K35_lpf

K35_lpf — Implémentation du filtre passe-bas résonant du Korg35 avec rétroaction sans retard.

Description

Implémentation du filtre passe-bas résonant du Korg35 avec rétroaction sans retard. On trouve ce type de filtre sur les Korg MS10, les premiers MS20 et les séries Monotron.

Syntaxe

asig K35_lpf ain, xcf, xQ [, inlp, isaturation, istor]

Initialisation

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.

Exécution

asig -- signal de sortie.

ain -- signal d'entrée.

xcf -- fréquence de coupure du filtre (taux-i-, k ou a).

xQ -- Q du filtre (taux-i-, k ou a). Dans l'intervalle 1.0-10.0 (lié à l'opcode). L'auto-oscillation survient à 10.0.

knlp (facultatif, 0 par défaut) -- méthode de traitement non linéaire. 0 = pas de traitement, 1 = traitement non linéaire. La méthode 1 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.

Exemples

Voici un exemple de l'opcode K35_lpf. Il utilise le fichier k35.csd.

Exemple 492. Exemple de l'opcode K35_lpf.

<CsoundSynthesizer>
<CsOptions>
</CsOptions>
; ==============================================
<CsInstruments>

sr	=	48000
ksmps	=	1
nchnls	=	2
0dbfs	=	1

;; test instruments to demo filter cutoff sweep with high resonance

instr 1	

asig = vco2(0.5, cps2pch(6.00, 12))
asig = K35_lpf(asig, expseg:a(10000, p3, 30), 9.9, 0, 1)
asig *= 0.25
asig  = limit(asig, -1.0, 1.0)

outc(asig, asig)

endin


instr 2	

asig = vco2(0.5, cps2pch(6.00, 12))
asig = K35_lpf(asig, expseg:k(10000, p3, 30), 9.9, 0, 1)
asig *= 0.25
asig  = limit(asig, -1.0, 1.0)

outc(asig, asig)

endin

instr 3	

asig = vco2(0.5, cps2pch(6.00, 12))
asig = K35_hpf(asig, expseg:a(10000, p3, 30), 9.9, 0, 1)
asig *= 0.25
asig  = limit(asig, -1.0, 1.0)

outc(asig, asig)

endin


instr 4	

asig = vco2(0.5, cps2pch(6.00, 12))
asig = K35_hpf(asig, expseg:k(10000, p3, 30), 9.9, 0, 1)
asig *= 0.25
asig  = limit(asig, -1.0, 1.0)

outc(asig, asig)

endin

;; beat instruments

instr ms20_drum

  ipch = cps2pch(p4, 12)
  iamp = ampdbfs(p5)
  aenv = expseg:a(10000, 0.05, ipch, p3 - .05, ipch)

  asig = rand:a(-1.0, 1.0)
  asig = K35_hpf(asig, 60, 7, 1, 1)
  asig = K35_lpf(asig, aenv, 9.8, 1, 1)

  asig = tanh(asig * 16)

  asig *= expon(iamp, p3, 0.0001)

  outc(asig, asig)

endin

instr ms20_bass 
  ipch = cps2pch(p4, 12)
  iamp = ampdbfs(p5)
  aenv = expseg(1000, 0.1, ipch * 2, p3 - .05, ipch * 2)

  asig = vco2(1.0, ipch)
  asig = K35_hpf(asig, ipch, 5, 0, 1)
  asig = K35_lpf(asig, aenv, 8, 0, 1)

  asig *= expon:a(iamp, p3, 0.0001) * 0.8

  outc(asig, asig)
endin

;; perf code

gktempo init 122

opcode beat_dur,i,0
  xout 60 / i(gktempo) 
endop

instr bass_player
  idur = beat_dur() / int(random(1,3)) 
  ipch = 6.00 + int(random(1,3)) + int(random(1,3)) / 100

  schedule("ms20_bass", 0, idur, ipch, -11) 

  if(p2 < 37.5) then
    schedule("bass_player", idur, 0.1)
  endif
  turnoff
endin

instr beat_player 
  istep_total = p4 
  istep = istep_total % 16

  if(istep % 4 == 0) then
    ipch = ((istep_total % 128) < 112) ? 4.00 : 8.00
    iamp = (istep == 0)  ? -9 : -12
    schedule("ms20_drum", 0, 0.5, ipch, iamp)
  endif

  schedule("ms20_drum", 0, 0.125, 14.00, 
           (istep % 4 == 0) ? -12 : -18)

  if(p2 < 37.5) then
    schedule("beat_player", beat_dur() / 4, 0.1, istep_total + 1)
  endif
  turnoff
endin

;; start play of beats

instr start_beats
  schedule("beat_player", 0, 0.1, 0)
  schedule("bass_player", 0, 0.1)
endin


</CsInstruments>
; ==============================================
<CsScore>
i1 0 5.0
i2 5 5.0
i3 10 5.0
i4 15 5.0

i "start_beats" 22 0.5 0

</CsScore>
</CsoundSynthesizer>


Références

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.

  1. Pirkle, Will. Designing Software Synthesizer Plug-ins in C++: For RackAFX, VST3, and Audio Units. CRC Press, 2014.

  2. Pirkle, Will. AN-5: Virtual Analog (VA) Korg35 Lowpass Filter v3.5. 2013.

  3. Zavalishin, Vadim. "The Art of VA filter design." Native Instruments, 2012.

Crédits

Auteur : Steven Yi
Avril 2017

Nouveau dans Csound 6.09.0