squinewave — Un oscillateur d'onde carrée-pulsation-dent de scie-sinus à bande limitée et variation de forme avec synchro forcée.
Cet oscillateur génère une forme d'onde variable qui peut évoluer librement entre les formes classiques de sinus, carrée, pulsation et dent de scie. La forme est contrôlée par deux valeurs interactives : clip (rectitude) et skew (symétrie). Toutes les formes utilisent un nombre minimum d'échantillons par transition (par exemple, la fin abrupte d'une dent de scie ou d'une pulsation utilise un minimum de N échantillons), ce qui produit une sortie à bande limitée. Aux plus hautes fréquences, le taux de transition minimal prédomine, ce qui fait qu'au delà d'une certaine hauteur toutes les formes se "dégradent" en sinus. Le taux de transition minimal est configuré au temps-i. La synchronisation forcée (une transition très rapide à la phase nulle) est supporté, et un signal de synchro est produit une fois par cycle.
aout [, asyncout] squinewave acps, aClip, aSkew, asyncin [, iMinSweep] [, iphase]
aout [, asyncout] squinewave acps, aClip, aSkew [, ksyncin] [, iMinSweep] [, iphase]
iMinSweep (facultatif) -- Supérieur ou égal à 4. Durée en échantillons des transitions les plus courtes des formes carrées/pulsation. Par défaut sr/3000 (pratiquement sans repliement).
iphase (facultatif, -1 par défaut) -- phase initiale, entre 0 et 2, proportionnelle aux segments de la forme d'onde (voir notes). Si une valeur négative est donnée, l'initialisation de la phase est ignorée.
aout -- sortie audio normalisée à +/-1.
asyncout -- (facultatif) -- signal de synchro : vaut 1 à la fin de chaque cycle, sinon 0.
acps -- fréquence. A partir de 0. Les fréquences négatives ne sont pas traitées.
aClip -- "rectitude" de la forme d'onde. Entre 0 et 1. 0 pour une sinus (ou une dent de scie), 1 pour une onde carrée (ou une pulsation).
aSkew -- symétrie de la forme d'onde.Entre -1 et +1. 0 pour une forme symétrique comme une sinus ou une onde carrée. +1 ou -1 pour une dent de scie ou une pulsations orientée à droite ou à gauche.
asyncin/ksyncin -- (facultatif, ignoré s'il n'est pas de taux-a) - lorsqu'il est >= 1, la forme d'onde glisse rapidement vers la phase nulle. La durée de la transition varie entre 0 et 1.5*iMinSweep échantillons en fonction de la phase courante.
L'opcode squinewave est un oscillateur à forme d'onde variable générée en interne. La forme d'onde a deux parties :
pente de cosinus descendante suivie d'une partie plate à -1
pente de cosinus ascendante suivie d'une partie plate à +1
A la fin de (2) un signal de synchro est produit.
Clip (0-1) | contrôle la proportion entre la partie plate et la transition dans chaque segment. |
Skew (-1 to +1) | contrôle la proportions des segments (1) et (2) dans le cycle de la forme d'onde. |
Si skew < 0, la partie (1) est plus courte, if skew > 0, (1) est plus longue que (2)
Les formes d'onde classiques ont des valeurs simples :
sinus : clip=0, skew=0
dent de scie : clip=0, skew=+1 or -1 (orientation à gauche ou à droite)
carrée : clip=1, skew=0
pulsation: clip=1, skew=+1 or -1
Les valeurs fractionnaires produisent des formes d'onde intermédiares.
asyncinL'entrée de synchronisation forcée (asyncin >=1) fait glisser rapidement la forme d'onde vers sa fin en élévant la fréquence à 2 * sr/iMinSweep. Les pulsations de synchro sont ainsi plus raides que la forme d'onde pulsation.
iMinSweepla forme d'onde est à bande limitée grâce à l'utilisation d'un nombre minimal d'échantillons pour les transition de cosinus même si clip/skew ont des valeurs extrêmes. Ceci est contrôlé par iMinSweep. Comme iMinSweep est compté en échantillons, la forme d'onde produite dépend du taux d'échantillonnage, mais le spectre sera très proche d'un spectre indépendant de sr. La valeur par défaut sr/3000 est plutôt "douce", les valeurs étant de 14 échantillons à 44.1 kHz, 16 à 48 kHz et 32 à 96 kHz, etc. iMinSweep est compté en nombres entiers bien que ce ne soit pas strictement nécessaire.
Si plusieurs unités de squinewave sont jouées à l'unisson, il est recommandé d'utiliser différentes valeurs de iMinSweep. La valeur minimale de transition crée des zones plus calmes dans la série des harmoniques. En utilisant des valeurs minimales de transition légèrement différentes, le spectre est rempli plutôt que de souligner le contour spectral.
squinewave est basé sur des cosinus plutôt que sur des sinus pour générer la forme d'onde. (Ceci simplifie la logique de contrôle). La différence est que cos(0) = 1, alors que sin(0) = 0. Cela signifie que la synchronisation forcée se produit quand la forme d'onde atteint une crête, juste avant d'entamer sa pente descendante. (Une synchronisation forcée sinusoîdale se produirait au passage à zéro).
ConseilLa durée des transitions de synchronisation forcée permet d'enchainer la synchronisation de plusiers unités de squinewave ce qui crée des impulsions à synchronisation forcée décalées.
Stabilité des hauteursNoter que iMinSweep limite la possibilité de squinewave d'atteindre une fréquence exacte. Quand skew ou clip sont actifs, et qu'une MF est appliquée, la forme d'onde de squinewave sera plus longue ou plus courte que la période exacte. Cependant, les différences se compensent, si bien qu'ave une MF symétrique, squinewave dévie en approchant une fréquence moyenne. Un signal sinusoïdal non mis en forme (clip=skew=0) correspond à la sortie de poscil sur 7 à 8 chiffres significatifs (également sous MF).
Phase initialeIl est utile de fixer la phase initiale si squinewave est utilisé comme un LFO formé. La phase initiale est divisée en quatre segments avec des valeurs symboliques comprises entre 0 et 2, et elle démarrera ainsi à l'endroit attendu indépendamment des valeurs de skew/clip. 0-1 représente la première partie, 1-2 la seconde. Voici quelques valeurs de iphase intéressantes :
0 - début de la première pente descendante.
0.5 - fin de la pente descendante (début de la section plate "basse").
1 - point médian, fin de la première section plate, début de la seconde pente ascendante.
1.5 - fin de la pente ascendante (début de la section plate "haute").
0.25 et 1.25 sont les passages à zéro au milieu des sections de pente descendante/ascendante.
0.75 et 1.75 sont au milieu des sections plates basse/haute.
Si iphase < 0 (ignoré) à la première utilisation, la phase initiale est fixée à 1.25, c'est-à-dire au passage à zéro de la pente ascendante. La sortie ressemble alors à une onde sinusoïdale.
Voici un exemple de l'opcode squinewave. Il utilise le fichier squinewave.csd.
Exemple 1001. Exemple de l'opcode squinewave.
Voir les sections Audio en temps réel et Options de la ligne de commande pour plus d'information sur l'utilisation des options de la ligne de commande.
<CsoundSynthesizer> <CsOptions> ; Select audio/midi flags here according to platform -odac ;;;realtime audio out ;-iadc ;;;uncomment -iadc if realtime audio input is needed too ; For Non-realtime ouput leave only the line below: ; -o sqrt.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> ;################################################# 0dbfs = 1.1 nchnls = 2 ksmps = 100 ; aSyncin, FMod for instr 2 gafmod init 0 gasync init 0 ; Modulator squinewave instr 1 ; freq start, end acps line p4, p3, p5 ; shape start, end aclip line p6, p3, p7 askew line p8, p3, p9 ; ar, async squinewave aFreq , aclip, askew [, asyncin, iMinSweep, iphase] aout1, gasync squinewave cpsoct(acps), aclip, askew, 0, 17 outs1 aout1 gaFMod = aout1 endin ; squinewave using gaFMod and gasync input from i1 instr 2 ; freq & shape start, end acps line p4, p3, p5 aclip line p6, p3, p7 askew line p8, p3, p9 aFMindex line p10, p3, p11 asyncin = gasync * p12 afreq = cpsoct(acps + aFMindex * gaFMod) ; ar squinewave aFreq, aclip, askew [, asyncin, iMinSweep, iphase] aout2 squinewave afreq , aclip, askew, asyncin outs2 aout2 endin </CsInstruments> <CsScore> ; First part instr 1 hardsyncs instr 2 (p12) ; p4=fund clip skew i1 0 1. 6.11 6.06 0 1 -1 +1 i1 + 1. pp5 2.03 pp7 0 pp9 0 i1 + 1. pp5 7.11 pp7 .8 pp9 -.8 i1 + 2. pp5 8.11 pp7 .2 pp9 1 i1 + .5 pp5 6.05 pp7 .5 pp9 -.6 i1 + 2.5 pp5 6.05 pp7 1 pp9 1 ; p4=fund clip skew p10=FM p12=sync i2 0 .5 1.08 2.06 0 .3 -.5 +.5 0 0 1 i2 + .5 pp5 4.03 pp7 .5 pp9 -.6 pp11 . . i2 + .5 pp5 5.11 pp7 1 pp9 .5 pp11 . . i2 + .5 pp5 6.01 pp7 .8 pp9 -.5 pp11 . . i2 + .5 pp5 2.11 pp7 .1 pp9 .3 pp11 . . i2 + .5 pp5 3.11 pp7 .8 pp9 -.8 pp11 . . i2 + 2. pp5 4.00 pp7 0 pp9 0 pp11 . . i2 + 3. pp5 3.00 pp7 .3 pp9 1 pp11 . . s ; End section, reset clock ; Second part instr 1 outputs FM for instr 2 (p10, p11) ; p4=fund clip skew i1 0 1. 6.11 6.06 0 1 -.3 +.3 i1 + 1. pp5 2.03 pp7 0 pp9 0 i1 + 1. pp5 7.11 pp7 .8 pp9 .8 i1 + 2. pp5 8.11 pp7 0 pp9 .4 i1 + .5 pp5 6.05 pp7 .5 pp9 -.6 i1 + 2.5 pp5 6.05 pp7 .4 pp9 .8 ; p4=fund clip skew p10=FM p12=sync i2 0 .5 8.08 6.06 0 .3 -.5 +.5 0 3 0 i2 + .5 pp5 6.03 pp7 .5 pp9 -.6 pp11 2 . i2 + .5 pp5 5.11 pp7 1 pp9 .5 pp11 < . i2 + .5 pp5 6.01 pp7 .8 pp9 -.5 pp11 1 . i2 + .5 pp5 5.11 pp7 .5 pp9 .3 pp11 < . i2 + .5 pp5 9.04 pp7 .1 pp9 -.3 pp11 .5 . i2 + 2. pp5 8.11 pp7 .4 pp9 .4 pp11 2 . i2 + 3. pp5 8.11 pp7 0 pp9 0 pp11 3 . e </CsScore> </CsoundSynthesizer>