GEN33 — Génère des formes d'onde complexes en mélangeant des sinus.
Ces routines génèrent des formes d'onde complexes en mélangeant des sinus, comme GEN09, mais les paramètres des partiels sont spécifiés dans une table déjà existante, ce qui permet de calculer n'importe quel nombre de partiels dans l'orchestre.
La différence entre GEN33 et GEN34 est que GEN33 utilise la TFR inverse pour générer la sortie, alors que GEN34 est basé sur l'algorithme utilisé dans les opcode oscils. GEN33 ne permet que des partiels entiers, et ne supporte pas les tailles de table égales à une puissance-de-deux plus 1, mais peut être significativement plus rapide avec un grand nombre de partiels. D'un autre côté, avec GEN34, il est possible d'utiliser des numéros de partiel non entiers et un point de garde, et cette routine peut être plus rapide s'il n'y a qu'un petit nombre de partiels (noter que GEN34 est aussi plusieurs fois plus rapide que GEN09, bien que ce dernier soit plus précis).
taille -- nombre de points dans la table. Doit être une puissance de deux et au moins 4.
src -- numéro de la table source. Cette table contient les paramètres de chaque partiel dans le format suivant :
ampa, pna, phsa, ampb, pnb, phsb, ...
les paramètres sont :
ampa, ampb, etc. : amplitude relative des partiels. L'amplitude actuelle dépend de la valeur de ech, ou de la normalisation (si celle-ci est active).
pna, pnb, etc. : numéro de partiel, ou fréquence, en fonction de fmode (voir ci-dessous) ; zéro et des valeurs négatives sont autorisés, cependant, si la valeur absolue du numéro de partiel dépasse (taille / 2), le partiel ne sera pas rendu. Avec GEN33, le numéro de partiel est arrondi à l'entier le plus proche.
phsa, phsb, etc. : phase initiale, dans l'intervalle de 0 à 1.
La longueur de la table (sans compter le point de garde) devrait être d'au moins 3 * nh. Si la table est trop courte, le nombre de partiels (nh) est réduit à (longueur de la table) / 3, arrondi vers zéro.
nh -- nombre de partiels. Zéro ou des valeurs négatives sont autorisés, et donnent une table vide (silence). Le nombre effectif peut être diminué si la table source (src) est trop courte, ou si certains partiels ont une fréquence trop haute.
ech -- échelle d'amplitude.
fmode (facultatif, défaut = 0) -- une valeur non nulle indique que les fréquences sont en Hz au lieu de numéros de partiel dans la table source. Le taux d'échantillonage est supposé être fmode si celui-ci est positif, ou -(sr * fmode) si une valeur négative est spécifiée.
Voici un exemple de la routine GEN33. Il utilise le fichier gen33.csd.
Exemple 1304. Exemple de la routine GEN33.
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 gen33.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> sr = 44100 ksmps = 32 nchnls = 2 0dbfs = 1 instr 1 ; partials 1, 4, 7, 10, 13, 16, etc. with base frequency of 400 Hz ibsfrq = 400 inumh = int(1.5 + sr * 0.5 / (3 * ibsfrq)) ; estimate number of partials isrcln = int(0.5 + exp(log(2) * int(1.01 + log(inumh * 3) / log(2)))) ; source table length itmp ftgen 1, 0, isrcln, -2, 0 ; create empty source table ifpos = 0 ifrq = ibsfrq inumh = 0 l1: tableiw ibsfrq / ifrq, ifpos, 1 ; amplitude tableiw ifrq, ifpos + 1, 1 ; frequency tableiw 0, ifpos + 2, 1 ; phase ifpos = ifpos + 3 ifrq = ifrq + ibsfrq * 3 inumh = inumh + 1 if (ifrq < (sr * 0.5)) igoto l1 itemp ftgen 2, 0, 262144, -33, 1, inumh, 1, -1 ; store output in ftable 2 (size = 262144) asig poscil .5, ibsfrq, itemp outs asig, asig endin </CsInstruments> <CsScore> i 1 0 2 e </CsScore> </CsoundSynthesizer>
Voici le diagramme de la forme d'onde générée par GEN33,
utilisé dans l'exemple :