Artefacts dans les sons aigus

Clonages d'ancètres, conceptions originales, circuit bending, le coin des grenouilles bricoleuses.

Modérateur : darcmorcel

Avatar de l’utilisateur
Buxi
Messages : 452
Inscription : 13 nov. 2015, 00:18

Artefacts dans les sons aigus

Message par Buxi »

Bonjour

Je viens vers vous car j'ai un problème dans mon son.

J'utilise un arduino DUE pour mon projet d'instrument (Buxitron) sur lequel je m'amuse à l'améliorer constamment.
J'utilise des tables d'onde pour l'arduino (je crois qu'on parle bien de tables d'onde).

En ce moment j'essaye de régler un problème que je rencontre dans les fréquences de sons correspondant aux notes les plus aigus.
Ce problème n'a lieu qu'avec les formes d'onde autre que la forme sinusoïdale.
Avec une forme d'onde triangulaire, ça s'entend très peu, avec une forme d'onde en dent de scie, ça s'entend bien et avec une forme d'onde carré c'est très présent.

Il s'agit de sons que je qualifierais de "parasites", j'en ai fais un rapide enregistrement :
https://soundcloud.com/buxi-cornet/mon-enregistrement-2" onclick="window.open(this.href);return false;

Est-ce que vous auriez des idées pour résoudre ce problème ou est-ce une conséquence normale de l'utilisation de formes d'ondes ?

Merci par avance
https://nicolas-merle.bandcamp.com" onclick="window.open(this.href);return false;
Notator
Messages : 1254
Inscription : 05 avr. 2012, 21:19

Re: Artefacts dans les sons aigus

Message par Notator »

Peut-être ça sature, des sortes d'overflow...
Et puis, il me semble que les convertisseurs D/A de la Due ne sont pas très performants.
Il faudrait essayer avec un bon convertisseur...
Avatar de l’utilisateur
Buxi
Messages : 452
Inscription : 13 nov. 2015, 00:18

Re: Artefacts dans les sons aigus

Message par Buxi »

Je suis entrain de regarder du côté des phénomènes d'aliasing. Je trouve des explications qui pourraient coller à mon soucis mais je ne suis pas certain. Il n'y a pas d'exemple sonore...

Si c'est ce soucis, il faudrait que je place un filtre passe bas en sortie du DAC de l'arduino.
https://nicolas-merle.bandcamp.com" onclick="window.open(this.href);return false;
Avatar de l’utilisateur
gligli
Messages : 411
Inscription : 28 févr. 2011, 10:06
Localisation : Vienne
Contact :

Re: Artefacts dans les sons aigus

Message par gligli »

Puir moi ça ressemble à de l'aliasing du au fait que les formes d'onde, a part pour le sinus, émettent des harmoniques au dessus de la fréquence de nyquist.
Par exemple, si tu sample à 48KHz (nyquist à 24KHz) et que tu émets une dent de scie à 10KHz, ben il y aura des harmoniques à 20KHz (ok) , 30KHz (pas ok), 40KHz (pas ok), ...

Un moyen encore assez simple d'éviter ça est d'interpoler le signal avant l'envoi au DAC. Perso j'utilise l'interpolation d'Hermite qui marche bien et qui est pas encore trop gourmande en ressources:
https://github.com/gligli/overcycler/bl ... osc.c#L152" onclick="window.open(this.href);return false;

Edit: Filter en sortie du DAC ne marchera pas je pense, car l'aliasing se manifeste comme un "repli" du spectre, ie. tu te retrouve avec ce qui "dépasse" de la fréquence nyquist un peu partout dans le spectre audible.
Avatar de l’utilisateur
Buxi
Messages : 452
Inscription : 13 nov. 2015, 00:18

Re: Artefacts dans les sons aigus

Message par Buxi »

Merci Gligli pour ton aide précieuse !

Bon... étant encore un peu newbi en programmation Arduino, comment puis-je utilise ton code ?
https://nicolas-merle.bandcamp.com" onclick="window.open(this.href);return false;
Avatar de l’utilisateur
gligli
Messages : 411
Inscription : 28 févr. 2011, 10:06
Localisation : Vienne
Contact :

Re: Artefacts dans les sons aigus

Message par gligli »

Heu, j'avoue que c'est peut-être pas si simple que ça, même si ca dois pouvoir compiler en arduino.

A mon avis, si tu peux faire varier la fréqence d'échantillonage du DAC librement, ca serait plus simple de jouer sample après sample de ta table d'onde et de faire varier la fréquence d'échantillonage pour changer de note.
Si tu te retrouve avec des fréquences d'échantillonage trop hautes, tu peux jouer un sample sur deux, un sample sur trois... (Il faut quand même que le diviseur tombe rond sur le nombre de samples de la table d'onde).
Avatar de l’utilisateur
Buxi
Messages : 452
Inscription : 13 nov. 2015, 00:18

Re: Artefacts dans les sons aigus

Message par Buxi »

Si j'augmente la fréquence d'échantillonnage, par exemple en passant de 44Khz à 256Khz, est-ce que je ne vais pas limiter ce phénomène d'aliasing ?
https://nicolas-merle.bandcamp.com" onclick="window.open(this.href);return false;
Avatar de l’utilisateur
gligli
Messages : 411
Inscription : 28 févr. 2011, 10:06
Localisation : Vienne
Contact :

Re: Artefacts dans les sons aigus

Message par gligli »

Si, ca devrait marcher si ton arduino peut monter aussi haut. Il en restera toujours un peu je pense.
Avatar de l’utilisateur
mathbox
Messages : 58
Inscription : 05 juin 2013, 12:45

Re: Artefacts dans les sons aigus

Message par mathbox »

Je confirme... ca sent l'aliasing.
Une autre possibilité est d'avoir des ondes plus simples pour les hautes fréquences. Par exemple, ton triangle devient un sinus à haute fréquence (en gros, ca revient un peu à intégrer le filtrage dans la forme d'onde elle-même).
Avatar de l’utilisateur
Buxi
Messages : 452
Inscription : 13 nov. 2015, 00:18

Re: Artefacts dans les sons aigus

Message par Buxi »

Merci, je n'avais pas pensé à cette solution mais effectivement je peux facilement mettre une sorte de transition de la forme x à la forme sinusoïdale en fonction de la fréquence du son.

C'est un peu triché mais faute de mieux...

Merci :razz:

Ps: ce qui est bien c'est que j'apprends des choses
https://nicolas-merle.bandcamp.com" onclick="window.open(this.href);return false;
SmashedTransistors
Messages : 216
Inscription : 02 avr. 2015, 00:33

Re: Artefacts dans les sons aigus

Message par SmashedTransistors »

Ca ressemble bien à de l'aliasing.
Peux tu mettre l'autorisation de download pour que je puisse le charger et le zieuter de plus près ?

Il y a pas mal de techniques évoluées pour éviter l'aliasing (comme on en a discuté sur le post viewtopic.php?f=35&t=16157.

Mais si tu arrives à tourner avec l'Arduino à 120kHz ça devrait suffire.
Les harmoniques d'une dent de scie décroissent à raison de -6dB par octave
Un carré a un harmonique sur deux avec une ampli nulle mais ils décroissent aussi à -6dB/oct.

si tu aux alentours de 10kHz avec une fréquence d'échantillonnage de 120kHz

10kHz 0 dB pour la fondamentale
20kHz -6 dB pour le premier harmonique
30kHz -12 dB
40kHz -18 dB
50kHz -24 dB
60kHz -36 dB -- limite de repliement (pour un échantillonnage à 120kHz)
50kHz -42 dB -- les fréquences sont repliées
40kHz -48 dB
30kHz -54 dB
20kHz -60 dB Repliement à -60 dB
10kHz -66 dB


si tu aux alentours de 10kHz avec une fréquence d'échantillonnage de 60kHz

10kHz 0 dB pour la fondamentale
20kHz -6 dB pour le premier harmonique
30kHz -12 dB ---
20kHz -18 dB Repliement audible à -18 dB
10kHz -24 dB
Avatar de l’utilisateur
Salmacis
Messages : 588
Inscription : 25 janv. 2012, 13:30

Re: Artefacts dans les sons aigus

Message par Salmacis »

yes...aliasing....
Tu peux te rabattre sur du variable rate pour le convertisseur.Il me semble que le duo a deux convertisseurs.
J'utilise cette technique pour mon projet et j'ai peu d'aliasing.
Une autre technique est d'avoir plusieurs formes d'onde par octaves (voir du wave morphing) :un carre sur les octave basse puis plus tu monte en fréquence plus tu passe sur un sinus...bon du coup tu pers tes harmoniques sur le octaves hautes...mais bon... c'est un choix.
Pourquoi l'arduino duo ?
Avatar de l’utilisateur
Buxi
Messages : 452
Inscription : 13 nov. 2015, 00:18

Re: Artefacts dans les sons aigus

Message par Buxi »

SmashedTransistors a écrit :Ca ressemble bien à de l'aliasing.
Peux tu mettre l'autorisation de download pour que je puisse le charger et le zieuter de plus près ?

Il y a pas mal de techniques évoluées pour éviter l'aliasing (comme on en a discuté sur le post viewtopic.php?f=35&t=16157.

Mais si tu arrives à tourner avec l'Arduino à 120kHz ça devrait suffire.
Les harmoniques d'une dent de scie décroissent à raison de -6dB par octave
Un carré a un harmonique sur deux avec une ampli nulle mais ils décroissent aussi à -6dB/oct.

si tu aux alentours de 10kHz avec une fréquence d'échantillonnage de 120kHz

10kHz 0 dB pour la fondamentale
20kHz -6 dB pour le premier harmonique
30kHz -12 dB
40kHz -18 dB
50kHz -24 dB
60kHz -36 dB -- limite de repliement (pour un échantillonnage à 120kHz)
50kHz -42 dB -- les fréquences sont repliées
40kHz -48 dB
30kHz -54 dB
20kHz -60 dB Repliement à -60 dB
10kHz -66 dB


si tu aux alentours de 10kHz avec une fréquence d'échantillonnage de 60kHz

10kHz 0 dB pour la fondamentale
20kHz -6 dB pour le premier harmonique
30kHz -12 dB ---
20kHz -18 dB Repliement audible à -18 dB
10kHz -24 dB
Merci pour ton aide.
Comment puis-je faire pour partager un fichier ?
https://nicolas-merle.bandcamp.com" onclick="window.open(this.href);return false;
Avatar de l’utilisateur
Buxi
Messages : 452
Inscription : 13 nov. 2015, 00:18

Re: Artefacts dans les sons aigus

Message par Buxi »

Salmacis a écrit :yes...aliasing....
Tu peux te rabattre sur du variable rate pour le convertisseur.Il me semble que le duo a deux convertisseurs.
J'utilise cette technique pour mon projet et j'ai peu d'aliasing.
Une autre technique est d'avoir plusieurs formes d'onde par octaves (voir du wave morphing) :un carre sur les octave basse puis plus tu monte en fréquence plus tu passe sur un sinus...bon du coup tu pers tes harmoniques sur le octaves hautes...mais bon... c'est un choix.
Pourquoi l'arduino duo ?
Ha... heu... je crois que j'ai grillé une des sorties DAC :dead:

Pourquoi j'ai choisi le DUE ? Parceque ça me semblait une manière assez simple et économique de générer du son.
Le fait que l'arduino permette de faire évoluer le projet facilement aussi.

Mais je n'avais pas pensé à ce problème d'aliasing du fait que je ne connaissais pas avant :(
https://nicolas-merle.bandcamp.com" onclick="window.open(this.href);return false;
Avatar de l’utilisateur
Buxi
Messages : 452
Inscription : 13 nov. 2015, 00:18

Re: Artefacts dans les sons aigus

Message par Buxi »

Bon alors vu que je ne vois pas trop comment partager des fichiers sur le forum, je pose mon code là...

Je préviens, vous allez sans doute trouver ça bordélique, je suis parti à la base d'un projet existant et j'ai appris sur le tas au fur et à mesure en modifiant et en ajoutant des choses.

Résultat c'est peut-être le cafarnaum dans mon programme.

Code : Tout sélectionner

//1024 valeures de A1 (55Hz) à A7 (3520Hz)
int NOTELOOKUP[]={
  65536, 65802, 66071, 66340, 66610, 66881, 67154, 67427, 67702, 67978, 68255, 68533, 68812, 69092, 69374, 69656, 69940, 70225, 70511, 70798, 71087, 71376, 71667, 71959, 72252, 72546, 72842, 73139, 73437, 73736, 74036, 74338, 
  74641, 74945, 75250, 75557, 75864, 76173, 76484, 76795, 77108, 77422, 77738, 78054, 78372, 78692, 79012, 79334, 79657, 79982, 80307, 80635, 80963, 81293, 81624, 81957, 82290, 82626, 82962, 83300, 83640, 83980, 84322, 84666, 
  85011, 85357, 85705, 86054, 86404, 86756, 87110, 87465, 87821, 88179, 88538, 88899, 89261, 89624, 89990, 90356, 90724, 91094, 91465, 91837, 92212, 92587, 92964, 93343, 93723, 94105, 94489, 94873, 95260, 95648, 96038, 96429, 
  96822, 97216, 97612, 98010, 98409, 98810, 99212, 99617, 100022, 100430, 100839, 101250, 101662, 102076, 102492, 102910, 103329, 103750, 104172, 104597, 105023, 105451, 105880, 106312, 106745, 107180, 107616, 108055, 108495, 
  108937, 109381, 109826, 110274, 110723, 111174, 111627, 112081, 112538, 112996, 113457, 113919, 114383, 114849, 115317, 115787, 116258, 116732, 117207, 117685, 118164, 118646, 119129, 119614, 120101, 120591, 121082, 121575, 
  122070, 122568, 123067, 123568, 124072, 124577, 125085, 125594, 126106, 126620, 127135, 127653, 128173, 128695, 129220, 129746, 130275, 130805, 131338, 131873, 132410, 132950, 133491, 134035, 134581, 135129, 135680, 136233, 
  136788, 137345, 137904, 138466, 139030, 139597, 140165, 140736, 141310, 141885, 142463, 143044, 143626, 144211, 144799, 145389, 145981, 146576, 147173, 147772, 148374, 148979, 149586, 150195, 150807, 151421, 152038, 152657, 
  153279, 153904, 154531, 155160, 155792, 156427, 157064, 157704, 158346, 158991, 159639, 160289, 160942, 161598, 162256, 162917, 163581, 164247, 164916, 165588, 166263, 166940, 167620, 168303, 168988, 169677, 170368, 171062, 
  171759, 172459, 173161, 173867, 174575, 175286, 176000, 176717, 177437, 178160, 178885, 179614, 180346, 181080, 181818, 182559, 183303, 184049, 184799, 185552, 186308, 187067, 187829, 188594, 189362, 190133, 190908, 191686, 
  192467, 193251, 194038, 194828, 195622, 196419, 197219, 198022, 198829, 199639, 200452, 201269, 202089, 202912, 203739, 204569, 205402, 206239, 207079, 207922, 208769, 209620, 210474, 211331, 212192, 213056, 213924, 214796, 
  215671, 216549, 217432, 218317, 219207, 220100, 220996, 221897, 222800, 223708, 224619, 225534, 226453, 227376, 228302, 229232, 230166, 231103, 232045, 232990, 233939, 234892, 235849, 236810, 237775, 238743, 239716, 240692, 
  241673, 242657, 243646, 244638, 245635, 246635, 247640, 248649, 249662, 250679, 251700, 252725, 253755, 254789, 255827, 256869, 257915, 258966, 260021, 261080, 262144, 263211, 264284, 265360, 266441, 267527, 268616, 269711, 
  270809, 271913, 273020, 274132, 275249, 276370, 277496, 278627, 279762, 280901, 282046, 283195, 284348, 285507, 286670, 287837, 289010, 290187, 291369, 292556, 293748, 294945, 296146, 297353, 298564, 299780, 301002, 302228, 
  303459, 304695, 305936, 307183, 308434, 309690, 310952, 312219, 313490, 314768, 316050, 317337, 318630, 319928, 321231, 322540, 323854, 325173, 326498, 327828, 329163, 330504, 331850, 333202, 334560, 335923, 337291, 338665, 
  340045, 341430, 342821, 344217, 345620, 347027, 348441, 349861, 351286, 352717, 354154, 355596, 357045, 358499, 359960, 361426, 362898, 364377, 365861, 367352, 368848, 370351, 371859, 373374, 374895, 376422, 377956, 379495, 
  381041, 382593, 384152, 385717, 387288, 388866, 390450, 392041, 393638, 395241, 396851, 398468, 400091, 401721, 403357, 405001, 406650, 408307, 409970, 411640, 413317, 415001, 416691, 418389, 420093, 421805, 423523, 425248, 
  426980, 428720, 430466, 432220, 433981, 435748, 437524, 439306, 441095, 442892, 444697, 446508, 448327, 450153, 451987, 453828, 455677, 457533, 459397, 461269, 463148, 465034, 466929, 468831, 470741, 472658, 474584, 476517, 
  478458, 480407, 482364, 484329, 486302, 488283, 490272, 492270, 494275, 496288, 498310, 500340, 502379, 504425, 506480, 508543, 510615, 512695, 514783, 516880, 518986, 521100, 523223, 525354, 527495, 529643, 531801, 533967, 
  536143, 538326, 540520, 542721, 544932, 547152, 549381, 551619, 553866, 556122, 558388, 560662, 562947, 565240, 567542, 569854, 572176, 574506, 576847, 579197, 581556, 583925, 586304, 588692, 591091, 593498, 595916, 598344, 
  600781, 603228, 605686, 608153, 610631, 613118, 615616, 618124, 620642, 623170, 625708, 628257, 630817, 633386, 635967, 638557, 641159, 643770, 646393, 649026, 651670, 654325, 656990, 659666, 662354, 665052, 667761, 670481, 
  673213, 675955, 678709, 681474, 684250, 687037, 689836, 692646, 695468, 698301, 701145, 704001, 706869, 709749, 712640, 715543, 718458, 721385, 724323, 727274, 730237, 733212, 736198, 739197, 742209, 745232, 748268, 751316, 
  754377, 757450, 760535, 763634, 766744, 769868, 773004, 776153, 779315, 782490, 785677, 788878, 792091, 795318, 798558, 801811, 805077, 808357, 811650, 814956, 818276, 821610, 824956, 828317, 831691, 835079, 838481, 841897, 
  845326, 848770, 852227, 855699, 859185, 862685, 866199, 869728, 873271, 876828, 880400, 883987, 887587, 891203, 894834, 898479, 902139, 905814, 909504, 913209, 916929, 920665, 924415, 928181, 931961, 935758, 939570, 943398, 
  947240, 951100, 954974, 958864, 962770, 966692, 970630, 974584, 978554, 982541, 986543, 990562, 994597, 998649, 1002717, 1006802, 1010903, 1015021, 1019156, 1023308, 1027476, 1031662, 1035865, 1040084, 1044321, 1048576, 
  1052847, 1057136, 1061442, 1065766, 1070108, 1074467, 1078844, 1083239, 1087652, 1092082, 1096531, 1100998, 1105483, 1109987, 1114508, 1119048, 1123607, 1128184, 1132780, 1137395, 1142028, 1146680, 1151351, 1156042, 1160751, 
  1165479, 1170227, 1174994, 1179781, 1184587, 1189412, 1194258, 1199123, 1204007, 1208912, 1213837, 1218781, 1223746, 1228731, 1233737, 1238763, 1243809, 1248876, 1253963, 1259072, 1264201, 1269351, 1274521, 1279713, 1284926, 
  1290161, 1295416, 1300694, 1305993, 1311313, 1316655, 1322018, 1327404, 1332811, 1338240, 1343692, 1349166, 1354662, 1360180, 1365721, 1371285, 1376871, 1382480, 1388111, 1393766, 1399444, 1405145, 1410869, 1416616, 1422387, 
  1428181, 1433999, 1439841, 1445706, 1451595, 1457509, 1463446, 1469408, 1475393, 1481404, 1487438, 1493498, 1499582, 1505690, 1511824, 1517983, 1524167, 1530375, 1536610, 1542869, 1549154, 1555465, 1561802, 1568164, 1574552, 
  1580966, 1587406, 1593873, 1600366, 1606885, 1613431, 1620004, 1626603, 1633229, 1639882, 1646563, 1653270, 1660005, 1666767, 1673557, 1680375, 1687220, 1694094, 1700994, 1707924, 1714881, 1721867, 1728881, 1735925, 1742995, 
  1750097, 1757225, 1764384, 1771571, 1778789, 1786034, 1793310, 1800615, 1807951, 1815315, 1822711, 1830135, 1837591, 1845076, 1852593, 1860139, 1867717, 1875325, 1882965, 1890635, 1898338, 1906070, 1913835, 1921631, 1929460, 
  1937319, 1945212, 1953135, 1961092, 1969080, 1977102, 1985155, 1993243, 2001362, 2009516, 2017701, 2025921, 2034173, 2042461, 2050780, 2059135, 2067522, 2075946, 2084401, 2092894, 2101418, 2109980, 2118574, 2127205, 2135870, 
  2144572, 2153307, 2162080, 2170886, 2179731, 2188609, 2197526, 2206478, 2215466, 2224491, 2233553, 2242652, 2251787, 2260960, 2270171, 2279419, 2288704, 2298028, 2307389, 2316788, 2326226, 2335702, 2345217, 2354771, 2364363, 
  2373995, 2383666, 2393376, 2403126, 2412915, 2422745, 2432614, 2442524, 2452474, 2462464, 2472495, 2482568, 2492681, 2502835, 2513031, 2523268, 2533547, 2543868, 2554230, 2564635, 2575083, 2585573, 2596106, 2606681, 2617300, 
  2627962, 2638667, 2649416, 2660209, 2671046, 2681927, 2692852, 2703822, 2714836, 2725895, 2737000, 2748149, 2759344, 2770585, 2781871, 2793204, 2804582, 2816007, 2827479, 2838997, 2850562, 2862174, 2873834, 2885541, 2897295, 
  2909098, 2920948, 2932847, 2944795, 2956791, 2968836, 2980930, 2993073, 3005266, 3017508, 3029800, 3042143, 3054535, 3066979, 3079472, 3092017, 3104613, 3117260, 3129959, 3142709, 3155511, 3168366, 3181272, 3194232, 3207244, 
  3220309, 3233428, 3246600, 3259825, 3273104, 3286438, 3299826, 3313268, 3326765, 3340317, 3353925, 3367587, 3381306, 3395080, 3408910, 3422797, 3436740, 3450740, 3464797, 3478912, 3493084, 3507313, 3521601, 3535947, 3550351, 
  3564814, 3579336, 3593916, 3608557, 3623257, 3638016, 3652837, 3667717, 3682658, 3697662, 3712725, 3727849, 3743035, 3758283, 3773593, 3788965, 3804400, 3819898, 3835459, 3851083, 3866771, 3882523, 3898339, 3914219, 3930165, 
  3946175, 3962250, 3978391, 3994597, 4010870, 4027209, 4043614, 4060087, 4076626, 4093233, 4109907, 4126650, 4143460, 4160339, 4177287, 4194304};

int SINLOOKUPSIZE=802;
short SINLOOKUP[]={
  2047, 2063, 2079, 2095, 2111, 2127, 2143, 2159, 2175, 2191, 2207, 2223, 2239, 2255, 2271, 2287, 2303, 2319, 2335, 2351, 2367, 2382, 2398, 2414, 2430, 2445, 2461, 2477, 2493, 2508, 2524, 2539, 
  2555, 2570, 2586, 2601, 2617, 2632, 2648, 2663, 2678, 2693, 2709, 2724, 2739, 2754, 2769, 2784, 2799, 2814, 2829, 2843, 2858, 2873, 2888, 2902, 2917, 2931, 2946, 2960, 2974, 2989, 3003, 3017, 
  3031, 3045, 3059, 3073, 3087, 3101, 3114, 3128, 3142, 3155, 3169, 3182, 3195, 3209, 3222, 3235, 3248, 3261, 3274, 3287, 3299, 3312, 3324, 3337, 3349, 3362, 3374, 3386, 3398, 3410, 3422, 3434, 
  3446, 3457, 3469, 3481, 3492, 3503, 3515, 3526, 3537, 3548, 3559, 3569, 3580, 3591, 3601, 3611, 3622, 3632, 3642, 3652, 3662, 3672, 3682, 3691, 3701, 3710, 3719, 3729, 3738, 3747, 3756, 3764, 
  3773, 3782, 3790, 3798, 3807, 3815, 3823, 3831, 3839, 3846, 3854, 3861, 3869, 3876, 3883, 3890, 3897, 3904, 3911, 3917, 3924, 3930, 3936, 3942, 3948, 3954, 3960, 3966, 3971, 3977, 3982, 3987, 
  3992, 3997, 4002, 4007, 4011, 4016, 4020, 4024, 4028, 4032, 4036, 4040, 4044, 4047, 4051, 4054, 4057, 4060, 4063, 4066, 4068, 4071, 4073, 4075, 4077, 4079, 4081, 4083, 4085, 4086, 4088, 4089, 
  4090, 4091, 4092, 4093, 4093, 4094, 4094, 4094, 4094, 4094, 4094, 4094, 4094, 4093, 4093, 4092, 4091, 4090, 4089, 4088, 4086, 4085, 4083, 4081, 4079, 4077, 4075, 4073, 4071, 4068, 4066, 4063, 
  4060, 4057, 4054, 4051, 4047, 4044, 4040, 4036, 4032, 4028, 4024, 4020, 4016, 4011, 4007, 4002, 3997, 3992, 3987, 3982, 3977, 3971, 3966, 3960, 3954, 3948, 3942, 3936, 3930, 3924, 3917, 3911, 
  3904, 3897, 3890, 3883, 3876, 3869, 3861, 3854, 3846, 3839, 3831, 3823, 3815, 3807, 3798, 3790, 3782, 3773, 3764, 3756, 3747, 3738, 3729, 3719, 3710, 3701, 3691, 3682, 3672, 3662, 3652, 3642, 
  3632, 3622, 3611, 3601, 3591, 3580, 3569, 3559, 3548, 3537, 3526, 3515, 3503, 3492, 3481, 3469, 3457, 3446, 3434, 3422, 3410, 3398, 3386, 3374, 3362, 3349, 3337, 3324, 3312, 3299, 3287, 3274, 
  3261, 3248, 3235, 3222, 3209, 3195, 3182, 3169, 3155, 3142, 3128, 3114, 3101, 3087, 3073, 3059, 3045, 3031, 3017, 3003, 2989, 2974, 2960, 2946, 2931, 2917, 2902, 2888, 2873, 2858, 2843, 2829, 
  2814, 2799, 2784, 2769, 2754, 2739, 2724, 2709, 2693, 2678, 2663, 2648, 2632, 2617, 2601, 2586, 2570, 2555, 2539, 2524, 2508, 2493, 2477, 2461, 2445, 2430, 2414, 2398, 2382, 2367, 2351, 2335, 
  2319, 2303, 2287, 2271, 2255, 2239, 2223, 2207, 2191, 2175, 2159, 2143, 2127, 2111, 2095, 2079, 2063, 2047, 2031, 2015, 1999, 1983, 1967, 1951, 1935, 1919, 1903, 1887, 1871, 1855, 1839, 1823, 
  1807, 1791, 1775, 1759, 1743, 1727, 1712, 1696, 1680, 1664, 1649, 1633, 1617, 1601, 1586, 1570, 1555, 1539, 1524, 1508, 1493, 1477, 1462, 1446, 1431, 1416, 1401, 1385, 1370, 1355, 1340, 1325, 
  1310, 1295, 1280, 1265, 1251, 1236, 1221, 1206, 1192, 1177, 1163, 1148, 1134, 1120, 1105, 1091, 1077, 1063, 1049, 1035, 1021, 1007, 993, 980, 966, 952, 939, 925, 912, 899, 885, 872, 859, 846,
  833, 820, 807, 795, 782, 770, 757, 745, 732, 720, 708, 696, 684, 672, 660, 648, 637, 625, 613, 602, 591, 579, 568, 557, 546, 535, 525, 514, 503, 493, 483, 472, 462, 452, 442, 432, 422, 412,
  403, 393, 384, 375, 365, 356, 347, 338, 330, 321, 312, 304, 296, 287, 279, 271, 263, 255, 248, 240, 233, 225, 218, 211, 204, 197, 190, 183, 177, 170, 164, 158, 152, 146, 140, 134, 128, 123,
  117, 112, 107, 102, 97, 92, 87, 83, 78, 74, 70, 66, 62, 58, 54, 50, 47, 43, 40, 37, 34, 31, 28, 26, 23, 21, 19, 17, 15, 13, 11, 9, 8, 6, 5, 4, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3,
  4, 5, 6, 8, 9, 11, 13, 15, 17, 19, 21, 23, 26, 28, 31, 34, 37, 40, 43, 47, 50, 54, 58, 62, 66, 70, 74, 78, 83, 87, 92, 97, 102, 107, 112, 117, 123, 128, 134, 140, 146, 152, 158, 164, 170, 177,
  183, 190, 197, 204, 211, 218, 225, 233, 240, 248, 255, 263, 271, 279, 287, 296, 304, 312, 321, 330, 338, 347, 356, 365, 375, 384, 393, 403, 412, 422, 432, 442, 452, 462, 472, 483, 493, 503, 514,
  525, 535, 546, 557, 568, 579, 591, 602, 613, 625, 637, 648, 660, 672, 684, 696, 708, 720, 732, 745, 757, 770, 782, 795, 807, 820, 833, 846, 859, 872, 885, 899, 912, 925, 939, 952, 966, 980, 993,
  1007, 1021, 1035, 1049, 1063, 1077, 1091, 1105, 1120, 1134, 1148, 1163, 1177, 1192, 1206, 1221, 1236, 1251, 1265, 1280, 1295, 1310, 1325, 1340, 1355, 1370, 1385, 1401, 1416, 1431, 1446, 1462,
  1477, 1493, 1508, 1524, 1539, 1555, 1570, 1586, 1601, 1617, 1633, 1649, 1664, 1680, 1696, 1712, 1727, 1743, 1759, 1775, 1791, 1807, 1823, 1839, 1855, 1871, 1887, 1903, 1919, 1935, 1951, 1967,
  1983, 1999, 2015, 2031};

short CREUXLOOKUP[]={
  -900,-898,-825,-807,-805,-785,-781,-761,-749,-741,-732,-720,-704,-692,-680,-668,-656,-640,-632,-607,-571,-539,-519,-494,-486,-474,-458,-450,-442,-426,-418,-410,-403,-396,-389,-383,-376,-369,-361,
  -353,-345,-337,-329,-324,-318,-313,-307,-301,-295,-290,-285,-278,-272,-266,-260,-252,-248,-244,-240,-232,-228,-224,-220,-216,-214,-212,-209,-206,-204,-200,-196,-192,-192,-188,-184,-180,-176,-176,
  -176,-172,-167,-163,-159,-155,-149,-143,-139,-135,-131,-123,-120,-117,-113,-110,-107,-103,-99,-95,-89,-83,-75,-63,-59,-54,-42,-30,-22,-14,-6,2,16,22,30,38,45,52,59,69,80,91,103,109,115,119,123,127,
  131,139,147,154,161,167,173,178,184,191,198,206,213,221,228,237,247,256,263,269,276,282,289,295,301,308,314,321,328,335,342,349,357,364,372,379,387,394,402,410,418,426,431,437,442,454,470,478,486,
  494,510,531,551,567,577,587,594,601,607,632,644,656,664,672,684,693,702,711,720,726,732,741,749,755,761,773,785,793,801,810,819,828,837,844,851,858,866,874,879,884,889,894,901,907,914,924,934,940,
  946,951,957,962,971,979,987,993,999,1005,1011,1019,1027,1035,1047,1059,1066,1073,1079,1094,1108,1116,1124,1132,1141,1151,1160,1168,1176,1184,1213,1225,1237,1247,1257,1265,1273,1281,1289,1297,1305,
  1314,1321,1328,1335,1343,1350,1355,1360,1365,1370,1375,1379,1384,1389,1394,1399,1405,1410,1415,1420,1425,1431,1436,1442,1447,1453,1458,1464,1469,1475,1479,1483,1487,1491,1495,1499,1503,1507,1511,
  1516,1521,1526,1531,1536,1541,1546,1551,1556,1564,1572,1580,1588,1596,1601,1607,1612,1618,1623,1628,1637,1646,1656,1665,1670,1675,1681,1689,1697,1705,1711,1717,1723,1729,1739,1748,1757,1766,1774,
  1782,1790,1798,1806,1811,1816,1821,1826,1834,1842,1850,1858,1866,1883,1895,1903,1911,1919,1927,1939,1951,1959,1967,1975,1987,1996,1996,2020,2048,2024,2012,2000,1985,1971,1961,1951,1941,1931,1921,
  1911,1903,1895,1887,1879,1870,1862,1854,1846,1838,1830,1821,1812,1804,1795,1786,1777,1768,1760,1751,1742,1733,1725,1717,1709,1701,1693,1685,1677,1669,1661,1653,1644,1636,1628,1619,1610,1601,1592,
  1583,1574,1565,1556,1547,1538,1528,1519,1510,1500,1490,1481,1471,1462,1452,1442,1433,1423,1414,1404,1394,1386,1378,1369,1361,1352,1344,1336,1327,1319,1311,1302,1294,1286,1277,1267,1256,1246,1236,
  1225,1215,1204,1194,1183,1173,1163,1152,1144,1135,1126,1118,1109,1100,1092,1083,1075,1066,1057,1049,1040,1032,1023,1016,1009,1001,994,987,980,972,965,958,951,944,936,929,922,915,907,900,893,886,
  878,871,863,856,848,841,834,826,819,811,804,796,789,781,774,766,759,751,744,736,730,723,716,710,703,696,689,683,676,669,662,656,649,642,636,629,622,615,607,599,591,583,575,567,559,551,543,535,527,
  519,510,502,494,484,474,464,454,444,434,424,414,404,393,383,373,364,355,346,337,328,318,309,300,291,282,273,264,254,245,236,226,215,204,194,183,173,162,152,141,131,120,109,99,89,79,69,59,48,38,28,
  18,8,-2,-12,-22,-29,-36,-42,-49,-56,-63,-69,-76,-83,-89,-96,-103,-110,-116,-123,-130,-137,-144,-151,-158,-165,-173,-180,-187,-194,-201,-208,-214,-220,-226,-232,-238,-244,-250,-256,-262,-268,-275,
  -281,-287,-293,-300,-306,-312,-319,-325,-331,-337,-342,-348,-354,-360,-366,-371,-377,-383,-388,-394,-400,-405,-411,-416,-422,-426,-431,-436,-440,-445,-449,-454,-460,-467,-473,-480,-486,-492,-498,
  -504,-510,-517,-523,-528,-533,-539,-544,-549,-555,-560,-566,-571,-576,-582,-587,-591,-595,-599,-603,-607,-611,-615,-619,-623,-628,-632,-636,-640,-644,-650,-657,-664,-671,-677,-684,-694,-703,-713,
  -723,-732,-739,-746,-753,-760,-767,-774,-781,-791,-802,-812,-823,-833,-842,-851,-860,-869,-878,-887,-897,-907,-916,-926,-936,-946,-955,-965,-975,-983,-992,-1001,-1010,-1018,-1027,-1039,-1051,-1063,
  -1075,-1084,-1092,-1100,-1108,-1116,-1125,-1135,-1144,-1158,-1172,-1178,-1184,-1189,-1195,-1201,-1213,-1226,-1239,-1252,-1265,-1276,-1287,-1297,-1305,-1314,-1322,-1327,-1332,-1338,-1342,-1346,-1350,
  -1340,-1240,-1140,-1040,-940,-930,-920,-910};

short PHOENIXLOOKUP[]={
  0,2,3,5,6,10,11,13,14,16,19,21,22,24,26,29,30,32,33,36,38,40,41,43,46,48,49,51,53,56,58,59,61,63,67,69,70,72,74,78,80,82,84,88,89,92,94,96,100,102,104,106,108,112,114,116,118,120,124,126,128,130,132,
  136,138,140,142,146,148,150,152,154,158,161,163,165,167,171,174,176,178,181,185,188,190,192,197,199,202,204,207,212,214,217,219,222,227,229,232,235,237,243,246,248,251,254,260,263,267,270,276,279,283,
  286,290,297,300,304,308,312,319,323,327,331,335,343,348,352,356,361,369,374,378,383,392,397,401,406,410,420,424,429,433,438,447,452,457,462,467,477,482,487,493,504,509,515,520,525,538,544,550,556,562,
  574,580,587,594,601,614,621,627,636,644,660,669,677,685,703,713,723,733,742,762,772,783,795,806,828,840,851,862,875,901,913,926,939,952,978,992,1005,1019,1047,1060,1074,1088,1102,1130,1144,1158,1172,1186,
  1213,1226,1240,1253,1267,1294,1307,1319,1332,1358,1371,1383,1396,1408,1432,1443,1455,1467,1479,1501,1512,1523,1533,1544,1565,1576,1586,1595,1605,1624,1634,1643,1653,1670,1679,1688,1696,1705,1722,1730,1738,
  1746,1754,1770,1778,1786,1792,1799,1813,1820,1827,1834,1841,1853,1859,1865,1871,1884,1890,1895,1900,1906,1916,1921,1927,1932,1936,1945,1950,1954,1959,1964,1972,1976,1979,1983,1990,1994,1998,2001,2004,2010,
  2013,2016,2020,2023,2027,2029,2031,2033,2035,2039,2040,2041,2042,2042,2044,2044,2045,2045,2044,2043,2043,2043,2042,2041,2039,2038,2037,2036,2034,2032,2030,2028,2025,2021,2019,2016,2014,2010,2003,1999,1995,
  1992,1984,1979,1974,1969,1964,1954,1949,1944,1937,1931,1918,1912,1906,1899,1893,1877,1869,1861,1853,1838,1830,1820,1811,1802,1783,1774,1764,1755,1744,1723,1712,1701,1691,1680,1657,1645,1633,1621,1609,1584,
  1572,1559,1545,1519,1505,1492,1478,1465,1437,1422,1408,1394,1380,1352,1337,1322,1307,1292,1261,1246,1231,1215,1184,1168,1152,1136,1120,1088,1071,1055,1038,1022,989,972,955,938,921,887,871,854,837,819,785,
  767,750,733,698,680,662,645,627,592,574,556,538,520,484,466,448,430,412,376,357,339,321,302,266,248,229,211,175,156,138,120,102,66,48,30,12,-6,-42,-59,-77,-95,-113,-148,-166,-184,-202,-236,-254,-272,-289,
  -306,-341,-358,-376,-393,-410,-444,-461,-478,-495,-511,-545,-562,-578,-595,-611,-645,-661,-678,-694,-726,-742,-758,-774,-790,-821,-836,-852,-867,-882,-913,-929,-943,-958,-973,-1003,-1018,-1032,-1047,-1061,
  -1089,-1103,-1118,-1132,-1160,-1173,-1186,-1199,-1213,-1239,-1252,-1266,-1278,-1290,-1315,-1328,-1340,-1352,-1365,-1388,-1399,-1411,-1422,-1445,-1456,-1467,-1477,-1487,-1508,-1518,-1529,-1539,-1548,-1567,
  -1576,-1586,-1595,-1605,-1623,-1631,-1640,-1648,-1657,-1674,-1683,-1691,-1698,-1714,-1722,-1729,-1737,-1745,-1759,-1767,-1774,-1781,-1788,-1802,-1809,-1815,-1822,-1828,-1841,-1847,-1854,-1859,-1865,-1876,
  -1882,-1887,-1893,-1903,-1908,-1913,-1918,-1923,-1933,-1938,-1942,-1946,-1950,-1959,-1963,-1967,-1971,-1975,-1981,-1985,-1988,-1991,-1998,-2000,-2003,-2005,-2008,-2013,-2015,-2018,-2020,-2022,-2026,-2028,
  -2030,-2031,-2033,-2036,-2037,-2038,-2039,-2040,-2043,-2043,-2043,-2044,-2045,-2045,-2045,-2046,-2046,-2045,-2045,-2045,-2045,-2045,-2045,-2044,-2044,-2044,-2043,-2042,-2042,-2041,-2040,-2039,-2037,-2036,
  -2035,-2034,-2032,-2030,-2029,-2027,-2026,-2023,-2021,-2019,-2018,-2016,-2012,-2011,-2009,-2007,-2005,-2000,-1998,-1996,-1994,-1989,-1987,-1984,-1982,-1979,-1974,-1972,-1969,-1967,-1965,-1960,-1957,-1955,
  -1953,-1951,-1946,-1944,-1942,-1940,-1938,-1934,-1932,-1930,-1929,-1925,-1923,-1922,-1920,-1919,-1916,-1915,-1914,-1912,-1911,-1909,-1908,-1907,-1906,-1905,-1903,-1902,-1901,-1901,-1900,-1898,-1897,-1896,
  -1896,-1894,-1893,-1892,-1891,-1890,-1888,-1887,-1885,-1884,-1882,-1880,-1878,-1876,-1873,-1870,-1865,-1863,-1860,-1857,-1850,-1846,-1843,-1839,-1835,-1828,-1823,-1819,-1814,-1810,-1801,-1797,-1792,-1787,
  -1782,-1773,-1768,-1763,-1758,-1753,-1742,-1737,-1732,-1726,-1716,-1711,-1705,-1699,-1694,-1683,-1677,-1672,-1666,-1661,-1649,-1644,-1638,-1633,-1627,-1616,-1610,-1605,-1599,-1594,-1583,-1577,-1572,-1566,
  -1554,-1549,-1543,-1537,-1531,-1518,-1511,-1504,-1497,-1490,-1477,-1468,-1460,-1452,-1443,-1000,-800,-600,-400,-300,-200,-100};                                                                                     

short SQUARELOOKUP[]={
  0,-311,-607,-879,-1117,-1318,-1484,-1617,-1722,-1802,-1864,-1911,-1946,-1973,-1992,-2007,-2018,-2025,-2031,-2036,-2039,-2041,-2043,-2044,-2045,-2046,-2047,-2047,-2047,-2047,-2048,-2048,-2048,-2048,-2048,
  -2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,
  -2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,
  -2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,
  -2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,
  -2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,
  -2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,
  -2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,
  -2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,
  -2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,
  -2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,
  -2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,
  -2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,
  -2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,-2048,
  -2048,-2048,-2048,-2048,-2048,-2048,-2047,-2047,-2047,-2047,-2046,-2045,-2044,-2043,-2041,-2039,-2036,-2031,-2025,-2018,-2007,-1992,-1973,-1946,-1911,-1864,-1802,-1722,-1617,-1484,-1318,-1117,-879,-607,
  -311,0,311,607,879,1117,1318,1484,1617,1722,1802,1864,1911,1946,1973,1992,2007,2018,2025,2031,2036,2039,2041,2043,2044,2045,2046,2047,2047,2047,2047,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,
  2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,
  2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,
  2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,
  2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,
  2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,
  2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048,
  300,150,50};

#define SAMPLE_RATE 750000.0
#define TICKS_PER_CYCLE (4294967296/SAMPLE_RATE)

#define BIAS 2048
 
#define LEDPIN1 47 //led octave1

#define LEDPIN2 43 //led octave2

#define LEDPIN3 39 //led octave3

#define LEDPIN4 35 //led octave4

#define LEDPIN5 31 //led PEDALE1

#define LEDPIN6 33 //led PEDALE2

#define FADEMAX 512

#define MAXDELAYBUFFERSIZE 40000  //environs 1 second de delay

int POT0FIN=0,POT0AFIN=0,POT0=0,POT0A=0,POT0AB=0,CORRECTION=0,POT1=0,POT2=0,POT3BB=0,POT3B=0,POT3=0,POT4B=0,POT4=0,POT5B,POT5=0,OCTAVE=0,PEDALE=0,PEDALEB=0,RDLED=0;
int out_DAC0;
int ledvert=2,ledbleu=4,ledblanc=5;
int64_t iter=0,iter2=0; 
boolean COMPTEUR=false,COMPTEUR2=false,PEDALEON=false;
const byte BUTTONS[]={11,12,13,10,9,7,6,3,8};  //11=>PedaleOn, 12=>creux, 13=>Nasillard, 10=>CourtLong, 9=>PedaleOctave, 7=>PedaleBasse, 6=>PedaleFormeOnde 
byte BUTTONSTATES[]={0,0,0,0,0,0,0,0,0};
short DELAYBUFFER[MAXDELAYBUFFERSIZE];
unsigned int delayWriteIndex=0,pDelayWriteIndex=0,FADE=0; 


//-----------------------------------------------------------------------------------Detection appuie long verrouillage clavier ---------------------------------

long debut_appui1;
boolean variable1=false;
int temps_defini=500,etat_bouton1,dernier_etat_bouton1=LOW,etat_prg1=LOW;

//-----------------------------------------------------------------------------------Fin detection appuie long verrouillage clavier -----------------------------

//-----------------------------------------------------------------------------------Lissage du pitch -----------------------------------------------------------

const int nEchantillons = 10;
int POT0ABB[nEchantillons],indice = 0;        // un tableau pour stocker les échantillons lus / l'indice de l'échantillon courant
float total = 0,moyenne = 0;       // la somme des échantillons mémorisés / la moyenne des échantillons mémorisés
               

//-----------------------------------------------------------------------------------Fin Lissage du pitch -------------------------------------------------------


//---------------------------------------------------------------------------------------------------------------------------------------------------------------

void setup()
{
  Serial.begin(115200);  
  pmc_set_writeprotect(false);
  pmc_enable_periph_clk(ID_TC4);
  TC_Configure(TC1,1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK2);
  TC_SetRC(TC1, 1, 238);
  TC_Start(TC1, 1);
  TC1->TC_CHANNEL[1].TC_IER=TC_IER_CPCS;
  TC1->TC_CHANNEL[1].TC_IDR=~TC_IER_CPCS;
  NVIC_EnableIRQ(TC4_IRQn);
 
  analogWrite(DAC1,0); 
  pinMode(LEDPIN1,OUTPUT);
  pinMode(LEDPIN2,OUTPUT);
  pinMode(LEDPIN3,OUTPUT);
  pinMode(LEDPIN4,OUTPUT);
  pinMode(LEDPIN5,OUTPUT);
  pinMode(LEDPIN6,OUTPUT);
      
  for(int i=0;i<9;i++){
    pinMode(BUTTONS[i],INPUT_PULLUP);
  }
  
  for(int i=0;i<MAXDELAYBUFFERSIZE;i++){
    DELAYBUFFER[i]=BIAS; //initialise delay buffer à 'zero'
  }

  analogWrite(ledbleu,255);
  delay(250);
  analogWrite(ledbleu,0);
  analogWrite(ledvert,255);
  delay(125);
  analogWrite(ledbleu,255);
  analogWrite(ledvert,0);
  delay(250);
  analogWrite(ledbleu,0);
  analogWrite(ledvert,255); 

//----------------------------------------------- Lissage pitch
for (int i = 0; i < nEchantillons; i++) {
POT0ABB[i] = 0;
 }

}

//---------------------------------------------------------------------------------------------------------------------------------------------------------------
void loop()
{ 
  total = total - POT0ABB[indice];
  CORRECTION = ((analogRead(A6)/17)-30);             //Accordage
  POT0ABB[indice] = (analogRead(A0)+CORRECTION);     //Fréquence
  POT0AB = (analogRead(A0)+CORRECTION);  
  POT1 = analogRead(A1);                             //Delay  
  POT2 = analogRead(A2);                             //Feedback  
  
  if((COMPTEUR==true)&&(POT0AB<65)){
   if(POT3BB>0){  
   POT3BB = constrain((POT3BB-2), 0, 512);
   }
  }else if((COMPTEUR==true)&&(POT0AB>65)){
   if(POT3BB<constrain((analogRead(A3)/1.8), 0, 512)){
   POT3BB = constrain((POT3BB+2), 0, 512);
   }else{
   POT3BB = constrain((analogRead(A3)/1.8), 0, 512);
   }
  }else{  
  POT3BB = constrain((analogRead(A3)/1.8), 0, 512);  //Volume
  }
  
  POT4B = constrain(analogRead(A5), 0, 1000);        //FormeOnde
  POT5B = constrain((analogRead(A7)/1.8), 0, 512);   //VolumeBasses               
  OCTAVE = analogRead(A4)/146;                       //Octave
  PEDALEB = analogRead(A8)-90;
  
 if(PEDALEON==true){
  PEDALE = constrain((PEDALEB*1.08), 0, 1000);       //ValeurPédale
 }

 if(PEDALEON==false){
  PEDALE = 0;
 }
 
 if(BUTTONSTATES[0]==2){   
  PEDALEON = true;
    }else if(BUTTONSTATES[0]==0){
     PEDALEON = false;
    }

if((BUTTONSTATES[4]==2)&&(BUTTONSTATES[8]==0)&&(BUTTONSTATES[7]==0)){   
  OCTAVE = constrain((OCTAVE+1), 0, 3);
    }
if((BUTTONSTATES[4]==2)&&(BUTTONSTATES[8]==2)&&(BUTTONSTATES[7]==0)){   
  OCTAVE = constrain((OCTAVE-1), 0, 3);
    }
if((BUTTONSTATES[4]==2)&&(BUTTONSTATES[8]==0)&&(BUTTONSTATES[7]==2)){   
  OCTAVE = constrain((OCTAVE+2), 0, 3);
    }
    
if(PEDALEON==true){
  if(BUTTONSTATES[5]==2){   
  digitalWrite(LEDPIN5,HIGH);
  digitalWrite(LEDPIN6,LOW);
  POT3B = POT3BB;
  POT4 = POT4B;
  POT5 = constrain((PEDALE/2+POT5B), 0, 512);        //Basses+Pedale 
    }else if(BUTTONSTATES[6]==2){
  digitalWrite(LEDPIN6,HIGH);
  digitalWrite(LEDPIN5,LOW);  
  POT3B = POT3BB;  
  POT5 = POT5B;
  POT4 = constrain((PEDALE+POT4B), 0, 1000);        //FormeOnde+Pedale  
    }else{ 
  digitalWrite(LEDPIN5,LOW);
  digitalWrite(LEDPIN6,LOW);
  POT4 = constrain((POT3BB+POT4B), 0, 1000);
  POT5 = POT5B;
  POT3B = constrain((PEDALE/2-5), 0, 512);          //Volume+Pedale 
    } 
  }

if(PEDALEON==false){
  digitalWrite(LEDPIN6,LOW);
  digitalWrite(LEDPIN5,LOW);
  POT3B = POT3BB;
  POT4 = constrain(POT4B, 0, 1000);
  POT5 = constrain(POT5B, 0, 512);
}
                                                                                                                                                          

//-------------------------------------------------------Detection appuie long pour verrouiller le clavier--------------------------------------------------

  
  if((POT3B==0)&&((POT0AB-CORRECTION)>1010)&&(COMPTEUR2==false)){
    etat_bouton1=HIGH;
  }else{
    etat_bouton1=LOW;
  } 


  if( etat_bouton1==HIGH && dernier_etat_bouton1==LOW ){
  debut_appui1=millis();
  variable1=true;
  }

  if((variable1==true)&&(etat_bouton1==HIGH)&&(dernier_etat_bouton1==HIGH)){
    if((millis()-debut_appui1) >= temps_defini){
    analogWrite(ledblanc,255); 
    delay(100); 
    analogWrite(ledbleu,255); 
    delay(100);
    analogWrite(ledblanc,0);   
    COMPTEUR2=true;    
    }
  }

  if(etat_bouton1==LOW){
    etat_prg1=LOW;
  }

  dernier_etat_bouton1=etat_bouton1;
  
//------------------------------------------------------Fin detection appuie long pour verrouiller le clavier-----------------------------------------------


//------------------------------------------------------Lissage valeur pitch--------------------------------------------------------------------------------


  // Ajout du dernier echantillon
  total = total + POT0ABB[indice];
  
  // Incrémentation de l'indice
  indice++;
  // si on est à la fin du tableau ...
  if (indice >= nEchantillons) {
    // ...retour au début
    indice = 0;
  }

  // calcul de la moyenne
  moyenne = total / nEchantillons;

//------------------------------------------------------Fin Lissage valeur pitch-----------------------------------------------------------------------------

  if((COMPTEUR2==true)&&(constrain((analogRead(A3)/1.8), 0, 512)>100)){
    COMPTEUR2=false;
  }

  if(COMPTEUR2==true){
    if(COMPTEUR==false){
      POT3=512;    
    }else if((COMPTEUR==true)&&(POT0AB<65)&&(POT3>0)){
     POT3=constrain((POT3-2), 0, 512);
    }else if((COMPTEUR==true)&&(POT0AB>65)&&(POT3<512)){
     POT3=constrain((POT3+2), 0, 512);     
    }
  }else{
    POT3=POT3B;  
  }

Serial.print(POT0); Serial.print("\t");

  buttonUpdate();
  selectCourtLong();
  defOctave();
  antiplop();
}

//---------------------------------------------------------------------------------------------------------------------------------------------------------------

void selectCourtLong(){ 
if(BUTTONSTATES[3]==2){ 
    delay(25);
    if(COMPTEUR==false){               // court
    analogWrite(ledbleu,255);
    analogWrite(ledblanc,255);    
    delay(200);
    analogWrite(ledbleu,0);
    analogWrite(ledblanc,0);    
    delay(100);
    analogWrite(ledbleu,255);
    analogWrite(ledblanc,255); 
    delay(200);
    analogWrite(ledbleu,0);
    analogWrite(ledblanc,0);     
    }
    if(COMPTEUR==true){               // continu
    analogWrite(ledbleu,255);
    analogWrite(ledblanc,255);    
    delay(500);
    analogWrite(ledbleu,0);
    analogWrite(ledblanc,0);  
    }
    COMPTEUR=!COMPTEUR;
  }
    if(POT0AB>65){  // sons continus : avec détection ruban  
     if((OCTAVE>=50)&&(OCTAVE<=65)){
      POT0A = POT0AB;  
     }else{
      POT0A = POT0ABB[indice];
     }
  }
}

//---------------------------------------------------------------------------------------------------------------------------------------------------------------

void defOctave(){

if((POT3/4)>0){
   analogWrite(ledbleu,(POT3/2));
   analogWrite(ledvert,255-(POT3/2)); 
  }else{
   analogWrite(ledbleu,0);
   analogWrite(ledvert,255);  
}

if((OCTAVE>=0)&&(OCTAVE<1)){        // Programme Octave1
  digitalWrite(LEDPIN1,HIGH);
  digitalWrite(LEDPIN2,LOW);
  digitalWrite(LEDPIN3,LOW);
  digitalWrite(LEDPIN4,LOW);             
           POT0=constrain((POT0A/2), 0, 595);        
  }

if((OCTAVE>=1)&&(OCTAVE<2)){     // Programme Octave2
  digitalWrite(LEDPIN1,LOW);
  digitalWrite(LEDPIN2,HIGH);
  digitalWrite(LEDPIN3,LOW);
  digitalWrite(LEDPIN4,LOW);                                      
           POT0=constrain((170+(POT0A/2)), 0, 935);
  }

if((OCTAVE>=2)&&(OCTAVE<3)){     // Programme Octave3 
  digitalWrite(LEDPIN1,LOW);
  digitalWrite(LEDPIN2,LOW);
  digitalWrite(LEDPIN3,HIGH);
  digitalWrite(LEDPIN4,LOW);         
           POT0=constrain((340+(POT0A/2)), 0, 1090);             
  }  

if((OCTAVE>=3)&&(OCTAVE<4)){     // Programme Octave4 
  digitalWrite(LEDPIN1,LOW);
  digitalWrite(LEDPIN2,LOW);
  digitalWrite(LEDPIN3,LOW);
  digitalWrite(LEDPIN4,HIGH);          
           POT0=constrain((510+(POT0A/2)), 0, 1090);     
  }   

if((OCTAVE>=4)&&(OCTAVE<5)){     // Programme Octave5 
  digitalWrite(LEDPIN1,HIGH);
  digitalWrite(LEDPIN2,HIGH);
  digitalWrite(LEDPIN3,HIGH);
  digitalWrite(LEDPIN4,HIGH);          
           POT0=constrain(POT0A, 0, 1090);        
  } 

  if((OCTAVE>=5)&&(OCTAVE<6)){ // Programme Octave6
  digitalWrite(LEDPIN1,LOW);
  digitalWrite(LEDPIN2,LOW);
  digitalWrite(LEDPIN3,LOW);
  digitalWrite(LEDPIN4,LOW);      
           POT0=(POT0A*3);
  }

  if((OCTAVE>=6)&&(OCTAVE<=7)){ // Programme Octave7
  RDLED = random(1, 200);
  if(RDLED==10){
     digitalWrite(LEDPIN1,HIGH);
     digitalWrite(LEDPIN2,LOW);
     digitalWrite(LEDPIN3,LOW);
     digitalWrite(LEDPIN4,LOW); 
  }
  if(RDLED==50){
     digitalWrite(LEDPIN2,HIGH);
     digitalWrite(LEDPIN1,LOW);
     digitalWrite(LEDPIN3,LOW);
     digitalWrite(LEDPIN4,LOW); 
  }
  if(RDLED==100){
     digitalWrite(LEDPIN3,HIGH);
     digitalWrite(LEDPIN1,LOW);
     digitalWrite(LEDPIN2,LOW);
     digitalWrite(LEDPIN4,LOW); 
  }
  if(RDLED==170){
     digitalWrite(LEDPIN4,HIGH);
     digitalWrite(LEDPIN1,LOW);
     digitalWrite(LEDPIN3,LOW);
     digitalWrite(LEDPIN2,LOW); 
  }      
  POT0=(random(20, 520)+(POT0A/2));
  }  
}

//---------------------------------------------------------------------------------------------------------------------------------------------------------------

void antiplop()
{
 
if((COMPTEUR==false)&&(POT0>POT0FIN)&&(OCTAVE<6)){
  POT0FIN++;
}else if((COMPTEUR==false)&&(POT0<POT0FIN)&&(OCTAVE<6)){
  POT0FIN--;
}else{
  POT0FIN=POT0;
}

if((COMPTEUR==false)&&(POT0A>POT0AFIN)&&(OCTAVE<6)){
  POT0AFIN++;
}else if((COMPTEUR==false)&&(POT0A<POT0AFIN)&&(OCTAVE<6)){
  POT0AFIN--;
}else{
  POT0AFIN=POT0A;
}

}

//---------------------------------------------------------------------------------------------------------------------------------------------------------------

void TC4_Handler()
{
  TC_GetStatus(TC1, 1);
     
  if(((POT0>65)&&(POT0AB<1010)&&(COMPTEUR==true))||(COMPTEUR==false)||(FADE>0)){            
      iter+=NOTELOOKUP[POT0FIN];
      iter%=SINLOOKUPSIZE<<16;                
    if(BUTTONSTATES[1]==2){            
      out_DAC0=volumeAdd4096((volumeMult4096(getBufInterp(CREUXLOOKUP,SINLOOKUPSIZE,iter),(FADE*POT4/1650)<<7)),(volumeMult4096(getBufInterp(SINLOOKUP,SINLOOKUPSIZE,iter),(512-FADE*POT4/1650)<<6)));
    }else if(BUTTONSTATES[2]==2){
      out_DAC0=volumeAdd4096((volumeMult4096(getBufInterp(SQUARELOOKUP,SINLOOKUPSIZE,iter),(FADE*POT4/1650)<<7)),(volumeMult4096(getBufInterp(SINLOOKUP,SINLOOKUPSIZE,iter),(512-FADE*POT4/2000)<<6)));
    }else{ 
      out_DAC0=volumeAdd4096((volumeMult4096(getBufInterp(PHOENIXLOOKUP,SINLOOKUPSIZE,iter),(FADE*POT4/1650)<<7)),(volumeMult4096(getBufInterp(SINLOOKUP,SINLOOKUPSIZE,iter),(512-FADE*POT4/1650)<<6)));
    }

    //ASR--------------------------------------------------------------------------------------
    
    if((FADE<FADEMAX)&&(((POT0>65)&&(POT0AB<1010))||((COMPTEUR==false)))){               
      FADE++;
    }else{
      FADE--;
    }
    
    //BASSES------------------------------------------------------------------------------------

    iter2+=NOTELOOKUP[POT0AFIN/2];
    iter2%=SINLOOKUPSIZE<<16;
    out_DAC0=volumeMult4096((volumeAdd4096((out_DAC0),(volumeMult4096(getBufInterp(SINLOOKUP,SINLOOKUPSIZE,iter2),(FADE*POT5/512)<<5)))),(FADE*POT3/512)<<7); 
                                  
  }
   
  //delay,feedback,filtering--------------------------------------------------------------------
  pDelayWriteIndex=delayWriteIndex;                                                            
  delayWriteIndex+=POT1<<9;                                                                     

  //crappy filtering - take a equal mix of current and last sample (2 tap rectangular moving average filter - good for high frequency clicks but not very noticeable otherwise)
  int oldsample=volumeMix4096(getBufInterp(DELAYBUFFER,MAXDELAYBUFFERSIZE,delayWriteIndex),getBufInterp(DELAYBUFFER,MAXDELAYBUFFERSIZE,pDelayWriteIndex),32768); //lit ancien sample
  oldsample=volumeMult4096(oldsample,((POT2*3)>>1)<<6);  //multiplie la quantité de feedback (à 150%)
  out_DAC0=volumeAdd4096(oldsample,out_DAC0);       //ajoutez l'échantillon le plus ancien à la sortie
        
  for(unsigned int i=(pDelayWriteIndex>>16);i<(delayWriteIndex>>16);i++){
    int index=i%MAXDELAYBUFFERSIZE;
    DELAYBUFFER[index]=out_DAC0; 
  }
    
  delayWriteIndex%=MAXDELAYBUFFERSIZE<<16;                                                      
  dacc_write_conversion_data(DACC_INTERFACE, out_DAC0); 
  
}

//---------------------------------------------------------------------------------------------------------------------------------------------------------------

int getBufInterp(short int* ARRAYINPUT, int BUFFSIZE, unsigned int INDEX){
  int LOWER  = INDEX>>16;
  if((INDEX%65536)==0){
    return (ARRAYINPUT[LOWER%BUFFSIZE]);
  }else{
    return linInterp(ARRAYINPUT[LOWER%BUFFSIZE], ARRAYINPUT[(LOWER+1)%BUFFSIZE], INDEX%65536);
  }
}

//---------------------------------------------------------------------------------------------------------------------------------------------------------------

int linInterp(int IN1, int IN2, int WEIGHT){
  return (IN1*(65536-WEIGHT) + IN2*WEIGHT)>>16;
}

//---------------------------------------------------------------------------------------------------------------------------------------------------------------

int volumeMult4096(int INPUTSAMPLE,int VOLFACTOR){
  return constrain((((INPUTSAMPLE-BIAS)*VOLFACTOR)>>16)+BIAS,0,4095);
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------------

int volumeMix4096(int INPUTSAMPLE1,int INPUTSAMPLE2,int MIX){
  return constrain((INPUTSAMPLE1*(65536-MIX)+INPUTSAMPLE2*MIX)>>16,0,4095);
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------------

int volumeAdd4096(int INPUTSAMPLE1,int INPUTSAMPLE2){ 
  return constrain(INPUTSAMPLE1+INPUTSAMPLE2-BIAS,0,4095);
}


//---------------------------------------------------------------------------------------------------------------------------------------------------------------
void buttonUpdate(){
  for(int i=0;i<9;i++){
    boolean buttonState=digitalRead(BUTTONS[i]);
    if(BUTTONSTATES[i]==3){
      BUTTONSTATES[i]=2;
    }
    if((buttonState==LOW)&&(BUTTONSTATES[i]==0)){
      BUTTONSTATES[i]=3;
    }
    if(BUTTONSTATES[i]==1){
      BUTTONSTATES[i]=0;
    }
    if((buttonState==HIGH)&&(BUTTONSTATES[i]==2)){
      BUTTONSTATES[i]=1;
    }
  }
}
https://nicolas-merle.bandcamp.com" onclick="window.open(this.href);return false;
SmashedTransistors
Messages : 216
Inscription : 02 avr. 2015, 00:33

Re: Artefacts dans les sons aigus

Message par SmashedTransistors »

Oups...

Je viens de m'apercevoir que j'ai écris de grosses âneries hier soir. :oups:
Je me suis mélangé les harmoniques et les octaves :palm:

L'aliasing décroit bien moins vite que ce que j'ai indiqué avec du carré et de la dents de scie.


Je voulais juste pouvoir charger le wav à partir de SoundCloud...

Je ne vois rien d'anormal dans ton code, tu fais bien une interpolation linéaire. Pour l'interpolation d'Hermite ça risque d'être compliqué, surtout avec des entiers.

Reste la possibilité d'utiliser des tables multiples (MipMaps). Mais ça risque de prendre trop de mémoire.
Et comme tu affectionnes les glissandi, il faudra interpoler le passage d'une table à l'autre ce qui te prendras plus de CPU.
Avatar de l’utilisateur
Buxi
Messages : 452
Inscription : 13 nov. 2015, 00:18

Re: Artefacts dans les sons aigus

Message par Buxi »

J'ai réduit le problème de manière assez significative !

J'ai mesuré à partir de quelle fréquence le problème d'aliasing apparaissait.

J'ai modifié le code de l'Arduino pour que à partir de cette fréquence, la forme d'onde passait progressivement vers une forme triangulaire.
En effet, en utilisant une forme d'onde triangulaire, j'avais quasiment aucun aliasing mais je garde un son un peu plus brillant qu'avec la forme sinusoïdale.
Si j'utilise une forme d'onde carré par exemple, ça passe un peu plus inaperçu de faire une transition vers une forme d'onde triangulaire que vers une forme d'onde sinusoïdale.

Au final, j'ai un son qui n'est pas encore tout à fait propre, j'ai encore un poil d'aliasing, mais c'est beaucoup beaucoup mieux ^^

Voilà ce que ça donne :

https://soundcloud.com/buxi-cornet/test2" onclick="window.open(this.href);return false;
https://nicolas-merle.bandcamp.com" onclick="window.open(this.href);return false;
Avatar de l’utilisateur
Buxi
Messages : 452
Inscription : 13 nov. 2015, 00:18

Re: Artefacts dans les sons aigus

Message par Buxi »

Bon... bah finalement c'est pas bon :sad2:
Le son est moins "joli"
https://nicolas-merle.bandcamp.com" onclick="window.open(this.href);return false;
Répondre
cron