GEN30

GEN30 — Génère des partiels harmoniques en analysant une table existante.

Description

Extrait un sous-ensemble de la série harmonique d'une forme d'onde existante.

Syntaxe

f # date taille 30 src minh maxh [ref_sr] [interp]

Exécution

src -- ftable source

minh -- numéro de l'harmonique le plus bas

maxh -- numéro de l'harmonique le plus haut

ref_sr (facultatif) -- maxh est pondéré par (sr / ref_sr). La valeur par défaut de ref_sr est sr. Si ref_sr est nul ou négatif, il est ignoré.

interp (facultatif) -- si différent de zéro, permet de changer l'amplitude des harmoniques le plus bas et le plus haut en fonction de la partie fractionnaire de minh et maxh. Par exemple, si maxh vaut 11.3 alors le 12ème harmonique est ajouté avec une amplitude de 0.3. Ce paramètre vaut zéro par défaut.

GEN30 ne supporte pas les tables avec un point de garde (c'est-à-dire une taille de table = puissance-de-deux + 1). Bien que de telles tables fonctionnent aussi bien en entrée qu'en sortie, lors de la lecture d'une table source, le point de garde est ignoré, et lors de l'écriture de la table en sortie, le point de garde est simplement copié du premier échantillon (index de table = 0).

La raison de cette limitation est que GEN30 utilise la TFR, qui nécessite que la taille de table soit une puissance de deux. GEN32 permet l'utilisation de l'interpolation linéaire pour le rééchantillonage et le déphasage, ce qui rend possible l'utilisation de n'importe quelle taille de table (cependant, pour les partiels calculés par TFR, la limitation de la puissance de deux existe toujours).

Examples

Voici un exemple de la routine GEN30. Il utilise le fichier gen30.csd.

Exemple 1301. Exemple de la routine GEN30.

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
; Audio out   Audio in    No messages
-odac     ;;;realtime audio out
; For Non-realtime ouput leave only the line below:
; -o gen30.wav -W ;;; for file output any platform
</CsOptions>
<CsInstruments>

;a simplified example of Istvan Varga
sr =  44100
ksmps =  32
nchnls =  2
0dbfs   = 1

isaw	ftgen 1, 0, 16384, 7, 1, 16384, -1						;sawtooth wave 
iFM	ftgen 3, 0, 4096, 7, 0, 512, 0.25, 512, 1, 512, 0.25, 512,	\
			     0, 512, -0.25, 512, -1, 512, -0.25, 512, 0			;FM waveform
iAM	ftgen 4, 0, 4096, 5, 1, 4096, 0.01						;AM waveform
iEQ	ftgen 5, 0, 1024, 5, 1, 512, 32, 512, 1						;FM to EQ
isine	ftgen 6, 0, 1024, 10, 1								;sine wave

/* generate bandlimited sawtooth waves */
i0	=  0
loop1:
imaxh	=  sr / (2 * 440.0 * exp(log(2.0) * (i0 - 69) / 12))
i_	ftgen i0 + 10, 0, 4096, -30, 1, 1, imaxh					;use gen 30
i0	=  i0 + 1
	if (i0 < 127.5) igoto loop1

instr 1

kcps	=  440.0 * exp(log(2.0) * (p4 - 69) / 12)					;note frequency
klpmaxf	limit p5 * kcps, 1000.0, 12000.0						;lowpass max. frequency

kfmd1	=  0.03 * kcps									;FM depth in Hz
kamfr	=  kcps * 0.02									;AM frequency
kamfr2	=  kcps * 0.1

kfnum	=  (10 + 69 + 0.5 + 12 * log(kcps / 440.0) / log(2.0))				;table number
aenv	linseg 0, p3*0.25, 1, p3*0.75, 0						;amp. envelope

asig	oscbnk kcps, 0.0, kfmd1, 0.0, 40, 200, 0.1, 0.2, 0, 0, 144,	      \
		0.0, klpmaxf, 0.0, 0.0, 1.5, 1.5, 2, kfnum, 3, 0, 5, 5, 5
asig	= asig * aenv*.03
outs asig, asig

endin

</CsInstruments>
<CsScore>
s
i 1 0 6 41 10
i 1 0 6 60
i 1 0 6 65
i 1 0 6 69
s
i 1 0 6 41 64
i 1 0 6 60
i 1 0 6 65
i 1 0 6 69

e
</CsScore>
</CsoundSynthesizer>


Crédits

Auteur : Istvan Varga

Nouveau dans la version 4.16