08.05.2018 Views

Elektor Electronics 2018 01 02 469

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!