diode_ladder — Implémentation d'un filtre en échelle à diodes à 4 pôles avec rétroaction sans retard.
Implémentation d'un filtre passe-bas à diodes à 4 pôles (24 dB/oct) avec rétroaction sans retard. Ce type de filtre fut utilisé à l'origine dans l'EMS VCS3 et il fut le filtre résonnant du Roland TB-303.
istor --état initial de l'espace de données interne. Comme le filtrage comprend une boucle de rétroaction sur la sortie précédente, l'état initial de l'espace de stockage utilisé est significatif. Une valeur nulle provoquera l'effacement de cet espace ; une valeur non nulle autorisera la persistance de l'information précédente. La valeur par défaut est 0.
asig -- signal de sortie passe-bas.
ain -- signal d'entrée.
xcf -- fréquence de coupure du filtre (taux-i-, k ou a).
xk -- valeur de rétroaction du filtre (taux-i-, k ou a) qui contrôle la résonance. Dans l'intervalle 0.0-17.0. L'auto-oscillation survient à 17.0.
knlp (facultatif, 0 par défaut) -- méthode de traitement non linéaire. 0 = pas de traitement, 1 = TNL de grande qualité, 2 = TNL de faible qualité (plus rapide). La méthode 1 utilise (1.0 / tanh(ksaturation)) * tanh(ksaturation * input). La méthode 2 utilise tanh(ksaturation * input). L'activation du TNL peut pousser la sortie globale du filtre au-delà de l'unité et doit être compensée pour l'environnement externe du filtre.
ksaturation (facultatif, 1 par défaut) -- quantité de saturation à utiliser pour le traitement non linéaire. Les valeurs > 1 augmentent la pente de la courbe de TNL.
Voici un exemple de l'opcode diode_ladder. Il utilise le fichier diode_ladder.csd.
Exemple 234. Exemple de l'opcode diode_ladder.
<CsoundSynthesizer> <CsOptions> -o dac </CsOptions> <CsInstruments> sr=44100 ksmps=16 nchnls=2 0dbfs=1 gi_sine ftgen 0, 0, 65537, 10, 1 gkcut init 6000 instr modulation gkcut = lfo(4000, 0.1) + 6000 endin instr bass iamp = ampdbfs(-12) ipch = cps2pch(p4, 12) asig = vco2(0.5, ipch, 0) acut = expon:a(i(gkcut), p3, 200) aout = diode_ladder(asig, acut, 8, 1, 4) aout *= expseg:a(1.0, p3 - 0.05, 1.0, 0.05, 0.001) aout = limit(aout, -1.0, 1.0) outc(aout, aout) endin gipat[] init 8 gipat[0] = 6.00 gipat[1] = 7.00 gipat[2] = 6.00 gipat[3] = 7.00 gipat[4] = 5.07 gipat[5] = 6.07 gipat[6] = 5.08 gipat[7] = 6.08 instr player indx = p4 ;; play instrument if(gipat[indx] > 0) then schedule("bass", 0, 0.2, gipat[indx]) endif ;; temporal recursion schedule("player", 0.2, 0.1, (indx + 1) % lenarray(gipat)) endin schedule("modulation", 0, -1) schedule("player", 0, 0.1, 0) event_i("e", 0, 0.1 * 128) </CsInstruments> <CsScore> </CsScore> </CsoundSynthesizer>
Ce filtre est basé sur les travaux de Will Pirkle qui emploie le travail de Vadim Zavalishin pour créer des implémentation de filtres analogiques à transformation préservant la topologie (TPT), avec des transformées bilinéaires.
Pirkle, Will. Designing Software Synthesizer Plug-ins in C++: For RackAFX, VST3, and Audio Units. CRC Press, 2014.
Pirkle, Will. AN-6: Virtual Analog (VA) DiodeLadder Filter. 2013.
Zavalishin, Vadim. "The Art of VA filter design." Native Instruments, 2012.