Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
2.8<br />
2.6<br />
2.4<br />
2.2<br />
2<br />
1.8<br />
1.6<br />
1.4<br />
1.2<br />
1<br />
0 0.2 0.4 0.6 0.8 1<br />
-1<br />
1<br />
0.8<br />
0.6<br />
0.4<br />
0.2<br />
0<br />
-180 -150 -120 -90 -60 -30 0 30 60 90 120 150 180<br />
-0.2<br />
-0.4<br />
-0.6<br />
-0.8<br />
Figure 2. La fonction e x (en gris) et notre approximation naïve (en rouge)<br />
divergent rapidement pour les grandes valeurs de x.<br />
Figure 3. Une approximation quadratique (en rouge) de la fonction sinus<br />
(en gris) suffit amplement à la représentation d’un oscillateur « vibrato ».<br />
LISTE DES<br />
COMPOSANTS<br />
2 3<br />
1<br />
14 5<br />
Tableau 1. Correspondance entre<br />
les messages MIDI et les actions<br />
de la micro-bobine Tesla.<br />
code CC<br />
action<br />
1 (0x<strong>01</strong>) profondeur du vibrato<br />
5 (0x05) vitesse du portamento<br />
12 (0x0c) vitesse du vibrato<br />
65 (0x41) portamento on/off<br />
72 (0x48) temps de relâchement<br />
84 (0x54) commande de portamento<br />
de maintien (keep-alive) sont transmis<br />
périodiquement – est ignoré. Puisque le<br />
synthé est monophonique, une seule note<br />
peut être jouée à la fois. Une touche pressée<br />
pendant la lecture d’une note joue la<br />
nouvelle note ; relâcher la nouvelle touche<br />
lorsque la précédente est encore pressée<br />
ne relance pas la note précédente.<br />
J’ai implanté des octets Control Codes<br />
(CC) standard chaque fois que possible<br />
(tableau 1). Le code CC 1 p. ex. correspond<br />
d’ordinaire à la molette de modulation<br />
d’un clavier. Le modulateur de<br />
hauteur d’un clavier MIDI n’utilise pas<br />
de code CC, mais sa propre commande<br />
MIDI, à savoir l’octet d’état 0x0b. Le<br />
temps de relâchement (release time)<br />
associé au code 72 définit le temps d’extinction<br />
d’une note après relâchement<br />
de la touche. Le synthé Tesla l’utilise<br />
comme « fondu de sortie » (fade-out)<br />
sur la largeur d’impulsion, mais le résultat<br />
est différent.<br />
Du portamento<br />
réservé au legato<br />
La tâche worker lance l’oscillateur à<br />
basse fréquence (LFO) utilisé pour les<br />
effets de vibrato. Le signal LFO est donc<br />
échantillonné à 1 kHz, une valeur plus<br />
que suffsante pour la fréquence LFO<br />
maximale de 20 Hz.<br />
Véritable abeille affairée, la tâche worker<br />
veille aussi à ce que la modulation de<br />
la hauteur soit correctement appliquée<br />
(±2 demi-tons). Elle surveille par ailleurs<br />
le portamento, implanté ici comme glissement<br />
linéaire d’une note A vers une<br />
note B, la durée du glissement étant<br />
indépendante de la distance entre A<br />
et B. Le portamento n’est en outre appliqué<br />
que si les notes sont jouées legato,<br />
c.-à-d. sans silence entre elles. Cela per-<br />
met de mélanger des notes avec et sans<br />
portamento, sans utiliser de bouton. Le<br />
code CC 84 de commande du portamento<br />
ne fait rien (pour l’instant).<br />
Calculs simplifiés<br />
Pour être euphonique, la modulation de<br />
la hauteur exige des calculs compliqués.<br />
Celui de la valeur de la modulation passe<br />
notamment par une élévation de 2 à la<br />
puissance 1/12, fonction qui n’existe pas<br />
en C. On peut heureusement écrire :<br />
⎛ x ⎞<br />
⎜<br />
⎝12<br />
⎠<br />
2<br />
⎛<br />
⎜<br />
⎝<br />
⎝<br />
⎟<br />
ln<br />
⎜<br />
2<br />
= e<br />
puis simplifier le logarithme népérien :<br />
ln2<br />
⎛ x ⎞<br />
⎜ ⎟<br />
⎝12<br />
⎠ =<br />
⎛ x ⎞<br />
⎜ ⎟<br />
12 ⎠<br />
⎞<br />
⎟<br />
⎠<br />
⎛ x ⎞<br />
⎜ ⎟⋅ ln 2<br />
⎝12<br />
⎠<br />
( ) =<br />
x ⋅ ln( 2)<br />
12 = x ⋅ 0,057762265<br />
L’élévation à la puissance 1/12 se réduit<br />
ainsi à un calcul d’exponentielle :<br />
e ( x⋅0,057762265)<br />
Le langage C a bien une fonction exp(),<br />
mais sa précision ralentit le calcul. Pour<br />
nos besoins, on peut la remplacer par un<br />
développement limité d’ordre 2 (fig. 2) :<br />
y = x ⋅0,057762265<br />
e y ≈ 1+ y + 0,5 ⋅ y 2<br />
Le calcul du sinus d’un angle de phase<br />
pour le LFO se heurte à un problème<br />
similaire, puisque là encore la fonction<br />
sin() s’avère bien trop lente. Un tableau<br />
de valeurs aurait fait l’affaire, mais la<br />
mémoire du PIC est déjà encombrée par<br />
le code du Smalltask. J’ai trouvé sur l’internet<br />
une solution futée qui utilise<br />
l’équation d’une parabole pour approcher<br />
les valeurs de la fonction sinus (fig. 3).<br />
34 janvier/février <strong>2<strong>01</strong>8</strong> www.elektormagazine.fr<br />
vu sur www.frboard.com