1 /*
2   rakarrack - a guitar effects software
3 
4   RecChord.C  -  Recognize MIDI Chord
5   Copyright (C) 2008 Josep Andreu
6   Author: Josep Andreu
7 
8  This program is free software; you can redistribute it and/or modify
9  it under the terms of version 2 of the GNU General Public License
10  as published by the Free Software Foundation.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  GNU General Public License (version 2) for more details.
16 
17  You should have received a copy of the GNU General Public License
18  (version2)  along with this program; if not, write to the Free Software
19  Foundation,
20  Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21 
22 */
23 
24 
25 #include "RecChord.h"
26 
27 
RecChord()28 RecChord::RecChord ()
29 {
30 
31     memset (Ch, 0, sizeof (Ch));
32 
33 
34     Ch[0][0] = 1;
35     Ch[6][0] = 1;
36     Ch[12][0] = 1;
37     Ch[18][0] = 1;
38     Ch[24][0] = 1;
39     Ch[31][0] = 1;
40     Ch[0][2] = 2;
41     Ch[6][2] = 1;
42     Ch[12][2] = 1;
43     Ch[18][2] = 2;
44     Ch[24][2] = 2;
45     Ch[31][7] = 1;
46     Ch[0][4] = 1;
47     Ch[6][4] = 1;
48     Ch[12][3] = 1;
49     Ch[18][3] = 1;
50     Ch[24][4] = 1;
51     Ch[0][7] = 1;
52     Ch[6][7] = 1;
53     Ch[12][5] = 2;
54     Ch[18][5] = 2;
55     Ch[24][7] = 1;
56     Ch[0][9] = 2;
57     Ch[6][9] = 1;
58     Ch[12][7] = 1;
59     Ch[18][6] = 1;
60     Ch[24][9] = 1;
61     Ch[30][0] = 1;
62     Ch[6][11] = 2;
63     Ch[18][8] = 2;
64     Ch[24][10] = 1;
65     Ch[18][9] = 1;
66     Ch[18][11] = 2;
67     Ch[1][0] = 1;
68     Ch[7][0] = 1;
69     Ch[13][0] = 1;
70     Ch[19][0] = 1;
71     Ch[25][0] = 1;
72     Ch[32][0] = 1;
73     Ch[1][2] = 2;
74     Ch[7][2] = 2;
75     Ch[13][2] = 1;
76     Ch[19][4] = 1;
77     Ch[25][1] = 1;
78     Ch[32][2] = 2;
79     Ch[1][4] = 1;
80     Ch[7][4] = 1;
81     Ch[13][3] = 1;
82     Ch[19][7] = 1;
83     Ch[25][4] = 1;
84     Ch[32][5] = 1;
85     Ch[1][7] = 1;
86     Ch[7][6] = 2;
87     Ch[13][5] = 2;
88     Ch[19][10] = 1;
89     Ch[25][7] = 1;
90     Ch[32][7] = 1;
91     Ch[1][9] = 1;
92     Ch[7][8] = 1;
93     Ch[13][7] = 1;
94     Ch[25][10] = 1;
95     Ch[1][11] = 2;
96     Ch[7][10] = 2;
97     Ch[13][10] = 1;
98 
99 
100     Ch[2][0] = 1;
101     Ch[8][0] = 1;
102     Ch[14][0] = 1;
103     Ch[20][0] = 1;
104     Ch[26][0] = 1;
105     Ch[33][0] = 1;
106     Ch[2][2] = 2;
107     Ch[8][2] = 2;
108     Ch[14][2] = 2;
109     Ch[20][5] = 1;
110     Ch[26][1] = 2;
111     Ch[33][2] = 1;
112     Ch[2][4] = 1;
113     Ch[8][3] = 1;
114     Ch[14][3] = 1;
115     Ch[20][7] = 1;
116     Ch[26][4] = 1;
117     Ch[33][4] = 2;
118     Ch[2][7] = 1;
119     Ch[8][5] = 2;
120     Ch[14][5] = 1;
121     Ch[20][10] = 1;
122     Ch[26][5] = 2;
123     Ch[33][7] = 1;
124     Ch[2][9] = 2;
125     Ch[8][7] = 1;
126     Ch[14][7] = 1;
127     Ch[26][7] = 1;
128     Ch[33][9] = 2;
129     Ch[2][11] = 1;
130     Ch[14][10] = 1;
131     Ch[26][8] = 1;
132     Ch[26][10] = 1;
133     Ch[3][0] = 1;
134     Ch[9][0] = 1;
135     Ch[15][0] = 1;
136     Ch[21][0] = 1;
137     Ch[27][0] = 1;
138     Ch[3][2] = 2;
139     Ch[9][2] = 2;
140     Ch[15][2] = 2;
141     Ch[21][2] = 2;
142     Ch[27][1] = 2;
143     Ch[3][4] = 1;
144     Ch[9][3] = 1;
145     Ch[15][3] = 1;
146     Ch[21][4] = 1;
147     Ch[27][3] = 1;
148     Ch[3][6] = 1;
149     Ch[9][5] = 2;
150     Ch[15][5] = 2;
151     Ch[21][6] = 1;
152     Ch[27][4] = 1;
153     Ch[3][7] = 1;
154     Ch[9][7] = 1;
155     Ch[15][7] = 1;
156     Ch[21][10] = 1;
157     Ch[27][6] = 2;
158     Ch[3][9] = 2;
159     Ch[9][9] = 1;
160     Ch[15][11] = 1;
161     Ch[27][7] = 1;
162     Ch[3][11] = 1;
163     Ch[27][9] = 2;
164     Ch[27][10] = 1;
165     Ch[4][0] = 1;
166     Ch[10][0] = 1;
167     Ch[16][0] = 1;
168     Ch[22][0] = 1;
169     Ch[28][0] = 1;
170     Ch[4][2] = 1;
171     Ch[10][3] = 1;
172     Ch[16][2] = 1;
173     Ch[22][2] = 1;
174     Ch[28][2] = 2;
175     Ch[4][4] = 1;
176     Ch[10][5] = 2;
177     Ch[16][3] = 1;
178     Ch[22][4] = 1;
179     Ch[28][4] = 1;
180     Ch[4][7] = 1;
181     Ch[10][7] = 1;
182     Ch[16][5] = 2;
183     Ch[22][7] = 1;
184     Ch[28][5] = 2;
185     Ch[4][9] = 2;
186     Ch[10][10] = 1;
187     Ch[16][7] = 1;
188     Ch[22][9] = 2;
189     Ch[28][8] = 1;
190     Ch[16][11] = 1;
191     Ch[22][10] = 1;
192     Ch[28][9] = 2;
193     Ch[28][11] = 1;
194     Ch[5][0] = 1;
195     Ch[11][0] = 1;
196     Ch[17][0] = 1;
197     Ch[23][0] = 1;
198     Ch[29][0] = 1;
199     Ch[5][2] = 1;
200     Ch[11][1] = 2;
201     Ch[17][3] = 1;
202     Ch[23][2] = 2;
203     Ch[29][2] = 2;
204     Ch[5][4] = 1;
205     Ch[11][3] = 1;
206     Ch[17][5] = 2;
207     Ch[23][4] = 1;
208     Ch[29][4] = 1;
209     Ch[5][7] = 1;
210     Ch[11][5] = 2;
211     Ch[17][6] = 1;
212     Ch[23][6] = 1;
213     Ch[29][6] = 2;
214     Ch[5][9] = 2;
215     Ch[11][6] = 1;
216     Ch[17][8] = 2;
217     Ch[23][7] = 1;
218     Ch[29][8] = 1;
219     Ch[5][11] = 1;
220     Ch[11][8] = 2;
221     Ch[23][9] = 2;
222     Ch[29][10] = 1;
223     Ch[11][10] = 1;
224     Ch[23][10] = 1;
225 
226 
227 
228     memset (ChN, 0, sizeof (ChN));
229 
230     {
231         static const char *stnom[] = {
232             "", "6", "Maj7", "lyd", "Maj(9)", "Maj7(9)", "6/9", "+", "m",
233             "m6", "m7", "m7(b5)", "m9", "m7(9)", "m7(11)", "m(Maj7)",
234             "m(Maj7)(9)", "dim", "dim7", "7", "7(Sus4)", "7(b5)", "7(9)",
235             "7(#11)", "7(13)", "7(b9)", "7(b13)", "7(#9)", "+Maj7", "+7",
236             "1+8", "1+5", "(Sus4)", "2"
237         };
238         for (int i = 0; i <= 33; i++) {
239             strcpy (ChN[i].Nom, stnom[i]);
240             ChN[i].tipo = i;
241         }
242     }
243 
244     ChN[1].num = 1;
245     ChN[6].num = 1;
246     ChN[9].num = 1;
247     ChN[32].num = 1;
248 
249 
250     {
251         static const char *stnom[] = {
252             "C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab", "A", "Bb",
253             "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"
254         };
255 
256         for (int i = 0; i <= 11; i++)
257             strcpy (NC[i].Nom, stnom[i]);
258         for (int i = 0; i <= 23; i++)
259             strcpy (NCE[i].Nom, stnom[i]);
260     }
261     NCE[0].note = 0;
262     NCE[1].note = 1;
263     NCE[2].note = 2;
264     NCE[3].note = 3;
265     NCE[4].note = 4;
266     NCE[5].note = 5;
267     NCE[6].note = 6;
268     NCE[7].note = -5;
269     NCE[8].note = -4;
270     NCE[9].note = -3;
271     NCE[10].note = -2;
272     NCE[11].note = -1;
273     NCE[12].note = 0;
274     NCE[13].note = 1;
275     NCE[14].note = 2;
276     NCE[15].note = 3;
277     NCE[16].note = 4;
278     NCE[17].note = 5;
279     NCE[18].note = 6;
280     NCE[19].note = -5;
281     NCE[20].note = -4;
282     NCE[21].note = -3;
283     NCE[22].note = -2;
284     NCE[23].note = -1;
285 
286 
287     IniciaChords ();
288     memset (NombreAcorde, 0, sizeof (NombreAcorde));
289 }
290 
291 
~RecChord()292 RecChord::~RecChord()
293 {
294 }
295 
296 
297 void
cleanup()298 RecChord::cleanup ()
299 {
300     int i;
301     memset (NombreAcorde, 0, sizeof (NombreAcorde));
302     for (i = 0; i < POLY; i++) {
303         note_active[i] = 0;
304         rnote[i] = 0;
305         gate[i] = 0;
306     }
307 
308     cc = 1;
309 
310 }
311 
312 void
IniciaChords()313 RecChord::IniciaChords ()
314 {
315     int i, j;
316     int notas = 1;
317     int numno[6];
318 
319     NumChord3 = 0;
320     NumChord4 = 0;
321     NumChord5 = 0;
322 
323     memset (Chord3, 0, sizeof (Chord3));
324     memset (Chord4, 0, sizeof (Chord4));
325     memset (Chord5, 0, sizeof (Chord5));
326 
327     for (i = 0; i <= 33; i++) {
328         notas = 1;
329         memset (numno, 0, sizeof (numno));
330 
331         for (j = 1; j <= 11; j++) {
332             if (Ch[i][j] == 1) {
333                 notas++;
334                 numno[notas] = j;
335             }
336         }
337 
338 
339 
340         switch (notas) {
341         case 3:
342             strcpy (Chord3[NumChord3].Nom, ChN[i].Nom);
343             Chord3[NumChord3].di1 = numno[2];
344             Chord3[NumChord3].di2 = numno[3] - numno[2];
345             Chord3[NumChord3].fund = 1;
346             Chord3[NumChord3].tipo = i;
347             NumChord3++;
348             if (ChN[i].num == 1)
349                 break;
350             strcpy (Chord3[NumChord3].Nom, ChN[i].Nom);
351             Chord3[NumChord3].di1 = numno[3] - numno[2];
352             Chord3[NumChord3].di2 = 12 - numno[3];
353             Chord3[NumChord3].fund = 3;
354             Chord3[NumChord3].tipo = i;
355             NumChord3++;
356             strcpy (Chord3[NumChord3].Nom, ChN[i].Nom);
357             Chord3[NumChord3].di1 = 12 - numno[3];
358             Chord3[NumChord3].di2 = numno[2];
359             Chord3[NumChord3].fund = 2;
360             Chord3[NumChord3].tipo = i;
361             NumChord3++;
362             break;
363         case 4:
364             strcpy (Chord4[NumChord4].Nom, ChN[i].Nom);
365             Chord4[NumChord4].di1 = numno[2];
366             Chord4[NumChord4].di2 = numno[3] - numno[2];
367             Chord4[NumChord4].di3 = numno[4] - numno[3];
368             Chord4[NumChord4].fund = 1;
369             Chord4[NumChord4].tipo = i;
370             NumChord4++;
371             if (ChN[i].num == 1)
372                 break;
373             strcpy (Chord4[NumChord4].Nom, ChN[i].Nom);
374             Chord4[NumChord4].di1 = numno[3] - numno[2];
375             Chord4[NumChord4].di2 = numno[4] - numno[3];
376             Chord4[NumChord4].di3 = 12 - numno[4];
377             Chord4[NumChord4].fund = 4;
378             Chord4[NumChord4].tipo = i;
379             NumChord4++;
380             strcpy (Chord4[NumChord4].Nom, ChN[i].Nom);
381             Chord4[NumChord4].di1 = numno[4] - numno[3];
382             Chord4[NumChord4].di2 = 12 - numno[4];
383             Chord4[NumChord4].di3 = numno[2];
384             Chord4[NumChord4].fund = 3;
385             Chord4[NumChord4].tipo = i;
386             NumChord4++;
387             strcpy (Chord4[NumChord4].Nom, ChN[i].Nom);
388             Chord4[NumChord4].di1 = 12 - numno[4];
389             Chord4[NumChord4].di2 = numno[2];
390             Chord4[NumChord4].di3 = numno[3] - numno[2];
391             Chord4[NumChord4].fund = 2;
392             Chord4[NumChord4].tipo = i;
393             NumChord4++;
394             strcpy (Chord4[NumChord4].Nom, ChN[i].Nom);
395             Chord4[NumChord4].di1 = numno[2] + (12 - numno[4]);
396             Chord4[NumChord4].di2 = numno[3] - numno[2];
397             Chord4[NumChord4].di3 = 12 - numno[3];
398             Chord4[NumChord4].fund = 4;
399             Chord4[NumChord4].tipo = i;
400             NumChord4++;
401             break;
402 
403         case 5:
404             strcpy (Chord5[NumChord5].Nom, ChN[i].Nom);
405             Chord5[NumChord5].di1 = numno[2];
406             Chord5[NumChord5].di2 = numno[3] - numno[2];
407             Chord5[NumChord5].di3 = numno[4] - numno[3];
408             Chord5[NumChord5].di4 = numno[5] - numno[4];
409             Chord5[NumChord5].fund = 1;
410             Chord5[NumChord5].tipo = i;
411             NumChord5++;
412             if (ChN[i].num == 1)
413                 break;
414             strcpy (Chord5[NumChord5].Nom, ChN[i].Nom);
415             Chord5[NumChord5].di1 = numno[3] - numno[2];
416             Chord5[NumChord5].di2 = numno[4] - numno[3];
417             Chord5[NumChord5].di3 = numno[5] - numno[4];
418             Chord5[NumChord5].di4 = 12 - numno[5];
419 
420             Chord5[NumChord5].fund = 5;
421             Chord5[NumChord5].tipo = i;
422             NumChord5++;
423             strcpy (Chord5[NumChord5].Nom, ChN[i].Nom);
424             Chord5[NumChord5].di1 = numno[4] - numno[3];
425             Chord5[NumChord5].di2 = numno[5] - numno[4];
426             Chord5[NumChord5].di3 = 12 - numno[5];
427             Chord5[NumChord5].di4 = numno[2];
428             Chord5[NumChord5].fund = 4;
429             Chord5[NumChord5].tipo = i;
430             NumChord5++;
431             strcpy (Chord5[NumChord5].Nom, ChN[i].Nom);
432             Chord5[NumChord5].di1 = numno[5] - numno[4];
433             Chord5[NumChord5].di2 = 12 - numno[5];
434             Chord5[NumChord5].di3 = numno[2];
435             Chord5[NumChord5].di4 = numno[3] - numno[2];
436             Chord5[NumChord5].fund = 3;
437             Chord5[NumChord5].tipo = i;
438             NumChord5++;
439             strcpy (Chord5[NumChord5].Nom, ChN[i].Nom);
440             Chord5[NumChord5].di1 = 12 - numno[5];
441             Chord5[NumChord5].di2 = numno[2];
442             Chord5[NumChord5].di3 = numno[3] - numno[2];
443             Chord5[NumChord5].di4 = numno[4] - numno[3];
444             Chord5[NumChord5].fund = 2;
445             Chord5[NumChord5].tipo = i;
446             NumChord5++;
447             strcpy (Chord5[NumChord5].Nom, ChN[i].Nom);
448             Chord5[NumChord5].di1 = numno[2] + (12 - numno[5]);
449             Chord5[NumChord5].di2 = numno[3] - numno[2];
450             Chord5[NumChord5].di3 = numno[4] - numno[3];
451             Chord5[NumChord5].di4 = 12 - numno[4];
452             Chord5[NumChord5].fund = 5;
453             Chord5[NumChord5].tipo = i;
454             NumChord5++;
455             break;
456 
457         }
458 
459     }
460 
461 
462 
463 };
464 
465 
466 
467 void
MiraChord()468 RecChord::MiraChord ()
469 {
470 
471     int i, j;
472     int anote[POLY];
473     int nnotes = 0;
474     int temp;
475     int di1, di2, di3, di4;
476     int labaja;
477     char AName[20];
478 
479 
480     for (i = 0; i < POLY; i++) {
481         if (note_active[i]) {
482             anote[nnotes] = rnote[i];
483             nnotes++;
484         }
485     }
486 
487 
488 
489     if ((nnotes < 3) || (nnotes > 5))
490         return;
491 
492     labaja = anote[0];
493     for (i = 1; i < nnotes - 1; i++)
494         if (anote[i] < labaja)
495             labaja = anote[i];
496     for (i = 0; i < nnotes; i++)
497         if (anote[i] - labaja > 12)
498             anote[i] -= 12;
499     for (i = 1; i < nnotes; i++) {
500         for (j = 0; j < nnotes - 1; j++) {
501 
502             if (anote[j] > anote[j + 1]) {
503                 temp = anote[j];
504                 anote[j] = anote[j + 1];
505                 anote[j + 1] = temp;
506             }
507         }
508     }
509 
510 
511 
512     bass = anote[0] % 12;
513 
514 sigue:
515 
516     if (nnotes == 3) {
517 
518         di1 = anote[1] - anote[0];
519         di2 = anote[2] - anote[1];
520 
521         j = -1;
522 
523         while (j <= NumChord3)
524 
525         {
526             j++;
527             if ((Chord3[j].di1 == di1) && (Chord3[j].di2 == di2)) {
528                 ctipo = Chord3[j].tipo;
529                 int elke = anote[Chord3[j].fund - 1];
530                 fundi = elke % 12;
531                 sprintf (AName, "%s%s", NC[fundi].Nom, Chord3[j].Nom);
532 
533                 if (bass != fundi) {
534 
535                     memset (AName, 0, sizeof (AName));
536                     sprintf (AName, "%s%s/%s", NC[fundi].Nom, Chord3[j].Nom,
537                              NCE[bass + plus (fundi)].Nom);
538                 }
539 
540                 if (strcmp (AName, NombreAcorde) != 0) {
541                     strcpy (NombreAcorde, AName);
542                     cc = 1;
543                 }
544                 return;
545             }
546         }
547 
548     }
549 
550     if (nnotes == 4) {
551 
552         di1 = anote[1] - anote[0];
553         di2 = anote[2] - anote[1];
554         di3 = anote[3] - anote[2];
555         j = -1;
556 
557         while (j <= NumChord4)
558 
559         {
560             j++;
561             if ((Chord4[j].di1 == di1) && (Chord4[j].di2 == di2)
562                     && (Chord4[j].di3 == di3)) {
563                 ctipo = Chord4[j].tipo;
564                 int elke = anote[Chord4[j].fund - 1];
565                 fundi = elke % 12;
566                 sprintf (AName, "%s%s", NC[fundi].Nom, Chord4[j].Nom);
567                 if (bass != fundi) {
568                     memset (AName, 0, sizeof (AName));
569                     sprintf (AName, "%s%s/%s", NC[fundi].Nom, Chord4[j].Nom,
570                              NCE[bass + plus (fundi)].Nom);
571                 }
572 
573                 if (strcmp (AName, NombreAcorde) != 0) {
574                     strcpy (NombreAcorde, AName);
575                     cc = 1;
576                 }
577                 return;
578             }
579 
580         }
581 
582 
583 
584     }
585 
586     if (nnotes == 5) {
587 
588         di1 = anote[1] - anote[0];
589         di2 = anote[2] - anote[1];
590         di3 = anote[3] - anote[2];
591         di4 = anote[4] - anote[3];
592         j = -1;
593 
594         while (j < NumChord5)
595 
596         {
597             j++;
598             if ((Chord5[j].di1 == di1) && (Chord5[j].di2 == di2)
599                     && (Chord5[j].di3 == di3) && (Chord5[j].di4 == di4)) {
600                 ctipo = Chord5[j].tipo;
601                 int elke = anote[Chord5[j].fund - 1];
602                 fundi = elke % 12;
603                 sprintf (AName, "%s%s", NC[fundi].Nom, Chord5[j].Nom);
604                 if (bass != fundi) {
605                     memset (AName, 0, sizeof (AName));
606                     sprintf (AName, "%s%s/%s", NC[fundi].Nom, Chord5[j].Nom,
607                              NCE[bass + plus (fundi)].Nom);
608                 }
609 
610                 if (strcmp (AName, NombreAcorde) != 0) {
611                     strcpy (NombreAcorde, AName);
612                     cc = 1;
613                 }
614                 return;
615 
616             }
617 
618         }
619 
620     }
621 
622 
623 
624     if (nnotes == 5) {
625         bass = anote[0] % 12;
626 
627         for (i = 1; i <= 4; i++)
628             anote[i - 1] = anote[i];
629         nnotes = 4;
630         goto sigue;
631     }
632 
633 
634 
635     if (nnotes == 5) {
636         nnotes = 4;
637         goto sigue;
638     }
639 
640     if (nnotes == 4) {
641         nnotes = 3;
642         goto sigue;
643     }
644 
645 
646 
647 };
648 
649 
650 
651 
652 int
plus(int nota)653 RecChord::plus (int nota)
654 {
655     switch (nota) {
656     case 2:
657         return (12);
658         break;
659     case 4:
660         return (12);
661         break;
662     case 7:
663         return (12);
664         break;
665     case 9:
666         return (12);
667         break;
668     case 11:
669         return (12);
670         break;
671     default:
672         return (0);
673     }
674 
675 };
676 
677 
678 void
Vamos(int voz,int interval,int reconota)679 RecChord::Vamos (int voz, int interval, int reconota)
680 {
681 
682     int n1, h1;
683     int hm1, hp1;
684     int hm2, hp2;
685     int hm3, hp3;
686     int ninterval = interval;
687     int tengo=0;
688     int nota;
689     int harmo;
690     int typo;
691 
692     nota = reconota % 12;
693 
694     nota -= fundi;
695     if (nota < 0)
696         nota += 12;
697 
698 
699     harmo = (12 + nota + interval) % 12;
700     if (harmo > 12)
701         harmo %= 12;
702 
703 
704 
705     hm1 = harmo - 1;
706     if (hm1 < 0)
707         hm1 += 12;
708     hp1 = harmo + 1;
709     if (hp1 > 12)
710         hp1 %= 12;
711 
712     hm2 = harmo - 2;
713     if (hm2 < 0)
714         hm2 += 12;
715     hp2 = harmo + 2;
716     if (hp2 > 12)
717         hp2 %= 12;
718 
719     hm3 = harmo - 3;
720     if (hm3 < 0)
721         hm3 += 12;
722     hp3 = harmo + 3;
723     if (hp3 > 12)
724         hp3 %= 12;
725 
726 
727 
728     n1 = Ch[ctipo][nota];
729     h1 = Ch[ctipo][harmo];
730 
731     typo = 3;
732 
733     if ((n1 == 1) && (h1 == 1))
734         typo = 0;
735     if ((n1 == 2) && (h1 == 2))
736         typo = 1;
737     if (h1 == 1)
738         typo = 2;
739 
740 
741 
742     switch (typo)
743 
744     {
745     case 0:
746         ninterval = interval;
747         break;
748     case 1:
749         ninterval = interval;
750         break;
751     case 2:
752         ninterval = interval;
753         break;
754     case 3:
755         tengo = 0;
756 
757         if ((Ch[ctipo][hp1] != 0) && (tengo == 0)) {
758             ninterval = interval + 1;
759             tengo = 1;
760         }
761         if ((Ch[ctipo][hm1] != 0) && (tengo == 0)) {
762             ninterval = interval - 1;
763             tengo = 1;
764         }
765 
766         if ((Ch[ctipo][hp2] != 0) && (tengo == 0)) {
767             ninterval = interval + 2;
768             tengo = 1;
769         }
770         if ((Ch[ctipo][hm2] != 0) && (tengo == 0)) {
771             ninterval = interval - 2;
772             tengo = 1;
773         }
774 
775         if ((Ch[ctipo][hp3] != 0) && (tengo == 0)) {
776             ninterval = interval + 3;
777             tengo = 1;
778         }
779         if ((Ch[ctipo][hm3] != 0) && (tengo == 0)) {
780             ninterval = interval - 1;
781             tengo = 1;
782         }
783         break;
784     }
785 
786     if (ninterval < -12)
787         ninterval += 12;
788     if (ninterval > 12)
789         ninterval %= 12;
790 
791 
792 
793     r__ratio[voz] = powf (2, ((float)ninterval / 12.0f));
794 
795 }
796 
797