K35_hpf
Précédent | Opcodes et opérateurs de l'orchestre | Suivant

## K35_hpf

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

## Description

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

## Syntaxe

    asig K35_hpf 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_hpf. Il utilise le fichier k35.csd.

Exemple 484. Exemple de l'opcode K35_hpf.

    <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-7A: Virtual Analog (VA) Korg35 Highpass Filter v2.0 Simplified. 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

Précédent | Niveau supérieur | Suivant
k | Sommaire | K35_lpf