squinewave

squinewave — Un oscillateur d'onde carrée-pulsation-dent de scie-sinus à bande limitée et variation de forme avec synchro forcée.

Description

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.

Syntaxe

aout [, asyncout] squinewave acps, aClip, aSkew, asyncin [, iMinSweep] [, iphase]
aout [, asyncout] squinewave acps, aClip, aSkew [, ksyncin] [, iMinSweep] [, iphase]

Initialisation

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.

Exécution

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 :

  1. pente de cosinus descendante suivie d'une partie plate à -1

  2. 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.

asyncin

L'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.

iMinSweep

la 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.

Notes

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).

Conseil

La 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 hauteurs

Noter 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 initiale

Il 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.

Exemples

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>


Crédits

Auteur : Rasmus Ekman
Novembre 2017

Nouveau dans la version 6.10