GEN30 — Génère des partiels harmoniques en analysant une table existante.
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).
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>