adsynt2 — Réalise une synthèse additive avec un nombre arbitraire de partiels - pas nécessairement harmoniques - avec interpolation.
Réalise une synthèse additive avec un nombre arbitraire de partiels, pas nécessairement harmoniques. (Voir adsynt)
iwfn -- table contenant une forme d'onde, normalement une sinus. Les valeurs de la table ne sont pas interpolées pour des raisons de performance, si bien que des tables plus grandes apportent une meilleure qualité.
ifreqfn -- table contenant les valeurs de fréquence de chaque partiel. ifreqfn peut contenir les valeurs de fréquence initiales de chaque partiel, mais elle est habituellement utilisée pour générer des paramètres pendant l'exécution avec tablew. Les fréquences doivent être relatives à kcps. La taille doit être au moins égale à icnt.
iampfn -- table contenant les valeurs d'amplitude de chaque partiel. iampfn peut contenir les valeurs d'amplitude initiales de chaque partiel, mais elle est habituellement utilisée pour générer des paramètres pendant l'exécution avec tablew. Les amplitudes doivent être relatives à kamp. La taille doit être au moins égale à icnt.
icnt -- nombre de partiels à générer.
iphs -- phase initiale de chaque oscillateur, si iphs = -1, l'initialisation est ignorée. Si iphs > 1, toutes les phases seront initialisées avec une valeur aléatoire.
kamp -- amplitude de la note.
kcps -- fréquence de base de la note. Les fréquences des partiels seront relatives à kcps.
La fréquence et l'amplitude de chaque partiel sont données dans les deux tables fournies. Le but de cet opcode est de faire générer par un instrument les paramètres de synthèse au taux-k et de les écrire dans des tables globales avec l'opcode tablew.
adsynt2 est identique à adsynt (by Peter Neubäcker), sauf qu'il réalise une interpolation linéaire pour les enveloppes d'amplitude de chaque partiel. Il est un peu plus lent que adsynt, mais l'interpolation améliore grandement la qualité du son dans les transitoires rapides des enveloppes d'amplitude lorsque kr < sr (c'est-à-dire quand ksmps > 1). Il n'y pas d'interpolation pour les enveloppes de hauteur, car dans ce cas la dégradation de la qualité sonore n'est pas aussi évidente même avec de grandes valeurs de ksmps. Il n'est pas recommandé quand kr = sr ; dans ce cas, adsynt est meilleur (car plus rapide).
Voici un exemple de l'opcode adsynt2. Il utilise le fichier adsynt2.csd. Ces deux instruments réalisent une synthèse additive. Leurs sorties respectives sonnent comme un bol tibétain. La première est statique car les paramètres ne sont fixés qu'à l'initialisation. Dans la seconde, les paramètres changent de manière continue.
Exemple 51. Exemple de l'opcode adsynt2.
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 ;;;RT audio out ;-iadc ;;;uncomment -iadc if RT audio input is needed too ; For Non-realtime ouput leave only the line below: ; -o adsynt2.wav -W ;;; for file output any platform </CsOptions> <CsInstruments> sr = 44100 ksmps = 32 nchnls = 2 0dbfs = 1 ; Generate a sinewave table. giwave ftgen 1, 0, 1024, 10, 1 ; Generate two empty tables for adsynt2. gifrqs ftgen 2, 0, 32, 7, 0, 32, 0 ; A table for freqency and amp parameters. giamps ftgen 3, 0, 32, 7, 0, 32, 0 ; Generates parameters at init time instr 1 ; Generate 10 voices. icnt = 10 ; Init loop index. index = 0 ; Loop only executed at init time. loop: ; Define non-harmonic partials. ifreq pow index + 1, 1.5 ; Define amplitudes. iamp = 1 / (index+1) ; Write to tables. tableiw ifreq, index, gifrqs ; Used by adsynt2. tableiw iamp, index, giamps index = index + 1 ; Do loop/ if (index < icnt) igoto loop asig adsynt2 0.4, 150, giwave, gifrqs, giamps, icnt outs asig, asig endin ; Generates parameters every k-cycle. instr 2 ; Generate 10 voices. icnt = 10 ; Reset loop index. kindex = 0 ; Loop executed every k-cycle. loop: ; Generate lfo for frequencies. kspeed pow kindex + 1, 1.6 ; Individual phase for each voice. kphas phasorbnk kspeed * 0.7, kindex, icnt klfo table kphas, giwave, 1 ; Arbitrary parameter twiddling... kdepth pow 1.4, kindex kfreq pow kindex + 1, 1.5 kfreq = kfreq + klfo*0.006*kdepth ; Write freqs to table for adsynt2. tablew kfreq, kindex, gifrqs ; Generate lfo for amplitudes. kspeed pow kindex + 1, 0.8 ; Individual phase for each voice. kphas phasorbnk kspeed*0.13, kindex, icnt, 2 klfo table kphas, giwave, 1 ; Arbitrary parameter twiddling... kamp pow 1 / (kindex + 1), 0.4 kamp = kamp * (0.3+0.35*(klfo+1)) ; Write amps to table for adsynt2. tablew kamp, kindex, giamps kindex = kindex + 1 ; Do loop. if (kindex < icnt) kgoto loop asig adsynt2 0.25, 150, giwave, gifrqs, giamps, icnt outs asig, asig endin </CsInstruments> <CsScore> ; Play Instrument #1 for 2.5 seconds. i 1 0 2.5 ; Play Instrument #2 for 2.5 seconds. i 2 3 2.5 e </CsScore> </CsoundSynthesizer>