Manuel du propriétaire | Native Instruments Reaktor 5 Manuel utilisateur

Ajouter à Mes manuels
224 Des pages
Manuel du propriétaire | Native Instruments Reaktor 5 Manuel utilisateur | Fixfr
REAKTOR CORE
Tutoriel / Manuel Utilisateur
Les informations contenues dans ce document peuvent être modifiées à tout moment
sans préavis et n’engagent pas la responsabilité de Native Instruments Software
Synthesis GmbH. Le Logiciel décrit dans ce document est soumis à l’acceptation
d’une Licence d’Utilisation et ne doit pas être copié sur d’autres supports. Aucune
partie de ce manuel ne peut être copiée, reproduite, transférée ou enregistrée, sous
quelque forme que ce soit et pour quelque usage que ce soit, sans l’accord écrit
explicite de Native Instruments Software Synthesis GmbH. Tous les noms de produits
et d’entreprises sont des marques déposées par leurs propriétaires respectifs.
De plus, si vous lisez ceci, cela signifie que vous avez préféré acheter le logiciel
plutôt que de le voler. C’est grâce aux gens comme vous que nous pouvons continuer à créer de formidables outils et à les mettre à jour . Nous vous en remercions
chaleureusement.
Manuel d’utilisation écrit par: Native Instruments Software Synthesis et Len Sasso
Traduction : Nicolas Sidi (nicolas.sidi@polytechnique.org)
Remerciements spéciaux à l’équipe de bêta-testeurs, dont l’aide nous fut précieuse
non seulement pour trouver et corriger les bogues, mais aussi pour rendre ce produit
encore meilleur.
© Native Instruments Software Synthesis GmbH, 2005. Tous droits réservés.
REAKTOR, REAKTOR 5 et REAKTOR CORE sont des marques de Native Instruments
Software Synthesis.
Germany
USA
Native Instruments GmbH
Schlesische Str. 28
D-10997 Berlin
Germany
info@native-instruments.de
www.native-instruments.de
Native Instruments USA, Inc.
5631 A Hollywood Boulevard
Los Angeles, CA 90028
USA
info@native-instruments.com
www.native-instruments.com
Table des matières
1. Premiers pas avec Reaktor Core ........................................................... 11
1.1. Qu’est-ce que Reaktor Core ? ...................................................11
1.2. Utilisation des cellules core .....................................................12
1.3. Utilisation des cellules core dans un exemple réel ......................15
1.4. Édition basique des cellules core ..............................................17
2. Pénétrer dans l’environnement Reaktor Core .........................................23
2.1. Cellules core évènement et audio ............................................. 23
2.2. Création de votre première cellule core..................................... 25
2.3. Les signaux audio et les signaux de contrôle ..............................37
2.5. Utiliser l’audio comme signal de contrôle...................................51
2.6. Les signaux évènements ......................................................... 53
2.7. Les signaux logiques .............................................................. 57
3. Fondements de Reaktor Core: le modèle du signal core ..........................60
3.1. Les valeurs ........................................................................... 60
3.2. Les évènements .................................................................... 60
3.3. Évènements simultanés ........................................................... 63
3.4. L’ordre de traitement .............................................................. 65
3.5. Retour aux cellules core évènements........................................ 66
4. Les structures avec état interne ...........................................................72
4.1. Les signaux d’horloge ..............................................................72
4.2. Les Object Bus Connections (OBC)........................................... 73
4.3. Initialisation .......................................................................... 77
4.4. Construire un accumulateur d’évènements ................................ 79
4.5. Le mélange d’évènements .......................................................81
4.6. L’accumulateur d’évènements avec reset et initialisation ............. 83
4.7. Réparons le modeleur d’évènements ........................................ 89
5. Le traitement de l’audio en détail ..........................................................92
5.1. Les signaux audio ................................................................... 92
5.2. Le bus d’horloge du taux d’échantillonnage ............................... 94
5.3. Réinjection d’une connexion ................................................... 95
5.4. Réinjection et macros ............................................................ 99
5.5. Les valeurs dénormales .........................................................103
5.6. Les autres mauvais nombres ..................................................108
5.7. Construction d’un filtre passe-bas à 1 pôle ..............................109
6. Le traitement conditionnel .................................................................. 112
6.1. Le routage des évènements....................................................112
REAKTOR CORE – III
6.2. Construction d’un limiteur de signal ........................................ 115
6.3. Construction d’un oscillateur en dents de scie simple ............... 116
7. Les autres types de signaux ................................................................ 118
7.1. Les signaux flottants .............................................................118
7.2. Les signaux entiers ...............................................................120
7.3. Construction d’un compteur d’évènements ...............................123
7.4. Building a rising edge counter macro .......................................124
8. Les tableaux ...................................................................................... 128
8.1. Introduction aux tableaux ......................................................128
8.2. Construction d’un détecteur de signal audio ............................131
8.3. Construction d’un délai .........................................................138
8.4. Les tables ...........................................................................144
9. Construction de structures optimisées ................................................149
9.1. Les Latches et les macros à modulation ..................................149
9.2. Routage et mélange ...............................................................150
9.3. Les opérations numériques ....................................................151
9.4. Conversions entre flottants et entiers ......................................152
Annexe A. Interface utilisateur de Reaktor Core ......................................154
A.1. Les cellules core....................................................................154
A.2. Les macros et modules core ..................................................154
A.3. Les ports core......................................................................155
A.4. Modification de la structure core ............................................155
Annexe B. Le concept de Reaktor Core .................................................... 156
B.1. Les signaux et les évènements ...............................................156
B.2. L’initialisation.......................................................................157
B.3. Les connexions OBC .............................................................157
B.4. Le routage ...........................................................................157
B.5. Le “latching” .......................................................................157
B.6. Les horloges ........................................................................158
Annexe C. Les ports des macros core...................................................... 158
C.1. In .......................................................................................158
C.2. Out .....................................................................................158
C.3. Latch (entrée) ......................................................................159
C.4. Latch (sortie) .......................................................................159
C.5. Bool C (entrée) ....................................................................159
C.6. Bool C (sortie) .....................................................................159
Annexe D. Les ports des cellules core ..................................................... 160
D.1. In (mode audio)....................................................................160
IV – REAKTOR CORE
D.2. Out (mode audio) .................................................................160
D.3. In (mode évènement) ............................................................160
D.4. Out (mode évènement) .........................................................160
Annexe E. Les bus intégrés ..................................................................... 161
E.1. SR.C ...................................................................................161
E.2. SR.R ...................................................................................161
Annexe F. Les modules d’usine ................................................................ 161
F.1. Const ...................................................................................161
F.2. Math > + .............................................................................162
F.3. Math > - ..............................................................................162
F.4. Math > * ..............................................................................162
F.5. Math > / ..............................................................................162
F.6. Math > |x| ............................................................................163
F.7. Math > –x .............................................................................163
F.8. Math > DN Cancel ................................................................163
F.9. Math > ~log .........................................................................163
F.10. Math > ~exp .......................................................................164
F.11. Bit > Bit AND .....................................................................164
F.12. Bit > Bit OR .......................................................................164
F.13. Bit > Bit XOR .....................................................................164
F.15. Bit > Bit << ........................................................................165
F.16. Bit > Bit >> ........................................................................165
F.17. Flow > Router .....................................................................165
F.18. Flow > Compare ..................................................................166
F.19. Flow > Compare Sign ...........................................................166
F.20. Flow > ES Ctl .....................................................................167
F.21. Flow > ~BoolCtl ..................................................................167
F.22. Flow > Merge .....................................................................167
F.23. Flow > EvtMerge .................................................................167
F.24. Memory > Read ..................................................................168
F.25. Memory > Write ..................................................................168
F.26. Memory > R/W Order ..........................................................168
F.27. Memory > Array ..................................................................169
F.28. Memory > Size [ ] ...............................................................169
F.29. Memory > Index .................................................................169
F.30. Memory > Table ..................................................................170
F.31. Macro ................................................................................170
Annexe G. Les macros expertes .............................................................. 171
G.1. Clipping > Clip Max / IClip Max ..............................................171
REAKTOR CORE – V
G.2. Clipping > Clip Min / IClip Min ...............................................171
G.3. Clipping > Clip MinMax / IClipMinMax ....................................171
G.4. Math > 1 div x .....................................................................171
G.5. Math > 1 wrap .....................................................................171
G.6. Math > Imod .......................................................................172
G.7. Math > Max / IMax ...............................................................172
G.8. Math > Min / IMin ................................................................172
G.9. Math > round.......................................................................172
G.10. Math > sign +- ...................................................................172
G.11. Math > sqrt (>0) ................................................................173
G.13. Math > x(>0)^y .................................................................173
G.14. Math > x^2 / x^3 / x^4 .......................................................173
G.15. Math > Chain Add / Chain Mult ............................................173
G.16. Math > Trig-Hyp > 2 pi wrap ................................................173
G.17. Math > Trig-Hyp > arcsin / arccos / arctan ............................. 174
G.18. Math > Trig-Hyp > sin / cos / tan .......................................... 174
G.19. Math > Trig-Hyp > sin –pi..pi / cos –pi..pi / tan –pi..pi ............ 174
G.20. Math > Trig-Hyp > tan –pi4..pi4 .......................................... 174
G.21. Math > Trig-Hyp > sinh / cosh / tanh .................................... 174
G.22. Memory > Latch / ILatch..................................................... 174
G.23. Memory > z^-1 / z^-1 ndc ...................................................175
G.24. Memory > Read [] ..............................................................175
G.25. Memory > Write [] ..............................................................175
G.26. Modulation > x + a / Integer > Ix + a ....................................176
G.27. Modulation > x * a / Integer > Ix * a .....................................176
G.28. Modulation > x – a / Integer > Ix – a .....................................176
G.29. Modulation > a – x / Integer > Ia – x .....................................176
G.30. Modulation > x / a ..............................................................176
G.31. Modulation > a / x ..............................................................177
G.32. Modulation > xa + y............................................................177
Annexe H. Les macros standard .............................................................. 177
H.1. Audio Mix-Amp > Amount .....................................................177
H.2. Audio Mix-Amp > Amp Mod ..................................................177
H.3. Audio Mix-Amp > Audio Mix ..................................................178
H.4. Audio Mix-Amp > Audio Relay ...............................................178
H.5. Audio Mix-Amp > Chain (amount) ..........................................178
H.6. Audio Mix-Amp > Chain (dB) .................................................179
H.7. Audio Mix-Amp > Gain (dB) ...................................................179
H.8. Audio Mix-Amp > Invert ........................................................179
H.9. Audio Mix-Amp > Mixer 2 … 4 ..............................................179
VI – REAKTOR CORE
H.10.
H.11.
H.13.
H.14.
H.15.
H.16.
H.17.
H.18.
H.19.
H.20.
H.21.
H.22.
H.23.
H.24.
H.25.
H.26.
H.27.
H.28.
H.29.
H.30.
H.31.
H.32.
H.33.
H.34.
H.35.
H.36.
H.37.
H.38.
H.39.
H.40.
H.41.
H.42.
H.43.
H.44.
H.45.
H.46.
H.47.
H.48.
H.49.
H.50.
Audio Mix-Amp > Pan ........................................................ 180
Audio Mix-Amp > Ring-Amp Mod ........................................ 180
Audio Mix-Amp > Stereo Mixer 2 … 4 ..................................181
Audio Mix-Amp > VCA .........................................................181
Audio Mix-Amp > XFade (lin) ...............................................181
Audio Mix-Amp > XFade (par) ..............................................182
Audio Shaper > 1+2+3 Shaper .............................................182
Audio Shaper > 3-1-2 Shaper ..............................................182
Audio Shaper > Broken Par Sat ........................................... 183
Audio Shaper > Hyperbol Sat ............................................. 183
Audio Shaper > Parabol Sat ............................................... 183
Audio Shaper > Sine Shaper 4 / 8 ....................................... 184
Control > Ctl Amount ........................................................ 184
Control > Ctl Amp Mod ...................................................... 184
Control > Ctl Bi2Uni .......................................................... 184
Control > Ctl Chain ............................................................185
Control > Ctl Invert .............................................................185
Control > Ctl Mix ...............................................................185
Control > Ctl Mixer 2 ..........................................................185
Control > Ctl Pan .............................................................. 186
Control > Ctl Relay ............................................................ 186
Control > Ctl XFade ........................................................... 186
Control > Par Ctl Shaper .................................................... 186
Convert > dB2AF ...............................................................187
Convert > dP2FF ...............................................................187
Convert > logT2sec ............................................................187
Convert > ms2Hz ...............................................................187
Convert > ms2sec ............................................................. 188
Convert > P2F .................................................................. 188
Convert > sec2Hz ............................................................. 188
Delay > 2 / 4 Tap Delay 4p ................................................. 188
Delay > Delay 1p / 2p / 4p ................................................. 188
Delay > Diff Delay 1p / 2p / 4p ............................................189
Envelope > ADSR ..............................................................189
Envelope > Env Follower .....................................................190
Envelope > Peak Detector ...................................................190
EQ > 6dB LP/HP EQ ...........................................................190
EQ > 6dB LowShelf EQ ......................................................191
EQ > 6dB HighShelf EQ ......................................................191
EQ > Peak EQ ...................................................................191
REAKTOR CORE – VII
H.51.
H.52.
H.53.
H.54.
H.55.
H.56.
H.57.
H.58.
H.59.
H.60.
H.61.
H.62.
H.63.
H.64.
H.65.
H.66.
H.67.
H.68.
H.69.
H.70.
H.71.
H.72.
H.74.
H.75.
H.76.
H.77.
H.78.
H.79.
H.80.
H.81.
H.82.
H.83.
H.84.
H.85.
H.86.
H.87.
H.88.
H.89.
H.90.
H.91.
EQ > Static Filter > 1-pole static HP ....................................191
EQ > Static Filter > 1-pole static HS ....................................192
EQ > Static Filter > 1-pole static LP .....................................192
EQ > Static Filter > 1-pole static LS .....................................192
EQ > Static Filter > 2-pole static AP ....................................192
EQ > Static Filter > 2-pole static BP ....................................192
EQ > Static Filter > 2-pole static BP1 ...................................193
EQ > Static Filter > 2-pole static HP ....................................193
EQ > Static Filter > 2-pole static HS ....................................193
EQ > Static Filter > 2-pole static LP.....................................193
EQ > Static Filter > 2-pole static LS .....................................194
EQ > Static Filter > 2-pole static N ......................................194
EQ > Static Filter > 2-pole static Pk .....................................194
EQ > Static Filter > Integrator .............................................194
Event Processing > Accumulator ..........................................195
Event Processing > Clk Div ..................................................195
Event Processing > Clk Gen .................................................195
Event Processing > Clk Rate ................................................195
Event Processing > Counter .................................................196
Event Processing > Ctl2Gate ...............................................196
Event Processing > Dup Flt / IDup Flt ...................................196
Event Processing > Impulse .................................................196
Event Processing > Separator / ISeparator .............................197
Event Processing > Thld Crossing .........................................197
Event Processing > Value / IValue .........................................197
LFO > MultiWave LFO .........................................................197
LFO > Par LFO ..................................................................198
LFO > Random LFO ............................................................198
LFO > Rect LFO ................................................................198
LFO > Saw(down) LFO ........................................................198
LFO > Saw(up) LFO ...........................................................199
LFO > Sine LFO .................................................................199
LFO > Tri LFO ...................................................................199
Logic > AND .....................................................................199
Logic > Flip Flop............................................................... 200
Logic > Gate2L ................................................................. 200
Logic > GT / IGT ............................................................... 200
Logic > EQ ....................................................................... 200
Logic > GE ....................................................................... 200
Logic > L2Clock ................................................................ 200
VIII – REAKTOR CORE
H.92. Logic > L2Gate ..................................................................201
H.94. Logic > OR ........................................................................201
H.95. Logic > XOR ......................................................................201
H.97. Oscillators > 4-Wave Mst .................................................... 202
H.98. Oscillators > 4-Wave Slv .................................................... 202
H.99. Oscillators > Binary Noise .................................................. 202
H.100. Oscillators > Digital Noise ................................................ 203
H.101. Oscillators > FM Op ......................................................... 203
H.102. Oscillators > Formant Osc ................................................ 203
H.103. Oscillators > MultiWave Osc.............................................. 203
H.104. Oscillators > Par Osc ....................................................... 204
H.105. Oscillators > Quad Osc ..................................................... 204
H.106. Oscillators > Sin Osc ....................................................... 204
H.107. Oscillators > Sub Osc 4 .................................................... 204
H.108. VCF > 2 Pole SV ............................................................. 204
H.109. VCF > 2 Pole SV C .......................................................... 205
H.110. VCF > 2 Pole SV (x3) S .................................................... 205
H.111. VCF > 2 Pole SV T (S) ...................................................... 205
H.112. VCF > Diode Ladder ......................................................... 206
H.113. VCF > D/T Ladder ........................................................... 206
H.114. VCF > Ladder x3 ............................................................. 206
Annexe I. Core cell library ......................................................................208
I.1. Audio Shaper > 3-1-2 Shaper ................................................. 208
I.2. Audio Shaper > Broken Par Sat .............................................. 208
I.3. Audio Shaper > Hyperbol Sat................................................. 208
I.4. Audio Shaper > Parabol Sat................................................... 209
I.5. Audio Shaper > Sine Shaper 4/8 ............................................ 209
I.6. Control > ADSR ................................................................... 209
I.7. Control > Env Follower............................................................210
I.8. Control > Flip Flop ................................................................210
I.9. Control > MultiWave LFO ........................................................211
I.10. Control > Par Ctl Shaper.......................................................211
I.11. Control > Schmitt Trigger ......................................................211
I.12. Control > Sine LFO ..............................................................212
I.13. Delay > 2/4 Tap Delay 4p .....................................................212
I.14. Delay > Delay 4p .................................................................212
I.15. Delay > Diff Delay 4p ...........................................................212
I.16. EQ > 6dB LP/HP EQ ............................................................213
I.17. EQ > HighShelf EQ ...............................................................213
I.18. EQ > LowShelf EQ ...............................................................213
REAKTOR CORE – IX
I.19.
I.20.
I.21.
I.22.
I.23.
I.24.
I.25.
I.26.
I.27.
I.28.
I.29.
I.30.
I.31.
I.32.
I.33.
I.34.
I.35.
I.36.
I.37.
I.38.
I.39.
I.40.
I.41.
I.42.
I.43.
I.44.
I.45.
I.46.
I.47.
EQ > Peak EQ .....................................................................213
EQ > Static Filter > 1-pole static HP .....................................214
EQ > Static Filter > 1-pole static HS ......................................214
EQ > Static Filter > 1-pole static LP ......................................214
EQ > Static Filter > 1-pole static LS ......................................214
EQ > Static Filter > 2-pole static AP ......................................215
EQ > Static Filter > 2-pole static BP......................................215
EQ > Static Filter > 2-pole static BP1 ....................................215
EQ > Static Filter > 2-pole static HP ......................................215
EQ > Static Filter > 2-pole static HS .....................................216
EQ > Static Filter > 2-pole static LP ......................................216
EQ > Static Filter > 2-pole static LS ......................................216
EQ > Static Filter > 2-pole static N........................................216
EQ > Static Filter > 2-pole static Pk ......................................217
Oscillator > 4-Wave Mst .......................................................217
Oscillator > 4-Wave Slv ........................................................217
Oscillator > Digital Noise ......................................................218
Oscillator > FM Op ..............................................................218
Oscillator > Formant Osc ......................................................218
Oscillator > Impulse ............................................................219
Oscillator > MultiWave Osc ...................................................219
Oscillator > Quad Osc ..........................................................219
Oscillator > Sub Osc ........................................................... 220
VCF > 2 Pole SV C ............................................................. 220
VCF > 2 Pole SV T.............................................................. 220
VCF > 2 Pole SV x3 S ..........................................................221
VCF > Diode Ladder ............................................................221
VCF > D/T Ladder .............................................................. 222
VCF > Ladder x3................................................................. 222
Index ......................................................................................................223
X – REAKTOR CORE
1. Premiers pas avec Reaktor Core
1.1. Qu’est-ce que Reaktor Core ?
Reaktor Core Reaktor Core est une nouvelle couche logicielle de fonctionnalités de Reaktor avec un nouvel ensemble de fonctions. Comme il y a déjà
un ancien niveau de fonctionnalités, à partir de maintenant nous appellerons
ces deux niveaux respectivement niveau core (noyau en anglais) et niveau
primaire. De plus, lorsque nous parlerons de “structure de niveau primaire”,
nous entendrons par là la structure interne d’un instrument ou d’une macro,
mais pas celle d’un ensemble.
Les fonctions de Reaktor Core ne sont pas directement compatibles avec
celles du niveau primaire de Reaktor, une interface est nécessaire entre les
deux. Cette interface est constituée par les cellules core.
Les cellules core se situent dans les structures du niveau primaire, ressemblant
et se comportant de façon similaire aux autres modules du niveau primaire.
Voici un exemple de structure, utilisant une cellule core HighShelf EQ, qui
est différente de la version habituelle du niveau primaire dans sa façon de
répondre aux contrôles de fréquence et d’amplification:
À l’intérieur des cellules core se trouvent des structures Reaktor Core, qui
constituent un moyen efficace d’implémenter des fonctionnalités personnalisées de traitement du signal (ou “DSP”) de bas niveau, et permettent aussi
de construire des structures de traitement du signal à plus grande échelle à
partir de ces mêmes fonctionnalités. Ces structures seront étudiées plus loin
dans le texte.
Bien que l’une des principales caractéristiques de Reaktor Core soit de pouvoir
construire ces structures de DSP de bas niveau, elles ne se limitent pas à cela.
Si vous n‘êtes pas un expert en traitement du signal, nous vous avons facilité
le travail en créant une librairie de modules que vous pouvez connecter dans
les structures core de la même façon qu‘au niveau primaire, et une librairie
REAKTOR CORE – 11
de cellules core que vous pouvez immédiatement utiliser dans les structures
du niveau primaire.
À dire vrai, chez Native Instruments, nous n’avons plus vraiment envie
de créer des milliers de nouveaux modules de niveau primaire pour les
nouvelles versions de Reaktor. Nous préférons les construire en utilisant notre nouvelle technologie Reaktor Core et les livrer sous forme
de cellules core. Vous trouverez déjà un ensemble de nouveaux filtres,
enveloppes, effets, etc., dans la librairie de cellules core.
1.2. Utilisation des cellules core
La librairie de cellules core est accessible depuis les structures du niveau
primaire via un clic droit sur le fond de l’écran, puis en choisissant le sousmenu Core Cell:
Comme vous pouvez le voir, différents types de cellules core peuvent être
utilisés comme des modules classiques de niveau primaire.
Une limitation importante des cellules core est que vous ne pouvez pas
les utiliser à l’intérieur des boucles d’évènements. Toute boucle d’évènement traversant une cellule core sera boquée par Reaktor.
Vous avez aussi la possibilité d’insérer des cellules core qui ne sont pas dans
la librairie. Pour ce faire, utilisez la commande Load… du même menu Core
Cell:
12 – REAKTOR CORE
Avant de pouvoir charger des fichiers de cellules core, il vous sauvegarder ces
cellules core. Voici comment faire: effectuez un clic droit sur une cellule core
et sélectionnez Save Core Cell As:
Vous pouvez également placer vos propres cellules core dans le menu pour
éviter d’utiliser la commande Load. Pour ce faire, placez-les dans le sousdossier “Core Cells” de votre dossier utilisateur. Encore mieux: mettez-les non
pas directement dans le dossier “Core Cells” mais dans des sous-dossiers de
votre crû. Voici un exemple de ce type d’organisation:
REAKTOR CORE – 13
Dans cet exemple, “My Documents\Reaktor 5” est le dossier utilisateur. Sur
votre ordinateur, il peut porter un autre nom, en fonction du choix que vous
avez effectué lors de l’installation ou dans les préférences de Reaktor. Le
dossier “Core Cells” se trouve dans ce dossier. S’il n’existe pas, créez-le
manuellement.
Dans ce dossier, nous en observons trois autres: “Effects”, “Filters” et “Oscillators”. À l’intérieur de ces dossiers se trouvent les fichiers des cellules core
qui seront affichées dans la partie utilisateur du menu Core Cell:
14 – REAKTOR CORE
Le contenu du menu est scanné lors du démarrage de Reaktor. Si vous
ajoutez de nouveaux fichiers dans ces dossiers, vous devez redémarrer
Reaktor pour qu’il les prenne en compte.
Les dossiers vides ne sont pas affichés dans le menu, ils doivent contenir
des fichiers pour être affichés.
Vous ne devez en aucun cas placer vos propres fichiers dans la librairie
système. Le dossier de la librairie système peut être modifié voire complètement effacé lors des mises à jour, et vos fichiers seraient alors perdus!
La librairie utilisateur (en anglais user library) est l’endroit indiqué pour
placer tout fichier non inclus dans l’application elle-même.
1.3. Utilisation des cellules core dans un exemple réel
Nous allons prendre ici un instrument Reaktor construit uniquement avec des
modules de niveau primaire et nous allons le modifier en y plaçant quelques
cellules core. Dans le dossier “Core Tutorial Examples” du dossier d’installation
de Reaktor, trouvez l’ensemble One Osc.ens et ouvrez-le. Cet ensemble est
constitué d’un seul instrument ayant la structure interne suivante:
Comme vous pouvez le constater, il s’agit d’un synthétiseur soustractif très
simple doté d’un oscillateur, d’un filtre et d’une enveloppe. Nous allons remplacer l’oscillateur par un autre, plus puissant. Faites un clic droit sur le fond
et sélectionnez Core Cell > Oscillator > MultiWave Osc:
REAKTOR CORE – 15
La caractéristique la plus importante de cet oscillateur est qu’il fournit simultanément plusieurs formes d’ondes analogues calées en phase. Nous souhaitons
utiliser leur mélange en lieu et place d’un simple oscillateur en dents de scie.
Fort heureusement, il existe déjà un mixeur accessible via Insert Macro >
Classic Modular > 02 Mixer Amp > Mixer – Simple – Mono:
Connectons maintenant ensemble le mixeur et l’oscillateur et remplaçons
l’oscillateur en dents de scie par leur combinaison:
Passez en vue panel. Vous pouvez maintenant utiliser les quatre potentiomètres
du mixeur pour modifier le mélange des formes d’onde.
Modifions encore l‘instrument: ajoutons-lui un effet de chorus basé sur Reaktor
Core. Nous écrivons “basé sur Reaktor Core” parce que, même si le chorus
lui-même est construit en tant que cellule core, la partie contenant les contrôles du panneau de ce chorus est encore construite avec les fonctions du
niveau primaire. Ceci est dû au fait que les structures Reaktor Core ne peuvent
pas définir leurs propres panneaux de contrôles: ces panneaux doivent être
construits au niveau primaire.
16 – REAKTOR CORE
Sélectionnez Insert Macro > RX Based > Chorus > SE IV S et insérez-le après
le module Voice Combiner:
Si vous jetez un œil à l’intérieur du chorus, vous verrez la cellule core du
chorus et les contrôles du panneau:
1.4. Édition basique des cellules core
Penchons-nous maintenant sur l‘édition des cellules core. Nous allons commencer avec quelque chose de simple, comme la modification d’une cellule
core existante pour l’adapter à vos besoins. Tout d’abord, double-cliquez sur
le MultiWave Osc pour pénétrer à l’intérieur:
Entrées
Normal
Sorties
REAKTOR CORE – 17
Ce que vous voyez maintenant est une structure Reaktor Core. Les trois zones séparées par des lignes verticales délimitent trois types de modules: les
modules d’entrée (à gauche), les modules de sortie (à droite) et les modules
normaux (au centre).
Les entrées et les sorties peuvent être déplacées uniquement verticalement,
et leur ordre correspond à l’ordre dans lequel elles apparaissent à l’extérieur
de la structure. Les modules normaux (au centre donc) peuvent être déplacés dans n’importe quelle direction. Par exemple, placez l’entrée FM sous
l’entrée PW:
Vous pouvez maintenant double-cliquer sur le fond pour remonter à la structure extérieure du niveau primaire et observer la modification de l’ordre des
ports d’entrée.
Revenons au niveau core et n’oublions pas de remettre les ports d’entrée
dans l’ordre originel:
Comme vous l’avez probablement déjà remarqué, si vous déplacez les modules,
les trois parties de la structure core peuvent s’agrandir afin de toujours englober
tous les modules. Cependant, elles ne se réduisent pas automatiquement, ce
qui peut les conduire à devenir beaucoup, beaucoup trop larges:
18 – REAKTOR CORE
Vous pouvez les réduire via un clic droit sur le fond et en sélectionnant la
commande Compact Board:
Maintenant que nous savons déplacer les composants d’une cellule core, et
même réarranger l’ordre de ses ports d’entrée et de sortie, essayons-nous à
quelques autres manipulations.
Pour une cellule core qui dispose de sorties audio, il est possible de commuter
le type de ses entrées entre audio et évènement (vous trouverez une explication
détaillée de leur différence plus loin dans le texte). Dans l’exemple ci-dessus,
nous avons utilisé un module MulitWave Osc qui dispose d’entrées et de sorties audio. Mais dans notre cas, nous n’avons pas vraiment besoin d’entrées
audio, puisque le seul élément connecté à l’oscillateur est le potentiomètre
de pitch (hauteur tonale). Ne serait-il pas plus économique (en ressources
REAKTOR CORE – 19
processeur) d’utiliser au moins partiellement des évènements ? La réponse
est évidemment “Oui !”, aussi allons-nous le faire de ce pas.
Nous vous suggérons de changer au moins les entrées P et PM pour les passer en mode évènement. Cela devrait permettre la plus grande économie en
puissance processeur. Double-cliquez sur le module d’entrée P pour ouvrir
sa fenêtre de propriétés:
Double-cliquez ici
Ouvrez la page de fonction de la fenêtre de propriétés (si nécessaire en cliquant
sur le bouton
). Vous devriez maintenant voir s‘afficher la propriété de
mode de signal (Signal Mode):
Réglez-la sur event (évènement en anglais). Remarquez comment le gros point
à gauche du module d’entrée passe du noir au rouge pour indiquer que l’entrée
est désormais en mode évènement (c’est plus visible lorsque le module n’est
pas sélectionné, cliquez quelque part ailleurs pour le désélectionner):
Le bouton devient rouge
Cliquez maintenant sur l’entrée PM et passez-la aussi en mode évènement.
Si vous le souhaitez, vous pouvez aussi passer les deux entrées restantes en
mode évènement. Après avoir fini, double-cliquez sur le fond de la structure
20 – REAKTOR CORE
pour revenir au niveau primaire et observez la nouvelle couleur rouge des ports
et l’utilisation diminuée du processeur.
Il est parfois absurde de commuter un port d‘un type à l‘autre. Par exemple,
une entrée recevant véritablement un signal audio (contenant un vrai son, pas
simplement un signal de contrôle tel qu‘une enveloppe calée sur le son) ne
doit pas être commutée en mode évènement. Non seulement c’est absurde,
mais de plus cela risque de ruiner le fonctionnement du module. Un autre cas
absurde: lorsque vous avez une entrée de type évènement vraiment sensible
aux évènements, p.ex. une entrée de contrôle sur une enveloppe (comme les
entrées Gate des enveloppes du niveau primaire de Reaktor). Si vous essayez
de les passer en mode audio, elles ne fonctionneront plus correctement.
Parallèlement aux cas où il est évident que la commutation du type de port
est absurde, il peut y avoir des cas dans lesquels elle est autorisée mais les
modules refusent alors de fonctionner. Cependant, ces cas sont normalement
très rares, ou bien c’est qu’une une erreur s’est glissée dans l’implémentation
du module. Généralement, la commutation du type de port fonctionne. Nous
vous proposons la règle de commutation suivante:
Dans une cellule core bien conçue, une entrée de contrôle audio peut
être commutée en évènement sans aucun problème. Une entrée de type
évènement peut être commutée en audio seulement si elle n’a pas de
fonction de commande.
Pour économiser du processeur, vous pouvez aussi déconnecter les sorties
audio dont vous n’avez pas besoin, désactivant ainsi les parties inutilisées
de la structure Reaktor Core. Vous devez effectuer cette opération depuis
l’intérieur de la structure – à l’extérieur, les connexions n’ont pas d’effet sur
la désactivation des éléments de la structure core.
Dans notre exemple, décidons que nous n’avons pas besoin des quatre sorties
mais seulement de la dent de scie et du train d’impulsions. Nous pouvons
aller dans dans le MultiWace Osc et déconnecter les sorties inutiles. La déconnexion est une opération très simple: il suffit de cliquer sur le port d’entrée
REAKTOR CORE – 21
de la connexion, de déplacer la souris n’importe où sauf sur un port de sortie
et de relâcher le bouton. Commençons avec la sortie “Tri” (pour “triangle”).
Cliquez sur le port de la sortie “Tri” et déplacez la souris sur un endroit vide
du fond de l’écran.
Il y a un autre moyen de supprimer une connexion. Cliquez sur la connexion
entre la sortie “sine” du MultiWave Osc et la sortie “Sin” de la cellule core,
de façon à la sélectionner (elle change de couleur):
Vous pouvez maintenant appuyer sur la touche Suppr de votre clavier pour
supprimer la connexion:
Après avoir supprimé les deux câbles, l’indicateur d’utilisation du processeur
devrait descendre encore un peu.
Et si vous changez d’avis et décidez de les reconnecter ? C’est tout aussi
simple: cliquez sur l’entrée ou la sortie que vous souhaitez reconnecter, déplacez la souris sur le port opposé de la connexion et relâchez le bouton. Par
exemple, cliquez sur la sortie “tri” du MultiWave Osc et déplacez la souris
jusqu’au module de sortie “Tri”. La connexion est rétablie:
22 – REAKTOR CORE
Bien sûr, les possiblités de modification des cellules core sont bien plus
étendues que ce que nous venons de décrire. Vous en apprendrez beaucoup
plus en continuant votre lecture.
2. Pénétrer dans l’environnement Reaktor Core
2.1. Cellules core évènement et audio
Les cellules core existent en deux parfums: Évènement et Audio (en anglais
Event et Audio). Les cellules core évènements ne peuvent recevoir en entrée
que des signaux évènements du niveau primaire, et ne produisent en sortie
que des signaux évènements du niveau primaire, en réponse aux premiers.
Les cellules core audio peuvent recevoir en entrée des signaux évènements
et audio, mais ne produisent en sortie que des signaux audio:
Parfum
Évènement
Audio
Entrées
Sorties
Évènements Évènements
Évènements/
Audio
Audio
Sources d’Horloge
Désactivées
Activées
Ainsi, les cellules audio permettent d’implémenter oscillateurs, filtres, enveloppes et autres effets, tandis que les cellules évènements ne servent qu’aux
tâches de traitement des évènements.
Les modules HighShelf EQ et MultiWave Osc que nous avons déjà vus sont
des exemples de cellules core audio (elles ont des sorties audio).
REAKTOR CORE – 23
Et voici un exemple de cellule core évènement:
Ce module est un modeleur parabolique (en anglais “parabolic shaper”) pour
les signaux de contrôle; il peut par exemple être utilisé pour le modelage de
courbes de vélocité ou de signaux de LFO.
Nous avons écrit ci-dessus que les cellules core évènements ne servent qu’aux
tâches de traitement des évènements. Les sources d‘horloge de ces cellules
étant désactivées dans ces cellules (cf. tableau ci-dessus), elles ne peuvent
générer leurs propres évènements et ne peuvent donc servir à implémenter des
modules comme des enveloppes ou des LFOs calés sur des évènements. Si
vous souhaitez implémenter de tels modules, nous vous suggérons de prendre
une cellule audio et de convertir sa sortie en évènements grâce à l’un des
convertisseurs audio-évènement du niveau primaire:
La structure ci-dessus utilise d’abord une cellule core audio implémentant
une enveloppe ADSR, puis convertit sa sortie sous forme d’évènements pour
moduler un oscillateur.
24 – REAKTOR CORE
2.2. Création de votre première cellule core
Pour créer une nouvelle cellule core, faites un clic droit sur le fond de l’écran
dans la structure du niveau primaire et sélectionnez Core Cell > New Audio
ou (pour les cellules évènements) Core Cell > New Event:
Nous allons construire une nouvelle cellule core à partir du modèle inclus
dans le module One Osc.ens que vous avez déjà manipulé. Nous utiliserons
la nouvelle version de cet ensemble (avec le nouvel oscillateur et le chorus)
que nous avons construite précédemment, mais si vous ne l’avez pas sauvegardée, ne vous en faites pas, vous pouvez faire la même chose à partir du
One Osc.ens original.
Comme vous pouvez le constater dans cet ensemble, nous modulons l’entrée
P du filtre, qui n’accepte que des signaux évènements. Nous n’utilisons pas
la version FM du même filtre car d’une part elle se comporte moins bien aux
fréquences de coupure élevées, et d’autre part l’échelle de modulation de
l’entrée FM est linéaire, ce qui donne généralement de moins bons résultats
musicaux pour une modulation par enveloppe (ce que l’on appelle habituellement – mais incorrectement – les “enveloppes lentes”):
REAKTOR CORE – 25
Comme nous voulons moduler une entrée évènement, nous avons besoin de
convertir l’enveloppe en signal évènement, ce qui est accompli par le convertisseur A/E. La vitesse de contrôle en résultant est relativement basse. Bien
entendu, nous aurions pu utiliser un convertisseur fonctionnant à une vitesse
plus élevée (et consommant plus de puissance processeur), mais au lieu de
cela nous allons remplacer ce filtre par un autre que nous construirons sous
forme de cellule core. Nous aurions pu aussi en prendre un directement dans
la librairie existante de cellules core, mais nous n‘aurions pas le bonheur de
fabriquer notre première structure Reaktor Core. Empruntons donc un chemin
plus ardu.
Commençons par créer une nouvelle cellule core audio en sélectionnant Core
Cell > New Audio. Une cellule core audio vide apparaît:
Double-cliquez dessus pour faire apparaître sa structure Reaktor Core interne,
qui est… vide. Vous vous en rappelez sûrement, les trois zones sont (de gauche
à droite) les entrées, les modules normaux et les sorties:
Attention, nous allons maintenant insérer notre premier module dans une
structure core! Effectuez un clic droit dans la zone “normale” (au centre donc)
pour appeler le menu de création de modules:
26 – REAKTOR CORE
Le premier sous-menu est nommé Built In Module et permet d’accéder aux
modules d’usine inclus dans Reaktor Core, qui sont généralement conçus pour
effectuer des tâches de très bas niveau, et dont nous discuterons plus loin.
Le second sous-menu, appelé Expert Macro, contient les macros prévues pour
être utilisées avec les modules de base pour les opérations de bas niveau.
Donc oublions-les aussi pour l’instant.
Le troisième sous-menu s’appelle Standard Macro et semble être celui qu’il
nous faut:
REAKTOR CORE – 27
La section VCF pourrait bien être la bonne, jetons-y un œil:
Peut-être pourrions-nous utiliser le module Diode Ladder (Échelle de diodes)
? Allons-y:
En fait, ce n’est peut-être pas la meilleure idée, car le son du Diode Ladder
doit être vraiment différent de celui du module filtre de niveau primaire que
nous voulons remplacer. L’échelle de diodes est un filtre avec au minimum
4 pôles (24 dB/octave) et celui que nous voulons remplacer a seulement 2
pôles (12 dB/octave). Supprimons donc ce Diode Ladder. Pour ce faire, vous
avez deux options. La première est de faire un clic droit sur le module puis
de choisir Delete Module:
28 – REAKTOR CORE
La seconde est de le sélectionner en cliquant dessus, puis d’appuyer simplement sur la touche Suppr.
Après avoir supprimé le Diode Ladder, insérons à la place un filtre 2 Pole SV
C depuis le même menu:
Celui-ci est bien un filtre à 2 pôles à variables d’état, semblable à celui
que nous voulons remplacer (avec quelques différences tout de même, mais
assez subtiles). L’important est que nous puissions moduler celui-ci avec de
l’audio. Nous aurons bien sûr aussi besoin d’entrées et de sorties pour notre
cellule core.
Pour être exact, nous aurons probablement besoin d’une seule sortie: le signal
LP (passe-bas). Pour créer cette sortie, effectuez un clic droit dans la zone
de sortie (à droite):
REAKTOR CORE – 29
Dans cette zone, vous ne pouvez créer qu’un type de module, donc sélectionnez-le. La structure ressemble maintenant à ceci:
Double-cliquez sur le module de sortie pour ouvrir la fenêtre de propriétés
(si elle n’est pas déjà ouverte). Saisissez “LP” dans le champ de nom (Label
sur l’écran):
Connectez maintenant la sortie LP du filtre au module de sortie:
Passons aux entrées. La première entrée sera le signal audio d’entrée. Faites
un clic droit sur le fond de l’écran dans la zone d’entrée et sélectionnez New
> In:
30 – REAKTOR CORE
L’entrée est automatiquement créée avec le bon mode –comme vous l‘indique
le gros point noir, il s‘agit d‘une entrée audio. Vous pouvez la renommer “In”
de la même façon que pour le module “LP”, puis la connecter à la première
entrée du module filtre:
Pour la deuxième entrée du module filtre Reaktor Core, les choses se corsent.
Comme vous pouvez le voir, cette entrée est nommée “F”, pour “fréquence”.
Si vous maintenez le bouton de la souris enfoncé sur cette entrée (assurezvous que le bouton
est activé), vous voyez apparaître le texte d’info
“Cutoff frequency (Hz)” (“Fréquence de coupure (Hz)”):
Nous savons que la fréquence de coupure de notre module filtre du niveau
primaire est contrôlée par une entrée appelée “P” et utilise une échelle de
demi-tons, comme vous pouvez l’observer dans le texte d’info de l’entrée.
Visiblement, nous avons besoin de convertir les demi-tons en Hertz. Nous
pouvons le faire au niveau primaire (avec le module Expon. (F)) ou bien à
l’intérieur de notre structure Reaktor Core. Comme nous sommes en train
d’apprendre à construire une structure Reaktor Core, choisissons la deuxième
option. Effectuez un clic droit sur le fond de la zone normale (au cent…) et
sélectionnez Standard Macro > Convert > P2F:
REAKTOR CORE – 31
Comme son nom l’indique (et comme le texte d’info le confirme), ce module
convertit une échelle “P” en échelle “F” –exactement ce dont nous avons
besoin! Créons donc une deuxième entrée nommée “P” et connectons-la via
le module P2F:
Tout cela devrait être suffisant. Mais, dans notre instrument, il reste le potentiomètre “P Cutoff”, définissant la fréquence de coupure de base du filtre qui est
ajoutée au signal de modulation venant de l’enveloppe. Ce signal est converti
en signal évènement au niveau primaire pour pouvoir alimenter l’entrée “P”
du filtre. Cette conversion n’est évidemment plus nécessaire, nous pouvons
retirer le module A/E et brancher directement le signal audio dans l’entrée
audio “P” de notre nouveau filtre. Cette méthode est loin de nous déplaire,
mais nous vous en suggérons une autre… pour la beauté du geste.
Nous allons partir d’une entrée “P” en mode évènement et une entrée de
modulation en mode audio. Si vous vous rappelez de notre discussion à propos
des “enveloppes lentes”, vous comprendrez pourquoi nous suggérons d’appeler
cet autre module d’entrée “PM”, et non “FM”, et d’utiliser une modulation
en demi-tons (le “P” vient de “Pitch”, “hauteur tonale” en anglais). C’est
exactement ce qui se passe dans l’instrument original: nous additionnions
le signal d’enveloppe avec le signal “P Cutoff” et branchions la somme dans
l’entrée “P”.
Passons donc notre entrée “P” en mode énèvement (nous avons déjà décrit
plus haut comment faire) et ajoutons une entrée “PM” en mode audio:
Comme un utilisateur du niveau primaire de Reaktor pourrait s’y attendre,
nous devrions pouvoir additonner les deux signaux tout de suite. Mais dans
32 – REAKTOR CORE
Reaktor Core, le module Add est considéré comme un module de bas niveau
et suppose quelque connaissance des principes fondamentaux de fonctionnement du bas niveau de Reaktor Core. Ils ne sont pas si compliqués que cela,
et nous les décrirons. Mais à ce stade, ils ne feraient que vous encombrer
l‘esprit. Utilisez plutôt un mixeur de signaux de contrôle, par exemple Standard
Macro > Control > Ctl Mix:
La dernière entrée dont nous avons besoin est la résonance. Sa forme audio
ne nous est d‘aucune utilité, utilisons donc un évènement:
Il nous reste à donner un nom à notre cellule core. Pour accéder à ses propriétés, cliquez sur le fond si la fenêtre Properties est déjà ouverte, sinon faites
un clic droit sur le fond et choisissez la commande Owner Properties:
REAKTOR CORE – 33
Vous pouvez alors saisir un texte dans le champ de nom (Label):
Double-cliquez sur le fond pour voir le résultat:
Le module a fière allure! On pourrait objecter que l’entrée du signal audio
est en haut de la cellule core, alors qu’elle était en bas du module filtre du
niveau primaire. Honnêtement, ce n’est pas un gros problème; si vous tenez
absolument à arranger cela, ce n’est pas très compliqué, vous savez déjà comment faire. Mais faisons-le ensemble, nous en profiterons pour vous montrer
en chemin une nouvelle fonction.
Retournons donc à l’intérieur de la structure core et commençons par déplacer
l’entrée du signal audio tout en bas:
Cela suffit, si ce n’est que maintenant un câble diagonal traverse toute la
structure, ce qui n’est pas très seyant. Voilà comment nous allons résoudre
ce problème.
34 – REAKTOR CORE
Effectuez un clic droit sur la sortie du module d’entrée In et sélectionnez la
commande Connect to New QuickBus:
Vous devriez maintenant voir ceci:
La fenêtre Properties devrait également afficher les propriétés du QuickBus
que vous venez de créer. La propriété la plus utile du QuickBus est bien sûr
de pouvoir le renommer (les autres propriétés sont assez avancées, laissonsles tranquilles pour l’instant). Vous pourrez rouvrir la fenêtre Properties plus
tard en double-cliquant sur le QuickBus.
Bien que vous puissiez renommer ce QuickBus, nous pensons que son nom
actuel est parfaitement approprié, puisqu’il correspond au nom de l’entrée qui
lui est connectée. Les QuickBus sont internes à la structure en question, il n’y
a donc pas de risque de collisions de noms si des QuickBus des structures
voisines ou parentes portent le même nom.
Étape suivante: effectuer un clic droit sur l’entrée du haut du module filtre 2
Pole SV C et de sélectionner Connect to QuickBus > In:
REAKTOR CORE – 35
Dans le menu ci-dessus, In n’est rien d’autre que le nom du QuickBus auquel
vous vous connectez. Ici, vous ne souhaitez pas créer de nouveau QuickBus,
mais connecter l’entrée en question au QuickBus déjà existant. Voilà à quoi
votre structure doit ressembler:
À la place du câble diagonal hideux, nous avons maintenant deux jolies références indiquant qu’elles sont connectées via un QuickBus nommé In.
Revenons au niveau primaire et modifions notre structure pour utiliser le filtre
que nous venons de construire. Vous pouvez vous débarrasser des modules
Add et A/E. Et voilà le résultat:
Notre nouvelle structure utilise un peu plus de puissance processeur, n’est-ce
pas ? N’oubliez pas que ce filtre est modulé par un signal audio en échelle de
demi-tons. S’il ne vous plaît pas, vous pouvez revenir à l’ancienne structure ou
utiliser le module filtre Multi 2 pole FM du niveau primaire (les “enveloppes
lentes”, vous vous rappelez ?), mais nous espérons qu’il vous plaît. Dans le
cas contraire, il y a plein d’autres filtres avec de nouvelles fonctions qui vous
plairont peut-être plus. Et si vous n’aimez pas les nouveaux filtres Reaktor Core,
il y a une foule d’autres modules Reaktor Core que vous pouvez essayer.
36 – REAKTOR CORE
2.3. Les signaux audio et les signaux de contrôle
Avant de poursuivre, nous devons regarder d’un peu plus près une convention
particulière utilisée dans les Standard Macros de la librairie Reaktor Core. Les
modules qui s’y trouvent peuvent être catégorisés selon le type de signaux
qu’ils traitent: audio, de contrôle, évènement et logique. Nous expliquerons les
signaux évènements et logiques un peu plus tard, concentrons nous d’abord
sur les deux premiers types de signaux.
Les signaux audio sont les signaux transportant de l’information audio (sic). Ils
comprennent les signaux sortant des oscillateurs, filtres, amplificateurs, delays,
etc. Ainsi, les modules comme les filtres, amplificateurs, saturations et autres
delays doivent normalement recevoir en entrée un signal audio à traiter.
Les signaux de contrôle ne transportent pas d’audio, ils servent juste à contrôler certains modules. Par exemple, les sorties des enveloppes, des LFOs,
les signaux de pitch (hauteur tonale) et de vélocité des notes du clavier ne
transportent aucun son mais peuvent servir à contrôler la fréquence de coupure
ou la résonance d’un filtre, la durée d’un délai ou quoi que ce soit d’autre.
Ainsi, les ports d’entrée de fréquence de coupure ou de résonance d’un filtre
ou de durée de délai sont supposés recevoir des signaux de contrôle.
Voilà un exemple de module filtre Reaktor Core que vous connaissez déjà:
L’entrée supérieure du filtre est prévue pour recevoir le signal audio à filtrer
et attend donc un signal de type audio. Les entrées F et Res sont visiblement
de type contrôle. Les sorties du filtre produisent différentes sortes de signaux
audio filtrés, elles sont donc toutes de type audio.
Un module oscillateur sinusoïdal, quant à lui, dispose d’une unique entrée de
contrôle (pour la fréquence) et d’une unique sortie audio:
Si nous observons le module Rect LFO, il dispose de deux entrées de contrôle
(pour la fréquence et la largeur de l’impulsion, la troisième entrée étant de type
REAKTOR CORE – 37
évènement) ainsi que d’une sortie de contrôle (car le module sert à contrôler
d’autres paramètres comme la fréquence de coupure d’un filtre, des niveaux
d’amplification, etc.):
Certains types de traitements (et mixages) sont utilisés à la fois pour
les signaux audio et pour les signaux de contrôle. Dans ce cas, vous
trouverez pour ces macros une version dédiée aux signaux audio et une
version dédiée aux signaux de contrôle. C’est le cas par exemple des
mixeurs audio ou de contrôle, des amplificateurs audio ou de contrôle,
etc. Généralement, il est déconseillé d’utiliser un module avec un signal
pour lequel il n’est pas prévu, à moins que vous ne sachiez précisément
ce que vous faites.
Ceci dit, il faut remarquer qu’il est assez souvent possible de réutiliser
des signaux audio comme signaux de contrôle. L’exemple le plus typique
est la modulation de la fréquence d’un oscillateur ou de la fréquence de
coupure d’un filtre par un signal audio. Ceci fonctionne sans problème,
à partir du moment où vous utilisez intentionnellement ce signal audio
comme un signal de contrôle. Nous osons croire que le cas contraire, ie
l’utilisation volontaire d’un signal de contrôle en tant que signal audio,
est plutôt rare...
Cette séparation entre les signaux audio, de contrôle, évènement et logique ne
doit pas être confondue avec la séparation audio/évènement du niveau primaire
de Reaktor. La classification audio/évènement du niveau primaire spécifie une
sorte de “vitesse de traitement” des signaux: les signaux audio sont traités
bien plus “vite” (et nécessitent plus de puissance processeur). De plus, comme
vous le savez probablement, les signaux évènements du niveau primaire ont
des règles de propagation différentes de celles des signaux audio. Dans la
terminologie de Reaktor Core, la différence entre les signaux audio, de contrôle,
évènements et logiques est purement sémantique: elle définit l’utilisation du
signal et non le type de traitement qu’il subit. La relation entre les catégories
évènement/audio du niveau primaire et les catégories audio/contrôle/évènement/logique de Reaktor Core n’est pas biunivoque (“bijective” diraient les
38 – REAKTOR CORE
purs et durs), mais nous pouvons quand même tenter de la détailler:
-
-
-
-
un signal audio du niveau primaire correspond normalement dans
Reaktor Core soit à un signal audio (p.ex. la sortie d’un oscillateur
ou d’un filtre), soit à un signal de contrôle (p.ex. la sortie d’une enveloppe).
un signal évènement du niveau primaire est généralement un signal
de contrôle dans Reaktor Core. Comme exemple, on peut citer la
sortie d’un LFO, d’un potentiomètre, d’une source MIDI de pitch ou
de vélocité.
parfois, un signal évènement du niveau primaire correspond à un
signal évènement dans Reaktor Core. L’exemple le plus typique est
un MIDI Gate (les signaux évènements de Reaktor Core seront décrits
plus loin, comme promis).
parfois, un signal évènement du niveau primaire ressemble à un signal
logique de Reaktor Core, bien qu’ils ne soient pas entièrement compatibles et qu‘une conversion explicite entre les deux soit nécessaire
(nous traiterons aussi de ce sujet plus loin). On peut prendre comme
exemple les signaux traités par Logic AND ou d’autres modules similaires du niveau primaire.
Il est important de comprendre que, lorsque vous sélectionnez un type
de signal pour un port d’entrée d’une cellule core, vous choisissez en
fait entre un signal évènement et un signal audio du niveau primaire
et non du niveau Reaktor Core! Les ports de la cellule core sont à la
jonction des deux mondes, c’est la raison pour laquelle ils utilisent dans
certains cas la terminologie du niveau primaire.
Nous allons en apprendre un peu plus sur ces distinctions en essayant de
construire une émulation d’effet d’écho à bande. Nous commencerons par
construire un simple écho numérique, puis nous l’améliorerons pour imiter
certaines caractéristiques d’un écho à bande.
Créons d’abord une cellule core vide. Pénétrez-y et renommez-la “Echo”.
Le premier module que nous allons placer dans la structure est un module
de délai. Prenons un délai à interpolation 4-points, car il est de meilleure
qualité qu’un 2-points, et car un délai sans interpolation ne conviendrait pas
à notre émulation de bande. Sélectionnons donc Standard Macro > Delay >
Delay 4p:
REAKTOR CORE – 39
Nous avons évidemment besoin d’une entrée et d’une sortie audio pour notre
cellule core de délai. Nous allons utiliser une connexion QuickBus pour l’entrée
et une connexion normale pour la sortie:
Il nous faut également une entrée événement pour contrôler la durée du délai.
Il faut ici prendre en compte le fait que la durée de délai au niveau primaire
est généralement exprimée en millisecondes, alors qu’au niveau Reaktor Core
elle est exprimée en secondes. Pas de problème, un petit convertisseur est
disponible, Standard Macro > Convert > ms2sec:
À ce point, nous n’avons qu’un écho simple, et il serait agréable de pouvoir
entendre le signal original et pas uniquement le signal avec écho. Nous devons donc mixer le signal original avec le signal retardé. Comme nous voulons
mixer des signaux audio, nous avons besoin d’un mixeur audio (si vous vous en
rappelez, nous avons utilisé un mixeur de contrôle pour mixer des signaux de
contrôle lorsque nous avons construit la cellule core de filtre). Encore mieux,
nous pouvons utiliser un mixeur audio spécialement conçu pour mélanger
deux signaux (bref un “crossfader”): Standard Macro > Audio Mix-Amp >
XFade (par):
40 – REAKTOR CORE
Le qualificatif “(par)” signifie “parabolique” – pour donner une transition plus
naturelle que la transition linéaire. Nous allons connecter l’entrée de contrôle
(“x”) du crossfader à une nouvelle entrée évènement qui contrôle la balance
entre les signaux original et retardé. Lorsque le signal de contrôle est égal à
0, nous n’entendons que le signal original, tandis que s’il est égal à 1 nous
n’entendons que le signal retardé:
C’est bien mieux maintenant, puisque nous pouvons entendre le signal original
et son écho. Mais ce n’est toujours qu’un écho. Pour avoir plusieurs échos,
nous devons réinjecter une partie du signal retardé dans l’entrée du délai.
Nous devons donc d’abord atténuer le signal retardé. D’après les mêmes considérations – un amplificateur audio pour un signal audio, prenons Standard
Macro > Audio Mix Amp > Amount:
Nous utilisons l’ampli Amount car nous voulons contrôler la quantité de signal
réinjectée. Cet amplificateur nous permet aussi d’inverser le signal en utilisant
des réglages négatifs. En revanche, un ampli comme Amp (dB), qui conviendrait mieux pour contrôler un volume sonore, ne serait pas très intéressant
dans notre cas, car il ne permet pas d’inverser le signal. Connectons l’entrée
de contrôle d’amplitude de l’amplificateur à une entrée évènement que nous
créons pour contrôler la quantité de réinjection:
REAKTOR CORE – 41
Les quantités raisonnables de réinjection se situent dans l’intervalle
[-0.9..0.9]. Si vous souhaitez tester ce délai dès l’étape suivante, faites attention à la quantité de réinjection, car vous pouvez facilement
atteindre des niveaux trop élevés (il n’y a pas encore de saturation
dans notre circuit). Nous aurions pu équiper notre cellule core d’un
limiteur de réinjection de sécurité, mais comme nous voulons ensuite
y adjoindre une saturation, nous n’avons pas jugé cela nécessaire. En
revanche, vous pourriez faire des essais avec des réinjections hautes
et entendre la saturation du délai.
Nous devons maintenant mixer le signal de réinjection avec le signal original.
Un mixeur audio (Standard Macro > Audio Mix Amp > Audio Mix) semble un
choix naturel:
:
Vous vous demandez peut-être ce qui est arrivé à l’entrée supérieure du module
Amount ci-dessus, celle qui affiche maintenant un gros “Z” orange:
En fait, selon la version du logiciel et les circonstances, ce “Z” peut apparaître
à d’autres entrées de la structure, mais cela ne doit pas vous inquiéter plus que
cela. Ce symbole indique qu’un délai numérique est apparu dans la structure à
cet endroit. Il est utile à la conception de structures évoluées, pour lesquelles
cette information peut être importante pour le concepteur.
Pour les structures simples comme celle qui nous occupe, nous pouvons
oublier ce symbole. Sa présence montre juste qu’il existe un délai d’1 échantillon (environ 0,02 ms à 44,1 kHz, encore moins aux taux d’échantillonnage
plus élevés) en ce point. Nous osons prétendre que vous ne remarquerez
rien si le délai est décalé de 0,02 ms par rapport à la valeur que vous avez
spécifiée...
Revenons à notre structure. Elle peut maintenant produire une série d’échos
42 – REAKTOR CORE
décroissants. Elle devrait être suffisante pour un écho numérique, mais nous
voulons vous montrer une autre caractéristique de la librairie, une astuce qui
vous permettra de réduire la taille de votre structure.
Parmi les amplificateurs audio, certains sont appelés “Chain”. Ces amplificateurs sont capables d’amplifier un signal donné et de le mélanger à un autre
signal “enchaîné”. L’un de ces amplis, Audio Mix Amp > Chain(amount), fonctionne comme Amount si ce n’est cette caractéristique “d’enchaînement”:
Le signal arrivant à la deuxième entrée de ce module est atténué selon le
facteur donné par l’entrée “A” puis mélangé au signal arrivant dans l’entrée
de chaîne (“>>”). Le signal arrivant dans cette entrée de chaîne n’est pas
atténué. Ce type d’amplificateur peut servir à construire des chaînes de mixage,
dans lesquelles les connexions des ports “>>” constituent une sorte de bus
de mixage:
Dans le cas qui nous concerne, nous n’avons pas besoin de bus de mixage,
mais nous pouvons utiliser ce module à la place de l’ensemble Audio Mix et
Amount. Le signal réinjecté sera atténué de la quantité spécifiée par l’entrée
Fbk et mixé avec le signal d’entrée exactement comme auparavant:
Félicitations! Vous avez construit un effet d’écho numérique simple. La prochaine étape sera d’y ajouter un effet de simulation de bande.
REAKTOR CORE – 43
2.4. Création de vos premières macros Reaktor Core
Pour l’effet d’écho que nous venons de construire, nous avons utilisé une
macro Delay 4p de la librairie qui nous offre un délai numérique de bonne
qualité. Mais bonne qualité ou pas, il sonne toujours trop “numérique”. Nous
pourrions lui donner un son plus chaud en lui ajoutant quelques caractéristiques typiques d’un écho à bande, comme la saturation et l’effet de pompage.
C’est ce que nous allons réaliser maintenant.
Commençons par supprimer la macro de délai de la structure, et créons une
macro vide à la place via un clic droit sur le fond de l’écran et en sélectionnant
Built In Module > Macro:
Double-cliquez sur cette macro pour pénétrer à l’intérieur. Vous voyez apparaître
une structure vide similaire à celle de la cellule core précédente:
Elle fonctionne aussi de façon semblable, avec toutefois quelques différences
importantes. Nous avions alors la structure d’une cellule Reaktor Core alors
que nous avons maintenant la structure interne d’une macro Reaktor Core.
En réalité, ces différences concernent l’ensemble des modules d’entrée et
de sortie disponibles:
44 – REAKTOR CORE
Les ports de type Latch et Bool C seront expliqués bien plus loin dans ce
manuel; ils servent pour les opérations avancées. Pour l’instant, nous nous
intéresserons uniquement à la sortie intitulée “Out” (ou “In” pour les entrées).
C’est un type général de port, qui peut accepter des signaux audio, logiques,
de contrôle et évènements. En fait, le port n’a cure du type de signal qu’il
reçoit: cette différenciation n’est utile que pour vous, en tant qu’utilisateur,
parce qu’elle définit ce à quoi doit servir le signal. Pour Reaktor Core, tous les
signaux sont identiques. La différence entre entrées/sorties audio et événement
de la structure précédente n‘existe plus, car il n’y a plus de niveau primaire
à l’extérieur (contrairement à ce qui se passe pour une cellule core): nous
sommes maintenant entièrement dans Reaktor Core.
La première chose que nous allons faire est de nommer la macro, de la même
façon que pour la cellule core, via un clic droit sur le fond et en sélectionnant
Owner Properties, où vous pouvez saisir le nom:
Les autres propriétés de la macro contrôlent divers aspects de l’apparence et
du traitement du signal pour cette macro.
Même si vous êtes libre d’expérimenter différents réglages pour ces autres
propriétés, nous vous conseillons fermement de laisser le paramètre
Solid activé et de modifier le paramètre FP Precision avec modération.
La signification de ces paramètres sera expliquée dans les sections
avancées de ce manuel.
Créons ensuite un ensemble d’entrées/sorties pour notre macro Tape Delay:
REAKTOR CORE – 45
L’entrée supérieure recevra le signal audio, l’entrée inférieure le paramètre
temporel. Vous avez peut-être remarqué la présence de ports supplémentaires
sur la gauche des modules d’entrée, nous les expliquerons plus loin.
Au centre de notre macro, nous allons utiliser comme point de départ le même
module Delay 4p:
Une simulation simple de l’effet de saturation peut être réalisée facilement,
il suffit de connecter un module saturateur avant le délai. Le saturateur est
une sorte de modeleur de signal et il travaille sur de l’audio, nous allons donc
le chercher parmi les modeleurs audio (en anglais “audio shapers”). Sélectionnons Standard Macro > Audio Shaper > Parabol Sat:
Le signal d’entrée est maintenant saturé sur un intervalle de –1 à +1. En fait,
cet intervalle est contrôlé par l’entrée “L” du module saturateur; si celle-ci
est déconnectée, la valeur est égale à 1 par défaut. Ceci peut vous paraître
surprenant, puisque d’habitude une entrée déconnectée est considérée comme
ne recevant aucun signal, autrement dit un signal nul. Ce n’est pas exactement
le cas dans les structures Reaktor Core, les modules ont la possibilité de spécifier un traitement spécial pour leurs entrées déconnectées, comme pour ce
saturateur dans lequel l’entrée “L” doit avoir 1 comme valeur par défaut.
Nous allons maintenant apprendre comment effectuer ce réglage, pour la valeur
par défaut de l’entrée “T”. Mettons que, si notre entrée “T” est déconnectée,
nous voulions qu’elle soit traitée comme si la valeur d’entrée était de 0,25
46 – REAKTOR CORE
secondes. Rien de plus simple: faites un clic droit sur ce nouveau port sur la
gauche du module d’entrée “T”, et sélectionnez Connect to New QuickConst.
Voilà ce que vous devriez voir:
De plus, la fenêtre de propriétés devrait afficher les propriétés de cette constante (si la fenêtre affiche une page différente, appuyez sur le bouton
):
Dans le champ de valeur (“Value”), saisissez la nouvelle valeur “0.25”:
Voilà ce que vous devriez voir maintenant:
Expliquons ce que nous venons de faire. Le port sur la gauche des modules
d’entrée spécifie un signal “par défaut”, c’est-à-dire un signal utilisé si l’entrée
n’est pas connectée (à l’extérieur de la macro). Dans notre cas, si l’entrée “T”
de la macro Tape Delay n’est pas connectée à l’extérieur, elle se comportera
comme si vous lui aviez connecté une constante de valeur 0,25.
REAKTOR CORE – 47
Une connexion à une QuickConst n’est évidemment pas la seule possibilité
pour un signal par défaut. Vous pouvez lui connecter n’importe quel autre
module de la structure, y compris un autre module d’entrée.
Maintenant que nous avons une saturation et une valeur par défaut pour
l’entrée “T”, simulons l’effet de pompage de la bande. Une façon simple de
le faire est de moduler la durée de délai par un LFO (pour “Low Frequency
Oscillator”, “Oscillateur Basse Fréquence” en anglais). Nous pourrions essayer
différentes formes de LFOs pour obtenir un meilleur effet de pompage. Nous
proposons pour l’instant d’en prendre un seul dans la librairie: Standard Macro
> LFO > Par LFO:
C’est un LFO parabolique produisant un signal qui ressemble par sa forme à
une sinusoïde, mais qui nécessite moins de puissance processeur. Son entrée
“F” doit recevoir le signal spécifiant sa vitesse d’oscillation (sa fréquence).
Nous pouvons à nouveau utiliser une constante QuickConst. Une fréquence
de 4 Hz semble raisonnable:
L’entrée “Rst” sert à redémarrer le LFO (“Rst” pour “Reset”, “Redémarrer”
en anglais), nous ne nous en servirons pas pour l’instant.
Nous devons maintenant spécifier une quantité de modulation en redimensionnant la sortie du LFO, car il génère pour l’instant un signal compris entre
–1 et 1, ce qui est beaucoup trop. Ne perdant pas de vue que nous avons ici
affaire à des signaux de contrôle, nous allons utiliser un module d’amplification
de contrôle, similaire à l’amplificateur Amount que nous avons utilisé pour
l’audio, Standard Macro > Control > Ctl Amount:
Une amplitude de modulation de 0,0002 devrait faire l’affaire, réduisons donc
le signal de ce facteur:
48 – REAKTOR CORE
Enfin, nous pouvons mixer les deux signaux de contrôles (celui de l’entrée “T”
et celui du module Ctl Amount) et les envoyer dans l’entrée “T”du module de
délai. Le module Ctl Mix déjà familier peut être à nouveau utilisé:
En fait, nous retrouvons la structure de mixeur “en chaîne” que nous avions
pour les signaux audio. Nous pouvons donc remplacer les modules Ctl Amount
et Ctl Mix comme nous l’avons fait pour le chemin du signal audio, avec cette
fois-ci le module Standard Macro > Control > Ctl Chain:
Nous pouvons apporter la touche finale à notre macro: changer la taille du
tampon pour notre délai, qui définit la durée de délai maximale. Si vous
maintenez le curseur sur la macro Delay 4p (et pour peu que le bouton
soit activé), vous pouvez lire dans le texte d’info que la taille de tampon (en
anglais “buffer”) par défaut correspond à 1 seconde à 44,1 kHz:
REAKTOR CORE – 49
Passons-le à 5 secondes, soit 44100*5 = 220500 (au fait, puisque chaque
échantillon occupe 4 octets, ceci fait en tout 220500*4 = 882000 octets,
soit presque 1 Mo). Double-cliquez sur la macro Delay 4p:
Le module sur la gauche est le module du tampon du délai. Double-cliquez
dessus (ou faites un clic droit et sélectionnez Show Properties) pour modifier ses propriétés. Sélectionnez la page
, dans laquelle vous devriez
voir s‘afficher la propriété Size (Taille en anglais...). Réglez-la sur 220500
échantillons:
Comme nous l’avons vu, un tampon de 5 secondes d’audio prend environ 1 Mo de mémoire, donc soyez prudent lorsque vous modifiez les
tampons de délai, tout particulièrement si les délais sont utilisés dans
50 – REAKTOR CORE
des parties polyphoniques de la structure, dans lesquelles la taille du
tampon sera multipliée par le nombre de voix !
Nous pouvons resortir de la macro Delay 4p puis de la macro Tape Delay que
nous venons de créer (double-cliquez sur le fond), pour nous occuper des
connexions externes:
Si vous ne l’avez pas encore fait, nous vous suggérons d’essayer le module
d’écho que nous avons construit. Voici une structure de test du niveau primaire
de Reaktor, aussi simple que possible (veuillez noter que le module d’écho
est réglé sur mono):
Vous pouvez l’améliorez de multiples façons, par exemple en insérant des
potentiomètres contrôlant les différents paramètres de l’écho, en utilisant un
véritable synthétiseur comme signal source, etc.
2.5. Utiliser l’audio comme signal de contrôle
Nous avons mentionné plus haut qu’il était possible d’utiliser un signal audio
en tant que signal de contrôle. Nous avons pensé qu’il serait utile d’en donner
un exemple. Nous allons créer une cellule core implémentant une paire d’oscillateurs, l’un des deux étant modulé par l’autre. Prenons deux oscillateurs
multi-ondes (en anglais “multiwave”):
REAKTOR CORE – 51
Nous aurons besoin d’un contrôle de pitch (hauteur tonale) pour chacun des
deux oscillateurs, et nous écouterons la sortie du deuxième oscillateur. Créons
les entrées et sorties correspondantes:
Nous voulons maintenant prendre la sortie de l’oscillateur de gauche et l’utiliser
pour moduler la fréquence du second oscillateur (celui de droite, donc):
L’entrée Mod contrôle la quantité de modulation.
Veuillez noter que nous mixons le signal de modulation après le convertisseur
P2F, afin que la modulation ait lieu sur l’échelle de fréquences (il serait aussi
possible d’effectuer la modulation sur l’échelle de pitch).
En fait, il vaut mieux adapter la quantité de modulation en fonction de la
fréquence de l’oscillation de base:
Maintenant, si vous analysez la structure ci-dessus du point de vue des signaux
audio et de contrôle, vous remarquerez que tous les signaux de la structure,
excepté les sorties des oscillateurs, sont des signaux de contrôle. Les sorties
des deux oscillateurs sont évidemment des signaux audio. Cependant, nous
utilisons de façon “détournée” la sortie de l’oscillateur de gauche, la considérant
comme un signal de contrôle que nous envoyons dans le mixer Ctl Chain.
52 – REAKTOR CORE
2.6. Les signaux évènements
Comme nous l’avons dit précédemment, il y a plusieurs significations à l’expression “signal évènement”. Le concept des signaux évènements du niveau
primaire de Reaktor devrait déjà vous être familier. Un signal évènement du
niveau primaire peut avoir plusieurs utilisations. Une première consiste à
l’utiliser comme signal de contrôle (p.ex. la sortie d’un LFO, d’un potentiomètre, etc.), simplement parce qu’il consomme moins de puissance processeur
qu’un signal audio du niveau primaire. Dans ce cas, vous auriez pu utiliser un
signal audio à la place et obtenir sensiblement le même effet. Une deuxième
utilisation, dans laquelle le signal évènement ne peut être remplacé par de
l’audio, se présente lorsque vous êtes intéressé(e) non seulement par les valeurs transportées par le signal, mais aussi par les instants auxquels chaque
nouvelle valeur est délivrée par le câble, autrement dit quand l’évènement
est envoyé. Comme exemple, citons un signal “gate” d’enveloppe du niveau
primaire: l’enveloppe est lancée à l’instant où un évènement arrive à l’entrée
de la porte (en anglais “gate”).
Lorsque nous parlions de signaux audio, de contrôle, évènements et logiques
dans Reaktor Core, nous ne parlions pas vraiment de différences techniques
entre ces signaux (techniquement, ils sont tous équivalents dans Reaktor
Core), mais plutôt des différentes façons d’utiliser un signal. Comme nous le
voyons maintenant, un signal évènement du niveau primaire de Reaktor peut
être utilisé comme signal de contrôle, événement, voire logique (alors qu’un
signal audio du niveau primaire de Reaktor peut être utilisé comme audio ou
comme contrôle, comme vous devriez vous en rappeler...).
Nous avons déjà appris à envoyer des signaux évènements du niveau primaire
dans Reaktor Core et à les utiliser comme signaux de contrôle. Les entrées en
mode évènement de la cellule core audio réalisant un filtre - que nous avons
construite auparavant - en est un bon exemple. Il y a également des cas
dans lesquels vous utiliseriez plutôt une cellule core évènement pour traiter
certains signaux évènements du niveau primaire, qui sont en fait des signaux
de contrôle. Voici un exemple de cellule core évènement englobant une macro
core de modeleur de type contrôle (Ctl Shaper):
REAKTOR CORE – 53
Ce modeleur de contrôle reçoit un signal de contrôle issu d’un signal évènement du niveau primaire (p.ex. un signal de vélocité MIDI, ou un signal de
LFO du niveau primaire), il le tord en fonction du paramètre “Shp” et envoie
le résultat à la sortie.
Une restriction importante des cellules core évènements (mentionnée
plus haut) est que toutes leurs sources d’horloge sont désactivées. Ceci
signifie que non seulement les oscillateurs et les filtres, mais aussi les
enveloppes et les LFOs ne peuvent pas fonctionner dans les cellules
core évènements. Ces cellules sont vraiment conçues pour recevoir des
évènements du niveau primaire de Reaktor, les traiter et les renvoyer à
l’extérieur, comme dans l’exemple ci-dessus.
Les signaux dérivés de signaux évènements du niveau primaire peuvent aussi
être utilisés comme véritables signaux évènements dans les structures Reaktor Core. Nous allons maintenant regarder d’un peu plus près quelques cas
simples d’utilisation d’évènements dans Reaktor Core.
Le premier cas est l’utilisation d’une enveloppe dans une structure core.
Comme nous venons de le voir, à cause de la restriction concernant les cellules
core évènements, nous pouvons uniquement utiliser une cellule core audio.
Créons donc une nouvelle cellule core audio et utilisons Standard Macro >
Envelope > ADSR:
L’entrée supérieure de l’enveloppe est une entrée “gate” qui fonctionne sensiblement comme les entrées “gate” des enveloppes du niveau primaire: cette
entrée allume ou éteint l’enveloppe en réponse à des évènements. Pas de
problème, créons une entrée évènement dans notre cellule core:
54 – REAKTOR CORE
Cette entrée convertira les évènements “gate” du niveau primaire en évènements core.
Intéressons-nous maintenant aux entrées A, D, S et R. L’entrée “S” (niveau
de maintien, en anglais “sustain”) fonctionne comme au niveau primaire, ie
elle attend un signal dans l’intervalle [0...1]:
Les entrées A, D et R sont quant à elles légèrement différentes en ce sens
que, contrairement aux enveloppes du niveau primaire, elles attendent ici des
temps spécifiés en secondes:
Ceci peut être géré par Standard Macro > Convert > logT2sec, qui convertit
les temps des enveloppes du niveau primaire en secondes:
Bien que toutes les entrées de la structure ci-dessus soient en mode évènement, du point de vue sémantique, la première entrée produit un signal
évènement alors que les autres produisent des signaux de contrôle.
Notre enveloppe dispose de deux ports non encore connectés. Le port GS règle
la sensibilité du seuil d’activation (“gate”). Réglé sur 0, l’enveloppe ignore
complètement le niveau de l’entrée “gate” et elle est toujours à son amplitude
maximale. Réglé sur 1, le niveau de seuil a son effet maximal, comme au
niveau primaire de Reaktor. Nous pouvons contrôler cette sensibilité depuis
l’extérieur via une nouvelle entrée:
REAKTOR CORE – 55
Le port RM spécifie le mode de redémarrage de l’enveloppe:
Ce port a un aspect différent car il attend des valeurs entières en entrée. Si
nous considérons par exemple l’entrée pour le temps d’attaque, elle peut accepter un temps d’attaque d’1 s, 1,5 s ou 0,2 s. Au contraire, le port pour le
mode de redémarrage ne s’attend pas à une valeur de 1,2 ou de 3,1. Ceci est
indiqué par l’aspect différent du port, mais cela n’empêche pas de connecter
à ce port un signal normal; utilisons donc une autre entrée évènement:
56 – REAKTOR CORE
Si les valeurs venant de l’extérieur ne sont pas entières, elles sont arrondies
à la valeur entière la plus proche. Par exemple, 1,2 sera arrondi à 1.
Observons maintenant un autre exemple d’utilisation d’un signal évènement
véritable:
La structure ci-dessus réalise une sorte de modulation de pitch (hauteur
tonale). L’effet est produit par un délai dont la durée varie dans l’intervalle
250±100 ms. La vitesse de cette variation est contrôlée par l’entrée Rate,
qui contrôle en fait la vitesse du LFO (la valeur est en Hertz). Il s’agit donc
d’un pur signal de contrôle. L’entrée Rst est un signal évènement, il peut être
utilisé pour redémarrer le LFO. La valeur en entrée spécifie la phase de redémarrage, pour laquelle 0 signifie que le LFO redémarre au début du cycle,
0,5 au milieu du cycle et 1 à la fin. Vous pouvez faire des tests en connectant
un bouton envoyant des valeurs spécifiques à cette entrée.
2.7. Les signaux logiques
Maintenant que nous en savons plus sur les signaux évènements et les signaux
de contrôle, il est temps d’en apprendre un peu plus sur une autre manière
d’utiliser les signaux dans Reaktor Core, via les signaux logiques. Voici un
exemple d’un module qui traite les signaux logiques:
Comme vous pouvez le remarquer, les ports de ce module ont un type entier,
comme l’entrée RM de l’enveloppe vue plus haut. Ceci est dû au fait que les
signaux arrivant ne transportent généralement que des valeurs entières, et
même “pire”, ils ne transportent que des 0 et des 1.
Pour le signal logique, la valeur 1 correspond à l’état true (vrai en anglais), et
la valeur 0 à l’état false (faux en anglais). La signification des expressions true
et false doit être assignée par l’utilisateur. Vous pouvez décider qu’un signal
logique détermine si une porte (“gate”) particulière est ouverte ou non:
REAKTOR CORE – 57
Ici, une macro Gate2L vérifie le signal d’entrée et produit une sortie true (ou
1) si la porte est ouverte et false (ou 0) si elle est fermée.
Vous pouvez utiliser les signaux logiques pour effectuer des “traitements logiques”. Par exemple, nous pourrions construire un processeur de porte logique
qui appliquerait à une porte logique MIDI une autre porte, régulièrement
cadencée, basée sur une horloge
Les modules Gate2L, AND et L2Gate sont des modules logiques et se trouvent
dans le menu Standard Macro > Logic. Le Gate LFO est une macro que nous
avons construite pour ce processeur. Elle génère un signal de porte, s’ouvrant
et se fermant à intervalles réguliers.
La porte en entrée et la sortie du LFO sont connectées à des convertisseurs
Gate2L qui convertissent les signaux de portes en signaux logiques, transformant les portes ouvertes en true et les portes fermées en false. Le module
AND sort la valeur true si et seulement si les deux portes sont à l’état ouvert
en même temps. En d’autres termes, la sortie du module AND est égale à
true si et seulement si l’utilisateur maintient une touche enfoncée et si en
même temps le LFO produit une porte ouverte. Ceci signifie que, tant que
l’utilisateur maintient une touche enfoncée, il y aura alternativement des
valeurs true et false en sortie du module AND, la vitesse d’alternance étant
réglée par la fréquence du LFO. La sortie du module AND est reconvertie en
signal de porte, l’amplitude du signal est prise du signal de porte en entrée,
pour que le niveau du signal de porte reste inchangé.
Voici la structure de notre macro Gate LFO:
58 – REAKTOR CORE
L’entrée F définit la vitesse des répétitions d’ouverture de la porte, et l’entrée W définit la durée d’ouverture des portes (à 0, elles restent ouvertes la
moitié du cycle, à –1 elles restent ouvertes 0 % du temps et à 1, 100 % du
temps). L’entrée Rst redémarre le LFO en réponse aux évènements entrants
(le LFO est donc redémarré à chaque fois qu’un évènement arrive à l’entrée
G principale).
Le module connecté à l’entrée Rst du Rect LFO est appelé Value et se trouve
dans Standard Macro > Event Processing. Il assure que le LFO est redémarré
avec une phase nulle en remplaçant toutes les valeurs des évènements entrants par la valeur de l’entrée inférieure, qui est en l’occurrence 0. La sortie
du LFO est convertie en signal de porte via un convertisseur Ctl2Gate, que
l’on trouve aussi dans Standard Macro > Event Processing.
Comme nous l’avons vu, les LFOs ne fonctionnent pas dans les cellules
core évènements, donc si vous voulez essayer cette structure, vous devez
utiliser une cellule core audio.
REAKTOR CORE – 59
3. Fondements de Reaktor Core: le modèle du signal core
3.1. Les valeurs
La plupart des sorties des modules de Reaktor Core produisent des valeurs.
“Produire” une valeur signifie qu’à tout moment une valeur est associée à
la sortie en question. Cette valeur est disponible pour les modules dont les
entrées sont connectées à cette sortie.
Dans l’exemple suivant, un module additionneur obtient les valeurs 2 et 3 de
deux autres modules, dont les sorties sont connectées à ses entrées; l’additionneur produit la valeur 5 à sa sortie
�
��
��
��
��
Si vous voulez faire une analogie avec le monde matériel, pensez les
valeurs comme des niveaux de signaux (des tensions électriques), en
particulier si vous avez affaire à des modules de grande échelle tels que
les oscillateurs, les filtres, les enveloppes, etc. Cependant, les valeurs
ne se limitent pas à cela. Après tout, ce ne sont que des valeurs, et
elles peuvent être utilisées pour réaliser n’importe quel algorithme de
traitement, pas seulement pour modeler un voltage.
3.2. Les évènements
Dans le monde numérique, le temps n’est pas continu, il est discret, c’est-à-dire
quantifié. L’un des exemples les plus connus est l’enregistrement numérique,
qui n’enregistre pas l’information totale d’un signal audio évoluant continûment
dans le temps, mais seulement son niveau à des instants précis régulièrement
espacés. Le nombre de ces instants dans chaque seconde définit le fameux
taux d’échantillonnage.
60 – REAKTOR CORE
Voici la représentation d’un signal continu:
�
et sa représentation numérique (ou digitale):
�
Ceci implique que, puisque nous sommes dans le monde numérique, les sorties
de nos modules ne peuvent faire évoluer leurs valeurs de façon continue. D’un
autre côté, nous n’avons pas besoin de forcer nos sorties à changer leur valeur
“à des instants précis régulièrement espacés”, autrement dit nous n’avons
pas besoin de maintenir un taux d’échantillonnage particulier tout au long
de nos structures. En outre, dans certaines parties de nos structures, nous
n’avons pas même besoin de maintenir un quelconque taux d’échantillonnage,
autrement dit nos changements n’ont pas besoin de survenir “à des instants
précis régulièrement espacés”.
Par exemple, au temps zéro, la sortie de notre additionneur a la valeur 5. Le
premier changement pourrait survenir au temps 1 ms (une milliseconde). Le
deuxième pourrait survenir à 4 ms. Le troisième à 6 ms:
�
���
��
��
��
��
��
��
��
��
�� ����������
REAKTOR CORE – 61
Sur la figure ci-dessus, nous voyons les changements de la sortie de notre additionneur survenant entre 0 et 7 ms. À l’instant où la sortie change de valeur,
elle génère un évènement. Un évènement signifie que la sortie “rend compte”
d’un changement de son état, en l’occurrence qu’elle change de valeur.
Dans l’exemple suivant, le module en haut à gauche a modifié sa valeur de
2 à 4, générant un évènement. En réponse, l’additionneur change aussi sa
valeur de sortie et génère également un évènement à sa sortie.
�
���
��
��
���
Le module supérieur gauche aurait aussi pu générer un nouvel évènement avec
la même valeur que l’ancienne. L’additionneur aurait quand même répondu
en générant aussi un nouvel évènement, bien sûr sans changer non plus sa
valeur de sortie.
�
���
��
��
���
La nouvelle valeur apparaissant à la sortie ne doit pas forcément être
différente de l’ancienne. Cependant, la seule manière pour une sortie
de changer sa valeur est de générer un évènement.
Comme vous l’avez vu dans les exemples précédents, un évènement survenant
à la sortie d’un module va être perçu par les modules connectés “en aval”,
qui produiront en réponse d’autres évènements (comme l’additionneur qui
produisait un évènement en réponse à l’évènement provenant du module en
haut à gauche). Ces nouveaux évènements vont à leur tour être perçus par
les modules connectés aux sorties correspondantes et propagés de proche
en proche, jusqu’à ce que la propagation s’arrête, pour une des raisons dont
nous discuterons plus loin dans ce texte.
62 – REAKTOR CORE
Dans Reaktor Core, les évènements sont différents des évènements du
niveau primaire de Reaktor. Ils suivent des règles différentes que nous
détaillerons plus loin.
3.3. Évènements simultanés
Considérons la situation suivante: les deux modules de gauche des exemples
précédents produisent simultanément un évènement.
�
���
��
���
���
Ceci est l’une des caractéristiques essentielles de Reaktor Core: les évènements
peuvent survenir simultanément en plusieurs endroits. Dans cette situation, les
évènements produits simultanément par les deux modules de gauche arrivent
aussi simultanément aux entrées de l’additionneur. En réponse, l’additionneur
va produire exactement un évènement à sa sortie.
Ce comportement est différent de celui observé au niveau primaire de
Reaktor, dans lequel les évènements ne peuvent pas survenir simultanément: dans une telle situation, l’additionneur (en mode évènement)
produirait deux évènements en sortie.
Bien sûr, en réalité les évènements ne sont pas produits simultanément par
les modules supérieur gauche et inférieur gauche, car les deux modules sont
traités par le même processeur, et un processeur ne peut jamais traiter qu’un
seul module à la fois. Mais l’important pour nous est que ces évènements sont
logiquement simultanés, c’est-à-dire qu’ils sont traités comme simultanés par
les modules qui les reçoivent.
Nous allons maintenant prendre un autre exemple d’une propagation simul�
tanée
d’évènements.
���
���
�����
��
�����
REAKTOR CORE – 63
Dans la figure ci-dessus, le module à l’extrême gauche envoie un évènement,
modifiant sa valeur de 2 à 3. L’évènement est envoyé simultanément à la fois
aux modules inverseur (-x) et multiplicateur (*). En réponse à l’évènement
entrant, l’inverseur produit une nouvelle valeur de sortie, -3. Il est important
de remarquer que, bien que l’évènement en sortie de l’inverseur soit produit
en réponse à l’arrivée de l’évènement venant du module tout à gauche, et
donc qu’il doive survenir après ce dernier, les deux évènements restent logiquement simultanés. Ceci signifie qu’ils arrivent simultanément aux entrées
du multiplicateur et que le multiplicateur, en réponse, ne produit qu’un seul
évènement en sortie, avec une valeur de -9.
Dans le niveau primaire, vous auriez eu ici deux évènements à la sortie
du module multiplicateur. Vous n’auriez pu déterminer si l’évènement
produit à la sortie du module de gauche avait d’abord été envoyé à l’inverseur ou au multiplicateur (bien que cela soit sans importance pour
cette structure particulière).
En général, vous pouvez utiliser la règle suivante pour déterminer si deux
évènements particuliers sont simultanés ou non:
Tous les évènements issus d’un (envoyés en réponse à un) même évènement sont simultanés. Tous les évènements issus d’un nombre arbitraire
d’évènements simultanés (survenant à différentes sorties mais que l’on
sait simultanés) sont aussi simultanés.
Le dernier exemple montre l’utilisation de la simultanéité d’évènements. Dans
ce cas, nous éliminons le traitement redondant du second évènement par le
multiplicateur, qui aurait nécessité plus de temps processeur. Dans des structures plus grandes, en l’absence d’un tel concept de simultanéité, le nombre
d’évènements peut croître de façon incontrôlée, à moins que le concepteur
de la structure n’ait apporté un soin particulier à maintenir le nombre d’évènements doublons au plus bas.
Au-delà de l’économie en temps de processeur, ce concept mène à des différences importantes dans l’approche de la construction des structures, en
particulier pour les structures réalisant des algorithmes de traitement du signal
(DSP) de bas niveau. Vous comprendrez et percevrez mieux ces différences
lorsque vous commencerez à construire vos propres structures.
64 – REAKTOR CORE
3.4. L’ordre de traitement
Comme nous l’avons vu dans les exemples précédents, lorsqu’un module
envoie un évènement, les modules “en aval” y répondent. On pourrait en conclure que, bien qu’ils produisent des évènements “logiquement simultanés”,
les modules sont en fait traités de façon non simultanée. On pourrait alors
supposer que, pour une connexion, il soit raisonnable de traiter le module “en
amont” avant le module “en aval”. Si quelqu’un arrive à ces conclusions... il
(ou elle) a absolument raison.
La règle générale de l’ordre de traitement des modules est la suivante:
Si deux modules connectés traitent des évènements simultanés, alors
le module “en amont” est traité en premier. Si les évènements ne sont
pas simultanés, l’ordre de traitement des modules correspond bien
entendu à l’ordre des évènements traités.
Nous déduisons de la règle ci-dessus qu‘un chemin de connexion unidirectionnel (toujours vers l’amont ou toujours vers l’aval) d‘un module au suivant
induit un ordre de traitement déterminé de ces deux modules: le module en
amont est traité en premier.
S’il n’y a pas de chemin unidirectionnel entre les deux modules, leur
ordre de traitement est indéfini (pour des évènements simultanés). Ceci
signifie que cet ordre est arbitraire et peut changer à tout moment. Le
concepteur de la structure doit donc veiller à ce qu’une telle situation
n’arrive que pour des modules dont l’ordre de traitement relatif est sans
importance, ce qui est généralement le cas tant qu’aucune connexion
OBC (cf. plus bas) n’entre en jeu.Here is an example, the digits showing
the order of module processing:
Voici un exemple, les nombres indiquant l’ordre de traitement:
�
��
��
��
��
��
Pour la structure ci-dessus, il existe un autre ordre de traitement possible:
REAKTOR CORE – 65
�
��
��
�
��
��
Il n’y a aucun moyen de dire lequel des deux sera choisi par l’application.
Heureusement, tant que vous n’utilisez pas de connexions OBC (détaillées plus
bas), l’ordre relatif de traitement des modules dans des cas comme celui-ci
est tout-à-fait indifférent.
Ces règles permettant de déterminer l’ordre de traitement ne peuvent
être appliquées s’il y a une réinjection dans les structures, car dans ce
cas, pour n’importe quelle paire de modules dans la boucle de réinjection, nous ne pouvons plus dire lequel est “en amont” et lequel est “en
aval”. Le problème de la manipulation des réinjections, y compris pour
l’ordre de traitement, sera abordé plus tard.
�
��
��
��
��
��
Pour la structure ci-dessus, il n’est pas possible de définir si le module B est
en amont ou en aval du module D, et vice versa (!). Visiblement, il y a une
connexion allant vers l’amont de D vers B, mais il y en a également une de
B vers D (via E).
3.5. Retour aux cellules core évènements
Observons les cellules core évènements du point de vue du concept d’évènement de Reaktor Core que nous venons de décrire.
Comme vous vous en rappelez certainement, les cellules core évènements ont
des entrées et des sorties évènements. Ces entrées et sorties sont des points
66 – REAKTOR CORE
d’interface entre les niveaux primaire et core de Reaktor. Ils font fonction de
convertisseurs entre les évènements du niveau primaire et les évènements
core, et vice versa. Les règles de conversion sont les suivantes:
Les entrées évènements envoient des évènements core à l’intérieur de la
structure en réponse aux évènements du niveau primaire venant de
l’extérieur. Comme les évènements du niveau primaire extérieur ne
peuvent arriver simultanément aux différentes entrées, les évènements
produits à l’intérieur ne sont pas non plus simultanés.
Les sorties évènements envoient des évènements de niveau primaire à
l’extérieur de la structure en réponse aux évènements core venant de
l’intérieur. Bien que des évènements core puissent être simultanés en
différentes sorties, les évènements du niveau primaire ne peuvent être
envoyés simultanément. Ainsi, pour des évènements core simultanés,
les évènements correspondants du niveau primaire sont envoyés les
uns à la suite des autres, les sorties supérieures envoyant toujours
leurs évènements avant les sorties inférieures.
Nous allons maintenant tester ces règles en pratique.
Essayons de construire un module de traitement d’évènements qui applique
un modelage du signal selon la formule: y = 0.25*x*(4-|x|)
La représentation graphique de cette fonction ressemble à ceci:
�
��
��
��
���
���
���
���
��
��
��
��
��
��
���
���
Commençons par créer une nouvelle cellule core évènement avec une entrée
et une sortie, appelées respectivement “x” et “y”.
REAKTOR CORE – 67
Créons ensuite la structure qui effectue la fonction. Nous devons créer les
modules “|x|” (valeur absolue), “-” (soustraction) et deux “*” (multiplication)
dans la zone des modules normaux (au centre). Ce ne sont pas des macros
core mais bien des modules Reaktor Core préfabriqués. Pour les insérer dans
les structures core, effectuez un clic droit sur le fond de la zone normale et
sélectionnez le sous-menu Built-In Module:
Vous trouverez tous les modules dont nous avons besoin dans le sous-menu
Built In Module > Math:
68 – REAKTOR CORE
Nous avons besoin de deux valeurs constantes, 0,25 et 4. Nous pourrions
utiliser des QuickConsts, tout comme nous l’avons fait dans les premiers
chapitres, mais nous pouvons aussi insérer un module de constante réelle via
Built In Module > Const (comme avec QuickConst, la valeur peut être précisée
dans la fenêtre Properties):
Bien sûr, dans notre cas, il n’y a pas d’intérêt particulier à utiliser des modules
Const en lieu et place des QuickConsts, mais cela peut parfois se révéler utile
(p.ex. si la même constante doit être connectée à plusieurs entrées, il peut
être judicieux d’utiliser un module Const, parce qu’alors vous n’avez besoin
que d’un seul module, et vous avez en outre un point unique pour contrôler
la valeur de toutes les entrées).
Bref, la structure maintenant créée modèle bien le signal de la manière voulue.
Nous pouvons nommer notre module et revenir au niveau primaire:
Maintenant, testons-le. Fixez le nombre de voix de l’instrument Reaktor à 1,
pour qu’il soit plus facile d’utiliser un module Meter (Indicateur en anglais):
REAKTOR CORE – 69
Créez un module Knob (Potentiomètre en anglais) et un module Meter, et
connectez-les à l’entrée et à la sortie de votre module:
Réglez les propriétés du potentiomètre et de l’indicateur de niveau. N’oubliez
pas de régler l’indicateur pour qu’il affiche sa valeur:
70 – REAKTOR CORE
ni de cocher la case “Always Active” (“Toujours actif” en anglais):
Maintenant, tournez le potentiomètre et observez l’évolution de la valeur.
REAKTOR CORE – 71
La structure de modelage d’évènements que nous venons de construire devrait
fonctionner parfaitement pour le modelage de signaux de contrôle, mais elle
comporte encore un défaut mineur dans sa façon de traiter les évènements.
Nous reviendrons sur ce problème (et nous le résoudrons !) un peu plus
tard.
4. Les structures avec état interne
4.1. Les signaux d’horloge
La manière dont une cellule Reaktor Core traite les évènements entrants est
entièrement fonction du module en question. Normalement, un module traite la
valeur entrante d’une certaine manière, mais il peut aussi tout-à-fait l’ignorer.
Le cas le plus typique d’un tel traitement est celui des entrées d’horloge.
Un exemple de module avec une entrée d’horloge est le Latch (Loquet en
anglais). Le Latch n’est pas un module d’usine, c’est une macro, mais c’est
néanmoins un exemple parfait pour illustrer le principe d’horloge.
Le Latch a deux entrées: une pour la valeur et une pour l’horloge.
�
��
����� �
En réponse à un évènement entrant, l’entrée de valeur (l’entrée supérieure)
enregistre la valeur entrante dans la mémoire interne du loquet, rien n’est
envoyé en sortie. L’entrée d’horloge, en réponse à un évènement entrant, envoie
vers la sortie la dernière valeur enregistrée (elle ouvre le loquet).
À moins que cela ne soit spécifié autrement, l’entrée d’horloge ignore
complètement la valeur de l’évènement arrivant, elle répond uniquement
à l‘arrivée de l’évènement.
Comme nous discutons pour l’instant des signaux d’horloge et non des loquets,
les exemples d’utilisation du module Latch seront détaillés plus loin.
72 – REAKTOR CORE
De même qu’il existe des modules avec des entrées d’horloge, il paraît clair
que certains signaux de la structure ne transportent aucune valeur utilisée
par (ou utile pour) le module. Certains signaux peuvent même être produits
dans le seul but d’être utilisés comme des sources d’horloge. Appelons-les
signaux d’horloge.
Un exemple de signal d’horloge est l’horloge du taux d’échantillonnage. Elle
produit un évènement pour chaque nouvel échantillon à générer, donc à 44,1
kHz elle “bat” 44100 fois par seconde. La valeur de ce signal n’a pas de
sens, elle n’est pas prévue pour servir en quoi que ce soit, et d’ailleurs (dans
l’implémentation actuelle) elle est égale à zéro.
4.2. Les Object Bus Connections (OBC)
Les Object Bus Connections (OBC, Connexions sur Bus Objet) sont un type
spécial de connexion entre les modules. Une connexion OBC entre deux modules “déclare” qu’ils partagent un même objet (ou état) interne. Le cas le
plus typique est la paire de modules Read et Write, qui partagent une mémoire
commune s’ils sont connectés via OBC.
La fonction du module Write est d’écrire une valeur entrante dans la mémoire
partagée via OBC. La fonction du module Read est de lire la valeur dans la
mémoire partagée via OBC en réponse au signal d’horloge entrant (entrée C).
La valeur lue est envoyée à la sortie du module Read.
�
��
��
��
����� �
�����
��
��
La structure ci-dessus effectue le traitement de la macro Latch (en fait c’est la
structure interne de la macro Latch). Les broches M et S des modules Read et
Write sont des broches de type Latch OBC. La broche M est l’entrée maîtresse
de la connexion et S la sortie esclave de la connexion. L’entrée maîtresse du
module Read est connectée à la sortie esclave du module Write (les deux
autres broches maîtresse et esclave ne sont pas utilisées). Ainsi, dans cette
structure, les modules Write et Read partagent la même mémoire.
REAKTOR CORE – 73
Dans la structure suivante, on trouve deux paires de modules Write et Read.
Chaque paire dispose de sa propre mémoire. Notez que la connexion du milieu
(de la sortie du Read à l’entrée du Write) n’est pas une connexion OBC.
�
��
��
���� �
��
��
��
����� �
��
���� �
��
����� �
��
��
��
On pourrait se demander quelle différence il peut bien y avoir entre être
maître(sse) et esclave. Du point de vue de la possession de l’objet partagé (dans
notre cas une mémoire), il n’y a aucune différence. Cependant, comme nous
l’avons déjà vu dans les sections précédentes, une règle énonce que les modules “en amont” sont traités avant les modules “en aval” en ce qui concerne
le traitement des “évènements simultanés”. De ce fait, dans les deux derniers
exemples, les modules Write sont traités avant leurs Read esclaves.
L’ordre relatif de traitement des modules connectés par OBC est défini
par les mêmes règles que pour les autres modules: les modules “en
amont” sont traités en premier.
En effet, considérons les deux cas sur l’exemple suivant. Dans les deux cas,
l’état original de la mémoire est à 2 et le même évènement de valeur 5 est
envoyé aux modules Read et Write. Dans un cas, le module Write est le maître,
dans l‘autre c‘est le module Read.
�
��
��
��
�����
����
��
��
����� �

� � �� ��� ��
On a représenté ci-dessus la structure du premier cas. Le module de gauche
envoie un évènement de valeur 5 qui arrive d’abord au module Write, ce qui
entraîne l’écriture de la nouvelle valeur 5 dans la mémoire partagée par la paire
Write et Read. Maintenant, l’évènement arrive au module Read, fonctionne
comme un signal d’horloge et commande l’opération de lecture, qui à son
tour lit la valeur de 5 récemment enregistrée et l’envoie à sa sortie. C’est la
fonction de la macro Latch de la librairie de macros de Reaktor Core.
74 – REAKTOR CORE
Considérons maintenant la structure du second cas:
�
��
��
��
�����
����
��
��
����� �
� � ���� � ��
Nous avons ici la situation opposée. D’abord, l’évènement d’horloge arrive
au module Read, envoyant la valeur de 2 à sa sortie. C’est seulement après
cette lecture que l’évènement arrive à l’entrée du module Write, ce qui passe
la valeur enregistrée à 5. Cette structure réalise en fait la fonction d’un bloc
Z-1 (retard d’un échantillon), très souvent utilisé en théorie du traitement du
signal numérique. En effet, la valeur de sortie est toujours en retard d’un
échantillon par rapport à l’entrée.
Comme nous l’avons mentionné, la structure ci-dessus réalise la fonction
Z-1. Mais avant de pouvoir réellement construire ou utiliser vous-même
de telles structures, vous devez prendre connaissance de certains points
importants. Nous vous conseillons donc de poursuivre votre lecture.
Si vous avez plus de deux modules connectés par des câbles OBC, tous ces
modules partagent le même état interne. Il devient alors très important de
savoir si un ordre particulier d’opérations de lecture et d’écriture doit être
appliqué, et si oui, lequel.
Par exemple, dans la structure suivante, l’ordre relatif de traitement des
deux opérations de lecture est indéfini, mais elles arrivent toutes deux après
l’opération d’écriture, il faut donc que cela vous convienne:
�
��
����� �
��
��
��
��
��
�����
�����
��
��
Dans la structure suivante, l’ordre relatif des opérations de première écriture
et de seconde lecture est indéfini, donc cette structure est potentiellement
dangereuse et doit être généralement évitée:
REAKTOR CORE – 75
�
��
��
��
���� �
��
��
���� �
��
����� �
��
��
Une manière plus satisfaisante de réaliser la structure ci-dessus est la
suivante:
�
��
��
��
�����
��
�����
��
����� �
��
��
��
Ou encore celle-là:
�
��
��
��
���� �
��
��
��
����� �
�����
��
��
Même si vous pensez qu’à un certain endroit, l’ordre relatif des opérations de
lecture et d’écriture n’est pas important, imposer un certain ordre de traitement
n‘est pas gênant et c‘est un peu plus sûr.
L’ordre relatif des opérations d’écriture est important. L’ordre relatif des
opérations de lecture importe peu, tant que leur ordre par rapport aux
opérations d’écriture est bien défini.
Les connexions OBC ne sont pas compatibles avec les connexions normales. De plus, les connexions OBC correspondant à des types d’objets
différents ne sont pas compatibles entre elles. Les broches de types
incompatibles ne peuvent pas être connectées, p.ex. vous ne pouvez
pas connecter une sortie de signal normal à une entrée OBC.
76 – REAKTOR CORE
4.3. Initialisation
Comme nous commençons à travailler avec des objets ayant un état interne
(dans le cas des Read et Write, la mémoire partagée), il devient nécessaire
de comprendre ce qu’est l’état initial de la structure que vous avez construite.
Par exemple, si nous voulons lire la valeur dans une mémoire (au moyen d’un
module Read) avant que quoi que ce soit n’y ait été écrit, quelle sera la valeur
lue ? Et si la valeur par défaut ne nous convient pas, comment pouvons-nous
la modifier ?
Ces questions sont réglées par le méchanisme d’initialisation de Reaktor Core.
L’initialisation des structures core est effectuée de la manière suivante:
- d’abord, tous les états sont initialisés à des valeurs par défaut, généralement des zéros. En particulier, les mémoires partagées et toutes
les valeurs de sortie des modules sont réglées sur zéro, à moins que
vous ne l’ayez spécifié autrement ;
- ensuite, un évènement d’initialisation est envoyé simultanément par
toutes les sources d’initialisation. Les sources d’initialisation comprennent la plupart des modules qui n’ont pas d’entrée: les modules
Const (y compris les QuickConsts), les entrées des cellules core, et
certains autres. Les sources envoient généralement leur valeur initiale
comme évènement d’initialisation, p.ex. les constantes envoient leurs
valeurs, et les entrées des cellules core envoient les valeurs initiales
reçues du niveau primaire, à l’extérieur.
Si le module est une source d’évènement d’initialisation, vous en trouverez mention dans la section de référence des modules. Si le module
n’est pas une source d’initialisation, il traite les évènements d’initialisation exactement comme n’importe quel autre évènement. La plupart
des sources d’initialisation sont les modules qui n’ont pas d’entrée(s)
et seulement ceux-ci.
Observons le fonctionnement de l’initialisation avec l’exemple suivant:
�
��
����� �
��
������
��
��
���� �
��
��
��
��
���� �
��
�
REAKTOR CORE – 77
Ce n’est qu’une partie de la structure, le module Read sur la gauche est connecté à une source d’horloge (en anglais clock), qui envoie aussi un évènement
d’initialisation (comme toute source d’horloge qui se respecte).
Initialement, tous les signaux de sortie ainsi que l’état interne de la chaîne
Read-Write-Read sont fixés à zéro.
�
��
��
����� �
��
��
��
���� �
����
����
��
��
��
��
���� �
����
��
��
��
��
��
Puis un évènement d’initialisation est envoyé simultanément de la source
d’horloge et de la constante 5.
�
��
���
����� �
� � ����� ��
���
��
��
���� �
��
���
��
��
���� �
���
��
��
���
Le module Read sur la gauche est traité avant le module Write et donc l’évènement d’horloge y arrive avant que la nouvelle valeur ne soit écrite dans la
mémoire, donc la sortie de ce module Read est égale à zéro. Puis la nouvelle
valeur est écrite dans la mémoire par le module Write. Maintenant, le second
module Read est lancé, générant une valeur de 5 à sa sortie. Enfin, le module
additionneur est traité et génère une somme de 5.
Comme vous vous en souvenez, les entrées déconnectées sont traitées
dans Reaktor Core comme des valeurs nulles (à moins qu’elles ne soient
spécifiées autrement par un module particulier). Cela signifie que ces
entrées reçoivent aussi un évènement d’initialisation, exactement comme
si un véritable module de constante nulle y était connecté.
78 – REAKTOR CORE
�
���
��
��
���
���
Ci-dessus, un additionneur avec une entrée déconnectée et une connectée
à une constante reçoit deux évènements d’initialisation simultanés, l’un venant de la constante zéro “par défaut” et l’autre de la vraie connexion à une
constante.
Il peut aussi y avoir une signification spéciale aux entrées déconnectées
qui ne sont pas des entrées de signal (elles ne peuvent donc pas être
connectées à une constante nulle). Par exemple, une entrée maîtresse
déconnectée d’un module Write signifie que la chaîne de la mémoire
partagée démarre à cet endroit et continue avec les modules connectés
à la sortie esclave.
4.4. Construire un accumulateur d’évènements
Le module accumulateur d’évènements que nous voulons construire maintenant
doit comporter deux entrées, l’une pour le valeurs d’évènements à accumuler,
et l’autre pour remettre l’accumulateur à zéro. Il lui faut aussi une sortie qui
envoie la somme totale des évènements accumulés.
Nous allons construire ce module sous la forme d’une macro core. Une telle
macro sera facile à utiliser à l’intérieur d’une cellule core évènement:
L’intérieur de notre macro ressemble pour l’instant à ceci:
REAKTOR CORE – 79
Le module accumulateur a besoin d’un état interne dans lequel il stockera la
valeur somme des évènements accumulés. Nous allons utiliser les modules
Read et Write pour construire la boucle de l’accumulateur. Vous les trouverez
dans le sous-menu Built In Module > Memory:
Le module que vous voyez à gauche (avec une flèche sortant du rectangle)
est le module Read, et le module à droite (avec une flèche entrant dans le
rectangle) est le module Write.
En réponse aux évènements entrants, la boucle de l’accumulateur doit prendre l’ancienne valeur et lui ajouter la nouvelle. Nous allons donc utiliser le
module Read pour récupérer l’ancien état, utiliser un additionneur pour y
ajouter la nouvelle valeur et utiliser le module Write pour stocker la valeur en
résultant.
Veuillez noter que l’horloge du module Read est pilotée par l’évènement entrant,
et que le module Write (relié au Read par une connexion OBC) est bien sûr
situé en aval du premier, puisque nous voulons écrire après avoir lu.
La structure ci-dessus accumule les valeurs entrantes et envoie en sortie le
résultat de leur somme. Il ne manque plus que la fonction “reset” (le redémarrage) ainsi que la circuiterie pour définir l’état initial.
80 – REAKTOR CORE
Penchons-nous d’abord sur la circuiterie de reset. Puisque nous sommes dans
le monde de Reaktor Core, l’entrée “In” et la sortie “Rst” doivent envoyer un
évènement simultanément. Si nous voulons que cette macro core soit utilisable
dans des contextes divers et variés, nous devons en tenir compte. Supposons
que les entrées “In” et “Rst” produisent simultanément un évènement. Que
voulons-nous qu’il arrive dans ce cas ? Le reset doit-il logiquement survenir
avant que l’évènement accumulé soit traité, ou après ? Ceci est très similaire
à la différence entre les fonctions Latch et Z-1, qui différaient uniquement par
l’ordre relatif de traitement de l’entrée du signal et de l’entrée de l’horloge.
Nous suggérons l’approche du Latch, car ce module est très largement utilisé
dans les structures Reaktor Core, et son comportement est donc plus intuitif.
Dans un Latch, le signal d’horloge arrive logiquement après le signal de valeur.
Dans notre cas, le signal de reset doit arriver logiquement après le signal
accumulé (obligeant l’état et la sortie à prendre la valeur zéro).
Nous devons donc, d’une façon ou d’une autre, “écraser” la sortie de l’accumulateur avec une valeur initiale. Pour ce faire, il nous faudra utiliser un
nouveau concept que nous allons détailler maintenant.
4.5. Le mélange d’évènements
Nous avons déjà abordé différentes manières de combiner deux signaux dans
Reaktor Core, par exemple avec les opérations arithmétiques. Mais il nous
manque toujours un moyen simple de mélanger deux signaux.
Mélanger n’est pas additionner. Mélanger signifie prendre la dernière valeur
de tous les signaux, et non les additionner. Pour mélanger les signaux, vous
devez utiliser le module Merge (Mélanger en anglais...). Observons son fonctionnement.
Imaginez un module Merge avec deux entrées. La valeur initiale de sortie
(avant l’évènement d’initialisation) est bien sûr zéro, comme pour la plupart
de modules:
�
��
��
������
��
Maintenant, un évènement de valeur 4 arrive à la deuxième entrée du module:
REAKTOR CORE – 81
�
��
��
��
������
���
L’évènement traverse le module et apparaît à la sortie. Maintenant, la sortie
du module mélangeur a pour valeur 4.
Puis un autre évènement, de valeur 5, arrive à la première entrée:
� 
��
��
��
������
���
L’évènement traverse le module et apparaît à la sortie, qui passe donc à la
valeur 5.
Maintenant, deux évènements avec les valeurs 2 et 8 arrivent simultanément
aux deux entrées:
� 
��
��
��
��
������
���
Là, nous devons appliquer au module Merge une règle spéciale:
Des évènements simultanés arrivant aux entrées d’un module Merge
sont traités dans l’ordre de numérotation des entrées. Il n’y a toujours
qu’un seul évènement généré en sortie, car une sortie Reaktor Core ne
peut produire plusieurs évènements simultanés.
Dans le cas ci-dessus, l’évènement arrivant à la seconde entrée est traité
après celui arrivant à la première, “écrasant” la valeur 2 par la valeur 8, qui
est transmise (seule) à la sortie.
82 – REAKTOR CORE
4.6. L’accumulateur d’évènements avec reset et initialisation
Pour réaliser la fonction “reset”, nous devons donc “écraser” la sortie de
l’accumulateur par une certaine valeur initiale. Pour ce faire, nous pouvons
utiliser le module Merge, que l’on trouve dans le sous-menu Built In Module
> Flow. Un moyen simple est de connecter la seconde entrée du module
mélangeur à l’entrée “Rst”.
L‘événement de reset est désormais directement envoyé au module Merge,
écrasant la sortie de l’additionneur même si un évènement accumulé arrive
au même moment. De là, l’évènement est envoyé en sortie ainsi que dans
l’état interne de l’accumulateur.
Dans la structure ci-dessus, la valeur arrivant à l’entrée “Rst” est utilisée
comme nouvelle valeur par l’accumulateur. Ce n’est peut-être pas une mauvaise idée, mais en tout cas il ne s’agit pas vraiment d’une fonction “reset”
mais plutôt d’une fonction “set”, implémentée dans le module accumulateur
standard de Reaktor. Si nous voulons une véritable fonction “reset”, nous devons écrire expressément un zéro dans l’état interne, quelle que soit la valeur
apparaissant à l’entrée “Rst”. Nous devons donc envoyer une valeur zéro au
module Write à chaque fois qu’un évènement arrive à l’entrée “Rst”.
Envoyer un évènement avec une valeur particulière en réponse à un évènement
entrant est une tâche assez commune dans Reaktor Core, et nous suggérons
d’utiliser à cette fin une macro Latch, située dans Expert Macro > Memory
> Latch:
Comme nous l’avons décrit plus haut, le module Latch dispose d’une entrée de
valeur (en haut) et d’une entrée d’horloge (en bas). Nous souhaitons connecter
l’entrée “Rst” à l’entrée d’horloge du Latch et une constante nulle à son entrée
REAKTOR CORE – 83
de valeur, car nous voulons envoyer uniquement des évènements de valeur
zéro. Nous pouvons aussi nous rappeler que les entrées déconnectées sont
considérées comme étant des constantes nulles (si rien d’autre n’est spécifié)
et laisser l’entrée de valeur du Latch déconnectée:
La fonction reset devrait maintenant fonctionner correctement.
La dernière chose que nous devons effectuer est de nous assurer que l‘initialisation est correcte. Définissons tout d’abord ce qu’est une initialisation
correcte. Regardons d’un peu plus près comment la structure ci-dessus va
être initialisée.
Supposons que l’évènement d’initialisation soit envoyé simultanément depuis
les entrées “In” et “Rst” de la structure supérieure de la celllule core, ainsi
que depuis la constante nulle implicite de l’entrée de valeur (déconnectée) du
module Latch. Ce dernier, commandé par l’entrée “Rst”, va envoyer une valeur
nulle à la seconde entrée du module Merge, écrasant toute valeur arrivant à
la première entrée de celui-ci. Ainsi, un zéro est inscrit dans l’état interne et
envoyé à la sortie: c’est parfait !
Cependant, cela pose un petit problème. Il est possible que l’évènement
d’initialisation n’arrive pas à l’un des deux ports, voire aux deux. Ceci peut
survenir si par exemple aucun évènement d’initialisation n’arrive à l’entrée
correspondante de la cellule core, ou si cette macro est utilisée dans une
structure Reaktor Core plus complexe qui ne reçoit pas non plus d’évènements
d’initialisation à toutes ses entrées (nous verrons plus tard comment arranger
cela). Nous devons donc apporter une dernière et ultime modification à notre
structure, pour qu’elle soit plus “universelle”.
Rendez-vous dans les propriétés du module Merge et fixez le nombre d’entrées à 3:
84 – REAKTOR CORE
Désormais, même si aucun évènement d’initialisation n’arrive à l’entrée “Rst”,
la constante nulle implicite à la troisième entrée (déconnectée) du Merge
enverra tout de même un évènement d’initialisation, générant ainsi la sortie
et l’état interne initial corrects.
Observons donc son fonctionnement. Nous vous suggérons de construire la
structure primaire suivante utilisant le module créé Event Accum:
Le nombre de voix de l’instrument doit être réglé sur 1 et l’indicateur doit être
réglé pour afficher une valeur et être toujours actif, comme dans l’exemple
précédent. Le bouton doit être placé en mode Trigger (lancement).
REAKTOR CORE – 85
Passez en mode Panel et observez les valeurs augmentant par pas de 1, toutes
les secondes, et redémarrant à chaque pression du bouton.
Profitons de cette occasion pour vous présenter le mode de déboguage de
Reaktor Core. Comme vous l’avez probablement déjà remarqué, contrairement
au niveau primaire de Reaktor, les valeurs à la sortie des modules ne s‘affichent plus lorsque vous laisser le curseur dessus. C’est un effet secondaire
malheureux de l’optimisation interne de Reaktor Core, qui a pour effet que
les valeurs à l’intérieur des structures Reaktor Core ne sont pas accessibles
depuis l’extérieur.
Comme nous vous entendons déjà gémir, nous avons opté pour un compromis.
Vous pouvez désactiver l’optimisation pour une structure core particulière, ce
qui vous permet de voir les valeurs de sortie. Essayons avec la structure que
nous venons de construire. Faites un clic droit sur le fond et sélectionnez
Debug Mode:
86 – REAKTOR CORE
Vous pouvez également activer ce mode via le bout
d’outils.
dans la barre
Maintenant, si vous maintenez votre curseur au-dessus d’une sortie particulière,
vous verrez s’afficher la valeur de cette sortie (ou un intervalle de valeurs):
Vous pouvez désactiver le mode de déboguage en sélectionnant à nouveau la
même commande (ou en appuyant sur le même bouton):
Le mode de déboguage est aussi automatiquement désactivé si vous sortez
de la structure, vous devrez donc l’activer à nouveau pour toute autre structure.
Après avoir “débogué” notre macro, il nous faut penser à l’enregistrer dans
un fichier pour un usage ultérieur. Pour ce faire, effectuez un clic droit sur la
macro et sélectionnez “Save As...”:
REAKTOR CORE – 87
Comme avec les cellules core, vous avez la possibilité d’insérer vos propres
macros dans le menu. Les macros doivent être placées dans le sous-dossier
“Core Macros” du dossier utilisateur de Reaktor:
Si des fichiers se trouvent dans ce dossier “Core Macros” ou ses sous-dossiers, un nouveau sous-menu apparaît dans le menu contextuel (menu du
bouton droit):
88 – REAKTOR CORE
Encore une fois, les mêmes restrictions que pour le dossier “Core Cells”
s’appliquent au dossier “Core Macros”:
- les dossiers vides n’apparaissent pas dans le menu,
- ne placez jamais vos propres fichiers dans la librairie système, mais
dans la librairie utilisateur.
4.7. Réparons le modeleur d’évènements
Nous pouvons maintenant étudier plus en détail ce qui n’allait pas dans le
modeleur d’évènements que nous avons construit auparavant:
Le problème vient de l’évènement d’initialisation. Si vous observez comment
l’initialisation se propage dans la structure ci-dessus, vous remarquerez les
choses suivantes:
- l’entrée ‘x’ envoie ou n’envoie pas d’évènement d’initialisation, selon
qu’elle en reçoit un ou non de la structure primaire à l’extérieur de la
structure (c’est la règle générale pour les évènements d’initialisation
des entrées évènements des cellules core) ;
- les constantes 4 et 0,25 envoient toujours des évènements
d’initialisation.
REAKTOR CORE – 89
De ce fait, si, pour une raison quelconque, l’évènement d’initialisation ne
n‘arrive pas à l’entrée du modeleur, sa sortie continuera à recevoir l’évènement
issu du dernier multiplicateur et transfèrera cet évènement à la structure du
niveau primaire, à l’extérieur.
Même si ceci n‘est pas trop grave pour le traitement du signal (si l’évènement
d’initialisation en entrée fait défaut, l’entrée est considérée comme nulle
et l’évènement d’initialisation de sortie est tout de même envoyé), ce n’est
pas exactement ce que l’on attend intuitivement d’un module de traitement
d’évènements. Nous préfèrerions plutôt que le module envoie un évènement
en sortie uniquement en réponse à un évènement entrant.
Nous sommes donc confrontés au problème suivant: nos modules de constantes peuvent envoyer des évènements à des moments indus (ie quand il n’y a
pas d’évènement en entrée). Comme solution, nous suggérons de remplacer
les modules de soustraction et de multiplication, qui ont des constantes en
entrée, par leurs homologues à Modulation.
Les macros à “Modulation” sont situées dans la librairie de Reaktor Core dans
Expert Module > Modulation:
L’appellation “Modulation”, même si elle n’est pas correcte à 100 %, reflète
pourtant leur fonction, qui est d’utiliser un signal pour en moduler un autre
(nous le verrons clairement plus tard, lorsque nous utiliserons des signaux
de contrôle pour moduler des signaux audio dans des structures de bas niveau). La plupart de ces macros combinent deux signaux, un “porteur” et un
“modulateur” (un peu comme dans la transmission radio). Contrairement aux
90 – REAKTOR CORE
modules core arithmétiques d’usine, les “macros à modulation” génèrent un
évènement de sortie uniquement en réponse à un évènement à l’entrée du
signal “porteur”. Les évènements à l’entrée “modulateur” ne relancent pas
le processus de calcul.
L’implémentation interne des macros à modulation est très simple: elles
retiennent juste le signal modulateur via un Latch, celui-ci étant régulé par
le signal porteur. Voici l’exemple de la structure interne du “multiplicateur à
modulation” (l’entrée appelée “a” est le modulateur):
Nous remplaçons donc le module de soustraction par la macro à modulation
a - x ainsi que le dernier module multiplicateur par la macro à modulation x
mul a. Voici à quoi ressemble notre structure après ces modifications (nous
avons également remplacé les modules Const par des QuickConst, mais c’est
sans importance):
Généralement, dans les macros à modulation, vous pouvez reconnaître l’entrée
du modulateur grâce à l’icône de la macro (le petit dessin sur le module): la
flèche de l’icône indique la position de l’entrée du modulateur. Dans le cas
du module de soustraction, la flèche est en haut, donc l’entrée de modulation
aussi. Pour le module de multiplication, c’est l’inverse. Notez également que
la sortie de ces modules est située en face de l’entrée du porteur, ce qui est
un autre indice. Enfin, vous pouvez placer votre curseur sur les modules et
leurs entrées et lire les informations qui s’affichent.
Dans la structure ci-dessus, aucun évènement ne sera envoyé, à moins qu’un
évènement n’arrive à l’entrée de la cellule core:
-
le module “|x|” est directement commandé par l’évènement d’entrée
de la cellule core ;
REAKTOR CORE – 91
-
le module de soustraction consécutif est uniquement commandé par
la sortie du module “|x|”, qui envoie un évènement uniquement en
réponse à un évènement d’entrée, la constante QuickConst n’ayant
pas d’effet de commande ;
- le premier multiplicateur est commandé soit par la sortie du module
de soustraction, soit par l’évènement d’entrée de la cellule core, mais
nous avons déjà vu que les deux ne peuvent survenir que simultanément ;
- le second multiplicateur est commandé uniquement par l’évènement
entrant et non par la constante QuickConst.
Notre structure se comporte désormais de façon un peu plus intuitive.
5. Le traitement de l’audio en détail
5.1. Les signaux audio
Dans Reaktor Core, les signaux audio ne sont pas d’un type particulier: l’audio
est aussi un évènement, qui ne diffère en rien des autres évènements du point
de vue de la structure. La seule différence est que, pour les signaux audio,
les évènements sont produits “à des instants précis régulièrement espacés”
correspondant au taux d’échantillonnage.
Pour produire des évènements régulièrement espacés (ou tout autre suite
d’évènements d’ailleurs), nous avons besoin d’une source d’évènements.
Comme pour les cellules core évènements, les entrées des cellules core audio
sont aussi des sources d’évènements. Mais nous avons maintenant un type
d’entrée supplémentaire:
Le Entrées Audio envoient régulièrement des évènements core à l’intérieur
de la structure, à un rythme déterminé par le taux d’échantillonnage
utilisé à l’extérieur, dans la structure du niveau primaire. Les évènements sont envoyés simultanément depuis toutes les entrées audio
de la cellule core.
Les entrées audio envoient également l’évènement d’initialisation dans
la structure de la cellule core. Cet évènement est envoyé, quoi qu’il
arrive dans la structure de niveau primaire. Mais la valeur envoyée
par ces entrées pendant l’initialisation dépend, elle, du processus
d’initialisation extérieur (dans la structure primaire).
92 – REAKTOR CORE
Il existe aussi un nouveau type de sortie, utilisé à la place des sorties évènements:
Les Sorties Audio envoient dans la structure extérieure de niveau primaire
la dernière valeur reçue de la structure core intérieure. Comme les
sorties audio du niveau primaire n’envoient pas d’évènements, aucun
évènement n’est envoyé vers l’extérieur.
Nous allons maintenant essayer de reconstruire le même modeleur que précédemment, mais en mode audio au lieu du mode évènement. Globalement, nous
pouvons utiliser exactement la même structure, en remplaçant simplement
les entrées et sorties évènements par leurs équivalentes audio:
Vous pourriez vous demander pourquoi nous n’avons pas utilisé ici les macros
à modulation. La raison en est que nous manipulons maintenant des signaux
audio. Ceux-ci envoient toujours un évènement d’initialisation, nous sommes
donc sûrs de sa présence aux entrées. Mais vous êtes libre d’utiliser des
macros à modulation si vous préférez.
Nous aurions aussi pu essayer d’insérer la structure ci-dessus dans une macro
pour pouvoir la réutiliser dans d’autres structures Reaktor Core, pour le traitement des évènements comme pour celui de l’audio. Dans ce cas, il est conseillé d’utiliser ces fameuses macros à modulation, car il n‘est plus possible
de savoir à l’avance quel type de signal sera traité par le module:
Et voici la structure interne de la cellule core audio pour ce cas précis:
REAKTOR CORE – 93
Pour la tester, nous allons la connecter à un oscillateur en dents de scie
ainsi qu’à un oscilloscope. Vous trouverez un oscilloscope dans Insert Macro
> Classic Modular > 00 Classic Modular – Display > Simple Scope (dans la
structure primaire). N’oubliez pas de vous assurer que le nombre de voix est
bien réglé sur 1.
Nous utilisons le contrôle externe de l’oscilloscope pour une meilleure synchronisation aux taux élevés de distorsion (le bouton Ext du panneau de
l’oscilloscope doit être activé). Modifiez l’intervalle du potentiomètre Ampl à
environ [0.. 5] pour pouvoir observer le modelage.
5.2. Le bus d’horloge du taux d’échantillonnage
Nous devons encore aborder au moins deux points pour pouvoir construire des
structures audio. Le premier est la création des cellules core audio sans entrées
audio. Bien sûr, nous pouvons les créer, mais comment faire pour obtenir une
source d’évènements audio ? Le second point est que de nombreux algorithmes
de traitement numérique du signal (DSP) nécessitent la connaissance du taux
d’échantillonnage actuel. Nous allons ici traiter de ces deux sujets.
Chaque structure Reaktor Core possède une connexion spéciale, appelée
“sampling rate clock bus” (“bus d’horloge du taux d’échantillonnage”). Ce
94 – REAKTOR CORE
bus (ou canal de transmission) transporte deux signaux: ceux de l’horloge et
du taux d’échantillonnage (en anglais “clock” et “rate”).
Clock est une source de signal dans laquelle des évènements sont régulièrement envoyés au taux d’échantillonnage audio. Comme avec
tous les signaux audio standard, cette source envoie un évènement
d’initialisation. Les évènements du signal d’horloge ont toujours une
valeur nulle, mais les structures utilisant ce signal doivent ignorer ses
valeurs car elles pourront être amenées à évoluer dans le futur.
Rate est une source de signal dont les valeurs sont toujours égales au
taux d’échantillonnage actuel, en Hertz. Les évènements sont envoyés
depuis cette source lors de l’initialisation ou lors des modifications
du taux d’échantillonnage.
Vous accédez au bus du taux d’échantillonnage via un clic droit sur n’importe
quelle entrée de signal et en sélectionnant Connect to SR.C pour le signal
d’horloge, ou Connect to SR.R pour le signal de taux d’échantillonnage.
La connexion s‘affiche à côté de l’entrée:
Le bus d’horloge du taux d’échantillonnage ne fonctionne pas à l’intérieur
des cellules core évènements.
5.3. Réinjection d’une connexion
Comme nous l’avons déjà vu, les règles concernant l’ordre de traitement ne
peuvent s’appliquer si la structure contient une ou plusieurs réinjections.
C’est pourquoi nous avons besoin de règles supplémentaires qui définissent
le traitement des réinjections.
REAKTOR CORE – 95
La regle principale est: lLes structures Reaktor Core ne savent pas manipuler la
réinjection.
Non, pas tout à fait comme ça. Vous pouvez effectuer des connexions de
réinjection dans Reaktor Core. Mais comme le moteur de Reaktor Core ne
sait pas manipuler les structures avec réinjection, il va les résoudre. Résoudre
une réinjection signifie que votre structure est modifiée (en interne, vous ne
verrez rien à l’écran) de façon à supprimer la réinjection.
Si jamais vous ne le saviez pas, la réinjection sans délai n’est pas pensable dans
le monde numérique. Il doit y avoir un délai d’au moins un échantillon dans le
chemin de réinjection. Et c’est justement ce que Reaktor Core va faire pendant
la résolution de la réinjection: le moteur va introduire un module de délai d’une
durée égale à un échantillon (Z^-1) dans le chemin de réinjection.
Comme vous le savez déjà, les ports où les délais implicites ont été insérés
par Reaktor Core sont indiqués par un grand Z orange:
Nous avons déjà vu une structure basée sur un module Read et un module
Write réalisant cette fonctionnalité Z^-1. Essayons de placer une telle construction de Read et Write dans notre structure. Nous allons la placer sur le
câble de la réinjection:
D’abord on écrit, puis on lit (notez que le module Read est piloté par l’horloge
96 – REAKTOR CORE
SR.C pour s’assurer que la lecture est effectuée une fois par cadence audio).
Ainsi, la valeur lue a toujours un échantillon de décalage avec la valeur écrite.
Et il n’y a pas de réinjection dans la structure. Vous n’en êtes pas sûr(e) ?
D’accord, déplaçons un peu les modules (sans toucher aux connexions):
Vous êtes d’accord maintenant ? Évidemment !
En insérant un module Z^-1, on supprime formellement la réinjection de la
structure, tout en la conservant, logiquement parlant (avec un délai d’un
échantillon audio).
En fait, la structure interne d’une macro Z^-1 est un peu plus compliquée qu’une simple paire de Read et Write. Nous verrons ceci plus en
détail dans la section suivante.
Vous n’avez aucune influence sur l’endroit où la résolution automatique de
réinjection va être insérée. Elle est insérée sur n’importe quel câble de la
boucle de réinjection. Il n’est même pas garanti que cette résolution soit
toujours placée sur le même câble: elle peut changer dans la prochaine version du logiciel, ou en réponse à une autre modification quelque part dans la
structure, elle peut même être différente la prochaine fois que vous chargerez
cette structure depuis le disque dur.
Cette résolution automatique de la réinjection est conçue pour les structures pour lesquelles l’endroit exact de la résolution n’a pas d’importance. En
particulier, ceci est bien pratique pour les utilisateurs pas vraiment calés en
traitement numérique de signal et ayant du mal à envisager de telles problématiques. La résolution automatique de réinjection leur permet d’obtenir des
résultats satisfaisants.
Si vous avez besoin d’un contrôle précis sur les points de résolution de
réinjection, vous pouvez insérer explicitement des modules Z^-1 dans
vos structures. Ces modules élimineront formellement les réinjections
et aucune résolution interne ne sera nécessaire.
Voici une version de la structure ci-dessus, avec une macro Z^-1 insérée (elle
REAKTOR CORE – 97
se trouve dans le sous-menu Expert Macro > Memory):
Comme vous pouvez le voir, le gros Z orange a disparu, et vous pouvez également constater que le point de délai d’un échantillon n’est plus au même
endroit que celui qui avait été automatiquement inséré: ce dernier était sur
le câble allant de la sortie de l’additionneur à l’entrée du multiplicateur, alors
qu’il est maintenant sur le câble entre la sortie du multiplicateur et l’entrée
de l’additionneur.
La raison d‘être de la seconde entrée du module Z^-1 sera expliquée
plus loin. Vous la laisserez généralement déconnectée.
La réinjection sur les connexions OBC et sur tous les autres types de connexions
“non-signal” (introduites plus loin) n’a pas de sens, c’est pourquoi elle n’est
pas permise. Si une boucle de réinjection sans câble de signal apparaît, une
des connexions est indiquée comme invalide et considérée comme absente.
La marque “invalide” est symbolisée par une croix rouge sur le port:
En revanche, les boucles de réinjection contenant des types “mixes” de
connexions, ie avec des câbles transportant du signal et d’autres types de
câbles, sont tout-à-fait acceptées et sont résolues de la manière habituelle,
la résolution étant insérée sur l’un des câbles “normaux” (ie transportant du
signal):
98 – REAKTOR CORE
En fait, cela signifie que les connexions non-signal ne sont pas affectées
par la résolution de réinjection, à moins de faire une boucle de réinjection
entièrement sans signal, ce qui n‘est pas palpitant.
5.4. Réinjection et macros
De manière générale, en ce qui concerne la résolution des réinjections, les
macros sont traitées comme les modules d’usine.
Considérons une macro qui transfère juste le signal d’entrée en sortie. Voici
sa structure interne:
Supposons maintenant que nous construisons une structure avec réinjection
en utilisant cette macro:
La boucle de réinjection passe par deux câbles dans la structure ci-dessus,
ainsi que par un câble à l’intérieur de la macro. Où la résolution va-t-elle se
produire ? (d’accord, on peut voir sur la figure ci-dessus qu’elle se produit à
l’entrée de l’additionneur dans ce cas particulier, mais nous savons qu’elle
aurait pu se produire ailleurs).
Imaginez un instant que Thru ne soit pas une macro mais un module d’usine.
Dans ce cas, il est évident que la résolution de la réinjection ne peut pas
apparaître dans ce module, mais uniquement à l’extérieur.
Nous nous efforçons de rendre les macros aussi semblables aux modules
d’usine que possible. Pour cette raison, par défaut, la résolution d’une telle
boucle de réinjection aura lieu à l’extérieur de la macro. L’endroit exact n’est
pas spécifié, mais on sait que ce sera à l’extérieur de la macro Thru.
La règle générale est la suivante: la résolution de la réinjection apparaît
dans le niveau de structure le plus élevé de la boucle de réinjection.
REAKTOR CORE – 99
Vous pouvez cependant modifier ce comportement par défaut, c’est-à-dire
autoriser la résolution de réinjection à l’intérieur des macros. En fait, vous
auriez déjà pu vous demander, si les macros sont vraiment traitées comme les
modules d’usine, comment une macro Z^-1 peut-elle résoudre une réinjection.
En effet, considérons la structure suivante:
Si les macros et les modules d’usine étaient équivalents, rien ne devrait changer
lorsque l’on remplace le multiplicateur par une macro Z^-1:
Mais cette structure est différente, car la réinjection implicite a disparu.
Cette macro Z^-1 doit bien avoir quelque chose de spécial... et en effet, elle
a quelque chose de spécial.
Si nous regardons à l’intérieur de cette macro, nous y voyons presque la même
structure que celle de notre propre implémentation de la fonction Z^-1 (cf.
plus haut):
100 – REAKTOR CORE
Comme vous pouvez le constater, l’entrée d’horloge de la macro est connectée
au module Read interne. La connexion par défaut pour cette entrée n’est pas
une constante nulle mais l’horloge audio, car c’est ce dont vous avez besoin
dans la plupart des cas. Le module connecté entre l’entrée supérieure et le
module Write sera expliqué plus loin. Nous pouvons l’ignorer pour l’instant.
Jusque là, rien de spécial dans cette structure, si ce n’est qu’elle semble
réaliser la fonction Z^-1 dont nous avons déjà parlé. Pourtant, comment le
moteur de Reaktor Core sait-il que cette structure sert à résoudre les boucles
de réinjection ? Bien sûr, le moteur sait que cette structure peut résoudre les
boucles de réinjection, mais quant à savoir si elle est prévue pour ? Ceci est
géré par les propriétés de la macro, et plus particulièrement par le réglage
Solid de la macro:
Cette propriété dit au moteur de Reaktor Core si la macro doit être considérée
comme un module d’usine “solide” pour la résolution de réinjection, ou si elle
doit être considérée comme transparente. Dans 99 % des cas, vous conserverez
cette propriété activée. En effet, vous ne souhaiterez généralement pas que
la résolution de réinjection apparaisse à l’intérieur de vos macros.
REAKTOR CORE – 101
Une bonne raison à cela est que la résolution se produisant à l’intérieur d’une
macro passe inaperçue, à moins d’ouvrir la structure interne de cette macro,
d’où le risque que certains délais implicites de réinjection échappent à votre
attention. Par exemple, si nous prenons notre structure avec la macro Thru,
et si nous désactivons le réglage Solid (assurez-vous de modifier ce réglage
pour la bonne macro, vous pouvez le vérifier via le texte “Thru” apparaissant
dans le champ de nom des propriétés):
Assurez-vous de modifier la bonne
macro
Désactivez le réglage Solid
Votre structure externe est probablement toujours la même (nous disons “probablement”, car on ne sait jamais où se trouve la résolution de réinjection):
Mais si vous modifiez votre structure en connectant la sortie à un autre module,
elle pourrait bien ressembler à ceci:
102 – REAKTOR CORE
Notre délai de résolution de réinjection semble avoir disparu. Dans une structure plus grande et plus complexe, nous pourrions facilement oublier qu’il y a
un délai implicite. Où est passé le délai ? Bien sûr, il est maintenant dans la
macro, le seul endroit que nous ne pouvons voir de l’extérieur:
Une deuxième bonne raison pour conserver la propriété Solid activée est
que, dans certains cas, si vous la désactivez, la fonction de la macro peut
être modifiée une fois la macro placée dans la boucle de réinjection. Bref,
facilitez-vous la vie et ne désactivez cette propriété que si vous construisez
des macros spécifiquement conçues pour résoudre les réinjections… ce qui
ne devrait pas arriver tous les quatre matins !
Revenons à notre module Z^-1. Comme la propriété Solid est désactivée pour
cette macro, les limites de cette macro sont complètement transparentes pour
la résolution de la réinjection. Ainsi, la macro Z^-1 n’est pas vraiment traitée
comme un module d’usine et elle peut résoudre la réinjection de la manière
décrite plus haut dans ce texte.
5.5. Les valeurs dénormales
Dans les structures que nous avons construites jusqu’à présent, à l’intérieur
de l’ordinateur, les valeurs des signaux sont représentées par des données
binaires d’un type particulier, appelées les nombres à virgule flottante, en bref
les flottants. Ce type de données permet une représentation efficace d’un
grand éventail de valeurs.
Le terme nombres à virgule flottante n’indique pas exactement comment les
nombres sont représentés. Cette appellation décrit simplement l’approche
utilisée pour les représenter, laissant une grande marge de manœuvre quant
à leur implémentation.
REAKTOR CORE – 103
Les processeurs équipant les ordinateurs personnels d’aujourd’hui utilisent
la norme standard de virgule flottante de l’IEEE (Institute of Electrical and
Electronics Engineers). Ce standard définit exactement comment les nombres
à virgule flottante doivent être représentés et ce que doivent être les résultats
des opérations entre eux (p.ex. comment manipuler les limitations de précision, etc.). En particulier, ce standard dit que, pour un groupe de valeurs à
virgule flottante particulièrement petites qui, pour des raisons de précision
limitée, ne peuvent être représentées correctement de la façon “normale”,
un autre type de représentation doit être utilisée. Cette autre représentation
est appelée “dénormale” (traduction directe de l’anglais “denormal”, terme
utilisé uniquement dans cette acception et ce contexte – NdT).
Pour une virgule flottante en 32-bit, l’intervalle des valeurs “dénormales”
est approximativement de 10-38 à 10-45 et de -10-38 à -10-45. Les valeurs
plus petites que 10 -45 en valeur absolue ne peuvent être représentées
et sont considérées comme nulles.
Comme ces nombres ont une représentation quelque peu différente de celle
des nombres “normaux”, certains processeurs ont des difficultés à les manipuler. En particulier, les opérations sur ces nombres peuvent être parfois
effectuées beaucoup, beaucoup plus lentement (dix fois, voire pire...) que les
opérations sur les nombres “normaux”.
Une situation classique dans laquelle les nombres dénormaux apparaissent pour des durées prolongées est celle des valeurs exponentiellement
décroissantes, comme dans les filtres, certaines enveloppes et autres
structures de réinjection. Dans de telles structures, après que le signal
d’entrée est revenu à zéro, les signaux décroissent asymptotiquement
vers zéro. Asymptotiquement signifie que ces signaux se rapprochent
indéfiniment du zéro, sans jamais l’atteindre. Dans cette situation, les
nombres dénormaux peuvent apparaître et rester dans la structure
pendant un certain temps, entraînant une augmentation significative
de l’utilisation du processeur.
Les nombres dénormaux peuvent également apparaître lorsque vous modifiez la précision d’un flottant d’une valeur élevée (64-bit) à une valeur
plus faible (32-bit). En effet, une valeur de 10-41 n’est pas dénormale
lorsqu‘elle a une précision de 64 bits, mais le devient avec 32 bits (le
changement de précision des flottants sera discutée plus loin).
104 – REAKTOR CORE
Considérons la modélisation d’un filtre passe-bas analogique à 1 pôle avec
une fréquence de coupure fixée à 20 Hz. Nos valeurs de signal numérique
correspondent aux tensions analogiques en volts. Imaginons que le niveau du
signal d’entrée est égal à 1 V (volt) sur une durée assez longue. La tension à la
sortie du filtre est aussi égale à 1 V. Maintenant, nous passons brusquement
la tension d’entrée à zéro. La tension de sortie va décroître selon la loi:
Vout  V0e 2� f ct
où f c est la fréquence de coupure du filtre (en Hertz), t est le temps (en
secondes) et la tension initiale.
La tension de sortie va évoluer comme suit:
après
après
après
après
0,5 sec
0,6 sec
0,7 sec
0,8 sec
Vout ≈10 -29 volt
Vout ≈10 -33 volt
Vout ≈10 -38 volt
Vout ≈10 -44 volt
Oups... les nombres entre 10 -38 et 10 -45 sont dans l’intervalle des valeurs
dénormales. Donc, entre 0,7 et 0,8 secondes à peu près, notre tension est
représentée par une valeur dénormale. Et ce pas seulement dans le filtre: la
sortie du filtre est probablement traitée plus loin par la structure en aval, ce
qui oblige aussi les modules suivants à traiter ces valeurs dénormales.
Au taux d’échantillonnage de 44,1 kHz, l’intervalle de temps de 0,1 seconde
correspond à 4410 échantillons. En supposant que la taille de tampon ASIO
classique est de quelques centaines d’échantillons, nous devons produire de
nombreux tampons réclamant une grosse utilisation du processeur (puisque
tous ces tampons sont remplis de valeurs dénormales). Si le traitement de
ces tampons nécessite une utilisation processeur de près de 100 % (ou plus),
des clics audio apparaissent.
De ces considérations, vous devez tirer l’enseignement suivant: les valeurs
dénormales sont très mauvaises pour l’audio en temps réel...
Les modules du niveau primaire de Reaktor sont programmés pour surveiller
les valeurs dénormales susceptibles de survenir en leur sein. Pour ce faire,
les algorithmes de DSP (traitement numérique du signal) ont été modifiés afin
qu’ils produisent le moins de valeurs dénormales possible. Si vous concevez
vos propres structures de bas niveau dans Reaktor Core, vous devez aussi
REAKTOR CORE – 105
tenir compte de ces valeurs dénormales. Pour vous aider dans cette tâche,
nous avons conçu le module Denormal Cancel, disponible dans le sous-menu
Built In Module > Math:
Le module Denormal Cancel dispose d’une entrée et d’une sortie. Il essaie de
modifier légèrement la valeurs entrante pour éviter qu’une valeur dénormale
n’arrive à la sortie:
La manière dont ce module modifie le signal n’est pas fixe, elle peut varier
d’une version de l’application à l’autre, voire d’un endroit à l’autre dans une
structure. Actuellement, cette opération est effectuée en additionnant une
toute petite constante à la valeur d’entrée. À cause de la limitation en précision, cette addition ne modifie pas les valeurs suffisamment grandes (les
valeurs plus grandes que 10 -10 ne sont pas modifiées du tout). À cause de
cette même limitation en précision, il est aussi très improbable que le résultat
de l’addition soit une valeur dénormale (dans la plupart des cas, c’est même
impossible).
Si, pour quelque raison que ce soit, le module Denormal Cancel ne
fonctionne pas pour votre structure, vous êtes évidemment libre d’utiliser
vos propres techniques d’élimination des valeurs dénormales. Mais une
technique fonctionnant sur une plateforme peut ne pas fonctionner sur
une autre. Notre algorithme DN Cancel s’adapte à chaque plateforme
gérée. Il est donc conseillé d’utiliser le module DN Cancel autant que
faire se peut. Nous allons même réfléchir à la construction d’algorithmes
alternatifs dans ce module – vos contributions sur notre forum sont les
bienvenues !
106 – REAKTOR CORE
Certains processeurs proposent l’option de contourner le standard IEEE
en désactivant la production de nombres dénormaux, forçant le résultat
à valoir zéro. Cette option est parfois disponible, parfois non. Comme
les structures Reaktor Core sont censées être indépendantes de la
plateforme, il est fortement recommandé de vous occuper vous-même
de l’élimination des valeurs dénormales dans vos structures, même si
votre système particulier s’en occupe déjà.
Comme les situations les plus classiques d’apparition de nombres dénormaux
sont les boucles de réinjection exponentiellement décroissantes, et comme en
traitement du son la plupart des boucles de réinjection décroissent exponentiellement (p.ex. les filtres et les structures à réinjection avec retards), nous
avons décidé d’insérer l’élimination des valeurs dénormales dans la macro
standard Z^-1.
Comme vous vous en souvenez, l’intérieur de cette macro ressemble à ceci:
Vous pouvez maintenant expliquer à quoi sert le module Denormal Cancel
(DNC). Comme vous allez souvent utiliser la macro Z^-1 dans des structures à réinjection, il y a une forte probabilité que des valeurs dénormales y
apparaissent. C’est pourquoi nous avons décidé de mettre ce module DNC
directement dans la structure de la macro Z^-1.
Il existe une autre version de cette macro, nommée Z^-1 ndc, qui n’effectue
pas cette élimination des valeurs dénormales (ndc pour no denormal cancel).
Vous pouvez l’utiliser dans les structures pour lesquelles vous êtes certain(e)
qu’elles ne produisent pas de valeurs dénormales (par exemple les filtres FIR
– à Réponse Impulsionnelle Finie):
REAKTOR CORE – 107
5.6. Les autres mauvais nombres
Les nombres dénormaux ne sont pas les seuls nombres méchants qui peuvent s’infiltrer dans vos structures à état interne, en particulier les boucles de
réinjection. Il existe d’autres types de mauvais nombres: les INF, les NaN et
les QnaN. Nous n’allons pas détailler chacun d’eux, une somme conséquente
d’informations les concernant est déjà disponible, notamment sur Internet.
L’important pour nous est d’éviter que ces nombres n’apparaissent dans nos
structures.
Généralement, de telles valeurs sont le résultat d’opérations invalides. Une
division par zéro est le cas le plus évident. D’autres cas entraînent l’apparition de nombres trop grands pour être représentés par des virgules flottantes
(ceux au-dessus de 10 -38 en valeur absolue), ou allant au-delà de l’intervalle
raisonnable pour une opération particulière.
De tels nombres ont tendance à se répandre dans les structures, plus encore
que les nombres dénormaux. Par exemple, dès que vous ajoutez une valeur
normale à une valeur dénormale, le résultat sera non-dénormal (bref normal),
à moins que la deuxième valeur soit presque dénormale. En revanche, si vous
ajoutez une valeur normale à INF, le résultat sera toujours INF.
En plus de cette tendance à se répandre pour toujours dans les structures (...
jusqu’au prochain reset de la structure), ces nombres ont la fâcheuse habitude
d’utiliser beaucoup plus de temps de calcul sur certains processeurs. C’est
pourquoi il nous faut tout faire pour tenter de prévenir leur apparition.
“Tout faire” signifie par exemple de vérifier, à chaque fois que vous divisez
un nombre par un autre, qu’aucune division par zéro ne puisse survenir. La
phase d’initialisation requiert une attention toute particulière. Considérons
par exemple l’élément de structure suivant:
Si, pour une raison quelconque, l’évènement d’initialisation n’arrive pas à
l’entrée inférieure du module diviseur, il en résulte une division par zéro lors
du processus d’initialisation. Dans ce cas, il peut être utile d’utiliser à la place
une macro à modulation, ou carrément de trouver une autre solution, selon
vos besoins.
108 – REAKTOR CORE
5.7. Construction d’un filtre passe-bas à 1 pôle
Un filtre passe-bas simple à 1 pôle peut être construit en utilisant l’équation:
y=b*x+(1-b)*y-1
où
x est l’échantillon d’entrée,
y est le nouvel échantillon de sortie,
y-1 est l’échantillon de sortie précédent et
b est le coefficient définissant la fréquence de coupure du filtre.
La valeur du coefficient b peut être prise égale à la fréquence de coupure
cyclique normalisée, qui peut être calculée à partir de la formule:
Fc = 2*π*fc / fSR
où
fc est la fréquence de coupure désirée (en Hertz),
fSR est le taux d’échantillonnage (en Hertz),
π est 3,14159…
Fc est la fréquence de coupure cyclique normalisée (en radians
pour les curieux).
En fait, le coefficient b est égal seulement approximativement à la
fréquence de coupure normalisée, l’erreur augmentant avec les hautes
fréquences de coupure. Mais, pour nos besoins, cela devrait faire l’affaire, en particulier si nous n’avons pas besoin d’un réglage précis de
la fréquence de coupure de notre filtre.
Commençons par créer une cellule core audio avec deux entrées: l’une pour
l’entrée audio et l’autre pour la fréquence de coupure. Dans cette version
du module, nous allons utiliser une entrée évènement pour la fréquence de
coupure.
Prenons la bonne habitude de construire nos structures Reaktor Core en tant
que macros core, pour pouvoir les réutiliser plus facilement. Nous allons aussi
créer notre filtre en tant que macro. Créons donc une macro à l’intérieur de
la cellule et créons les mêmes entrées pour la macro:
REAKTOR CORE – 109
Construisons maintenant la circuiterie pour convertir la fréquence de coupure
en coupure cyclique normalisée:
6.28319 est le 2*π, qui est ensuite divisé par le taux d’échantillonnage pour
former la valeur à multiplier avec la fréquence de coupure. Nous n’avons pas
besoin d’un multiplicateur “à modulation”, car “F” est logiquement une entrée
de signal de contrôle, nous effectuerons donc la multiplication initiale même
s’il n’y a pas d’évènement d’initialisation à l’entrée “F”.
Nous effectuons la division avant la multiplication car la division est une
opération relativement lourde, et le taux d’échantillonnage ne change
pas si souvent que cela. Si seule la fréquence de coupure change, aucun
évènement n’est envoyé au module diviseur et ainsi la division ne doit pas
être à nouveau effectuée. Ceci est un exemple d’optimisation standard
pouvant être réalisée par le concepteur de la structure core.
Construisons la circuiterie réalisant l’équation du filtre:
Au cas où des évènements asynchrones arriveraient à l‘horloge audio standard,
l‘entrée audio est contrôlée par un Latch. Ceci ne serait pas nécessaire dans
une structure de cellule core pour laquelle nous savons que l’entrée audio
envoie les évènements aux instants corrects. Mais, de façon générale, cette
pratique reste toujours une bonne idée.
110 – REAKTOR CORE
On utilise deux multiplicateurs à modulation pour empêcher que l’entrée “F”
(qui peut, dans l’absolu, changer de valeur à tout instant) ne lance le calcul
dans la boucle de réinjection. L’appellation “macros à modulation” devrait
maintenant être plus claire: ici, le signal issu de la fréquence de coupure sert
à moduler les gains de la boucle de réinjection.
L’utilisation du Latch est une technique standard de Reaktor Core pour
s’assurer que les évènements entrants ne relancent pas le calcul de façon
intempestive. Elle est également largement employée par les macros à
modulation et dans d’autres situations semblables.
Le module Z^-1 sert à enregistrer la valeur de la sortie précédente et envoie
automatiquement un évènement avec cette valeur à chaque battement de la
cadence audio. Le module prévient aussi l’apparition éventuelle de valeurs
dénormales. Les utilisateurs habitués au traitement numérique du signal
devraient remarquer que la structure ressemble beaucoup aux diagrammes
de filtres DSP standard.
Le module Merge (Mélangeur) situé à la sortie de l’additionneur garantit que
l’état du filtre est toujours à zéro après l’initialisation, même si le signal d’entrée a une valeur non nulle à cet instant.
N’oubliez pas de placer le convertisseur pitch-vers-fréquence dans la structure
de la cellule core, et vous êtes prêt(e) pour le test:
Nous suggérons d’utiliser la structure de test suivante (n’oubliez pas de régler
la polyphonie de l’instrument sur 1 voix):
Le potentiomètre Cutoff (Fréquence de coupure en anglais) doit être réglé
dans l’intervalle [0.. 100]. Faites attention aux fréquences de coupure trop
élevées: en raison de l’erreur croissante sur le coefficient du filtre, le filtre
devient instable aux hautes fréquences.
REAKTOR CORE – 111
Un meilleur design du filtre limiterait au moins les valeurs de la fréquence de coupure à l’intervalle pour lequel le filtre est stable. Dans
notre cas, il faudrait limiter le coefficient b à l’intervalle [0.. 0,99] ou
quelque chose comme ça. Les techniques de limitation des valeurs
seront décrites plus loin dans ce texte.
Voici ce que vous devriez désormais voir en mode Panel:
Déplacez le potentiomètre de la fréquence de coupure (Cutoff) et observez
l’évolution de la forme du signal.
6. Le traitement conditionnel
6.1. Le routage des évènements
Dans Reaktor Core, les évènements ne doivent pas systématiquement voyager par les mêmes chemins. Il est possible de modifier dynamiquement ces
chemins. Pour ce faire, vous pouvez utiliser le module Router (Built In Module
> Flow > Router):
Le module Router reçoit des évènements à son entrée signal (celle du bas) et
les envoie soit vers sa sortie 1 (supérieure), soit vers sa sortie 0 (inférieure).
La sortie vers laquelle les évènements sont envoyés dépend de l’état courant
du routeur, contrôlé par l’entrée Ctl (l’entrée du haut).
112 – REAKTOR CORE
L’entrée Ctl reçoit une connexion d’un nouveau type, compatible ni avec les
signaux normaux, ni avec les signaux OBC. Il s’agit d’un signal de type BoolCtl
(“boolean control”, “contrôle binaire” en anglais). Le signal BoolCtl ne peut
être que dans l’état true ou l’état false (vrai ou faux, on ou off, 1 ou 0...). Si
le signal de contrôle est dans l’état true, les évènements sont envoyés à la
sortie 1. Si le signal de contrôle est dans l’état false, les évènements sont
envoyés à la sortie 0.
Dans Reaktor Core, les signaux de contrôle ont une différence notable
avec les signaux normaux: ils ne transmettent pas d’évènements et de
peuvent donc piloter seuls aucun traitement.
Pour contrôler un routeur, vous avez bien sûr besoin d’une source de signal de
contrôle. La source la plus commune est sans doute le module Comparison,
disponible dans Built In Module > Flow > Compare:
Ce module compare les deux signaux d’entrée et transmet le résultat sous la
forme d’un signal BoolCtl. L’entrée supérieure est supposée être à gauche du
signe de comparaison et celle du bas à droite du signe. Le module affichant
‘>’ produit donc un signal de contrôle true si la valeur à l’entrée supérieure
est plus grande que celle à l’entrée inférieure, et un signal false dans le cas
contraire.
Vous pouvez changer le critère de comparaison dans les propriétés du module:
REAKTOR CORE – 113
Les critères disponibles sont:
=
égal
!=
différent (≠)
<=
inférieur ou égal (≤)
<
strictement inférieur
>=
supérieur ou égal (≥)
>
strictement supérieur
Il est bien sûr possible de connecter plusieurs routeurs au même module
de comparaison. Ils changeront d’état simultanément.
Le module Router sépare le chemin d’évènements en deux branches. Assez
souvent, ces branches se rejoignent en aval:
En fonction du résultat de la comparaison, la structure ci-dessus va soit
inverser le signal d’entrée, soit le laisser inchangé.
Une implémentation alternative de cette structure est possible:
Dans cette version, la sortie 0 du Router est déconnectée, le routeur fonctionne
donc comme un interrupteur (ou un gate), laissant passer les évènements
seulement s’il est dans l’état true. La valeur inversée arrive alors à la deuxième
entrée du module Merge (mélangeur), écrasant la valeur non inversée qui arrive
toujours à la première entrée. Si le routeur est dans l’état false, l’inverseur
ne reçoit pas d’évènement et n’envoie rien à la seconde entrée du Merge, qui
transmet donc le signal non modifié à sa sortie.
Les branches sont le plus souvent mélangées avec un module Merge.
Mais, théoriquement, vous pourriez utiliser à la place n’importe quel
autre module (p.ex. un module arithmétique comme l’additionneur, le
multiplicateur, etc.).
114 – REAKTOR CORE
Les routeurs traitent l’évènement d’initialisation exactement comme
les autres évènements. Ainsi, en utilisant des routeurs, on peut filtrer
l’évènement d’initialisation pour l’empêcher d’apparaître dans certaines
parties de la structure.
6.2. Construction d’un limiteur de signal
Construisons la structure d’une macro Reaktor Core qui limitant le signal
audio à un niveau spécifié):
Si le signal d’entrée est inférieur au seuil, il est envoyé à la sortie 0 du routeur puis, via le module Merge, à la sortie de la structure. Sinon, le signal
est envoyé à la sortie 1 où il contrôle le loquet (Latch), envoyant au module
Merge la valeur seuil à la place du signal. La même chose se produit lors de
l’initialisation.
Veuillez remarquer que la sortie de cette structure ne change pas automatiquement quand le seuil change. Le nouveau seuil sera simplement
utilisé pour tous les évènements ultérieurs de l’entrée de signal. Ceci
est assez similaire au comportement des macros à modulation, pour
lesquelles les changements du modulateur ne produisaient pas d’évènements de sortie.
Voici une structure permettant de tester le module limiteur que nous venons
de construire (une cellule core audio est utilisée):
Et voilà ce que vous voyez sur le panneau:
REAKTOR CORE – 115
En fait, vous trouverez un grand nombre de macros de limiteurs “à modulation”
de ce genre dans le menu Expert Macro > Clipping.
6.3. Construction d’un oscillateur en dents de scie simple
Construisons maintenant un simple oscillateur en dents de scie qui génère
une forme d’onde en dents de scie d’amplitude 1 à une fréquence spécifiée.
Nous allons utiliser l’algorithme suivant: “Augmente le niveau de sortie à une
vitesse constante et, dès qu’il dépasse 1, rabaisse-le de 2”.
On pourrait également proposer de réinitialiser le niveau à –1 au lieu de
le rabaisser de 2, mais c’est généralement une mauvaise idée car nous
pourrions difficilement maintenir la fréquence d’oscillation demandée.
La vitesse de croissance du signal définit la fréquence de l’oscillateur selon
l’équation suivante:
d = 2f / fSR
où d est l’augmentation du niveau pour un échantillon audio, f
la fréquence de l’oscillateur et fSR le taux d’échantillonnage.
Nous allons d’abord construire la circuiterie qui traitera cette vitesse de croissance:
Nous avons maintenant besoin de la boucle d’incrémentation. Il est plus que
temps d’utiliser les modules Read et Write exactement comme nous l‘avons
fait précédemment avec l’accumulateur:
116 – REAKTOR CORE
Le module Read lance l’incrémentation du niveau à chaque évènement audio.
La somme de l’ancien niveau et de l’incrément est ensuite comparée à 1
et envoyée soit directement à l’écriture du résultat, soit à la circuiterie de
bouclage.
La troisième entrée du module Merge assure l’initialisation correcte de l’oscillateur à zéro. Théoriquement, le module qui soustrait 2 au niveau du signal
devrait être une macro à modulation, mais cela nous importe peu ici, puisque
le Merge écrase de toute façon le résultat de l’initialisation.
Voici la structure de test que nous vous suggérons (n’oubliez pas le convertisseur P2F à l’intérieur de la cellule core):
Et voilà la vue en mode Panel:
REAKTOR CORE – 117
7. Les autres types de signaux
7.1. Les signaux flottants
Le type de signal le plus couramment utilisé en DSP (traitement numérique
du signal) sur les ordinateurs personnels modernes est la virgule flottante (ou
flottant pour faire court). Les valeurs flottantes peuvent représenter une large
gamme de valeurs, jusqu’à 1038 (en mode 32-bit) voire même 10308 (en mode
64-bit). Aussi utiles soient-elles, les virgules flottantes ont un inconvénient:
elles sont d’une précision limitée. La précision est plus élevée en mode 64bit, mais elle reste limitée.
La précision des valeurs en virgules flottantes est limitée pour
des raisons techniques: si elles n’étaient pas limitées, ces valeurs
nécessiteraient une quantité infinie de mémoire pour les stocker.
C’est pour la même raison que vous ne pouvez pas écrire la
représentation décimale complète d’un nombre transcendental
(comme π) sur une feuille de papier “finie”, aussi grande soit-elle.
Même si vous connaissiez tous les chiffres après la virgule (mais
comment le pourriez-vous, puisqu’il y en a un nombre infini, mais
même si vous le pouviez), essayez juste de les écrire tous: 3,
1, 4, 1, 5, 9, etc. Il arrivera un moment où vous manquerez de
papier. Le traitement de tels nombres aurait également demandé
un processeur infiniment rapide.
Les signaux et l’espace mémoire que vous avez utilisés jusqu’ici sont représentés par des nombres en virgules flottantes en 32-bit. Reaktor Core vous
offre la possibilité d’utiliser des flottants en 64-bit au cas où vous auriez
besoin d’une précision supérieure (ou d’un intervalle de valeurs plus grand,
bien qu’il soit difficile d’imaginer que l’intervalle allant de 10-38 à 1038 puisse
être insuffisant).
Par défaut, tous les traitements de Reaktor Core sont effectués en
flottants de précision 32-bit. Ceci ne signifie pas forcément que les
signaux sont traités comme des flottants en 32-bit, mais que le traitement utilisera au minimum des flottants en 32-bit (bien que des flottants
en 64-bit puissent occasionnellement être utilisés comme résultats
intermédiaires).
Vous pouvez modifier la précision des flottants pour les modules individuels
ou pour les macros complètes. Pour les modules individuels, vous effectuez
118 – REAKTOR CORE
ce réglage via la propriété FP Precision (“floating point precision”, “précision
de la virgule flottante” en anglais) de ces modules:
default
32 bit
64 bit
utilise la précision par défaut pour la structure en question
utilise une précision d’au moins 32 bits
utilise une précision d’au moins 64 bits
Changer la précision pour un module signifie que, dans ce module, le traitement
sera effectué en utilisant la précision spécifiée, et que la valeur de sortie sera
aussi générée en utilisant cette précision.
Vous pouvez également changer la précision par défaut pour des structures
entières si vous faites un clic droit sur le fond et sélectionnez Owner Properties
pour ouvrir les propriétés du module en question:
La précision par défaut sera effective pour tous les modules à l’intérieur de
la structure en question, y compris les macros, tant qu’ils ou elles ne définisREAKTOR CORE – 119
sent pas à leur tour leur propre précision (ou bien, pour les macros, un autre
précision par défaut pour les éléments qu’elles contiennent).
Les signaux en virgule flottante normaux, d‘une précision de 32 ou 64
bits, sont parfaitement compatibles entre eux et peuvent être librement
interconnectés. Les signaux OBC de précisions différentes ne sont pas
compatibles entre eux (car vous ne pouvez pas avoir de stockage qui
soit à la fois en 32 et en 64 bits). Ainsi, pour les signaux OBC, les
réglages “default”, “32 bit” et “64 bit” sont considérés comme étant
différents et incompatibles entre eux, car leur précision effective par
défaut peut être modifiée en changeant les propriétés de l’une des
macros en question.
Les modules d’entrée et de sortie des structures du niveau supérieur des
cellules core envoient et reçoivent toujours des flottants de 32 bits, car
c’est le type de signal utilisé dans les connexions audio et évènements
du niveau primaire de Reaktor.
7.2. Les signaux entiers
Voici un autre type de données couramment gérées par les processeurs modernes. Ce type de données est en fait plus important encore que les virgules
flottantes. Il s’agit des entiers. Les nombres entiers sont représentés et traités
avec une précision infinie. Bien que la précision des entiers soit infinie, l’intervalle des valeurs entières représentables est limité. Pour les entiers représentés
sur 32 bits, les valeurs peuvent aller jusqu’à plus de 109 (un milliard).
La précision infinie des entiers, tant pour le stockage que
pour le traitement, est possible uniquement parce qu’ils n’ont
aucun chiffre après la virgule. On peut donc les écrire avec un
nombre fini de chiffres. Écrivons le nombre de secondes qu’il
y a dans une heure: 3, 6, 0, 0, et c’est tout. C’est aussi simple
que ça! Encore une fois, si vous essayez d’écrire la valeur de π,
vous n’aurez jamais fini: 3, 1, 4, 1, 5... avec les entiers, point
de tout cela.
Alors que la virgule flottante est une représentation naturelle pour les valeurs
changeant continûment (comme les signaux audio), les entiers sont une représentation plus appropriée pour les valeurs changeant de manière discrète
(p.ex. les compteurs).
120 – REAKTOR CORE
De nombreux modules de Reaktor peuvent être commutés en mode entier,
dans lequel ils attendent des valeurs entières en entrée, les traitent comme
telles (ie avec une précision infinie) et produisent des valeurs entières en
sortie. Comme exemples, on peut citer l’additionneur, le multiplicateur ou le
soustracteur. Certains modules ne fonctionnent même qu’en mode entier.
Dans Reaktor Core, les valeurs entières ont une longueur minimale de
32 bits garantie.
La commutation entre les types entier et flottant (si le module en est capable)
est effectuée via la propriété Signal Type du module:
Un module réglé sur le mode entier traite les valeurs d’entrée comme des
entiers et produit des valeurs entières en sortie. Vous pouvez déterminer si
un module est en mode entier grâce à l’apparence différente de ses entrées
et sorties:
Ce réglage n’existe pas pour les macros, car normalement vous ne construisez pas les structures exactement de la même façon selon que vous leur
réservez des entiers ou des flottants (sauf peut-être pour les structures très
très simples).
Les signaux entiers peuvent être tout à fait connectés à des flottants, mais les câbles reliant des signaux de types différents effectuent automatiquement la conversion, ce qui peut nécessiter une certaine quantité de ressources processeur. À l’heure où
nous écrivons ces lignes, cette quantité est décelable sur les PCs
REAKTOR CORE – 121
et assez significative sur les Macs. Les connexions OBC de types
entier et flottant sont bien sûr incompatibles entre elles.
Une telle conversion peut entraîner une perte d‘informations. En particulier, les grands entiers ne peuvent pas être précisément représentés
par des flottants, et le contraire est encore plus vrai. Les grands flottants (plus grands que le plus grand entier représentable) ne peuvent
pas être représentés par des entiers du tout, auquel cas la conversion
est indéfinie. Durant la conversion “flottant vers entier”, les valeurs
sont arrondies à l’entier approximativement le plus proche. Le terme
“approximativement” signifie, par exemple, que la valeur 0,5 sera
arrondie soit à 0, soit à 1, même si vous pouvez être à peu près sûr
que la valeur 0,49 sera arrondie à 0 et 0,51 à 1.
Il est important de comprendre que la commutation d’un traitement complet en mode entier n’est pas la même chose que la
simple conversion de sa sortie en entier. Prenons l’exemple suivant: nous additionnons les deux nombres 2,4 et 4,3 en tant
que flottants. Le résultat est 6,7, ce qui, une fois converti en entier, donne 7. La sortie de la structure suivante est donc 8:
Si nous passons maintenant le premier additionneur en mode entier, au lieu
d’additionner 2,4 et 4,3, nous allons additionner leurs valeurs arrondies, soit
respectivement 2 et 4, ce qui donne 6. Le résultat final sera donc 7:
Les entrées d’horloge ignorent complètement leurs valeurs entrantes, c’est
pourquoi elles sont toujours en virgule flottantes. La conversion du type de
signal ne sera donc pas effectuée pour les signaux utilisés uniquement comme
horloges:
122 – REAKTOR CORE
Ici, l’entrée d’horloge du module Read reste flottante, bien que le module ait
été passé en mode entier (les ports OBC ont la même apparence, qu’ils soient
en mode entier ou flottant).
La réinjection entière est résolue de la même manière que la réinjection
flottante – en insérant un module Z^-1 en mode entier (bien sûr, il n’y
a plus besoin du système d’élimination des valeurs dénormales).
7.3. Construction d’un compteur d’évènements
Construisons un module compteur d’évènements. La fonction de cette macro
est similaire à celle de l’accumulateur d’évènements construit plus haut, mais
au lieu de sommer les valeurs des évènements, ce module va simplement les
compter. Le type entier semble le choix logique pour compter:
Tous les modules préfabriqués ainsi que la sortie ont été réglés en mode
entier. La macro ILatch est utilisée ici à la place du Latch pour redémarrer
le circuit. Les deux macros font exactement la même chose (et se trouvent
dans le même menu), mais la première travaille sur les signaux de type entier.
Une macro à modulation pour les entiers est aussi utilisée (vous la trouvez
dans le menu Expert Macro > Modulation > Integer). Les deux entrées n’ont
pas besoin d’être réglées en mode entier, car elles fournissent uniquement
des signaux d’horloge.
Jetons un œil sur la structure de la cellule core évènement contenant la
macro:
REAKTOR CORE – 123
Nous voyons que la sortie de ce module n’est pas réglée sur le mode entier
(d’ailleurs c’est impossible). Ceci est dû au fait que la cellule core doit, en
tant que module du niveau primaire de Reaktor, sortir un évènement normal
du niveau primaire, qui est forcément en virgule flottante.
Voici une structure de test pour ce compteur:
... et l’allure du panneau correspondant:
7.4. Building a rising edge counter macro
Nous allons maintenant discuter de la technique de comparaison de signe,
qui pourra vous être utile dans la construction de structures Reaktor Core. La
“comparaison de signe” s’attache au signe des nombres (“plus” ou “moins”)
sans prêter attention à leur valeur. Bien sûr, “plus” est plus grand que “moins”.
Ainsi, par exemple:
3,1 est de signe plus grand que –1,4
2,1 de même signe que 5,0
-4,5 est de même signe que –2,9
Vous pourriez implémenter la comparaison de signe via plusieurs modules de comparaison et plusieurs routeurs, mais il existe une technique plus efficace. Dans Reaktor Core, la comparaison de signe peut
être effectuée via le module Compare Sign (Built In Module > Flow >
Compare Sign):
124 – REAKTOR CORE
Vous pourriez implémenter la comparaison de signe via plusieurs modules de
comparaison et plusieurs routeurs, mais il existe une technique plus efficace.
Dans Reaktor Core, la comparaison de signe peut être effectuée via le module
Compare Sign (Built In Module > Flow > Compare Sign):
Le module produit en sortie un signal BootCtl que vous pouvez connecter à
un routeur.
L’une des utilisations possibles de ce module est la détection de fronts montants dans le signal entrant. Nous entendons par “front montant” une partie
croissante du signal. Nous allons construire ci-dessous un compteur de fronts
montants sous forme de macro Reaktor Core:
Remarquez que la sortie est en mode entier, puisque le décompte est, à n’en
pas douter, une valeur entière.
La première chose dont nous avons besoin est une macro de détection de
front qui convertira le front détecté en évènement:
Voici comment la macro de détection peut être implémentée:
La chaîne OBC en bas de la structure conserve la valeur précédente du signal
d’entrée. Comme nous le voyons, la nouvelle valeur est enregistrée après que
REAKTOR CORE – 125
l’ancienne a été lue. Le dernier module Write de la chaîne s’occupe de la
tâche d’initialisation pour l’emplacement mémoire de la valeur précédente.
Nous initialisons cet emplacement à la valeur –1, afin que la première valeur
positive soit comptée comme front montant.
Nous avions déjà vu comment utiliser le module Merge pour initialiser
l’emplacement mémoire. Le module Write à la fin de la chaîne OBC est
une autre technique d’initialisation de la mémoire interne. Il doit être le
dernier module Write dans la chaîne, pour pouvoir écraser les résultats
déjà enregistrés par les modules Write en amont.
Le module Router, contrôlé par le module Sign Comparison, va sélectionner
les évènements, ne laissant passer que ceux pour lesquels le signe passe de
“négatif” à “positif” (bref les “fronts montants”).
Il n’est pas clair qu’un tel module envoie un évènement pendant l’initialisation,
en particulier parce que l’emplacement mémoire est encore à zéro lors du
traitement des évènements d’initialisation, et le signe de zéro est indéfini.
Nous pouvons modifier cette structure de manière à éviter qu‘un événement
ne soit envoyé lors de l’initialisation:
Le module ES Ctl est un “contrôle sensible aux évènements”. Le signal de
contrôle qu’il produit est dans l’état true seulement si un évènement arrive
à l’entrée du module. Puisque l’entrée est déconnectée dans la structure cidessus, autrement dit connectée à une constante nulle, la seule fois où le
signal de contrôle est égal à true est lors de l’initialisation. Le second routeur
va donc bloquer tout évènement survenant pendant l’initialisation et laisser
passer tous les autres.
Remarquez que nous avons ici un exemple d’un module qui n’envoie
pas d’évènement à sa sortie pendant l’initialisation.
126 – REAKTOR CORE
Maintenant que nous avons un module détecteur, nous pouvons le connecter
à la circuiterie de comptage que nous avons déjà:
La fonction de la structure ci-dessus doit être claire. Le module Detect envoie
un évènement à chaque fois qu’il détecte un front montant, et ces évènements
sont comptés par le module Evt Cnt.
Pour construire un circuit de test, plaçons cette macro dans une cellule core
audio et comptons les fronts montants d’une forme d’onde en dents de scie.
La structure interne de la cellule core ressemble à celle-ci:
... et la structure du niveau primaire à ceci:
(n’oubliez pas de régler les propriétés du Meter comme indiqué dans les
exemples précédents).
Voici ce que vous devriez voir dans le panneau:
REAKTOR CORE – 127
La vitesse de changement du nombre doit correspondre à la fréquence de
l’oscillateur, définie par le potentiomètre Pitch. Avec un Pitch valant zéro,
la fréquence de l’oscillateur est d’environ 8 Hz, donc le nombre devrait être
incrémenté environ 8 fois par seconde.
8. Les tableaux
8.1. Introduction aux tableaux
Imaginez que vous vouliez construire un module sélecteur de signal audio qui,
en fonction de la valeur d’un signal de contrôle en entrée, prenne le signal de
l’une des quatre entrées audio:
Pour implémenter ce module, une première approche serait d’utiliser des
modules Router. Mais il y a une autre possibilité. Nous pouvons utiliser une
autre fonctionnalité de Reaktor Core: les tableaux.
Un tableau unidimensionnel est une série ordonnée de données du même type
qui peuvent être référencées par leur rang dans la collection, ie leur index.
Par exemple, prenons un groupe de 5 nombres en virgule flottante:
5.2
16.1
-24.0
11.9
-0.5
Dans Reaktor Core, les indices des éléments d’un tableau démarrent à zéro: le
premier élément a pour index 0. Ici, l’élément d’index 0 est 5,2, celui d’index
1 est 16,1, celui d’index 2 est –24,0 et ainsi de suite.
Voici une représentation de ce tableau:
Index
Valuer
0
5.2
128 – REAKTOR CORE
1
16.1
2
-24.0
3
11.9
4
0.5
Dans Reaktor Core, les tableaux sont créés grâce au module Array (ce qui
signifie... Tableau en anglais) que l’on trouve dans le sous-menu Built In
Module > Memory > Array:
Un module Array a une seule sortie, de type Array OBC. La taille du tableau
(le nombre d’éléments) et le type de données contenues sont spécifiés dans
les propriétés du tableau:
Par exemple, pour le tableau ci-dessus, nous devons spécifier le type de
données float (virgule flottante) et une taille (size) de 5.
Veuillez noter que, comme les indices des tableaux partent de zéro,
l’intervalle d’indices pour un tableau de taille 5 serait de 0 à 4 (vous
pouvez aussi le voir dans le tableau ci-dessus).
Les signaux de type Array OBC correspondant aux différents types de
données ne sont pas compatibles entre eux.
Pour faire référence à un élément d’un tableau, vous devez spécifier son
index. Pour ce faire, vous pouvez utiliser le module Index situé dans Built In
Module > Memory > Index:
L’entrée OBC maîtresse (en bas) du module Index doit être connectée à la
sortie esclave d’un module tableau. Le type de connexion de l’entrée maîtresse doit correspondre au type du tableau, vous devez le spécifier dans les
propriétés du module Index:
REAKTOR CORE – 129
Et maintenant la connexion:
L’entrée supérieure du module Index est toujours de type entier et reçoit la
valeur d’index. Ici, nous faisons une référence à l’élément d’index 1 dans le
tableau:
Notez que le module Const a aussi été réglé sur le mode entier (indiqué par
le symbole de sa sortie). Ceci n’est pas nécessaire, puisqu’une conversion
automatique est effectuée sinon, mais c’est plus joli.
Nous aurions aussi pu utiliser une QuickConst:
La sortie du module Index est de type Latch OBC. Ceci signifie que vous
pouvez y connecter un module Read ou Write (ou plusieurs d’entre eux). Bien
entendu, vous devez veiller à ce que les modules Read et Write soient réglés
sur le même type de données que les modules Array et Index.
Ici, l’élément d’index 1 du tableau est initialisé à 16,1:
130 – REAKTOR CORE
Si un index hors de l’intervalle est envoyé au module Index, le résultat
de l’accès au tableau donne une valeur indéfinie. La structure ne plante
pas, mais il est impossible de savoir quel élément sera lu, ou même si
un élément sera effectivement lu. Ceci signifie que si vous n’êtes pas
certain(e) de la taille du tableau, vous devriez la limiter via des modules
Router ou des macros de la librairie
8.2. Construction d’un détecteur de signal audio
Revenons à la construction de notre module sélecteur de signal audio:
Voici une structure interne vide pour construire ce module:
Nous allons utiliser un tableau de 4 éléments en virgule flottante pour stocker
nos signaux audio:
Voici les propriétés du module tableau:
REAKTOR CORE – 131
Pour écrire les valeurs d’entrée dans le tableau, nous utilisons une macro
standard Write [] disponible dans Expert Macro > Memory > Write []:
Cette macro dispose en interne d’un module Index et d’un module Write,
effectuant l’écriture dans l’élément du tableau avec l’index spécifié:
L’entrée supérieure reçoit bien sûr la valeur à écrire. L’entrée “[]” reçoit
l’index auquel l’écriture doit avoir lieu. L’entrée “M” reçoit la connexion OBC
à un tableau de flottants à la précision par défaut, et la sortie “S” est une
connexion “thru” (ie qui prolonge simplement la chaîne OBC), semblable à
celle d’autres modules OBC comme Read et Write.
L’entrée “M” et la sortie “S” sont des ports de macro d’un type différent de
celui que nous avons utilisé jusqu’à présent. De tels ports peuvent être insérés
en sélectionnant l’entrée “Latch” du menu d’insertion de ports (le troisième
type de port est le BoolCtl):
132 – REAKTOR CORE
Les ports de type “Latch” peuvent servir aux connexions OBC Latch (entre
les Reads et les Writes) ou pour les connexions OBC Array. Ces réglages sont
à effectuer dans les propriétés du port:
Régler le type de connexion sur “Latch” ou “Array” définit le type de connexion OBC. Pour les ports de la macro Write [], ce réglage est visiblement
sur “Array”.
Le module avec deux lignes horizontales parallèles est le module R/W Order,
que l’on trouve dans Built In Module > Memory > R/W Order:
Il ne fait rien d’autre que transmettre la connexion de son entrée maîresse
(en bas) à sa sortie esclave. L’entrée supérieure n’a absolument aucun effet,
si ce n’est celui d’affecter l’ordre de traitement des modules. Tout ce qui est
REAKTOR CORE – 133
connecté à la sortie “S” de la macro sera traité après le module Write, ce qui
ne serait pas forcément le cas si ce module R/W Order était absent de la
structure.
En l’absence du module R/W Order, la fonctionnalité de la macro Write
[] n’aurait été ni assurée ni intuitive, car l’utilisateur se serait alors
attendu à ce que tout ce qui est connecté en aval de la macro Write
[] soit traité après elle. En général, de tels problèmes surviennent uniquement avec les connexions OBC; vous devez donc veiller à placer
des modules R/W Order aux endroits nécessaires dans les macros que
vous concevez.
Le module R/W Order, tout comme les ports OBC, dispose d’une propriété
Connection Type. Pour ce module, cette propriété ne contrôle que le type des
ports “M” et “S”, l’autre entrée étant systématiquement en mode Latch. Pour
plus de détails, veuillez vous référer à la description du module R/W Order
dans la section de référence.
Construisons le circuit permettant d’écrire les signaux d’entrée dans le tableau:
134 – REAKTOR CORE
Les quatre modules Write [] se chargent d’enregistrer les valeurs audio entrantes dans le tableau. Nous avons maintenant besoin de lire l’une des quatre
valeurs. Nous suggérons d’utiliser la macro Read [] (Expert Macro > Memory
> Read []):
Cette macro effectue la lecture dans un élément d’un tableau, dont l’index est
précisé par l’entrée entière au milieu. L’entrée du haut est l’entrée de l’horloge
pour les opérations de lecture – la macro envoie la valeur lue à la sortie du
haut, en réponse à un évènement entrant à cette entrée du haut. Les ports
en bas sont bien sûr les connexions de tableau maîtresse et esclave.
Maintenant, à quoi connectons-nous son entrée maîtresse ? Bien sûr, nous
ne pouvons la connecter directement au module tableau, parce que nous
voulons que l’opération de lecture soit effectuée après toutes les opérations
d’écriture (il pourrait sinon y avoir un délai effectif d’un échantillon, ou pas,
bref rien de très fiable). Nous ne pouvons pas non plus la connecter à l’un
des modules Write []. Cela ne résoud pas notre problème. Nous suggérons
plutôt de connecter les modules Write [] en “ribambelle” derrière le module
tableau, autrement dit de les connecter en série, puis de connecter le module
Read [] à la sortie du dernier module Write []. Le module Read [] est alors
effectivement le dernier.
REAKTOR CORE – 135
Maintenant, que connectons-nous à l’entrée index du module Read [] ? Si
nous voulons que notre valeur de sélection soit entre 1 et 4, nous devons
soustraire 1 à la valeur d’entrée “Sel”. Notez que nous effectuons une soustraction entière (puisque “Sel” est juste une entrée de contrôle, nous n’avons
pas vraiment besoin d’une macro à modulation ici):
La dernière chose à faire est de cadencer le module de lecture via l’horloge
du taux d’échantillonnage (puisqu’il s’agit d’un sélecteur audio):
De façon générale, nous aurions dû prendre soin de limiter la valeur d’entrée
“Sel” à l’intervalle correct, mais pour nous simplifier la tâche nous n’allons
pas le faire maintenant.
Voici la structure de test que nous suggérons (nous avons placé la macro dans
une cellule core audio):
136 – REAKTOR CORE
Le potentiomètre Sel est réglé pour commuter entre les quatre valeurs allant
de 1 à 4.
Affichez la vue du panneau et observez les différentes formes d’onde en
fonction du réglage du potentiomètre:
REAKTOR CORE – 137
8.3. Construction d’un délai
Maintenant que nous possédons une certaine expérience avec les tableaux,
construisons une macro simple de délai audio. Le module doit ressembler à
quelque chose comme ça:
... ou encore mieux, à quelque chose comme ça (pour ce faire nous devons
régler la propriété Port Alignment de la macro sur “top”):
L’entrée “T” reçoit le temps de délai, en secondes.
Si vous jetez un œil sur un appareil de délai analogique à bande, vous verrez
une boucle de bande combinée à des têtes de lecture et d’enregistrement.
Pour être précis, il y a aussi une tête d’effacement, mais pour faire simple
nous pouvons imaginer que la tête d’enregistrement effectue à la fois la tâche
d’écriture et celle d’effacement.
�
�������
���������
Si nous voulons simuler cet appareil sous forme numérique, il nous faut une
sorte de boucle de bande digitale. De par la nature discrète du monde numérique, la boucle de “bande digitale” contiendra un nombre fini d’échantillons
audio. Ces échantillons seront enregistrés et lus au taux d’échantillonnage
audio:
138 – REAKTOR CORE
�
�������
���������
Un choix naturel pour cette “boucle de bande digitale” est un tableau dont la
taille est égale au nombre d’échantillons enregistrés dans la boucle.
Dans un délai analogique à bande, le temps de délai dépend de la distance
entre les têtes de lecture et d’enregistrement - qui est fixe - et de la vitesse
de défilement de la bande - qui est variable - et ce pour des raisons techniques évidentes: il est bien plus facile de faire varier la vitesse de la bande
que l’écartement des têtes... Dans le monde digital, il se trouve que c’est le
contraire: faire varier la vitesse de la bande revient à effectuer une conversion
du taux d’échantillonnage entre la “bande digitale” et la sortie, alors que faire
varier la distance entre les têtes est relativement simple. C’est donc ce que
nous allons faire de ce pas:
�
�������
���������
Il y a une autre différence notable avec le monde analogique. Dans le monde
analogique, la bande se déplace. Si nous voulions déplacer notre “bande
digitale”, nous serions obligés de copier tous les éléments du tableau dans
l’élément voisin pour chaque battement de l’horloge audio, ce qui coûterait cher
en ressources processeur. À la place, nous allons plutôt déplacer les têtes.
De tout ceci, nous pouvons conclure que nous avons besoin des éléments
suivants:
REAKTOR CORE – 139
Tableau
Index d’écriture
Index de lecture
– notre simulation de “boucle de bande digitale”
– notre tête d’enregistrement
– notre tête de lecture
Les index de lecture et d’enregistrement se déplacent donc à travers le tableau,
échantillon par échantillon. Au moment où l’un d’eux atteint la fin du tableau,
il doit être renvoyé au début du tableau (ce qui correspond à scotcher la fin
de la bande avec son début). La différence entre la position de lecture et celle
d’écriture correspond au temps de délai mesuré en échantillons.
Cette technique est en fait assez classique en programmation, on l’appelle la technique du “tampon circulaire” (“circular buffer”), ou “tampon
en anneau” (“ring buffer”).
Commençons par programmer la “tête d’enregistrement”. Cette fonction est
très similaire à l’oscillateur en dents de scie que nous avons déjà programmé,
si ce n’est que les calculs sont effectués en mode entier. Le pas d’incrémentation vaut 1 (pour chaque tic-tac audio), l’intervalle des valeurs de sortie va
de 0 à N-1, où N est la taille du tableau. Plaçons cette circuiterie dans une
macro “RecordPos”:
L’entrée “N” doit recevoir le nombre d’éléments du tableau, et la sortie “Pos”
doit générer la position courante d’enregistrement (l’index). Voici comment
implémenter cette macro (comparez avec l’implémentation de l’oscillateur en
dents de scie vu plus haut):
Notez que le module de comparaison est réglé sur “>=”. Le signe “=” était
sans importance pour l’oscillateur en dents de scie, mais pour les calculs sur
les entiers, la différence se révèle généralement décisive. La condition “>=”
garantit que la tête d’enregistrement n’atteindra jamais la valeur N.
Au niveau supérieur, nous créons un module tableau et le connectons à ce
RecordPos via le module Size [] (disponible dans Built In Module > Memory
> Size []), qui renvoie la taille du tableau:
140 – REAKTOR CORE
La taille du tableau peut aller jusqu’à 44100 emplacements. Ceci nous autorise jusqu’à 1 seconde de délai (une seconde moins un échantillon, pour être
précis) au taux d’échantillonnage de 44,1 kHz:
Il nous faut maintenant calculer les véritables index. Pour ce faire, nous allons
construire deux macros. La première macro va convertir le temps de délai
demandé en distance, exprimée en échantillons:
Ceci peut être effectué en multipliant le temps (en secondes) par le taux
d’échantillonnage (en Hertz). Nous devons aussi penser à limiter le résultat,
la macro Expert Macro > Clipping >IClipMinMax devrait faire l’affaire:
REAKTOR CORE – 141
Nous nous limitons à N-1 car c’est effectivement la plus grande distance
possible entre deux éléments du tableau. Notez que la conversion en entiers
est effectuée après la multiplication.
Nous aurions aussi pu limiter directement la valeur d’entrée (à une
valeur différente, bien sûr), ce qui est généralement plus approprié,
puisque les valeurs flottantes au-delà des limites de représentation des
entiers peuvent produire des valeurs entières arbitraires, rendant alors
la limitation sans objet.
Nous utilisons ensuite une autre macro pour calculer l’index de lecture à partir
de RecordPos et Distance:
La position de lecture doit être située à Distance échantillons derrière la position
d’enregistrement, c’est pourquoi nous effectuons leur soustraction:
La valeur de la distance passe par un loquet car elle est produite par une
entrée de contrôle qui peut potentiellement recevoir des évènements à n’importe quel moment, et nous ne voulons pas que la soustraction survienne à
d’autres moments que les évènements de l’horloge audio.
Si nous nous contentons de soustraire, la différence risque d’être souvent
négative. Ceci est dû au fait que notre tableau n’est pas une boucle, ses
extrémités ne sont pas connectées entre elles. Nous devons donc cycliser le
résultat:
-1 doit devenir N-1,
-2 doit devenir N-2,
-3 doit devenir N-3,
etc.
142 – REAKTOR CORE
Plaçons donc une autre macro pour la cyclisation:
Comme RecordPos et Distance sont tous deux entre 0 et N-1, nous savons
que leur différence ne peut pas être inférieure à que –N+1. La cyclisation
peut donc être réalisée par une simple addition de N:
Revenons à notre structure du niveau supérieur. Nous avons maintenant les
indices de lecture et d’enregistrement, il nous reste à effectuer ces mêmes
lectures et enregistrements:
Notez que la lecture se a lieu après l’écriture et qu’elle est cadencée par
l’horloge du taux d’échantillonnage.
Voici la structure de test que nous proposons. N’oubliez pas de placer un
convertisseur ms2sec dans la cellule core Delay, ni de régler celle-ci en mode
monophonique:
REAKTOR CORE – 143
En fait, il est conseillé de passer le délai en mode monophonique dès que possible, car pour chaque voix il consomme environ 200 Ko de mémoire. En effet, 44100 échantillons,
utilisant 4 octets (32 bits) chacun, font en tout:
44100*4 = 176400 octets = un peu plus de 172 Ko
(un kilooctet contient 1024 octet)
Pour tester la structure ci-dessus, jouez des notes sur votre clavier MIDI et
écoutez-les retardées de la durée spécifiée par le potentiomètre Time.
8.4. Les tables
Il existe un autre module similaire à Array. Il s’appelle Table et se trouve dans
le sous-menu Built In Module > Memory > Table:
Les tables sont en fait des tableaux un peu particulier, en ceci que vous ne
pouvez que lire dans les tables, l’écriture y étant interdite. Les valeurs d’une
table sont préinitialisées via les propriétés du module. Pour accéder à la liste
des valeurs, appuyez sur le bouton dans la fenêtre de propriétés:
Cliquez ici pour modifier les
valeurs
Une nouvelle boîte de dialogue doit apparaître:
144 – REAKTOR CORE
Vous voyez une table vide. Elle contient un seul élément, de valeur zéro. Vous
pouvez maintenant commencer à saisir les nouvelles valeurs manuellement ou
les importer depuis un fichier. Si vous choisissez l’option manuelle, cliquez
sur le bouton
. La boîte de dialogue suivante apparaît:
Vous devez sélectionner le type de valeurs stockées dans la table, sa taille
(le nombre d’éléments qu’elle contient) et une valeur pour initialiser tous les
éléments de la table.
Vous pouvez également importer la table depuis un fichier. Le fichier peut être
aux formats WAV/AIFF, texte (TXT/ASC) ou Native Table (NTF). Pour importer
depuis un fichier, appuyez sur le bouton
Une boîte de dialogue apparaît et
vous permet de sélectionner un fichier. Puis une autre boîte de dialogue vous
demande de sélectionner le type de données pour les valeurs de la table.
REAKTOR CORE – 145
Essayons d’utiliser une table. Nous allons construire une macro d’oscillateur
sinusoïdal via l’approche “lecture de table”:
Dans cette macro, commençons par créer un module table:
Nous l’initialisons via le fichier sinetable.txt que nous vous avons préparé dans
le dossier “Core Turorial Examples”, dans le dossier d’installation de Reaktor.
Il s’agit d’un fichier texte contenant les valeurs d’une fonction sinus, sur une
période entière plus un sample. Importez-les en tant que valeurs flottantes
Float32:
Vous pouvez aussi visualiser les valeurs chargées sous l’aspect d’une forme
d’onde. Les boutons
et
commutent entre les deux affichages “liste”
et “forme d’onde”.
Appuyez sur OK pour fermer la boîte de dialogue et transférer les valeurs à
la table.
Il existe également une propriété FP Precision, que vous trouverez dans la
fenêtre de propriétés de la table. Elle ne contrôle pas vraiment la précision
146 – REAKTOR CORE
des valeurs dans la table (celle-ci aurait dû être sélectionnée lors de l’importation des valeurs depuis un fichier ou lors de leur saisie manuelle). Elle
définit plutôt la précision “formelle” de la sortie du module Table. De façon
générale, laissez cette propriété sur “Default”:
Précision formelle de la sortie
Maintenant que nous avons la table, continuons à construire l’oscillateur. Il
sera basé sur un “oscillateur de phase” qui génèrera un signal en dents de
scie montantes, de 0 jusqu’à la taille de la table moins un:
L’implémentation de l’oscillateur de phase est assez semblable à celle d’un
oscillateur en dents de scie ou à celle de la position d’enregistrement dans
le délai précédent:
Un module Read [], connecté à l’oscillateur de phase et cadencé par l’horloge
du taux d’échantillonnage, accède à l’élément correspondant dans la table
et extrait sa valeur.
REAKTOR CORE – 147
La structure de test que nous suggérons est la suivante (n’oubliez pas le
convertisseur P2F dans la cellule core):
... dont voici le panneau:
Bien entendu, le sinus produit ne sonne pas très bien car nous n’avons pas
effectué d’interpolation. Nous vous laissons le plaisir de construire une version
avec interpolation si vous le souhaitez.
148 – REAKTOR CORE
9. Construction de structures optimisées
La règle dit: aucun outil n’est parfait. La technologie Reaktor Core ne fait pas
exception. Cela ne signifie pas qu’elle soit mauvaise, bien au contraire, nous
pensons que cette technologie est tout simplement géniale . Pas parfait
signifie réel. Cela implique que vous deviez avoir quelques connaissances sur
comment tirer le meilleur parti de cette technologie. Appelez cela “Trucs et
astuces” ou quoi que ce soit d’autre. Nous allons ici discuter de ces questions
d’optimisation.
9.1. Les Latches et les macros à modulation
Utilisez les Latches (loquets) et/ou les macros à modulation à tous les endroits
nécessaires, pour être sûr(e) de retarder les évènements jusqu’à ce qu’ils
doivent effectivement être traités.
Voici une structure qui utilise une macro à modulation pour la multiplication
dans la boucle d’itération audio. L’utilisation de la macro à modulation évite
que le traitement soit lancé par les évènements de l’entrée “a”:
Nous pourrions tout aussi bien utiliser un loquet explicite dans la structure:
Nous avons déjà mentionné de nombreux exemples de cette technique plus
haut dans ce manuel.
L’utilisation des loquets intéresse à la fois l’optimisation des performances et
l’exactitude de vos structures. Certaines erreurs typiques de la programmation de structures sont liées à l’envoi d’évènements à certains modules aux
mauvais moments.
REAKTOR CORE – 149
Ne craignez pas que les loquets diminuent les performances de vos structures.
Les loquets ne consomment pas beaucoup, voire pas du tout de ressources
processeur.
Les loquets sont généralement préférés aux routeurs pour le filtrage des
évènements, car ils consomment moins de puissance processeur. Autant que
faire se peut, utilisez les routeurs uniquement lorsque la logique du traitement
impose leur emploi.
9.2. Routage et mélange
Le routage peut être plus ou moins coûteux en termes de puissance de calcul,
selon la situation et votre plateforme. Si vous pouvez éviter le routage sans
ajouter d’opérations coûteuses à votre structure, faites-le !
Le routage ES Ctl peut être parfois remplacé par des Latches. Si possible,
ayez recours à ce remplacement.
Si vous séparez le chemin d’évènements en deux branches via un routeur, il
est souhaitable de mélanger ces branches après leur traitement différentiel:
Il est aussi conseillé de mélanger au routeur les évènements entrants (non
séparés):
Le mélange ne doit pas forcément être effectué via un module Merge. N’importe quel module arithmétique ou similaire fait l’affaire:
150 – REAKTOR CORE
Le mélange peut aussi se faire dans une macro (en fonction de sa structure
interne):
Il peut être nécessaire ou raisonnable de mélanger les branches générées
par différents routeurs, mais veillez alors à la consommation de puissance
processeur.
9.3. Les opérations numériques
Pour les nombres en virgule flottante, l’addition, la soustraction, la valeur
absolue et l’opposé sont généralement les opérations les plus économiques.
Pour les entiers, ce sont l’addition, la soustraction et l’opposé. La valeur absolue d’un entier est aussi relativement économique. L’élimination des valeurs
dénormales du module DN Cancel est, comme vous vous en rappelez, une
simple addition.
En revanche, la division de flottants, la multiplication et la division d’entiers
consomment en moyenne plus de puissance.
Il est conseillé de regrouper vos opérations d’une manière telle que les plus
coûteuses soient effectuées le plus rarement possible. Par exemple, si vous
devez calculer une fréquence normalisée en divisant la fréquence en Hertz
par le taux d’échantillonnage, il est judicieux de calculer d’abord l’inverse du
taux d’échantillonnage puis de multiplier le résultat par la fréquence:
REAKTOR CORE – 151
Dans la structure ci-dessus, la division est effectuée seulement lors des
changements de taux d’échantillonnage, qui devraient être plutôt rares. Les
changements de la fréquence ne relancent que la multiplication.
Comparez avec l’implémentation directe de la même formule:
dans laquelle la division est effectuée en réponse à chaque changement de
la fréquence.
9.4. Conversions entre flottants et entiers
De manière générale, évitez toute conversion inutile entre flottants et entiers.
Selon la plateforme, ces conversions peuvent utiliser une part non négligeable
de la puissance processeur. Les conversions nécessaires doivent être maintenues, bien sûr...
Bien que la structure suivante fonctionne comme prévu, elle comprend en fait
deux conversions inutiles entre entiers et flottants:
La première conversion a lieu à l’entrée du module additionneur, au milieu. Ce
module est réglé pour travailler avec des flottants, mais il reçoit un signal entier
en entrée. Il convertit donc les entiers en flottants. La seconde conversion
a lieu à l’entrée du module de valeur absolue, qui est réglé en mode entier
alors qu’il reçoit les flottants issus de la sortie de l’additionneur. Il convertit
donc les flottants en entiers.
152 – REAKTOR CORE
Voici une bien meilleure façon de procéder:
Tous les modules sont réglés en mode entier, il n’y donc aucune conversion
à faire.
Les signaux d’horloge doivent généralement être de type flottant, mais si un
signal entier est utilisé, ce n’est pas un problème:
Même si l’entrée d’horloge du Latch est flottante, elle est cadencée par un
signal entier. Comme la valeur de l’horloge est sans importance, aucune
conversion n’est effectuée.
REAKTOR CORE – 153
Annexe A. Interface utilisateur de Reaktor Core
A.1. Les cellules core
Une cellule core peut être créée dans la structure du niveau primaire de
Reaktor (sauf dans la structure de l’ensemble) via un clic droit sur le fond et
en sélectionnant Core Cell > New Audio ou Core Cell > New Event.
Les cellules core des librairies (utilisateur comme système) se trouvent dans
le même menu “Core Cell”. Vous pouvez également charger les cellules core
via la commande Core Cell > Load….
Pour supprimer une cellule core, sélectionnez-la et appuyez sur la touche Suppr,
ou bien faites un clic droit sur la cellule core et sélectionnez la commande
Delete. Il est aussi possible de supprimer une sélection multiple.
Pour enregistrer une cellule core dans un fichier, faites un clic droit sur la
cellule core et sélectionnez la commande Save Core Cell As….
Pour modifier la structure interne de la cellule core, double-cliquez dessus.
Pour resortir de sa structure, double-cliquez sur le fond.
Pour modifier les propriétés externes de la cellule core, faites un clic droit
sur la cellule et sélectionnez Properties. Si la fenêtre de propriétés est déjà
ouverte, il vous suffit de cliquer sur la cellule.
Pour modifier ses propriétés internes, vous devez vous rendre dans sa structure interne, faire un clic droit sur le fond de l’écran et sélectionner Owner
Properties. Si la fenêtre de propriétés est déjà ouverte, il vous suffit de cliquer
sur le fond.
A.2. Les macros et modules core
Pour créer un module ou une macro core normal(e), faites un clic droit dans
la partie centrale (la plus grande) de la structure core et sélectionnez l’un(e)
des modules/macros dans les menus Built In Module, Expert Macro, Standard
Macro, ou User Macro. Vous pouvez aussi charger un(e) module/macro par un
clic droit sur le fond et en sélectionnant la commande Load Module….
Une macro vide peut être créée depuis le menu Built In Module.
154 – REAKTOR CORE
Pour enregistrer un(e) module/macro core dans un fichier, faites un clic droit
dessus et sélectionnez la commande Save As….
Pour supprimer un(e) module/macro core, sélectionnez-le(la) et appuyez sur la
touche Suppr, ou bien faites un clic droit dessus et sélectionnez la commande
Delete. Il est aussi possible de supprimer une sélection multiple.
Pour modifier la structure interne du module / de la macro core, double-cliquez
dessus. Pour resortir de sa structure, double-cliquez sur le fond.
Pour modifier les propriétés du module / de la macro core, vous devez vous
rendre dans sa structure interne, faire un clic droit sur le fond de l’écran et
sélectionner Owner Properties. Si la fenêtre de propriétés est déjà ouverte, il
vous suffit de cliquer sur le fond.
Vous pouvez également accéder aux propriétés du module / de la macro core
depuis l’extérieur, via un clic droit dessus et en sélectionnant Properties.
Si la fenêtre de propriétés est déjà ouverte, il vous suffit de cliquer sur le
module / la macro.
A.3. Les ports core
Pour créer un port core, effectuez un clic droit dans la zone de gauche (entrées) ou de droite (sorties) de la structure core et sélectionnez l’un des types
de ports disponibles dans le sous-menu New.
Pour supprimer un port core, sélectionnez-le et appuyez sur la touche Suppr,
ou bien faites un clic droit dessus et sélectionnez la commande Delete. Il est
aussi possible de supprimer une sélection multiple (y compris une sélection
mixte de modules/ports).
A.4. Modification de la structure core
Pour déplacez un module core, cliquez dessus et déplacez-le vers l’endroit
souhaité. Les ports peuvent être déplacé uniquement verticalement, leur ordre
vertical définissant leur ordre d’apparition à l’extérieur.
Pour créer une connexion entre une entrée d’un module et une sortie d’un
autre, cliquez sur l’un des ports et déplacez le curseur sur l’autre port.
Pour supprimer une connexion, cliquez sur le câble de connexion pour le
sélectionner, puis appuyez sur la touche Suppr. Vous pouvez aussi cliquer sur
REAKTOR CORE – 155
l’entrée et déplacer le curseur n’importe où sur le fond de l’écran.
Pour créer une QuickConst, effectuez un clic droit sur l’entrée d’un module
et sélectionnez Connect to New QuickConst. Pour accéder aux propriétés de
la QuickConst, cliquez simplement sur celle-ci.
Pour créer un QuickBus, effectuez un clic droit sur une entrée ou une sortie
d’un module et sélectionnez Connect to New QuickBus. Pour connecter une
entrée ou une sortie de module à un QuickBus existant, cliquez sur cette
entrée ou cette sortie, et sélectionnez l’un des bus disponibles dans le menu
Connect to QuickBus.
Annexe B. Le concept de Reaktor Core
B.1. Les signaux et les évènements
Les signaux peuvent être de type flottant ou entier. Les ports flottants ressemblent à ceci: , et les ports entiers à cela:
Les signaux se propagent sous la forme d’évènements à travers les connexions
depuis les sorties jusqu’aux entrées connectées. Un évènement est une action
basique qui se produit à une sortie particulière, changeant la valeur de cette
sortie (dans certains cas, la valeur est changée en elle-même).
Tous les évènements provenant de la même source d’évènements sont considérés comme “simultanés”. Ceci signifie que si deux évènements arrivent à
différentes entrées d’un même module, ils arrivent “simultanément”.
“La même source” signifie la même sortie: dans certaines circonstance,
plusieurs sorties peuvent être considérées comme “une même source d’évènements”. Par exemple, toutes les entrées audio et connexions d’horloge du
taux d’échantillonnage standard sont considérées comme une même source
d’évènements. Dans ce contexte, “la même source” ne signifie pas forcément
“la même valeur” mais plutôt leur “simultanéité”.
À moins qu’un module donné soit une source d’évènements, la seule chose
pouvant commander le traitement de ses valeurs entrantes est un ou plusieurs
évènements arrivant à ses entrées. S’il s’agit d’évènements multiples, un seul
évènement est produit en sortie, puisque les évènements en entrée arrivent
simultanément.
156 – REAKTOR CORE
B.2. L’initialisation
L’initialisation des structures s’effectue de la façon suivante. D’abord, toutes
les valeurs sont remises à zéro. Puis l’évènement d’initialisation est envoyé
simultanément depuis toutes les sources d’initialisation. Généralement, il
s’agit des constantes, des entrées des cellules core (mais pas toujours) et
des horloges. C’est tout.
B.3. Les connexions OBC
Les OBC (Object Bus Connections) sont des connexions entre modules qui
n’envoient aucun signal mais déclarent juste que les modules partagent un
même état commun (mémoire). La connexion de ce type la plus courante
est celle entre des modules Read et Write accédant à une même valeur enregistrée.
B.4. Le routage
Vous pouvez utiliser les modules Router pour diriger le flux d’évènements entre
deux chemins possibles. Si le Router choisit l’un des chemins de sortie pour
les évènements entrants, l’autre sortie ne reçoit pas d’évènement (cela signifie
en particulier que la valeur de cette autre sortie ne peut pas être modifiée).
Le Router est contrôlé par une connexion d’entrée de type BoolCtl. À l’autre
extrémité de cette connexion, vous avez généralement un module Compare
(parfois, d’autres modules intermédiaires comme des ports de macro BoolCtl
peuvent se trouver entre le Compare et le Router).
En utilisant les Routers, vous pouvez dynamiquement activer ou désactiver
les calculs dans certaines parties de vos structures.
En général, après avoir séparé le chemin du signal en deux via un Router,
vous voudrez remélanger les deux branches via un module Merge ou un autre
module. Souvent, vous voudrez mélanger une des branches au signal original
non séparé. De manière générale, vous êtes libre de faire ici ce qu’il vous
plaira (mais faites tout de même attention à la consommation de ressources
processeur).
B.5. Le “latching”
Le “latching” (utilisation des Latches, ou loquets) est probablement la technique la plus courante dans Reaktor Core. Elle consiste à utiliser des modules
Latch pour éviter que des évènements ne soient envoyés aux mauvais instants.
REAKTOR CORE – 157
Par exemple, vous ne voudriez pas qu’un évènement de signal de contrôle ne
lance un calcul dans une boucle audio.
Vous pouvez aussi utiliser les macros du groupe Expert Macros > Modulation,
qui est un ensemble des combinaisons de Latches les plus courantes, avec
quelques modules de traitement arithmétique.
B.6. Les horloges
Les horloges sont des sources d‘évènements. D‘habitude, les évènements
d‘horloge arrivent à des intervalles réguliers qui correspondent à la fréquence
de l‘horloge. Vous avez besoin d‘horloges pour piloter différents modules
comme les oscillateurs, les filtres, etc. La plupart des implémentations de
ces modules n‘ont pas besoin d’une connexion d‘horloge explicite venant de
l‘extérieur: ils utilisent implicitement une source d‘horloge standard disponible
dans les structures core. Cette source est l‘horloge du taux d‘échantillonnage,
qui tourne à la fréquence audio par défaut.
Veuillez noter que, dans les cellules core évènements, bien que la connexion à
l‘horloge du taux d‘échantillonnage soit disponible, le signal d‘horloge lui-même
n‘est pas disponible. C‘est pourquoi la plupart des oscillateurs, filtres et autres
modules similaires ne fonctionnent pas dans les cellules core évènements.
Annexe C. Les ports des macros core
C.1. In
Reçoit un évènement entrant depuis l’extérieur et le transfère inchangé à sa
propre sortie interne.
La connexion d’entrée interne peut être utilisée pour forcer la signification
par défaut (déconnectée) de ce port.
C.2. Out
Reçoit un évènement arrivant à l’entrée interne et le transfère inchangé à
l’extérieur
158 – REAKTOR CORE
C.3. Latch (entrée)
Transfère une connexion OBC de l’extérieur de la macro à l’intérieur de la
macro.
La connexion d’entrée interne peut être utilisée pour forcer la signification
par défaut (déconnectée) de ce port.
C.4. Latch (sortie)
Transfère une connexion OBC de l’intérieur de la macro à l’extérieur de la
macro
C.5. Bool C (entrée)
Transfère une connexion BoolCtl de l’extérieur de la macro à l’intérieur de la
macro.
La connexion d’entrée interne peut être utilisée pour forcer la signification
par défaut (déconnectée) de ce port.
C.6. Bool C (sortie)
Transfère une connexion BoolCtl de l’intérieur de la macro à l’extérieur de la
macro.
REAKTOR CORE – 159
Annexe D. Les ports des cellules core
D.1. In (mode audio)
Donne accès au signal audio venant de l’extérieur du module. Envoie des
évènements réguliers à la cadence du taux d’échantillonnage (synchronisés à
SR.C, l’horloge globale du taux d’échantillonnage).
ÉVÈNEMENT D’INITIALISATION:
envoie un évènement d’initialisation.
Sa valeur est définie par l’initialisation
extérieure.
D.2. Out (mode audio)
Donne accès depuis l’extérieur du module aux valeurs reçues à l’intérieur. À
tout instant, la dernière valeur reçue est transférée à l’extérieur.
D.3. In (mode évènement)
Convertit les évènements du niveau primaire de Reaktor venant de l’extérieur
en évènements Reaktor Core et les transfère à l’intérieur.
ÉVÈNEMENT D’INITIALISATION:
envoie un évènement d’initialisation si un
évènement d’initalisation est reçu de
l’extérieur.
D.4. Out (mode évènement)
Convertit les évènements Reaktor Core venant de l’intérieur en évènements du
niveau primaire de Reaktor et les transfère à l’extérieur. Si plusieurs sorties
en mode évènements reçoivent simultanément des évènements Reaktor Core,
les évènements correspondant du niveau primaire sont envoyés dans l’ordre
des sorties supérieures vers les sorties inférieures.
160 – REAKTOR CORE
Annexe E. Les bus intégrés
E.1. SR.C
Envoie des évènements d’horloge réguliers à la cadence du taux d’échantillonnage.
ÉVÈNEMENT D’INITIALISATION:
envoie toujours un évènement
d’initialisation.
E.2. SR.R
Fournit le taux d’échantilonnage courant, en Hertz. Envoie des évènements
avec les nouvelles valeurs en réponse aux changements du taux d’échantillonnage.
ÉVÈNEMENT D’INITIALISATION:
envoie toujours un évènement
d’initialisation avec le taux
d’échantillonnage initial.
Annexe F. Les modules d’usine
F.1. Const
Génère un signal de valeur constante. Cette valeur est affichée dans le
module.
ÉVÈNEMENT D’INITIALISATION:
PROPRIÉTÉS:
Value
durant l’initialisation, envoie l’évènement
avec la valeur spécifiée. C‘est le seul
instant où ce module envoie un
événement.
la valeur à envoyer en sortie
REAKTOR CORE – 161
F.2. Math > +
Génère en sortie la somme des signaux en entrée. L’évènement de sortie est
envoyé à chaque fois qu’un évènement arrive à l’une des entrées (ou aux deux
simultanément).
F.3. Math > -
Génère en sortie la différence des signaux en entrée (le signal à l’entrée inférieure est soustrait au signal à l’entrée supérieure). L’évènement de sortie
est envoyé à chaque fois qu’un évènement arrive à l’une des entrées (ou aux
deux simultanément).
F.4. Math > *
Génère en sortie le produit des signaux en entrée. L’évènement de sortie est
envoyé à chaque fois qu’un évènement arrive à l’une des entrées (ou aux deux
simultanément).
F.5. Math > /
Génère le quotient des signaux en entrée (le signal à l’entrée supérieure est
divisé par le signal à l’entrée inférieure). En mode entier, produit une division
avec reste, le reste étant abandonné. L’évènement de sortie est envoyé à
chaque fois qu’un évènement arrive à l’une des entrées (ou aux deux simultanément).
162 – REAKTOR CORE
F.6. Math > |x|
Génère en sortie la valeur absolue du signal entrant. L’évènement de sortie
est envoyé à chaque fois qu’un évènement arrive en entrée.
F.7. Math > –x
Génère en sortie la valeur opposée (inversion du signe) du signal entrant.
L’évènement de sortie est envoyé à chaque fois qu’un évènement arrive en
entrée.
F.8. Math > DN Cancel
Modifie le signal entrant de manière à supprimer les nombres dénormaux.
L’implémentation actuelle ajoute une toute petite constante. Fonctionne uniquement avec les nombres en virgule flottante. L’évènement de sortie est
envoyé à chaque fois qu’un évènement arrive en entrée.
F.9. Math > ~log
Calcule une approximation du logarithme de la valeur entrante. L’évènement
de sortie est envoyé à chaque fois qu’un évènement arrive en entrée.
PROPRIÉTÉS:
Base
Precision
base du logarithme
précision de l’approximation (une meilleure précision
demande plus de puissance processeur)
REAKTOR CORE – 163
F.10. Math > ~exp
Calcule une approximation de l’exponentielle de la valeur entrante. L’évènement
de sortie est envoyé à chaque fois qu’un évènement arrive en entrée.
PROPRIÉTÉS:
Base
Precision
base de l’exponentielle
précision de l’approximation (une meilleure précision
demande plus de puissance processeur)
F.11. Bit > Bit AND
Effectue la fonction binaire ET sur les signaux entrants. Fonctionne uniquement sur les entiers. L’évènement de sortie est envoyé à chaque fois qu’un
évènement arrive à l’une des entrées (ou aux deux simultanément).
F.12. Bit > Bit OR
Effectue la fonction binaire OU sur les signaux entrants. Fonctionne uniquement sur les entiers. L’évènement de sortie est envoyé à chaque fois qu’un
évènement arrive à l’une des entrées (ou aux deux simultanément).
F.13. Bit > Bit XOR
Effectue la fonction binaire OU EXCLUSIF sur les signaux entrants. Fonctionne
uniquement sur les entiers. L’évènement de sortie est envoyé à chaque fois
qu’un évènement arrive à l’une des entrées (ou aux deux simultanément).
164 – REAKTOR CORE
F.14. Bit > Bit NOT
Effectue l’inversion binaire du signal entrant. Fonctionne uniquement sur les
entiers. L’évènement de sortie est envoyé à chaque fois qu’un évènement
arrive en entrée.
F.15. Bit > Bit <<
Décale vers la gauche les bits de la valeur à l’entrée supérieure (vers les bits
plus significatifs). La quantité du décalage est spécifiée par l’entrée inférieure.
Le résultat pour N < 0 et N > 31 est indéfini (donc utilisez cette fonction
seulement pour 0 ≤ N ≤ 31). Fonctionne uniquement sur les entiers. L’évènement de sortie est envoyé à chaque fois qu’un évènement arrive à l’une des
entrées (ou aux deux simultanément).
F.16. Bit > Bit >>
Décale vers la droite les bits de la valeur à l’entrée supérieure (vers les bits
moins significatifs). Aucune extension de signe n’est effectuée. La quantité
du décalage est spécifiée par l’entrée inférieure. Le résultat pour N < 0 et N
> 31 est indéfini (donc utilisez cette fonction seulement pour 0 ≤ N ≤ 31).
Fonctionne uniquement avec les entiers. L’évènement de sortie est envoyé à
chaque fois qu’un évènement arrive à l’une des entrées (ou aux deux simultanément).
F.17. Flow > Router
Assigne le signal de l’entrée signal (entrée inférieure) à l’une des deux sorties
en fonction de l’état du signal de contrôle (entrée supérieure). Si le signal
de contrôle est dans l’état true, le module assigne le signal à la sortie 1 (supérieure), et à la sortie 0 (inférieure) si le signal de contrôle est dans l’état
REAKTOR CORE – 165
false. L’évènement de sortie est envoyé à l’une des sorties à chaque fois qu’un
évènement arrive à l’entrée signal.
F.18. Flow > Compare
Produit un signal BoolCtl en sortie, indiquant le résultat de la comparaison
des valeurs d’entrée. La valeur à l’entrée supérieure est placée à gauche du
signe de comparaison et la valeur à l’entrée inférieure à droite du signe (p.ex.
le module montré ci-dessus vérifie si la valeur du haut est plus grande que
celle du bas).
PROPRIÉTÉS:
Criterion
l’opération de comparaison à effectuer.
F.19. Flow > Compare Sign
Produit un signal BoolCtl en sortie, indiquant le résultat de la comparaison
du signe des valeurs d’entrée. La valeur à l’entrée supérieure est placée à
gauche du signe de comparaison et la valeur à l’entrée inférieure à droite du
signe (p.ex. le module montré ci-dessus vérifie si le signe de la valeur du haut
est plus grand que le signe de la valeur du bas).
La comparaison de signe est définie comme suit:
+ est égal à +
– est égal à –
+ est plus grand que –
Le signe d’une valeur nulle est indéfini, donc une valeur arbitraire peut être
générée si l’une des valeurs comparées est nulle.
PROPRIÉTÉS:
Criterion
l’opération de comparaison à effectuer.
166 – REAKTOR CORE
F.20. Flow > ES Ctl
Produit en sortie un signal BoolCtl indiquant la présence momentanée d’un
évènement en entrée (le signal vaut true s’il y a un évènement à l’entrée de
ce module à cet instant précis).
F.21. Flow > ~BoolCtl
Produit en sortie un signal BoolCtl qui est l’inversion du signal BoolCtl d’entrée
(true se change en false et réciproquement).
F.22. Flow > Merge
Envoie un évènement en sortie à chaque fois qu’il y a un évènement à l’une
des entrées, ou à plusieurs simultanément. Si une seule entrée reçoit un
évènement à un instant donné, la valeur de l’évènement en sortie est égale
à la valeur de cet évènement en entrée. Si plusieurs entrées reçoivent des
évènements simultanément, la valeur de l’entrée la plus basse (parmi celles recevant un évènement à cet instant) est transmise. Par exemple, si la
deuxième et la troisième entrée (en partant du haut) reçoivent un évènement,
la valeur de l’évènement à la troisième entrée sera transmise.
PROPRIÉTÉS:
Input Count nombre d’entrées du module
F.23. Flow > EvtMerge
La fonction de ce module est similaire à celle du module Merge, si ce n’est
qu’ici les valeurs des entrées sont ignorées. La valeur de la sortie est indéfinie. Ce module est conçu pour générer des signaux d’horloge. Il fonctionne
REAKTOR CORE – 167
uniquement en mode virgule flottante, puisque de toute façon la valeur n’est
pas censée servir à quoi que ce soit.
PROPRIÉTÉS:
Input Count nombre d’entrées du module
F.24. Memory > Read
Lit la valeur stockée dans la mémoire de la chaîne OBC à laquelle ce module
appartient. La lecture se produit en réponse à un évènement à l’entrée supérieure (horloge) et la valeur lue est envoyée à la sortie supérieure. Les ports
du bas sont les connexions OBC maîtresse (à gauche) et esclave (à droite).
F.25. Memory > Write
Écrit la valeur arrivant à l’entrée supérieure dans la mémoire de la chaîne
OBC à laquelle ce module appartient. L’écriture se produit en réponse à un
évènement à l’entrée supérieure. Les ports du bas sont les connexions OBC
maîtresse (à gauche) et esclave (à droite).
F.26. Memory > R/W Order
Ce module n’effectue aucune action. Il peut être inséré dans une structure
pour contrôler l’ordre de traitement des modules connectés par OBC. Les
ports OBC du bas sont les connexions OBC maîtresse et esclave, connectées
en interne en “thru” (transmission simple). L’entrée OBC supérieure est la
connexion “secondaire”, qui permet de placer ce module logiquement après
le module connecté à cette entrée.
L’entrée secondaire ne peut être connectée qu’à des signaux de type OBC Latch
normaux. Les ports maître et esclave peuvent quant à eux être connectés à
des signaux de type OBC Latch ou Array (loquet ou tableau), selon les réglages des propriétés du module R/W Order. En tout cas, le type de signal et la
168 – REAKTOR CORE
précision doivent être les mêmes pour toutes les connexions de ce module
(p.ex. vous ne pouvez pas connecter en même temps l’entrée secondaire à un
Read en mode entier et les connexions maîtresse et esclave à des modules
en mode flottants).
PROPRIÉTÉS:
Connection Type
type de connexion du port “thru” (loquet ou
tableau).
F.27. Memory > Array
Définit un objet mémoire de type tableau. Le module lui-même n’effectue
aucune action. Toutes les opérations sur le tableau doivent être effectuées
par des modules connectés à la sortie du tableau, qui est une connexion OBC
esclave de type tableau.
PROPRIÉTÉS:
Size
nombre d’éléments dans le tableau.
F.28. Memory > Size [ ]
Renvoie la taille de l’objet tableau connecté à l’entrée. La taille est une valeur
entière constante.
ÉVÈNEMENT D’INITIALISATION:
pendant l’initialisation, envoie en sortie
un évènement ayant pour valeur la taille
du tableau. C‘est le seul moment où ce
module envoie un événement.
F.29. Memory > Index
Donne accès à un élément du tableau. L’accès est donné sous la forme d’une
connexion OBC Latch associée à l’élément du tableau. L’association est établie et/ou modifiée en envoyant un évènement à l’entrée supérieure (index)
REAKTOR CORE – 169
du module Index, qui démarre à zéro et est toujours en mode entier. L’entrée
inférieure est la connexion OBC maîtresse vers le tableau. La sortie fournit
la connexion OBC Latch à l’élément tableau, sélectionné par l’entrée d’index.
Le type de valeur et la précision sont bien sûr les mêmes pour les connexions
OBC d’entrée et de sortie, ils sont contrôlés par les propriétés du module.
F.30. Memory > Table
Définit un tableau préinitialisé en lecture seule. Le module lui-même n’effectue
aucune action. Toutes les opérations sur la table doivent être effectuées par
des modules connectés à la sortie de la table, qui est une connexion OBC
esclave de type tableau.
PROPRIÉTÉS:
FP Precision
modifie les valeurs dans la table.
contrôle la précision formelle de la connexion de sortie.
F.31. Macro
Fournit un conteneur pour une structure interne. Le nombre d’entrées et de
sorties n’est pas fixé, il est défini par la structure interne.
PROPRIÉTÉS:
FP Precision
contrôle la précision formelle de la connexion de sortie.
Look
commute entre les apparences Large (label et noms
des ports visibles) et Small (label et noms des ports
invisibles).
Pin Alignment contrôle l’alignement des ports dans la vue externe de la
macro
Solid
contrôle le traitement de la macro par le moteur de Reaktor Core. Si cette option est désactivée, les limites de la
macro sont transparentes, notamment pour la résolution
des réinjections. Laissez cette option ACTIVÉE, à moins
que vous ne sachiez ex-ac-te-ment ce que vous faites !
Icon
le bouton
charge une nouvelle icône pour la macro, et
le bouton
efface l’icône (aucune icône assignée).
170 – REAKTOR CORE
Annexe G. Les macros expertes
G.1. Clipping > Clip Max / IClip Max
Le signal à l’entrée supérieure est borné supérieurement par la valeur de seuil
à l’entrée du bas. Les changements de seuil ne génèrent pas d’évènement.
G.2. Clipping > Clip Min / IClip Min
Le signal à l’entrée supérieure est borné inférieurement par la valeur de seuil
à l’entrée du bas. Les changements de seuil ne génèrent pas d’évènement.
G.3. Clipping > Clip MinMax / IClipMinMax
Le signal à l’entrée supérieure est borné inférieurement par la valeur de seuil
à l’entrée du milieu, et supérieurement par la valeur de seuil à l’entrée du bas.
Les changements de seuil ne génèrent pas d’évènement.
G.4. Math > 1 div x
Calcule l’inverse de la valeur d’entrée.
G.5. Math > 1 wrap
Boucle les valeurs entrantes dans l’intervalle [-0,5.. 0,5] (la période de bouclage
vaut 1).
REAKTOR CORE – 171
G.6. Math > Imod
Calcule le reste de la division de la valeur supérieure par la valeur inférieure.
L’évènement de sortie est envoyé à chaque fois qu’il y a un évènement à l’une
des deux entrées (ou aux deux simultanément).
G.7. Math > Max / IMax
Calcule le maximum des valeurs d’entrée. L’évènement de sortie est envoyé
à chaque fois qu’il y a un évènement à l’une des deux entrées (ou aux deux
simultanément).
G.8. Math > Min / IMin
Calcule le minimum des valeurs d’entrée. L’évènement de sortie est envoyé
à chaque fois qu’il y a un évènement à l’une des deux entrées (ou aux deux
simultanément).
G.9. Math > round
Arrondit la valeur entrante à l’entier le plus proche. L’arrondi des valeurs
exactement au milieu entre deux entiers n’est pas défini. Par exemple, 1,5
sera arrondi à 1 ou à 2.
G.10. Math > sign +Génère en sortie soit 1, soit –1, en fonction du signe de l’entrée (les nombres
positifs génèrent 1, les négatifs –1, et zéro ne génère pas de sortie).
172 – REAKTOR CORE
G.11. Math > sqrt (>0)
Approximation de la racine carrée. Fonctionne uniquement pour les entrées
positives.
G.12. Math > sqrt
Approximation de la racine carrée.
G.13. Math > x(>0)^y
Approximation de x^y (“x puissance y”). x doit être positif. L’évènement de
sortie est envoyé à chaque fois qu’il y a un évènement à l’une des deux entrées
(ou aux deux simultanément).
G.14. Math > x^2 / x^3 / x^4
Calcule x à la puissance 2/3/4.
G.15. Math > Chain Add / Chain Mult
Additionne/multiplie les signaux entre eux, du bas vers le haut. L’évènement
de sortie est généré s’il y a un ou plusieurs évènements à une ou plusieurs
entrées.
G.16. Math > Trig-Hyp > 2 pi wrap
Boucle les valeurs entrantes sur l’intervalle [-π..π] (la période de bouclage
est 2π).
REAKTOR CORE – 173
G.17. Math > Trig-Hyp > arcsin / arccos / arctan
Approximation de l’arcsinus/arccosinus/arctangente.
G.18. Math > Trig-Hyp > sin / cos / tan
Approximation du sinus/du cosinus/de la tangente.
G.19. Math > Trig-Hyp > sin –pi..pi / cos –pi..pi / tan –pi..pi
Approximation du sinus/du cosinus/de la tangente (fonctionne seulement sur
l’intervalle [-π..π]).
G.20. Math > Trig-Hyp > tan –pi4..pi4
Approximation de la tangente (fonctionne seulement sur l’intervalle
[-π /4..π /4]).
G.21. Math > Trig-Hyp > sinh / cosh / tanh
Approximation du sinus/du cosinus/de la tangente hyperboliques.
G.22. Memory > Latch / ILatch
“Bloque” (retarde) le signal à l’entrée supérieure jusqu’à ce qu’un évènement
d’horloge arrive à l’entrée inférieure. Si deux évènements arrivent simultanément
aux deux entrées, le signal entrant passe directement en sortie.
174 – REAKTOR CORE
G.23. Memory > z^-1 / z^-1 ndc
Envoie en sortie la dernière valeur reçue à l’entrée supérieure, en réponse à
l’évènement d’horloge de l’entrée inférieure. Si l’entrée d’horloge est déconnectée, le module utilise l’horloge audio standard (SR.C) à la place, fonctionnant
alors de fait comme un délai d’un échantillon.
Les deux modules peuvent automatiquement résoudre les boucles de réinjection, la version Z^-1 assurant de plus l’élimination des valeurs dénormales.
La version Z^-1 ndc ne doit être utilisée que lorsque les valeurs dénormales
ne sont pas attendues en entrée.
G.24. Memory > Read []
Lit une valeur dans un tableau à un index donné (spécifié par l’entrée du
milieu), en réponse à un évènement d’horloge entrant (entrée supérieure).
L’entrée inférieure (OBC) est la connexion au tableau.
Utilisez la sortie OBC pour créer des chaînes OBC et “sérialiser” les opérations
d’accès au tableau !
G.25. Memory > Write []
Écrit une valeur (reçue à l’entrée supérieure) dans un tableau, à un index donné
(spécifié par l’entrée du milieu). L’opération d’écriture est commandée par
toute valeur entrante. L’entrée inférieure (OBC) est la connexion au tableau.
Utilisez la sortie OBC pour créer des chaînes OBC et “sérialiser” les opérations
d’accès au tableau !
REAKTOR CORE – 175
G.26. Modulation > x + a / Integer > Ix + a
Ajoute un paramètre (entrée inférieure) au signal (entrée supérieure) en réponse à un signal entrant. Les changements du paramètre ne génèrent pas
d’évènements.
G.27. Modulation > x * a / Integer > Ix * a
Multiplie le signal (entrée supérieure) par un paramètre (entrée inférieure)
en réponse à un signal entrant. Les changements du paramètre ne génèrent
pas d’évènements.
G.28. Modulation > x – a / Integer > Ix – a
Soustrait un paramètre (entrée inférieure) au signal (entrée supérieure) en
réponse à un signal entrant. Les changements du paramètre ne génèrent pas
d’évènements.
G.29. Modulation > a – x / Integer > Ia – x
Soustrait le signal (entrée supérieure) à un paramètre (entrée inférieure) en
réponse à un signal entrant. Les changements du paramètre ne génèrent pas
d’évènements.
G.30. Modulation > x / a
Divise le signal (entrée supérieure) par un paramètre (entrée inférieure) en
réponse à un signal entrant. Les changements du paramètre ne génèrent pas
d’évènements.
176 – REAKTOR CORE
G.31. Modulation > a / x
Divise un paramètre (entrée inférieure) par le signal (entrée supérieure) en
réponse à un signal entrant. Les changements du paramètre ne génèrent pas
d’évènements.
G.32. Modulation > xa + y
Multiplie le signal à l’entrée supérieure par un paramètre de gain (entrée du
milieu) et ajoute le résultat au signal de l’entrée inférieure. Les évènements
à l’une des deux entrées signal (ou aux deux) génèrent une nouvelle valeur,
contrairement aux évènements arrivant à l’entrée paramètre.
Annexe H. Les macros standard
H.1. Audio Mix-Amp > Amount
Fournit un contrôle linéaire et inversible sur l’amplitude d’un signal audio.
A=0
coupe le signal
A=1
laisse le signal intact
A = -1
inverse le signal
Usage typique: contrôler la quantité de réinjection audio.
H.2. Audio Mix-Amp > Amp Mod
REAKTOR CORE – 177
Module l’amplitude du signal audio par une certaine quantité (AM) sur une
échelle linéaire
AM = 1
double l’amplitude
AM = 0
pas de changement
AM = -1
coupe le signal
Usage typique: trémolo, modulation d’amplitude.
H.3. Audio Mix-Amp > Audio Mix
Mixe deux signaux ensemble.
H.4. Audio Mix-Amp > Audio Relay
Commute entre les deux signaux audio d’entrée. Si ‘x’ est plus grand que 0,
le module prend le signal 1, sinon il prend le signal 0.
H.5. Audio Mix-Amp > Chain (amount)
Pondère l’amplitude du signal audio par une certaine quantité (A) et mélange
le résultat avec le signal audio enchaîné (>>).
A=0
le signal est coupé (mis en sourdine)
A=1
le signal reste inchangé
A = -1
le signal est inversé
Usage typique: chaînes de mixage audio, contrôle de la quantité de
réinjection audio.
178 – REAKTOR CORE
H.6. Audio Mix-Amp > Chain (dB)
Pondère l’amplitude du signal audio par une certaine quantité de décibels
(dB) et mélange le résultat avec le signal audio enchaîné (>>).
Usage typique: chaînes de mixage audio.
H.7. Audio Mix-Amp > Gain (dB)
Pondère l’amplitude du signal audio par une certaine quantité de décibels
(dB).
+6 dB
double l’amplitude
0 dB
pas de changement
-6 dB
diminue l’amplitude de moitié
Usage typique: contrôle du volume du signal, en échelle de dB.
H.8. Audio Mix-Amp > Invert
Inverse la polarité du signal audio.
H.9. Audio Mix-Amp > Mixer 2 … 4
Mixe les signaux audio entrants (In1, In2, …) en atténuant leurs niveaux d’une
certaine quantité de dB (Lvl1, Lvl2, …).
REAKTOR CORE – 179
H.10. Audio Mix-Amp > Pan
Règle la balance du signal audio en utilisant une courbe parabolique.
Pos = -1
tout à gauche
Pos = 0
centre
Pos = 1
tout à droite
H.11. Audio Mix-Amp > Ring-Amp Mod
Le signal audio porteur (entrée du haut) est modulé par le signal audio de l’entrée “Mod”. Le type de modulation est contrôlé par l’entrée “R/A”, qui effectue
un fondu entre la modulation en anneau et la modulation d’amplitude.
R/A = 0
modulation en anneau
R/A = 1
modulation d’amplitude
(pour une vraie modulation d’amplitude, l’amplitude du modulateur de doit pas
dépasser 1)
H.12. Audio Mix-Amp > Stereo Amp
Amplifie un signal audio monophonique d’une certaine quantité de décibels
et le place dans le champ panoramique à la position spécifiée. La position
panoramique est définie comme suit:
-1 tout à gauche
0 centre
1 tout à droite
180 – REAKTOR CORE
H.13. Audio Mix-Amp > Stereo Mixer 2 … 4
Mixe les signaux audio entrants (In1, In2, …) en atténuant leurs niveaux d’une
certaine quantité de dB (Lvl1, Lvl2, …) et en les plaçant dans le champ stéréo
aux positions spécifiées (Pan1, Pan2, …). Les positions panoramiques sont
définies comme suit:
-1 tout à gauche
0 centre
1 tout à droite
H.14. Audio Mix-Amp > VCA
Amplificateur audio avec contrôle linéaire de l’amplitude.
A=0
coupe le signal (sourdine)
A=1
laisse le signal inchangé
Usage typique: connecter une enveloppe d’amplitude à l’entrée A.
Remarque: pour une amplification négative, utilisez le module Audio
Amount.
H.15. Audio Mix-Amp > XFade (lin)
Crossfader (mélangeur) audio avec courbe linéaire.
x=0
seul le signal 0 est entendu
x = 0,5
mélange égal des deux signaux
x=1
seul le signal 1 est entendu
Remarque: le crossfader parabolique donne généralement de meilleurs résultats sonores.
REAKTOR CORE – 181
H.16. Audio Mix-Amp > XFade (par)
Crossfader (mélangeur) audio avec courbe parabolique. Donne généralement
de meilleurs résultats sonores que le crossfader linéaire.
x=0
seul le signal 0 est entendu
x = 0,5
mélange égal des deux signaux
x=1
seul le signal 1 est entendu
H.17. Audio Shaper > 1+2+3 Shaper
Fournit un modelage contrôlable du signal audio du 2ème et du 3ème ordre.
L’entrée “1st” spécifie la quantité de signal original (1=inchangé, 0=absent).
Les entrées “2nd” et “3rd” correspondent respectivement aux quantités de
distorsion du deuxième et du troisième ordre.
H.18. Audio Shaper > 3-1-2 Shaper
Modeleur du signal audio avec quantité variable de distorsion du 2ème ou du
3ème ordre. La quantité de distorsion et son type sont contrôlés par l’entrée
“Shp”:
Shp = 0
pas de modelage
Shp > 0
modelage du 3ème ordre
Shp < 0
modelage du 2ème ordre
182 – REAKTOR CORE
H.19. Audio Shaper > Broken Par Sat
Saturation parabolique brisée. Segment linéaire autour du niveau zéro.
L’entrée “L” règle le niveau de sortie de la “saturation totale” (1 par défaut).
L’entrée “H” règle la dureté (entre 0 et 1). Les valeurs plus élevées correspondent à un segment linéaire plus important au milieu.
L’entrée “S” contrôle la symétrie de la courbe de saturation (de –1 à 1). À 0,
la courbe est symétrique.
H.20. Audio Shaper > Hyperbol Sat
Saturation hyperbolique simple. L’entrée “L” règle le niveau de sortie de la
“saturation totale” (1 par défaut). Cependant, la “saturation totale” n’est
jamais atteinte avec ce type de saturation.
H.21. Audio Shaper > Parabol Sat
Saturation parabolique simple. L’entrée “L” règle le niveau de sortie de la
“saturation totale” (1 par défaut).
Remarque: la saturation totale est atteinte avec un niveau d’entrée égal à
2L.
REAKTOR CORE – 183
H.22. Audio Shaper > Sine Shaper 4 / 8
Modeleur en sinus du 4ème / 8ème ordre. Le modeleur du 8ème ordre effectue
une meilleure approximation du sinus, mais il consomme plus de puissance
processeur.
H.23. Control > Ctl Amount
Fournit un contrôle linéaire (éventuellement négatif) sur l’amplitude d’un
signal de contrôle.
A=0
coupe le signal
A=1
laisse le signal intact
A = -1
inverse le signal
Usage typique: contrôler la quantité de modulation.
H.24. Control > Ctl Amp Mod
Module l’amplitude du signal de contrôle par une certaine quantité (AM) sur
une échelle linéaire.
AM = 1
double l’amplitude
AM = 0
pas de changement
AM = -1
coupe le signal
H.25. Control > Ctl Bi2Uni
Convertit un signal bipolaire de –1 à 1 en signal unipolaire. L’entrée “a” contrôle la quantité de conversion: à 0 il n’y a aucun changement, à 1 (valeur
184 – REAKTOR CORE
par défaut) la conversion est totale.
Usage typique: connecter immédiatement après un LFO pour ajuster la polarité
de la modulation.
H.26. Control > Ctl Chain
Pondère l’amplitude du signal audio par une certaine quantité (A) et mélange
le résultat avec le signal audio enchaîné (>>).
A=0
le signal est coupé (mis en sourdine)
A=1
le signal reste inchangé
A = -1
le signal est inversé
Usage typique: chaînes de mixage audio.
H.27. Control > Ctl Invert
Inverse la polarité du signal de contrôle.
H.28. Control > Ctl Mix
Mixe deux signaux de contrôle.
H.29. Control > Ctl Mixer 2
Mixe deux signaux de contrôle (In1 et In2) avec les facteurs de gain spécifiés
(A1 et A2).
A=0
pas de signal
A=1
signal inchangé
A = -1
signal inversé
REAKTOR CORE – 185
H.30. Control > Ctl Pan
Règle la balance du signal de contrôle en utilisant une courbe parabolique
Pos = -1
tout à gauche
Pos = 0
centre
Pos = 1
tout à droite
H.31. Control > Ctl Relay
Commute entre deux signaux de contrôle. Si ‘x’ est plus grand que 0, le module
transmet le signal 1, sinon il transmet le signal 0.
H.32. Control > Ctl XFade
Crossfader (mélangeur) pour signaux de contrôle avec courbe linéaire.
x=0
seul le signal 0 est trnasmis
x = 0,5
mélange égal des deux signaux
x=1
seul le signal 1 est transmis
H.33. Control > Par Ctl Shaper
Applique une double courbe parabolique au signal de contrôle. Le signal
d’entrée doit être dans l’intervalle [–1..1]. Le signal de sortie est aussi dans
[–1..1]. La quantité de torsion est contrôlée par l’entrée “b” (dont l’intervalle
est encore une fois [–1..1]).
b=0
pas de torsion (courbe linéaire)
b = -1
torsion maximale “vers” l’axe des X
b=1
torsion maximale “vers” l’axe des Y
186 – REAKTOR CORE
Vous pouvez aussi utiliser ce modeleur pour les signaux dans l’intervalle [0..1],
auquel cas seule une moitié de la courbe est utilisée.
Usage typique: vélocité et autres modelages de contrôleurs.
H.34. Convert > dB2AF
Convertit un signal de contrôle de l’échelle de décibels à l’échelle linéaire de
gain d’amplitude.
0 dB

1.0
-6 dB

0.5
etc.
H.35. Convert > dP2FF
Convertit un signal de contrôle de l’échelle de pitch (hauteur tonale, en demitons) à l’échelle des ratios de fréquences.
12 demi-tons

2
-12 demi-tons

-2
etc.
H.36. Convert > logT2sec
Convertit le temps logarithmique du niveau primaire de Reaktor (utilisé pour
les enveloppes) en secondes.
0 
0.001 sec
60 
1 sec
etc.
H.37. Convert > ms2Hz
Convertit une période temporelle en millisecondes dans la fréquence correspondante en Hertz. P.ex. 100 ms  10 Hz.
REAKTOR CORE – 187
H.38. Convert > ms2sec
Convertit le temps en millisecondes en un temps en secondes. P.ex. 500ms
 0.5 sec.
H.39. Convert > P2F
Convertit un signal de contrôle de l’échelle de pitch (hauteur tonale) à l’échelle
de fréquences. P.ex. pitch 69  440 Hz.
H.40. Convert > sec2Hz
Convertit une période temporelle en secondes dans la fréquence correspondante en Hertz. P.ex. 0.1sec  10 Hz.
H.41. Delay > 2 / 4 Tap Delay 4p
Délai à 2/4 battements avec 4 points d’interpolation. Les entrées T1 à T4
spécifient la durée de délai (en secondes) pour chacun des battements.
La durée maximale de délai est de 44100 échantillons par défaut, ce qui fait
1 seconde à 44,1 kHz. Pour ajuster cette durée, modifiez la taille du tableau
dans la macro.
H.42. Delay > Delay 1p / 2p / 4p
Délai 1-point (non interpolé) / 2-points / 4-points. L’entrée T spécifie la durée
du délai en secondes. La durée maximale de délai est de 44100 échantillons
par défaut, ce qui fait 1 seconde à 44,1 kHz. Pour ajuster cette durée, modifiez la taille du tableau dans la macro.
188 – REAKTOR CORE
Utilisez les versions interpolées du délai pour réaliser des délais modulés.
Pour les délais non modulés (durée fixe de délai), la version non interpolée
donne habituellement de meilleurs résultats.
H.43. Delay > Diff Delay 1p / 2p / 4p
Délai à diffusion 1-point (non interpolé) / 2-points / 4-points. L’entrée T
spécifie la durée du délai en secondes. Les entrées Dffs règlent les facteurs
de diffusion.
La durée maximale de délai est de 44100 échantillons par défaut, ce qui fait
1 seconde à 44,1 kHz. Pour ajuster cette durée, modifiez la taille du tableau
dans la macro.
H.44. Envelope > ADSR
Génère une enveloppe ADSR.
A, D, R stemps d’attaque, de décroissance (ou chute) et de relâchement
(ou extinction) en secondes.
S
niveau de maintien (intervalle entre 0 et 1, à 1 le niveau de
maintien est égal au niveau maximal).
G
entrée gate. Les évènements positifs entrants (re)démarrent l’enveloppe. Les évènements nuls ou négatifs arrêtent l’enveloppe.
GS
sensibilité du gate. Pour une sensibilité nulle, le maximum de
l’enveloppe a toujours une amplitude de 1. Pour une sensibilité
égale à 1, le maximum de l’enveloppe est égal au niveau du
gate positif.
RM
mode de redéclenchement. Commute entre les modes analogique
et digital d’une part, et entre les modes redémarrage et legato
REAKTOR CORE – 189
RM
RM
RM
RM
=
=
=
=
0
1
2
3
d’autre part. En mode “digital”, l’enveloppe redémarre toujours
de zéro alors qu’en mode “analogique” elle redémarre de son
niveau de sortie actuel. En mode “redémarrage”, les évènements
gate positifs redémarrent l’enveloppe, alors qu’en mode legato
celle-ci redémarre seulement quand les gates passent d’une
valeur négative/nulle à une valeur positive. Voici les valeurs de
RM autorisées:
redémarrage analogique (par défaut)
legato analogique
redémarrage digital
legato digital
H.45. Envelope > Env Follower
Produit en sortie un signal de contrôle qui “suit” l’enveloppe du signal audio
entrant. Les entrées A et D spécifient les temps d’attaque et de décroissance
du suivi, en secondes.
H.46. Envelope > Peak Detector
Produit en sortie le “dernier” pic du signal audio entrant, sous forme de signal
de contrôle. L’entrée D spécifie le temps de décroissance du niveau de sortie,
en secondes.
H.47. EQ > 6dB LP/HP EQ
Égaliseur passe-bas (LP) / passe-haut (HP) à 1 pôle (6 dB/octave). L’entrée F
spécifie la fréquence de coupure (en Hz) pour les deux sorties LP et HP.
190 – REAKTOR CORE
H.48. EQ > 6dB LowShelf EQ
Égaliseur à étage bas à 1 pôle. L’entrée dB spécifie l’accentuation des basses
fréquences, en dB (les valeurs négatives atténuent ces fréquences). L’entrée
F spécifie la fréquence de transition, en Hertz.
H.49. EQ > 6dB HighShelf EQ
Égaliseur à étage haut à 1 pôle. L’entrée dB spécifie l’accentuation des hautes
fréquences, en dB (les valeurs négatives atténuent ces fréquences). L’entrée
F spécifie la fréquence de transition, en Hertz.
H.50. EQ > Peak EQ
Égaliseur à pic/creux à 2 pôles. L’entrée F spécifie la fréquence centrale en Hz,
l’entrée BW spécifie la largeur de bande (en anglais bandwidth) en octaves,
et l’entrée dB spécifie la hauteur du pic (les valeurs négatives produisant un
creux).
H.51. EQ > Static Filter > 1-pole static HP
Filtre passe-haut statique à 1 pôle. L’entrée F spécifie la fréquence de coupure
en Hz.
REAKTOR CORE – 191
H.52. EQ > Static Filter > 1-pole static HS
Filtre à étage haut statique à 1 pôle. L’entrée F spécifie la fréquence de coupure
en Hz, et l’entrée B l’accentuation des hautes fréquences en dB.
H.53. EQ > Static Filter > 1-pole static LP
Filtre passe-bas statique à 1 pôle. L’entrée F spécifie la fréquence de coupure
en Hz.
H.54. EQ > Static Filter > 1-pole static LS
Filtre à étage bas statique à 1 pôle. L’entrée F spécifie la fréquence de coupure
en Hz, et l’entrée B l’accentuation des basses fréquences en dB.
H.55. EQ > Static Filter > 2-pole static AP
Filtre passe-tout statique à 2 pôles. L’entrée F spécifie la fréquence de coupure
en Hz, et l’entrée Res la résonance (entre 0 et 1).
H.56. EQ > Static Filter > 2-pole static BP
192 – REAKTOR CORE
Filtre passe-bande statique à 2 pôles. L’entrée F spécifie la fréquence centrale
en Hz, et l’entrée Res la résonance (entre 0 et 1).
H.57. EQ > Static Filter > 2-pole static BP1
Filtre passe-bande statique à 2 pôles. L’entrée F spécifie la fréquence centrale
en Hz, et l’entrée Res la résonance (entre 0 et 1). L’amplification à la fréquence
centrale est toujours égale à 1, quelle que soit la résonance.
H.58. EQ > Static Filter > 2-pole static HP
Filtre passe-haut statique à 2 pôles. L’entrée F spécifie la fréquence de coupure en Hz, et l’entrée Res la résonance (entre 0 et 1).
H.59. EQ > Static Filter > 2-pole static HS
Filtre à étage haut statique à 2 pôles. L’entrée F spécifie la fréquence de
coupure en Hz, l’entrée Res spécifie la résonance (entre 0 et 1) et l’entrée B
l’accentuation des hautes fréquences en dB.
H.60. EQ > Static Filter > 2-pole static LP
Filtre passe-bas statique à 2 pôles. L’entrée F spécifie la fréquence de coupure
en Hz, et l’entrée Res la résonance (entre 0 et 1).
REAKTOR CORE – 193
H.61. EQ > Static Filter > 2-pole static LS
Filtre à étage bas statique à 2 pôles. L’entrée F spécifie la fréquence de
coupure en Hz, l’entrée Res spécifie la résonance (entre 0 et 1) et l’entrée B
l’accentuation des hautes fréquences en dB.
H.62. EQ > Static Filter > 2-pole static N
Filtre en creux statique à 2 pôles. L’entrée F spécifie la fréquence de coupure
en Hz, et l’entrée Res la résonance (entre 0 et 1).
H.63. EQ > Static Filter > 2-pole static Pk
Filtre en pic statique à 2 pôles. L’entrée F spécifie la fréquence centrale en
Hz, l’entrée Res la résonance (entre 0 et 1) et l’entrée B l’accentuation à la
fréquence centrale en dB.
H.64. EQ > Static Filter > Integrator
Intègre le signal audio entrant (calcule sa primitive) via la méthode des sommes
rectangulaires. Un évènement à l’entrée Rst réinitialise la sortie de l’intégrateur
à la valeur de cet évènement.
194 – REAKTOR CORE
H.65. Event Processing > Accumulator
Calcule la somme des valeurs arrivant à l’entrée supérieure. Un évènement à
l’entrée Set réinitialise la sortie à la valeur de cet évènement. La valeur de la
sortie inférieure est la somme de tous les évènements précédents, la valeur
de la sortie supérieure est la somme de tous les évènements précédents sauf
le dernier.
H.66. Event Processing > Clk Div
Diviseur de fréquence d’horloge. Les évènements d’horloge arrivant à l’entrée
supérieure sont filtrés, le module ne laissant passer que le 1er, le N+1ème, le
2N+1ème, etc. (N est la valeur à l’entrée inférieure, elle spécifie le ratio de la
division).
H.67. Event Processing > Clk Gen
Génère des évènements d’horloge à la fréquence spécifiée par l’entrée (en Hz).
Ce module fonctionne uniquement à l’intérieur des cellules core audio.
H.68. Event Processing > Clk Rate
Estime la fréquence et la période des évènements du signal d’horloge entrant.
La sortie F est la fréquence en Hz, et la sortie T la période en secondes. Ce
module fonctionne uniquement à l’intérieur des cellules core audio.
La valeur initiale de la période est zéro, et la fréquence est une valeur très
grande. Vous obtenez une estimation raisonnable en sortie seulement après
le deuxième évènement d’horloge en entrée.
REAKTOR CORE – 195
H.69. Event Processing > Counter
Compte le nombre d’évènements arrivant à l’entrée supérieure. Un évènement
à l’entrée Set réinitialise la sortie à la valeur de cet évènement. La valeur
de la sortie inférieure est le décompte de tous les évènements précédents,
et la valeur de la sortie supérieure est le décompte de tous les évènements
précédents sauf le dernier.
H.70. Event Processing > Ctl2Gate
Convertit le signal de contrôle (ou audio) de l’entrée supérieure en signal gate
(signal en porte) avec pour amplitude la valeur à l’entrée inférieure A. Les
passages du signal à zéro dans le sens croissant ouvrent la porte, les passages
à zéro dans le sens décroissant ferment la porte.
H.71. Event Processing > Dup Flt / IDup Flt
Filtre les évènements en double (seuls les évènements avec une valeur différente de l’évènement précédent sont transmis).
H.72. Event Processing > Impulse
Génère une impulsion d’un échantillon, d’amplitude 1, en réponse à un évènement entrant. Ce module fonctionne uniquement dans les cellules core
audio.
196 – REAKTOR CORE
H.73. Event Processing > Random
Génère des nombres aléatoires en réponse aux horloges entrantes. L’intervalle
de sortie est [–1..1]. Un évènement à l’entrée Seed (“Graine” en anglais)
relance le générateur avec la valeur de cet évènement.
H.74. Event Processing > Separator / ISeparator
Les évènements à l’entrée supérieure ayant une valeur supérieure à la valeur
de l’entrée Thld (pour “Threshold”, “Seuil” en anglais) sont envoyés à la sortie
Hi. Les autres sont envoyés à la sortie Lo.
H.75. Event Processing > Thld Crossing
Dès qu’un signal croissant, à l’entrée supérieure, dépasse le seuil fixé par
l’entrée inférieure, un évènement est envoyé à la sortie supérieure.
H.76. Event Processing > Value / IValue
Change la valeur de l’évènement arrivant à l’entrée supérieure et lui attribue
la valeur de l’évènement disponible à cet instant à l’entrée inférieure.
H.77. LFO > MultiWave LFO
REAKTOR CORE – 197
Génère simultanément en sortie plusieurs oscillateurs basse fréquence (LFOs)
calés en phase, avec différentes formes d’onde. L’entrée F spécifie la fréquence
en Hz, l’entrée W la largeur du train d’impulsions (dans l’intervalle de –1 à
1, valable uniquement pour la sortie “train d’impulsions”), les évènements
à l’entrée Rst redémarrent le LFO avec la phase spécifiée par la valeur de
l’évènement (dans l’intervalle de 0 à 1).
H.78. LFO > Par LFO
Génère un signal de contrôle basse fréquence parabolique. L’entrée F spécifie
la fréquence en Hz et les évènements à l’entrée Rst redémarrent le LFO avec
la phase spécifiée par la valeur de l’évènement (dans l’intervalle de 0 à 1).
H.79. LFO > Random LFO
Génère un signal de contrôle basse fréquence aléatoire (méthode “random
sample-and-hold”, littéralement “échantillon-et-maintien aléatoire”). L’entrée
F spécifie la fréquence en Hz et les évènements à l’entrée Rst redémarrent
le LFO avec la phase spécifiée par la valeur de l’évènement (dans l’intervalle
de 0 à 1).
H.80. LFO > Rect LFO
Génère un signal de contrôle basse fréquence rectangulaire (ou train d’impulsions). L’entrée F spécifie la fréquence en Hz, l’entrée W contrôle la largeur
des impulsions (dans l’intervalle de –1 à 1), et les évènements à l’entrée Rst
redémarrent le LFO avec la phase spécifiée par la valeur de l’évènement (dans
l’intervalle de 0 à 1).
198 – REAKTOR CORE
H.81. LFO > Saw(down) LFO
Génère un signal de contrôle basse fréquence en dents de scie descendantes. L’entrée F spécifie la fréquence en Hz et les évènements à l’entrée Rst
redémarrent le LFO avec la phase spécifiée par la valeur de l’évènement (dans
l’intervalle de 0 à 1).
H.82. LFO > Saw(up) LFO
Génère un signal de contrôle basse fréquence en dents de scie montantes.
L’entrée F spécifie la fréquence en Hz et les évènements à l’entrée Rst redémarrent le LFO avec la phase spécifiée par la valeur de l’évènement (dans
l’intervalle de 0 à 1).
H.83. LFO > Sine LFO
Génère un signal de contrôle basse fréquence sinusoïdal. L’entrée F spécifie
la fréquence en Hz et les évènements à l’entrée Rst redémarrent le LFO avec
la phase spécifiée par la valeur de l’évènement (dans l’intervalle de 0 à 1).
H.84. LFO > Tri LFO
Génère un signal de contrôle basse fréquence triangulaire. L’entrée F spécifie
la fréquence en Hz et les évènements à l’entrée Rst redémarrent le LFO avec
la phase spécifiée par la valeur de l’évènement (dans l’intervalle de 0 à 1).
REAKTOR CORE – 199
H.85. Logic > AND
Effectue la conjonction (opération logique ET) de deux signaux: la sortie vaut
1 si et seulement si les deux entrées valent 1. Pour les valeurs d’entrées autres
que 0 et 1, le résultat est indéfini.
H.86. Logic > Flip Flop
La sortie est commutée entre 0 et 1 à chaque fois que l’entrée d’horloge
reçoit un évènement.
H.87. Logic > Gate2L
Convertit un signal de gate en signal logique. La “porte ouverte” produit la
valeur 1 en sortie, la “porte fermée” produit la valeur 0.
H.88. Logic > GT / IGT
Compare les deux valeurs flottantes/entières entrantes puis génère 1 si la
valeur du haut est plus grande que celle du bas, et 0 dans le cas contraire.
H.89. Logic > EQ
Compare les deux valeurs entières entrantes et génère 1 si elles sont égales,
et 0 dans le cas contraire.
H.90. Logic > GE
200 – REAKTOR CORE
Compare les deux valeurs entières entrantes et génère 1 si la valeur du haut
est plus grande que (ou égale à) celle du bas, et 0 dans le cas contraire.
H.91. Logic > L2Clock
Convertit un signal logique en signal d’horloge. Le passage du signal d’entrée
de 0 à 1 envoie l’évènement d’horloge. Pour les valeurs d’entrées autres que
0 et 1, le résultat est indéfini..
H.92. Logic > L2Gate
Convertit un signal logique en signal gate. Le passage du signal d’entrée de
0 à 1 ouvre la porte, le passage de l’entrée de 1 à 0 la ferme. Le niveau du
signal gate “porte ouverte” est défini par la valeur à l’entrée inférieure (par
défaut = 1). Pour les valeurs d’entrées autres que 0 et 1, le résultat est indéfini.
H.93. Logic > NOT
Convertit les 0 en 1 et vice versa. Pour les valeurs d’entrées autres que 0 et
1, le résultat est indéfini.
H.94. Logic > OR
Effectue la disjonction (opération logique OU) de deux signaux logiques: la
sortie vaut 1 si au moins une des deux entrées vaut 1. Pour les valeurs d’entrées autres que 0 et 1, le résultat est indéfini.
H.95. Logic > XOR
Effectue une disjonction exclusive (opération logique OU EXCLUSIF) de deux
REAKTOR CORE – 201
signaux logiques: la sortie vaut 1 si une seule des entrées vaut 1 (et l’autre
0). Pour les valeurs d’entrées autres que 0 et 1, le résultat est indéfini.
H.96. Logic > Schmitt Trigger
Passe la sortie à 1 si l’entrée devient supérieure à L+ (par défaut 0,67), et à
0 si l’entrée devient inférieure à L- (par défaut 0,33).
H.97. Oscillators > 4-Wave Mst
Génère quatre formes d’onde audio calées en phase. La fréquence est spécifiée
par l’entrée F (en Hz). La largeur de l’impulsion (pour le train d’impulsions)
est spécifiée par l’entrée ‘pw’, dans l’intervalle de –1 à 1. Cet oscillateur peut
fonctionner avec des fréquences négatives et dispose de plus d’une sortie de
synchronisation pour l’oscillateur esclave équivalent, 4-Wave Slv.
H.98. Oscillators > 4-Wave Slv
Génère quatre formes d’onde audio calées en phase. La fréquence est spécifiée
par l’entrée F (en Hz). La largeur de l’impulsion (pour le train d’impulsions)
est spécifiée par l’entrée ‘pw’, dans l’intervalle de –1 à 1.
Cet oscillateur peut fonctionner avec des fréquences négatives. Il peut aussi
être synchronisé à un autre oscillateur 4-Wave Mst/Slv via l’entrée Snc. L’entrée
SncH contrôle la dureté de la synchronisation (0 = pas de synchro, de 0 à 1
202 – REAKTOR CORE
= degré croissant de synchronisation souple). Une sortie de synchronisation
pour un autre oscillateur 4-Wave Slv est également disponible.
H.99. Oscillators > Binary Noise
Générateur de bruit blanc binaire. Produit aléatoirement les valeurs –1 ou
1. Un évènement entrant à l’entrée Seed (ré)initialise le générateur aléatoire
interne avec une valeur “graine” donnée (la valeur de l’évènement).
H.100. Oscillators > Digital Noise
Générateur de bruit blanc numérique. Produit des valeurs aléatoires dans l’intervalle [-1..1]. Un évènement entrant à l’entrée Seed (ré)initialise le générateur
aléatoire interne avec une valeur “graine” donnée (la valeur de l’évènement
H.101. Oscillators > FM Op
Opérateur classique de FM (Modulation de Fréquence). Produit une onde
sinusoïdale dont la fréquence est définie par l’entrée F (en Hz). Le sinus peut
être modulé en phase par l’entrée PhM (en radians). Un évènement arrivant
à l’entrée Rst redémarre l’oscillateur à la phase spécifiée par la valeur de cet
évènement (intervalle de 0 à 1).
H.102. Oscillators > Formant Osc
Génère une forme d’onde avec une fréquence fondamentale spécifiée par
l’entrée F (en Hz) et une fréquence de formant spécifiée par l’entrée Fmt (en
Hz aussi).
REAKTOR CORE – 203
H.103. Oscillators > MultiWave Osc
Génère quatre formes d’onde audio calées en phase. La fréquence est spécifiée
par l’entrée F (en Hz). La largeur de l’impulsion (pour le train d’impulsions)
est spécifiée par l’entrée ‘pw’, dans l’intervalle de –1 à 1. Cet oscillateur ne
peut pas fonctionner avec des fréquences négatives.
H.104. Oscillators > Par Osc
Génère une forme d’onde audio parabolique. L’entrée F spécifie la fréquence
en Hz.
H.105. Oscillators > Quad Osc
Génère une paire de formes d’onde sinusoïdales calées en phase, avec un
décalage de phase de 90°. L’entrée F spécifie la fréquence en Hertz.
H.106. Oscillators > Sin Osc
Génère une onde sinusoïdale. L’entrée F spécifie la fréquence en Hz.
H.107. Oscillators > Sub Osc 4
204 – REAKTOR CORE
Génère quatre sous-harmoniques calées en phase. La fréquence “fondamentale” est spécifiée par l’entrée F (en Hz). Les nombres sous-harmoniques sont
spécifiés par les entrées S1 à S4 (intervalle 1..120). L’entrée Tbr contrôle le
contenu harmonique de la forme d’onde de sortie (intervalle 0..1).
H.108. VCF > 2 Pole SV
Filtre 2-pôles à variable d’état. L’entrée F spécifie la fréquence de coupure en
Hz et l’entrée Res la résonance (intervalle 0..0,98).
Les sorties HP/BP/LP produisent respectivement les signaux passe-haut,
passe-bande et passe-bas.
H.109. VCF > 2 Pole SV C
Filtre 2-pôles à variable d’état (version compensée). Offre un meilleur comportement aux fréquences de coupures élevées. L’entrée F spécifie la fréquence
de coupure en Hz et l’entrée Res la résonance (intervalle 0..0,98). Vous pouvez également utiliser des valeurs négatives de résonance, elles augmentent
encore plus la pente.
Les sorties HP/BP/LP produisent respectivement les signaux passe-haut,
passe-bande et passe-bas.
H.110. VCF > 2 Pole SV (x3) S
Filtre 2-pôles à variable d’état avec un suréchantillonnage optionnel (version
x3) et une saturation. L’entrée F spécifie la fréquence de coupure en Hz, l’entrée Res la résonance (intervalle 0..1) et l’entrée Sat le niveau de saturation
REAKTOR CORE – 205
(intervalle typique: de 8 à 32).
Les sorties HP/BP/LP produisent respectivement les signaux passe-haut,
passe-bande et passe-bas.
H.111. VCF > 2 Pole SV T (S)
Filtre 2-pôles à variable d’état avec compensation et saturation optionnelle
(version S). Offre un meilleur comportement aux fréquences de coupures
élevées, quoique légèrement différent de celui de la version 2 Pole SV C.
L’entrée F spécifie la fréquence de coupure en Hz, l’entrée Res la résonance
(intervalle 0..1) et l’entrée Sat le niveau de saturation (intervalle typique: de
8 à 32).Les sorties HP/BP/LP produisent respectivement les signaux passehaut, passe-bande et passe-bas.
H.112. VCF > Diode Ladder
Émulation linéaire d’un filtre à échelle de diodes. L’entrée F spécifie la fréquence de coupure (en Hz) et Res spécifie la résonance (intervalle de 0 à
0,98).
H.113. VCF > D/T Ladder
Émulation linéaire de filtre à échelle, fondu possible entre les comportements
“diode” et “transistor”. L’entrée F spécifie la fréquence de coupure (en Hz),
l’entrée Res spécifie la résonance (intervalle de 0 à 0,98) et l’entrée D/T con-
206 – REAKTOR CORE
trôle la balance entre les diodes et les transistors (0=diode, 1=transistor).
H.114. VCF > Ladder x3
Une émulation d’un filtre à échelle de transistor saturant (suréchantillonné
trois fois). L’entrée F spécifie la fréquence de coupure (en Hz), l’entrée Res
spécifie la résonance (intervalle de 0 à 1) et l’entrée SatL spécifie le niveau
de saturation (intervalle typique entre 1 et 32).
Les sorties 1 à 4 sont prises aux étages correspondants de l’échelle émulée.
Prenez l’étage 4 pour le son de filtre à échelle “classique”.
REAKTOR CORE – 207
Annexe I. Core cell library
I.1. Audio Shaper > 3-1-2 Shaper
Modeleur du signal audio avec une quantité variable de distorsion du 2ème
ou du 3ème ordre. La quantité de distorsion et son type sont contrôlés par
l’entrée “Shp”:
Shp = 0
pas de modelage
Shp > 0
modelage du 3ème ordre
Shp < 0
modelage du 2ème ordre
I.2. Audio Shaper > Broken Par Sat
Saturation parabolique brisée. Segment linéaire autour du niveau zéro.
L’entrée “L” règle le niveau de sortie de la “saturation totale” (1 par
défaut). L’entrée “H” règle la dureté (entre 0 et 1). Les valeurs plus grandes
correspondent à un segment linéaire plus grand au milieu.
L’entrée “S” contrôle la symétrie de la courbe de saturation (de –1 à 1). À 0,
la courbe est symétrique.
I.3. Audio Shaper > Hyperbol Sat
Saturation hyperbolique simple. L’entrée “L” règle le niveau de sortie de la
“saturation totale” (1 par défaut). Cependant, la “saturation totale” n’est
jamais atteinte avec ce type de saturation.
208 – REAKTOR CORE
I.4. Audio Shaper > Parabol Sat
Saturation parabolique simple. L’entrée “L” règle le niveau de sortie de la
“saturation totale” (1 par défaut).
Remarque: la saturation totale est atteinte avec un niveau d’entrée égal
à 2L.
I.5. Audio Shaper > Sine Shaper 4/8
Modeleur en sinus du 4ème / 8ème ordre. Le modeleur du 8ème ordre effectue
une meilleure approximation du sinus, mais il consomme plus de puissance
processeur.
I.6. Control > ADSR
Génère une enveloppe ADSR.
A, D, R temps d’attaque, de décroissance (ou chute) et de relâchement
(ou extinction) en secondes.
S
niveau de maintien (intervalle entre 0 et 1, à 1 le niveau de
maintien est égal au niveau maximal).
G
entrée gate. Les évènements positifs entrants (re)démarrent l’enveloppe. Les évènements nuls ou négatifs arrêtent l’enveloppe.
GS
sensibilité du gate. Pour une sensibilité nulle, le maximum de
l’enveloppe a toujours une amplitude de 1. Pour une sensibilité
égale à 1, le maximum de l’enveloppe est égal au niveau du gate
positif.
REAKTOR CORE – 209
RM
mode de redéclenchement. Commute entre les modes analogique
et digital d’une part, et entre les modes redémarrage et legato
d’autre part. En mode “digital”, l’enveloppe redémarre toujours
de zéro alors qu’en mode “analogique” elle redémarre de son
niveau de sortie actuel. En mode “redémarrage”, les évènements
gate positifs redémarrent l’enveloppe, alors qu’en mode legato
celle-ci redémarre seulement quand les gates passent d’une
valeur négative/nulle à une valeur positive. Voici les valeurs de
RM autorisées:
RM = 0
redémarrage analogique (par défaut)
RM = 1
legato analogique
RM = 2
redémarrage digital
RM = 3
legato digital
I.7. Control > Env Follower
Génère en sortie un signal de contrôle qui “suit” l’enveloppe du signal audio
entrant. Les entrées A et D spécifient les temps d’attaque et de décroissance
du suivi, en secondes.
I.8. Control > Flip Flop
La sortie est basculée entre 0 et 1 à chaque fois que l’entrée de commande
reçoit un évènement.
210 – REAKTOR CORE
I.9. Control > MultiWave LFO
Génère simultanément en sortie plusieurs oscillateurs basse fréquence (LFOs)
calés en phase, avec différentes formes d’onde. L’entrée Rate spécifie la fréquence en Hz, l’entrée W la largeur du train d’impulsions (dans l’intervalle de
–1 à 1, valable uniquement pour la sortie “train d’impulsions”), les évènements
à l’entrée Rst redémarrent les LFOs avec la phase spécifiée par la valeur de
l’évènement (dans l’intervalle de 0 à 1).
I.10. Control > Par Ctl Shaper
Applique une double courbe parabolique au signal de contrôle. Le signal
d’entrée doit être dans l’intervalle [–1..1]. Le signal de sortie est aussi dans
[–1..1]. La quantité de torsion est contrôlée par l’entrée “b” (dont l’intervalle
est encore une fois [–1..1]).
b=0
pas de torsion (courbe linéaire)
b = -1
torsion maximale “vers” l’axe des X
b=1
torsion maximale “vers” l’axe des Y
Vous pouvez aussi utiliser ce modeleur pour les signaux dans l’intervalle [0..1],
auquel cas seule une moitié de la courbe est utilisée.
Usage typique: vélocité et autres modelages de contrôleurs.
I.11. Control > Schmitt Trigger
Passe la sortie à 1 si l’entrée devient supérieure à L+ (par défaut 0,67), et à
0 si l’entrée devient inférieure à L- (par défaut 0,33)..
REAKTOR CORE – 211
I.12. Control > Sine LFO
Génère un signal de contrôle basse fréquence sinusoïdal. L’entrée Rate spécifie
la fréquence en Hz et les évènements à l’entrée Rst redémarrent le LFO avec
la phase spécifiée par la valeur de l’évènement (dans l’intervalle de 0 à 1).
I.13. Delay > 2/4 Tap Delay 4p
Délai à 2/4 battements avec 4 points d’interpolation. Les entrées T1 à T4
spécifient la durée du délai (en secondes) pour chacun des battements.
La durée maximale du délai est de 44100 échantillons par défaut, ce qui fait
1 seconde à 44,1 kHz. Pour ajuster cette durée, modifiez la taille du tableau
dans la macro.
I.14. Delay > Delay 4p
Délai à interpolation 4-points. L’entrée T spécifie la durée du délai en secondes. La durée maximale de délai est de 44100 échantillons par défaut, ce
qui fait 1 seconde à 44,1 kHz. Pour ajuster cette durée, modifiez la taille du
tableau dans la macro.
I.15. Delay > Diff Delay 4p
Délai à diffusion à interpolation 4-points. L’entrée T spécifie la durée du délai
212 – REAKTOR CORE
en secondes. L’entrée Dffs règle le facteur de diffusion. La durée maximale
de délai est de 44100 échantillons par défaut, ce qui fait 1 seconde à 44,1
kHz. Pour ajuster cette durée, modifiez la taille du tableau dans la macro.
I.16. EQ > 6dB LP/HP EQ
Égaliseur passe-bas (LP) / passe-haut (HP) à 1 pôle (6 dB/octave). L’entrée
F spécifie la fréquence de coupure (en Hz).
I.17. EQ > HighShelf EQ
Égaliseur à étage haut à 1 pôle. L’entrée dB spécifie l’accentuation des hautes
fréquences, en dB (les valeurs négatives atténuent ces fréquences). L’entrée
F spécifie la fréquence de transition, en Hertz.
I.18. EQ > LowShelf EQ
Égaliseur à étage bas à 1 pôle. L’entrée dB spécifie l’accentuation des basses
fréquences, en dB (les valeurs négatives atténuent ces fréquences). L’entrée
F spécifie la fréquence de transition, en Hertz.
I.19. EQ > Peak EQ
REAKTOR CORE – 213
Égaliseur à pic/creux à 2 pôles. L’entrée F spécifie la fréquence centrale en Hz,
l’entrée BW spécifie la largeur de bande (en anglais bandwidth) en octaves,
et l’entrée dB spécifie la hauteur du pic (les valeurs négatives produisant un
creux).
I.20. EQ > Static Filter > 1-pole static HP
Filtre passe-haut statique à 1 pôle. L’entrée F spécifie la fréquence de coupure
en Hz.
I.21. EQ > Static Filter > 1-pole static HS
Filtre à étage haut statique à 1 pôle. L’entrée F spécifie la fréquence de coupure
en Hz, et l’entrée B l’accentuation des hautes fréquences, en dB.
I.22. EQ > Static Filter > 1-pole static LP
Filtre passe-bas statique à 1 pôle. L’entrée F spécifie la fréquence de coupure
en Hz.
I.23. EQ > Static Filter > 1-pole static LS
Filtre à étage bas statique à 1 pôle. L’entrée F spécifie la fréquence de coupure
en Hz, et l’entrée B l’accentuation des basses fréquences en dB.
214 – REAKTOR CORE
I.24. EQ > Static Filter > 2-pole static AP
Filtre passe-tout statique à 2 pôles. L’entrée F spécifie la fréquence de coupure
en Hz, et l’entrée Res la résonance (entre 0 et 1).
I.25. EQ > Static Filter > 2-pole static BP
Filtre passe-bande statique à 2 pôles. L’entrée F spécifie la fréquence centrale
en Hz, et l’entrée Res la résonance (entre 0 et 1).
I.26. EQ > Static Filter > 2-pole static BP1
Filtre passe-bande statique à 2 pôles. L’entrée F spécifie la fréquence centrale
en Hz, et l’entrée Res la résonance (entre 0 et 1). L’amplification à la fréquence
centrale est toujours égale à 1, quelle que soit la résonance.
I.27. EQ > Static Filter > 2-pole static HP
Filtre passe-haut statique à 2 pôles. L’entrée F spécifie la fréquence de coupure en Hz, et l’entrée Res la résonance (entre 0 et 1).
REAKTOR CORE – 215
I.28. EQ > Static Filter > 2-pole static HS
Filtre à étage haut statique à 2 pôles. L’entrée F spécifie la fréquence de
coupure en Hz, l’entrée Res spécifie la résonance (entre 0 et 1) et l’entrée B
l’accentuation des hautes fréquences en dB.
I.29. EQ > Static Filter > 2-pole static LP
Filtre passe-bas statique à 2 pôles. L’entrée F spécifie la fréquence de coupure
en Hz, et l’entrée Res la résonance (entre 0 et 1).
I.30. EQ > Static Filter > 2-pole static LS
Filtre à étage bas statique à 2 pôles. L’entrée F spécifie la fréquence de
coupure en Hz, l’entrée Res spécifie la résonance (entre 0 et 1) et l’entrée B
l’accentuation des hautes fréquences en dB.
I.31. EQ > Static Filter > 2-pole static N
Filtre en creux statique à 2 pôles. L’entrée F spécifie la fréquence de coupure
en Hz, et l’entrée Res la résonance (entre 0 et 1).
216 – REAKTOR CORE
I.32. EQ > Static Filter > 2-pole static Pk
Filtre en pic statique à 2 pôles. L’entrée F spécifie la fréquence centrale en
Hz, l’entrée Res la résonance (entre 0 et 1) et l’entrée B l’accentuation à la
fréquence centrale en dB.
I.33. Oscillator > 4-Wave Mst
Génère quatre formes d’onde audio calées en phase. Le pitch (hauteur tonale)
de l’oscillateur est spécifié par l’entrée P (sous forme de numéro de note MIDI).
Il peut être modulé par l’entrée PM (en demi-tons, donc exponentiellement)
et par l’entrée FM (en Hertz, donc linéairement). La largeur de l’impulsion
(pour le train d’impulsions) est spécifiée par l’entrée PW, dans l’intervalle de
–1 à 1.
Cet oscillateur peut fonctionner avec des fréquences négatives et dispose
de plus d’une sortie de synchronisation pour l’oscillateur esclave équivalent,
4-Wave Slv.
I.34. Oscillator > 4-Wave Slv
REAKTOR CORE – 217
Génère quatre formes d’onde audio calées en phase. Le pitch (hauteur tonale)
de l’oscillateur est spécifié par l’entrée P (sous forme de numéro de note MIDI).
Il peut être modulé par l’entrée PM (en demi-tons, donc exponentiellement) et
par l’entrée FM (en Hertz, donc linéairement). La largeur de l’impulsion (pour
le train d’impulsions) est spécifiée par l’entrée PW, dans l’intervalle de –1 à
1.Cet oscillateur peut fonctionner avec des fréquences négatives. Il peut aussi
être synchronisé à un autre oscillateur 4-Wave Mst/Slv via l’entrée Snc. L’entrée
SncH contrôle la dureté de la synchronisation (0 = pas de synchro, de 0 à 1
= degré croissant de synchronisation souple). Une sortie de synchronisation
pour un autre oscillateur 4-Wave Slv est également disponible.
I.35. Oscillator > Digital Noise
Générateur de bruit blanc numérique. Produit des valeurs aléatoires dans
l’intervalle [-1..1]. Un évènement entrant à l’entrée Seed (ré)initialise le générateur aléatoire interne avec une valeur “graine” donnée (la valeur de l’évènement).
I.36. Oscillator > FM Op
Opérateur classique de FM (Modulation de Fréquence). Produit une onde sinusoïdale dont le pitch est défini par l’entrée P (en numéro de note MIDI). Le
sinus peut être modulé en phase par l’entrée PhM (en radians). Un évènement
arrivant à l’entrée Rst redémarre l’oscillateur à la phase spécifiée par la valeur
de cet évènement (intervalle de 0 à 1).
I.37. Oscillator > Formant Osc
Génère une forme d’onde avec une fréquence fondamentale spécifiée par
218 – REAKTOR CORE
l’entrée P (en numéro de note MIDI) et une fréquence de formant spécifiée
par l’entrée Fmt (en Hz aussi).
I.38. Oscillator > Impulse
Génère une impulsion de largeur un échantillon, d’amplitude 1, en réponse
à un évènement entrant.
I.39. Oscillator > MultiWave Osc
Génère quatre formes d’onde audio calées en phase. Le pitch (hauteur tonale)
de l’oscillateur est spécifié par l’entrée P (sous forme de numéro de note MIDI).
Il peut être modulé par l’entrée PM (en demi-tons, donc exponentiellement) et
par l’entrée FM (en Hertz, donc linéairement). La largeur de l’impulsion (pour
le train d’impulsions) est spécifiée par l’entrée PW, dans l’intervalle de –1 à 1.
Cet oscillateur ne peut pas fonctionner avec des fréquences négatives.
I.40. Oscillator > Quad Osc
Génère une paire de formes d’onde sinusoïdales calées en phase, avec un
décalage de phase de 90°. L’entrée P spécifie le pitch, en numéro de note
MIDI.
REAKTOR CORE – 219
I.41. Oscillator > Sub Osc
Génère quatre sous-harmoniques calées en phase. La fréquence “fondamentale”
est spécifiée par l’entrée P (en numéro de note MIDI). Les nombres sous-harmoniques sont spécifiés par les entrées S1 à S4 (intervalle 1..120). L’entrée
Tbr contrôle le contenu harmonique de la forme d’onde de sortie (intervalle
0..1).
I.42. VCF > 2 Pole SV C
Filtre 2-pôles à variable d’état (version compensée). Offre un meilleur comportement aux fréquences de coupures élevées. L’entrée P spécifie la fréquence
de coupure (en numéro de note MIDI). Elle peut être modulée par l’entrée PM
(en demi-tons, donc exponentiellement) et par l’entrée FM (en Hertz, donc
linéairement). L’entrée Res spécifie la résonance (intervalle 0..0,98). Vous
pouvez également utiliser des valeurs négatives de résonance, elles augmentent encore plus la pente. Les sorties HP/BP/LP produisent respectivement
les signaux passe-haut, passe-bande et passe-bas.
I.43. VCF > 2 Pole SV T
220 – REAKTOR CORE
Filtre 2-pôles à variable d’état avec compensation. Offre un meilleur comportement aux fréquences de coupures élevées, quoique légèrement différent de
celui de la version 2 Pole SV C. L’entrée P spécifie la fréquence de coupure en
numéro de note MIDI. Elle peut être modulée par l’entrée PM (en demi-tons,
donc exponentiellement) et par l’entrée FM (en Hertz, donc linéairement).
L’entrée Res spécifie la résonance (intervalle 0..1).
Les sorties HP/BP/LP produisent respectivement les signaux passe-haut,
passe-bande et passe-bas.
I.44. VCF > 2 Pole SV x3 S
Filtre 2-pôles à variable d’état avec un suréchantillonnage optionnel (version
x3) et une saturation. L’entrée P spécifie la fréquence de coupure (en numéro
de note MIDI). Elle peut être modulée par l’entrée PM (en demi-tons, donc
exponentiellement) et par l’entrée FM (en Hertz, donc linéairement). L’entrée
Res spécifie la résonance (intervalle 0..1) et l’entrée Sat le niveau de saturation
(intervalle typique: de 8 à 32).
Les sorties HP/BP/LP produisent respectivement les signaux passe-haut,
passe-bande et passe-bas.
I.45. VCF > Diode Ladder
Émulation linéaire d’un filtre à échelle de diodes. L’entrée P spécifie la fréquence de coupure du filtre (en numéro de note MIDI). Elle peut être modulée
par l’entrée PM (en demi-tons, donc exponentiellement) et par l’entrée FM
(en Hertz, donc linéairement). L’entrée Res spécifie la résonance (intervalle
de 0 à 0,98).
REAKTOR CORE – 221
I.46. VCF > D/T Ladder
Émulation linéaire d’un filtre à échelle, fondu possible entre les comportements “diode” et “transistor”. L’entrée P spécifie la fréquence de coupure
du filtre (en numéro de note MIDI). Elle peut être modulée par l’entrée PM
(en demi-tons, donc exponentiellement) et par l’entrée FM (en Hertz, donc
linéairement). L’entrée Res spécifie la résonance (intervalle de 0 à 0,98) et
l’entrée D/T contrôle la balance entre les diodes et les transistors (0=diode,
1=transistor).
I.47. VCF > Ladder x3
Une émulation d’un filtre à échelle de transistor saturant (suréchantillonné
trois fois). L’entrée P spécifie la fréquence de coupure (en numéro de note
MIDI). Elle peut être modulée par l’entrée PM (en demi-tons, donc exponentiellement) et par l’entrée FM (en Hertz, donc linéairement). L’entrée Res
spécifie la résonance (intervalle de 0 à 1) et l’entrée SatL spécifie le niveau
de saturation (intervalle typique entre 1 et 32).
Les sorties 1 à 4 sont prises aux étages correspondants de l’échelle émulée.
Prenez l’étage 4 pour le son de filtre à échelle “classique”.
222 – REAKTOR CORE
Index
B
Boolean control (BoolCtl) ......... 113
C
Cellules. Voir Cellules Core
Cellules Core ............................ 11
(Re-)nommer les .................... 33
Audio .................................... 92
Dossier utilisateur des ............ 13
Édition basique des ................ 17
Évènements ........................... 66
Évènement et Audio................ 23
Générer des ........................... 25
Ports de ................................ 29
Utilisation des........................ 12
Comparaison de signe ............. 124
D
Debug Mode ............................. 86
E
Entrées. Voir Ports
Signaux par défaut de l’entrée . 46
Évènements.............................. 60
Le routage des ..................... 112
simultanés............................. 63
Évènements Core. Voir Évènements
F
FP Precision .............. 45, 119, 146
H
Horloge du taux d’échantillonnage ...
..... 73, 94, 96, 101, 110, 117, 136
I
INF ....................................... 108
Initialisation ......................77, 126
Initialisation évènements ................
.................... 77, 89, 93, 108, 126
Inputs. Voir Ports
L
Latch module .........72, 74, 75, 83,
.............................. 115, 123, 149
M
Macros. Voir Macros Core
Macros à modulation .......... 90, 93,
......................................123, 149
Macros Core ............................. 44
(Re-)nommer les .................... 45
Création de............................ 44
Dossier Utilisateur .................. 88
Paramètre Solid ............. 45, 101
Ports de ................................ 44
Macro Read [] ........................ 135
Macro Write [] ........................ 132
Mauvaises valeurs ........... 103, 108
Modules. Voir Modules Core
Modules Core
Insérer des ............................ 26
Ordre de traitement ................ 65
mode entier ..................121, 123
Module Denormal Cancel (DNC) 107
Module ES Ctl ........................ 126
Module Merge ..... 81, 83, 114, 150
Module R/W Order .................. 133
Module Read .............. 73, 80, 130
Initialisation de ...................... 77
Module Router .................112, 150
Module Write .......73, 80, 126, 130
Initialisation de ...................... 77
Module Z1 .....75, 96, 97, 111, 123
REAKTOR CORE – 223
N
NaN ...................................... 108
O
Object Bus Connections (OBC) .......
73, 120, 129
P
Ports
Audio .................................... 92
Audio/Évènement ................... 19
Évènements ........................... 67
Générer ................................. 29
Ordre d’émission .................... 67
Ordre relatif ........................... 18
Précision de la virgule flottante.
Voir FP Precision
Q
QnaN..................................... 108
QuickBus ................................. 35
QuickConst .........................47, 69
R
Réinjection ............................... 95
Indication de ................... 42, 96
Réinjection et macros ............. 99
Résolution de .................97, 123
S
Signaux
audio .................................... 37
contrôle ................................ 37
entiers ........................ 120, 152
évènements ........................... 53
flottants .......................118, 152
Horloge. Voir Signaux d’horloge
logiques ................................ 57
224 – REAKTOR CORE
Signaux d’horloge ...................... 72
Signaux par défaut de l’entrée.
Voir Entrées
Sorties. Voir Ports
Sorties Audio ............................ 93
Structure Core .......................... 18
T
Tableaux ................................ 128
Tables.................................... 144
V
Valeurs dénormales ................. 103

Manuels associés