adsynt2

adsynt2 — Réalise une synthèse additive avec un nombre arbitraire de partiels - pas nécessairement harmoniques - avec interpolation.

Description

Réalise une synthèse additive avec un nombre arbitraire de partiels, pas nécessairement harmoniques. (Voir adsynt)

Syntaxe

ar adsynt2 kamp, kcps, iwfn, ifreqfn, iampfn, icnt [, iphs]

Initialisation

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.

Exécution

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

Exemples

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


Crédits

Ecrit par Gabriel Maldonado.

Nouveau dans Csound 5 (Disponible auparavant seulement dans CsoundAV)