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