-- | Filters
module Csound.Air.Filter(
    -- | Arguemnts are inversed to get most out of curruing. First come parameters and the last one is the signal.

    -- * First order filters
    lp1, hp1,

    -- * Simple filters
    lp, hp, bp, br, alp,
    bp2, br2,

    -- * Butterworth filters
    blp, bhp, bbp, bbr,

    -- * Filter order
    ResonFilter, FlatFilter,
    filt, flatFilt, toReson,

    -- * Specific filters

    -- ** Moog filters
    mlp, mlp2, mlp3, lp18, ladder,

    -- ** Formant filters
    formant, singA, singO, singE, singU, singO2,

    -- * Making the smooth lines
    smooth, slide,

    -- * Analog filters
    -- | Requires Csound 6.07 or higher

    alp1, alp2, alp3, alp4, ahp,

    -- * Zero delay filters

    -- ** One pole filters
    zdf1, zlp1, zhp1, zap1,

    -- ** Two pole filters
    zdf2, zlp, zhp, zbp, zubp, zbr, zap, zpeak,

    -- ** Ladder filter
    zladder,

    -- ** Four poles filters
    -- zdf4, zlp4, zbp4, zhp4,

    -- ** Eq-filters
    -- peakEq, highShelf, lowShelf,

    -- * Classic analog-like filters

    -- ** low pass
    lpCheb1, lpCheb1', lpCheb2, lpCheb2', clp, clp',

    -- ** band pass
    bpCheb1, bpCheb1', bpCheb2, bpCheb2', cbp, cbp',

    -- ** high pass
    hpCheb1, hpCheb1', hpCheb2, hpCheb2', chp, chp',

    -- resonant filters
    cheb1, cheb2, vcf,
    cheb1', cheb2', vcf',

    -- * Named resonant low pass filters
    plastic, wobble, trumpy, harsh,

    -- * TB303 filter
    tbf, diode, fdiode, linDiode,

    -- Korg 35 filters
    linKorg_lp, linKorg_hp, linKorg_bp, korg_lp, korg_hp, korg_bp,
    klp, khp, kbp,

    -- * Statevariable filters
    slp, shp, sbp, sbr,

    -- * Multimode filters
    multiStatevar, multiSvfilter
) where

import Csound.Typed

import Csound.SigSpace(bat)
import Csound.Typed.Opcode

-- | Low-pass filter.
--
-- > lp cutoff resonance sig
lp :: Sig -> Sig -> Sig -> Sig
lp :: Sig -> Sig -> Sig -> Sig
lp Sig
cf Sig
q Sig
a = Sig -> Sig -> Sig -> Sig
bqrez Sig
a Sig
cf Sig
q

-- | High-pass filter.
--
-- > hp cutoff resonance sig
hp :: Sig -> Sig -> Sig -> Sig
hp :: Sig -> Sig -> Sig -> Sig
hp Sig
cf Sig
q Sig
a = Sig -> Sig -> Sig -> Sig
bqrez Sig
a Sig
cf Sig
q Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
1

-- | Band-pass filter.
--
-- > bp cutoff resonance sig
bp :: Sig -> Sig -> Sig -> Sig
bp :: Sig -> Sig -> Sig -> Sig
bp Sig
cf Sig
q Sig
a = Sig -> Sig -> Sig -> Sig
bqrez Sig
a Sig
cf Sig
q Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
2

-- | Band-reject filter.
--
-- > br cutoff resonance sig
br :: Sig -> Sig -> Sig -> Sig
br :: Sig -> Sig -> Sig -> Sig
br Sig
cf Sig
q Sig
a = Sig -> Sig -> Sig -> Sig
bqrez Sig
a Sig
cf Sig
q Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
3

-- | All-pass filter.
--
-- > alp cutoff resonance sig
alp :: Sig -> Sig -> Sig -> Sig
alp :: Sig -> Sig -> Sig -> Sig
alp Sig
cf Sig
q Sig
a = Sig -> Sig -> Sig -> Sig
bqrez Sig
a Sig
cf Sig
q Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
4

-- Butterworth filters

-- | High-pass filter.
--
-- > bhp cutoff sig
bhp :: Sig -> Sig -> Sig
bhp :: Sig -> Sig -> Sig
bhp = (Sig -> Sig -> Sig) -> Sig -> Sig -> Sig
forall a b c. (a -> b -> c) -> b -> a -> c
flip Sig -> Sig -> Sig
buthp

-- | Low-pass filter.
--
-- > blp cutoff sig
blp :: Sig -> Sig -> Sig
blp :: Sig -> Sig -> Sig
blp = (Sig -> Sig -> Sig) -> Sig -> Sig -> Sig
forall a b c. (a -> b -> c) -> b -> a -> c
flip Sig -> Sig -> Sig
butlp

-- | Band-pass filter.
--
-- > bbp cutoff bandwidth sig
bbp :: Sig -> Sig -> Sig -> Sig
bbp :: Sig -> Sig -> Sig -> Sig
bbp Sig
freq Sig
band Sig
a = Sig -> Sig -> Sig -> Sig
butbp Sig
a Sig
freq Sig
band

-- | Band-regect filter.
--
-- > bbr cutoff bandwidth sig
bbr :: Sig -> Sig -> Sig -> Sig
bbr :: Sig -> Sig -> Sig -> Sig
bbr Sig
freq Sig
band Sig
a = Sig -> Sig -> Sig -> Sig
butbr Sig
a Sig
freq Sig
band


-- | Moog's low-pass filter.
--
-- > mlp centerFrequency qResonance signal
mlp :: Sig -> Sig -> Sig -> Sig
mlp :: Sig -> Sig -> Sig -> Sig
mlp Sig
cf Sig
q Sig
asig = Sig -> Sig -> Sig -> Sig
moogvcf Sig
asig Sig
cf Sig
q

-- | Makes slides between values in the signals.
-- The first value defines a duration in seconds for a transition from one
-- value to another in piecewise constant signals.
slide :: Sig -> Sig -> Sig
slide :: Sig -> Sig -> Sig
slide = (Sig -> Sig -> Sig) -> Sig -> Sig -> Sig
forall a b c. (a -> b -> c) -> b -> a -> c
flip Sig -> Sig -> Sig
lineto

-- | Produces smooth transitions between values in the signals.
-- The first value defines a duration in seconds for a transition from one
-- value to another in piecewise constant signals.
--
-- > smooth transTime asig
smooth :: Sig -> Sig -> Sig
smooth :: Sig -> Sig -> Sig
smooth = (Sig -> Sig -> Sig) -> Sig -> Sig -> Sig
forall a b c. (a -> b -> c) -> b -> a -> c
flip Sig -> Sig -> Sig
portk

-- | Resonant filter.
--
-- > f centerFreq q asig
type ResonFilter = Sig -> Sig -> Sig -> Sig

-- | Filter without a resonance.
--
-- > f centerFreq q asig
type FlatFilter  = Sig -> Sig -> Sig

-- | Makes fake resonant filter from flat filter. The resulting filter just ignores the resonance.
toReson :: FlatFilter -> ResonFilter
toReson :: (Sig -> Sig -> Sig) -> Sig -> Sig -> Sig -> Sig
toReson Sig -> Sig -> Sig
f = \Sig
cfq Sig
_res -> Sig -> Sig -> Sig
f Sig
cfq

-- | Applies a filter n-times. The n is given in the first rgument.
filt :: Int -> ResonFilter -> ResonFilter
filt :: Int -> (Sig -> Sig -> Sig -> Sig) -> Sig -> Sig -> Sig -> Sig
filt Int
n Sig -> Sig -> Sig -> Sig
f Sig
cfq Sig
q Sig
asig = (((Sig -> Sig) -> (Sig -> Sig) -> Sig -> Sig)
-> (Sig -> Sig) -> [Sig -> Sig] -> Sig -> Sig
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (Sig -> Sig) -> (Sig -> Sig) -> Sig -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) Sig -> Sig
forall a. a -> a
id ([Sig -> Sig] -> Sig -> Sig) -> [Sig -> Sig] -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Int -> (Sig -> Sig) -> [Sig -> Sig]
forall a. Int -> a -> [a]
replicate Int
n (Sig -> Sig -> Sig -> Sig
f Sig
cfq Sig
q)) Sig
asig

-- | Applies a flat filter (without resonance) n-times. The n is given in the first rgument.
flatFilt :: Int -> FlatFilter -> FlatFilter
flatFilt :: Int -> (Sig -> Sig -> Sig) -> Sig -> Sig -> Sig
flatFilt Int
n Sig -> Sig -> Sig
f Sig
cfq Sig
asig = (((Sig -> Sig) -> (Sig -> Sig) -> Sig -> Sig)
-> (Sig -> Sig) -> [Sig -> Sig] -> Sig -> Sig
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (Sig -> Sig) -> (Sig -> Sig) -> Sig -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) Sig -> Sig
forall a. a -> a
id ([Sig -> Sig] -> Sig -> Sig) -> [Sig -> Sig] -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Int -> (Sig -> Sig) -> [Sig -> Sig]
forall a. Int -> a -> [a]
replicate Int
n (Sig -> Sig -> Sig
f Sig
cfq)) Sig
asig

-- spec filt

-- | Low pass filter 18 dB  with built in distortion module.
--
-- > lp18 distortion centerFreq resonance asig
--
-- * distortion's range is 0 to 1
--
-- * resonance's range is 0 to 1
lp18 :: Sig -> Sig -> Sig -> Sig -> Sig
lp18 :: Sig -> Sig -> Sig -> Sig -> Sig
lp18 Sig
dist Sig
cfq Sig
q Sig
asig = Sig -> Sig -> Sig -> Sig -> Sig
lpf18 Sig
asig Sig
cfq Sig
q Sig
dist

-- | Another implementation of moog low pass filter (it's moogladder in Csound).
-- The arguments have are just like in the @mlp@ filter.
--
-- > mlp2 centerFreq q asig
mlp2 :: Sig -> Sig -> Sig -> Sig
mlp2 :: Sig -> Sig -> Sig -> Sig
mlp2 Sig
cfq Sig
q Sig
asig = Sig -> Sig -> Sig -> Sig
moogladder Sig
asig Sig
cfq Sig
q

-- | Mooglowpass filter with 18 dB.
--
-- > mlp3 centerFreq q asig
mlp3 :: Sig -> Sig -> Sig -> Sig
mlp3 :: Sig -> Sig -> Sig -> Sig
mlp3 = Sig -> Sig -> Sig -> Sig -> Sig
lp18 Sig
0

-- | First order low pass filter (tone in Csound, 6 dB)
--
-- > lp1 centerFreq asig
lp1 :: Sig -> Sig -> Sig
lp1 :: Sig -> Sig -> Sig
lp1 Sig
cfq Sig
asig = Sig -> Sig -> Sig
tone Sig
asig Sig
cfq

-- | First order high pass filter (atone in Csound, 6 dB)
--
-- > hp1 centerFreq asig
hp1 :: Sig -> Sig -> Sig
hp1 :: Sig -> Sig -> Sig
hp1 Sig
cfq Sig
asig = Sig -> Sig -> Sig
atone Sig
asig Sig
cfq

-- | Resonance band pass filter (yet another implementation, it's reson in Csound)
--
-- > bp2 centerFreq q asig
bp2 :: Sig -> Sig -> Sig -> Sig
bp2 :: Sig -> Sig -> Sig -> Sig
bp2 Sig
cfq Sig
q Sig
asig = Sig -> Sig -> Sig -> Sig
reson Sig
asig Sig
cfq Sig
q

-- | Resonance band reject filter (yet another implementation, it's areson in Csound)
--
-- > br2 centerFreq q asig
br2 :: Sig -> Sig -> Sig -> Sig
br2 :: Sig -> Sig -> Sig -> Sig
br2 Sig
cfq Sig
q Sig
asig = Sig -> Sig -> Sig -> Sig
areson Sig
asig Sig
cfq Sig
q

-- | Formant filter.
--
-- > formant bandPassFilter formants asig
--
-- It expects a band pass filter, a list of formants and processed signal.
-- The signal is processed with each filter the result is a sum of all proceessed signals.
-- Formant filters are used to mimic the vocalization of the sound.
formant :: ResonFilter -> [(Sig, Sig)] -> Sig -> Sig
formant :: (Sig -> Sig -> Sig -> Sig) -> [(Sig, Sig)] -> Sig -> Sig
formant Sig -> Sig -> Sig -> Sig
f [(Sig, Sig)]
qs Sig
asig = [Sig] -> Sig
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum (((Sig, Sig) -> Sig) -> [(Sig, Sig)] -> [Sig]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (( (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig
asig) ((Sig -> Sig) -> Sig)
-> ((Sig, Sig) -> Sig -> Sig) -> (Sig, Sig) -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sig -> Sig -> Sig -> Sig) -> (Sig, Sig) -> Sig -> Sig
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Sig -> Sig -> Sig -> Sig
f) [(Sig, Sig)]
qs)

-- | Formant filter that sings an A.
singA :: Sig -> Sig
singA :: Sig -> Sig
singA = (Sig -> Sig) -> Sig -> AtOut Sig Sig Sig
forall a b. At Sig a b => (Sig -> a) -> b -> AtOut Sig a b
bat ((Sig -> Sig -> Sig -> Sig) -> [(Sig, Sig)] -> Sig -> Sig
formant Sig -> Sig -> Sig -> Sig
bp2 [(Sig, Sig)]
anA)

-- | Formant filter that sings an O.
singO :: Sig -> Sig
singO :: Sig -> Sig
singO = (Sig -> Sig) -> Sig -> AtOut Sig Sig Sig
forall a b. At Sig a b => (Sig -> a) -> b -> AtOut Sig a b
bat ((Sig -> Sig -> Sig -> Sig) -> [(Sig, Sig)] -> Sig -> Sig
formant Sig -> Sig -> Sig -> Sig
bp2 [(Sig, Sig)]
anO)

-- | Formant filter that sings an E.
singE :: Sig -> Sig
singE :: Sig -> Sig
singE = (Sig -> Sig) -> Sig -> AtOut Sig Sig Sig
forall a b. At Sig a b => (Sig -> a) -> b -> AtOut Sig a b
bat ((Sig -> Sig -> Sig -> Sig) -> [(Sig, Sig)] -> Sig -> Sig
formant Sig -> Sig -> Sig -> Sig
bp2 [(Sig, Sig)]
anE)

-- | Formant filter that sings an U.
singU :: Sig -> Sig
singU :: Sig -> Sig
singU = (Sig -> Sig) -> Sig -> AtOut Sig Sig Sig
forall a b. At Sig a b => (Sig -> a) -> b -> AtOut Sig a b
bat ((Sig -> Sig -> Sig -> Sig) -> [(Sig, Sig)] -> Sig -> Sig
formant Sig -> Sig -> Sig -> Sig
bp2 [(Sig, Sig)]
anIY)

-- | Formant filter that sings an O.
singO2 :: Sig -> Sig
singO2 :: Sig -> Sig
singO2 = (Sig -> Sig) -> Sig -> AtOut Sig Sig Sig
forall a b. At Sig a b => (Sig -> a) -> b -> AtOut Sig a b
bat ((Sig -> Sig -> Sig -> Sig) -> [(Sig, Sig)] -> Sig -> Sig
formant Sig -> Sig -> Sig -> Sig
bp2 [(Sig, Sig)]
anO2)

anO, anA, anE, anIY, anO2 :: [(Sig, Sig)]

anO :: [(Sig, Sig)]
anO  = [(Sig
280, Sig
20), (Sig
650, Sig
25), (Sig
2200, Sig
30), (Sig
3450, Sig
40), (Sig
4500, Sig
50)]
anA :: [(Sig, Sig)]
anA  = [(Sig
650, Sig
50), (Sig
1100, Sig
50), (Sig
2860, Sig
50), (Sig
3300, Sig
50), (Sig
4500, Sig
50)]
anE :: [(Sig, Sig)]
anE  = [(Sig
500, Sig
50), (Sig
1750, Sig
50), (Sig
2450, Sig
50), (Sig
3350, Sig
50), (Sig
5000, Sig
50)]
anIY :: [(Sig, Sig)]
anIY = [(Sig
330, Sig
50), (Sig
2000, Sig
50), (Sig
2800, Sig
50), (Sig
3650, Sig
50), (Sig
5000, Sig
50)]
anO2 :: [(Sig, Sig)]
anO2 = [(Sig
400, Sig
50), (Sig
840, Sig
50), (Sig
2800, Sig
50), (Sig
3250, Sig
50), (Sig
4500, Sig
50)]

-------------------------------------------------------
-- new filters

-- | Analog-like low-pass filter
--
-- > alpf1 centerFrequency resonance asig
alp1 :: Sig -> Sig -> Sig -> Sig
alp1 :: Sig -> Sig -> Sig -> Sig
alp1 Sig
freq Sig
resonance Sig
asig = Sig -> Sig -> Sig -> Sig
mvclpf1 Sig
asig Sig
freq Sig
resonance

-- | Analog-like low-pass filter
--
-- > alpf2 centerFrequency resonance asig
alp2 :: Sig -> Sig -> Sig -> Sig
alp2 :: Sig -> Sig -> Sig -> Sig
alp2 Sig
freq Sig
resonance Sig
asig = Sig -> Sig -> Sig -> Sig
mvclpf2 Sig
asig Sig
freq Sig
resonance

-- | Analog-like low-pass filter
--
-- > alpf3 centerFrequency resonanceance asig
alp3 :: Sig -> Sig -> Sig -> Sig
alp3 :: Sig -> Sig -> Sig -> Sig
alp3 Sig
freq Sig
resonance Sig
asig = Sig -> Sig -> Sig -> Sig
mvclpf3 Sig
asig Sig
freq Sig
resonance

-- | Analog-like low-pass filter
--
-- > alpf4 centerFrequency resonance asig
--
-- Analog outputs
--
-- * asig1 -- 6dB/oct low-pass response output.
--
-- * asig2 -- 12dB/oct low-pass response output.
--
-- * asig3 -- 18dB/oct low-pass response output..
--
-- * asig4 -- 24dB/oct low-pass response output.
alp4 :: Sig -> Sig -> Sig -> (Sig, Sig, Sig, Sig)
alp4 :: Sig -> Sig -> Sig -> (Sig, Sig, Sig, Sig)
alp4 Sig
freq Sig
resonance Sig
asig = Sig -> Sig -> Sig -> (Sig, Sig, Sig, Sig)
mvclpf4 Sig
asig Sig
freq Sig
resonance

-- | Analog-like high-pass filter
--
-- > ahp centerFrequency asig
ahp :: Sig -> Sig -> Sig
ahp :: Sig -> Sig -> Sig
ahp Sig
freq Sig
asig = Sig -> Sig -> Sig
mvchpf Sig
asig Sig
freq


-----------------------------------------------
-- named filters

-- classic filters

-- low pass

-- | Chebyshev  type I low pass filter (with 2 poles).
--
-- lpCheb1 centerFreq asig
lpCheb1 :: Sig -> Sig -> Sig
lpCheb1 :: Sig -> Sig -> Sig
lpCheb1 = D -> Sig -> Sig -> Sig
lpCheb1' D
2

-- | Chebyshev  type I low pass filter (with given number of poles, first argument).
--
-- lpCheb1' npols centerFreq asig
lpCheb1' :: D -> Sig -> Sig -> Sig
lpCheb1' :: D -> Sig -> Sig -> Sig
lpCheb1' D
npoles Sig
kcf Sig
asig = Sig -> Sig -> D -> D -> Sig
clfilt Sig
asig Sig
kcf D
0 D
npoles Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
1

-- | Chebyshev  type II low pass filter (with 2 poles).
--
-- lpCheb2 centerFreq asig
lpCheb2 :: Sig -> Sig -> Sig
lpCheb2 :: Sig -> Sig -> Sig
lpCheb2 = D -> Sig -> Sig -> Sig
lpCheb2' D
2

-- | Chebyshev  type II low pass filter (with given number of poles, first argument).
--
-- lpCheb2' npols centerFreq asig
lpCheb2' :: D -> Sig -> Sig -> Sig
lpCheb2' :: D -> Sig -> Sig -> Sig
lpCheb2' D
npoles Sig
kcf Sig
asig = Sig -> Sig -> D -> D -> Sig
clfilt Sig
asig Sig
kcf D
0 D
npoles Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
2

-- | Butterworth lowpass filter based on clfilt opcode (with 2 poles).
--
-- clp centerFreq asig
clp :: Sig -> Sig -> Sig
clp :: Sig -> Sig -> Sig
clp = D -> Sig -> Sig -> Sig
clp' D
2

-- | Butterworth lowpass filter based on clfilt opcode (with given number of poles, first argument).
--
-- clp' npols centerFreq asig
clp' :: D -> Sig -> Sig -> Sig
clp' :: D -> Sig -> Sig -> Sig
clp' D
npoles Sig
kcf Sig
asig = Sig -> Sig -> D -> D -> Sig
clfilt Sig
asig Sig
kcf D
0 D
npoles Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
0

-- high pass

-- | Chebyshev  type I high pass filter (with 2 poles).
--
-- hpCheb1 centerFreq asig
hpCheb1 :: Sig -> Sig -> Sig
hpCheb1 :: Sig -> Sig -> Sig
hpCheb1 = D -> Sig -> Sig -> Sig
hpCheb1' D
2

-- | Chebyshev  type I high pass filter (with given number of poles, first argument).
--
-- hpCheb1' npols centerFreq asig
hpCheb1' :: D -> Sig -> Sig -> Sig
hpCheb1' :: D -> Sig -> Sig -> Sig
hpCheb1' D
npoles Sig
kcf Sig
asig = Sig -> Sig -> D -> D -> Sig
clfilt Sig
asig Sig
kcf D
1 D
npoles Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
1

-- | Chebyshev  type II high pass filter (with 2 poles).
--
-- hpCheb2 centerFreq asig
hpCheb2 :: Sig -> Sig -> Sig
hpCheb2 :: Sig -> Sig -> Sig
hpCheb2 = D -> Sig -> Sig -> Sig
hpCheb2' D
2

-- | Chebyshev  type II high pass filter (with given number of poles, first argument).
--
-- hpCheb2' npols centerFreq asig
hpCheb2' :: D -> Sig -> Sig -> Sig
hpCheb2' :: D -> Sig -> Sig -> Sig
hpCheb2' D
npoles Sig
kcf Sig
asig = Sig -> Sig -> D -> D -> Sig
clfilt Sig
asig Sig
kcf D
1 D
npoles Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
2

-- | Butterworth high pass filter based on clfilt opcode (with 2 poles).
--
-- chp centerFreq asig
chp :: Sig -> Sig -> Sig
chp :: Sig -> Sig -> Sig
chp = D -> Sig -> Sig -> Sig
clp' D
2

-- | Butterworth high pass filter based on clfilt opcode (with given number of poles, first argument).
--
-- chp' npols centerFreq asig
chp' :: D -> Sig -> Sig -> Sig
chp' :: D -> Sig -> Sig -> Sig
chp' D
npoles Sig
kcf Sig
asig = Sig -> Sig -> D -> D -> Sig
clfilt Sig
asig Sig
kcf D
1 D
npoles Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
0

------------------------------------------
-- band-pass

mkBp :: FlatFilter -> FlatFilter -> Sig -> Sig -> Sig -> Sig
mkBp :: (Sig -> Sig -> Sig)
-> (Sig -> Sig -> Sig) -> Sig -> Sig -> Sig -> Sig
mkBp Sig -> Sig -> Sig
lowPass Sig -> Sig -> Sig
highPass Sig
cfq Sig
bw Sig
asig = Sig -> Sig -> Sig
highPass (Sig
cfq Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
- Sig
rad) (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig
lowPass (Sig
cfq Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
rad) Sig
asig
    where rad :: Sig
rad = Sig
bw Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ Sig
2

bpCheb1 :: Sig -> Sig -> Sig -> Sig
bpCheb1 :: Sig -> Sig -> Sig -> Sig
bpCheb1 = D -> Sig -> Sig -> Sig -> Sig
bpCheb1' D
2

bpCheb1' :: D -> Sig -> Sig -> Sig -> Sig
bpCheb1' :: D -> Sig -> Sig -> Sig -> Sig
bpCheb1' D
npoles = (Sig -> Sig -> Sig)
-> (Sig -> Sig -> Sig) -> Sig -> Sig -> Sig -> Sig
mkBp (D -> Sig -> Sig -> Sig
lpCheb1' D
npoles) (D -> Sig -> Sig -> Sig
hpCheb1' D
npoles)

bpCheb2 :: Sig -> Sig -> Sig -> Sig
bpCheb2 :: Sig -> Sig -> Sig -> Sig
bpCheb2 = D -> Sig -> Sig -> Sig -> Sig
bpCheb2' D
2

bpCheb2' :: D -> Sig -> Sig -> Sig -> Sig
bpCheb2' :: D -> Sig -> Sig -> Sig -> Sig
bpCheb2' D
npoles = (Sig -> Sig -> Sig)
-> (Sig -> Sig -> Sig) -> Sig -> Sig -> Sig -> Sig
mkBp (D -> Sig -> Sig -> Sig
lpCheb2' D
npoles) (D -> Sig -> Sig -> Sig
hpCheb2' D
npoles)

cbp :: Sig -> Sig -> Sig -> Sig
cbp :: Sig -> Sig -> Sig -> Sig
cbp = D -> Sig -> Sig -> Sig -> Sig
cbp' D
2

cbp' :: D -> Sig -> Sig -> Sig -> Sig
cbp' :: D -> Sig -> Sig -> Sig -> Sig
cbp' D
npoles = (Sig -> Sig -> Sig)
-> (Sig -> Sig -> Sig) -> Sig -> Sig -> Sig -> Sig
mkBp (D -> Sig -> Sig -> Sig
clp' D
npoles) (D -> Sig -> Sig -> Sig
chp' D
npoles)


---------------------------------------------
-- resonant filters

mkReson :: FlatFilter -> FlatFilter -> ResonFilter
mkReson :: (Sig -> Sig -> Sig)
-> (Sig -> Sig -> Sig) -> Sig -> Sig -> Sig -> Sig
mkReson Sig -> Sig -> Sig
lowPass Sig -> Sig -> Sig
highPass Sig
kcf Sig
res Sig
asig = Sig
0.5 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* (Sig -> Sig -> Sig
lowPass (Sig
kcf Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
2) Sig
asig Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig -> Sig -> Sig -> Sig
bandPass Sig
bw Sig
kcf Sig
asig)
    where
        bw :: Sig
bw = Sig
kcf Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ (Sig
0.001 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig -> Sig
forall a. Num a => a -> a
abs Sig
res)
        bandPass :: Sig -> Sig -> Sig -> Sig
bandPass = (Sig -> Sig -> Sig)
-> (Sig -> Sig -> Sig) -> Sig -> Sig -> Sig -> Sig
mkBp Sig -> Sig -> Sig
lowPass Sig -> Sig -> Sig
highPass

cheb1 :: Sig -> Sig -> Sig -> Sig
cheb1 :: Sig -> Sig -> Sig -> Sig
cheb1 = D -> Sig -> Sig -> Sig -> Sig
cheb1' D
2

cheb1' :: D -> Sig -> Sig -> Sig -> Sig
cheb1' :: D -> Sig -> Sig -> Sig -> Sig
cheb1' D
npoles = (Sig -> Sig -> Sig)
-> (Sig -> Sig -> Sig) -> Sig -> Sig -> Sig -> Sig
mkReson (D -> Sig -> Sig -> Sig
lpCheb1' D
npoles) (D -> Sig -> Sig -> Sig
hpCheb1' D
npoles)

cheb2 :: Sig -> Sig -> Sig -> Sig
cheb2 :: Sig -> Sig -> Sig -> Sig
cheb2 = D -> Sig -> Sig -> Sig -> Sig
cheb2' D
2

cheb2' :: D -> Sig -> Sig -> Sig -> Sig
cheb2' :: D -> Sig -> Sig -> Sig -> Sig
cheb2' D
npoles = (Sig -> Sig -> Sig)
-> (Sig -> Sig -> Sig) -> Sig -> Sig -> Sig -> Sig
mkReson (D -> Sig -> Sig -> Sig
lpCheb2' D
npoles) (D -> Sig -> Sig -> Sig
hpCheb2' D
npoles)

vcf :: Sig -> Sig -> Sig -> Sig
vcf :: Sig -> Sig -> Sig -> Sig
vcf = D -> Sig -> Sig -> Sig -> Sig
cbp' D
2

vcf' :: D -> Sig -> Sig -> Sig -> Sig
vcf' :: D -> Sig -> Sig -> Sig -> Sig
vcf' D
npoles = (Sig -> Sig -> Sig)
-> (Sig -> Sig -> Sig) -> Sig -> Sig -> Sig -> Sig
mkReson (D -> Sig -> Sig -> Sig
clp' D
npoles) (D -> Sig -> Sig -> Sig
chp' D
npoles)

-- moog ladder

-- | Moog ladder filter
--
-- > ladder centerFreq q asig
ladder :: Sig -> Sig -> Sig -> Sig
ladder :: Sig -> Sig -> Sig -> Sig
ladder Sig
kcf Sig
res Sig
asig = Sig -> Sig -> Sig -> Sig
moogladder Sig
asig Sig
kcf Sig
res

-----------------------------------------
-- named filters

-- | plastic sound
--
-- > plastic centerFreq q asig
plastic :: Sig -> Sig -> Sig -> Sig
plastic :: Sig -> Sig -> Sig -> Sig
plastic Sig
kcf Sig
res Sig
asig = Sig -> Sig -> Sig -> Sig
rezzy Sig
asig Sig
kcf (Sig
1 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
99 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
res)

-- | wobble sound
--
-- > wobble centerFreq q asig
wobble :: Sig -> Sig -> Sig -> Sig
wobble :: Sig -> Sig -> Sig -> Sig
wobble Sig
kcf Sig
res Sig
asig = Sig -> Sig -> Sig -> Sig
lowres Sig
asig Sig
kcf Sig
res

-- | trumpy sound
--
-- > trumpy centerFreq q asig
trumpy :: Sig -> Sig -> Sig -> Sig
trumpy :: Sig -> Sig -> Sig -> Sig
trumpy Sig
kcf Sig
res Sig
asig = Sig -> Sig -> Sig -> D -> Sig -> Sig
vlowres Sig
asig Sig
kcf (Sig
resSig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
0.15) D
6 (Sig
4 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
res Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
20)

-- | harsh sound
--
-- > harsh centerFreq q asig
harsh :: Sig -> Sig -> Sig -> Sig
harsh :: Sig -> Sig -> Sig -> Sig
harsh Sig
kcf Sig
res Sig
asig = (Sig -> Sig) -> Sig -> AtOut Sig Sig Sig
forall a b. At Sig a b => (Sig -> a) -> b -> AtOut Sig a b
bat (\Sig
x -> Sig -> Sig -> Sig -> Sig
bqrez Sig
x Sig
kcf (Sig
1 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
90 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
res)) Sig
asig

-----------------------------

-- | Fixed version of tbfcv filter
-- the first argument is distortion (range [0, 1])
tbf :: Sig -> Sig -> Sig -> Sig -> Sig
tbf :: Sig -> Sig -> Sig -> Sig -> Sig
tbf Sig
dist Sig
kcf Sig
res Sig
asig = Sig -> Sig -> Sig -> Sig -> Sig -> Sig
tbvcf Sig
asig (Sig
1010 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
kcf) Sig
res (Sig
0.5 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
3.5 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
dist) Sig
0.5

-----------------------------
-- state variable filter

-- | State variable low-pass filter
slp :: Sig -> Sig -> Sig -> Sig
slp :: Sig -> Sig -> Sig -> Sig
slp Sig
kcf Sig
res Sig
asig = Sig
lows
    where (Sig
_, Sig
lows, Sig
_, Sig
_) = Sig -> Sig -> Sig -> (Sig, Sig, Sig, Sig)
statevar Sig
asig Sig
kcf Sig
res

-- | State variable high-pass filter
shp :: Sig -> Sig -> Sig -> Sig
shp :: Sig -> Sig -> Sig -> Sig
shp Sig
kcf Sig
res Sig
asig = Sig
highs
    where (Sig
highs, Sig
_, Sig
_, Sig
_) = Sig -> Sig -> Sig -> (Sig, Sig, Sig, Sig)
statevar Sig
asig Sig
kcf Sig
res

-- | State variable band-pass filter
sbp :: Sig -> Sig -> Sig -> Sig
sbp :: Sig -> Sig -> Sig -> Sig
sbp Sig
kcf Sig
res Sig
asig = Sig
mids
    where (Sig
_, Sig
_, Sig
mids, Sig
_) = Sig -> Sig -> Sig -> (Sig, Sig, Sig, Sig)
statevar Sig
asig Sig
kcf Sig
res

-- | State variable band-reject filter
sbr :: Sig -> Sig -> Sig -> Sig
sbr :: Sig -> Sig -> Sig -> Sig
sbr Sig
kcf Sig
res Sig
asig = Sig
sides
    where (Sig
_, Sig
_, Sig
_, Sig
sides) = Sig -> Sig -> Sig -> (Sig, Sig, Sig, Sig)
statevar Sig
asig Sig
kcf Sig
res


multiStatevar :: (Sig, Sig, Sig) -> Sig -> Sig -> Sig -> Sig
multiStatevar :: (Sig, Sig, Sig) -> Sig -> Sig -> Sig -> Sig
multiStatevar (Sig
weightLows, Sig
wieghtHighs, Sig
weightMids) Sig
kcf Sig
res Sig
asig = Sig
weightLows Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
lows Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
wieghtHighs Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
highs Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
weightMids Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
mids
    where (Sig
highs, Sig
lows, Sig
mids, Sig
_) = Sig -> Sig -> Sig -> (Sig, Sig, Sig, Sig)
statevar Sig
asig Sig
kcf Sig
res

multiSvfilter :: (Sig, Sig, Sig) -> Sig -> Sig -> Sig -> Sig
multiSvfilter :: (Sig, Sig, Sig) -> Sig -> Sig -> Sig -> Sig
multiSvfilter (Sig
weightLows, Sig
wieghtHighs, Sig
weightMids) Sig
kcf Sig
res Sig
asig = Sig
weightLows Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
lows Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
wieghtHighs Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
highs Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
weightMids Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
mids
    where (Sig
highs, Sig
lows, Sig
mids) = Sig -> Sig -> Sig -> (Sig, Sig, Sig)
svfilter Sig
asig Sig
kcf Sig
res


--------------------------------

-- | Zero-delay feedback implementation of 1 pole filter.
--
-- ouputs low-pass and high-pass signals.
--
-- > zdf1 centerFreq asig = (alp, ahp)
zdf1 :: Sig -> Sig -> (Sig, Sig)
zdf1 :: Sig -> Sig -> (Sig, Sig)
zdf1 Sig
cfq Sig
asig = Sig -> Sig -> (Sig, Sig)
zdf_1pole_mode Sig
asig Sig
cfq

-- | Zero-delay feedback implementation of 1 pole low-pass filter.
--
-- > zlp1 centerFreq asig
zlp1 :: Sig -> Sig -> Sig
zlp1 :: Sig -> Sig -> Sig
zlp1 Sig
cfq Sig
asig = Sig -> Sig -> Sig
zdf_1pole Sig
asig Sig
cfq Sig -> Sig -> Sig
forall a. Tuple a => a -> Sig -> a
`withSig` Sig
0

-- | Zero-delay feedback implementation of 1 pole high-pass filter.
--
-- > zhp1 centerFreq asig
zhp1 :: Sig -> Sig -> Sig
zhp1 :: Sig -> Sig -> Sig
zhp1 Sig
cfq Sig
asig = Sig -> Sig -> Sig
zdf_1pole Sig
asig Sig
cfq Sig -> Sig -> Sig
forall a. Tuple a => a -> Sig -> a
`withSig` Sig
1

-- | Zero-delay feedback implementation of 1 pole allpass filter.
--
-- > zap1 centerFreq asig
zap1 :: Sig -> Sig -> Sig
zap1 :: Sig -> Sig -> Sig
zap1 Sig
cfq Sig
asig = Sig -> Sig -> Sig
zdf_1pole Sig
asig Sig
cfq Sig -> Sig -> Sig
forall a. Tuple a => a -> Sig -> a
`withSig` Sig
2

-- | zero delay feedback 2 pole filter
--
-- > zdf2 centerFreq q asig = (alp, abp, ahp)
zdf2 :: Sig -> Sig -> Sig -> (Sig, Sig, Sig)
zdf2 :: Sig -> Sig -> Sig -> (Sig, Sig, Sig)
zdf2 Sig
cfq Sig
q Sig
asig = Sig -> Sig -> Sig -> (Sig, Sig, Sig)
zdf_2pole_mode Sig
asig Sig
cfq (Sig -> Sig -> Sig -> Sig
forall a. SigSpace a => Sig -> Sig -> a -> a
uon Sig
0.5 Sig
25 Sig
q)

zpole2 :: Sig -> Sig -> Sig -> Sig -> Sig
zpole2 :: Sig -> Sig -> Sig -> Sig -> Sig
zpole2 Sig
n Sig
cfq Sig
q Sig
asig = Sig -> Sig -> Sig -> Sig
zdf_2pole Sig
asig Sig
cfq (Sig -> Sig -> Sig -> Sig
forall a. SigSpace a => Sig -> Sig -> a -> a
uon Sig
0.5 Sig
25 Sig
q) Sig -> Sig -> Sig
forall a. Tuple a => a -> Sig -> a
`withSig` Sig
n

-- | zero delay feedback 2 pole Low pass filter. Q is unipolar [0, 1]
--
-- > zlp centerFreq q asig
zlp :: Sig -> Sig -> Sig -> Sig
zlp :: Sig -> Sig -> Sig -> Sig
zlp = Sig -> Sig -> Sig -> Sig -> Sig
zpole2 Sig
0

-- | zero delay feedback 2 pole High pass filter. Q is unipolar [0, 1]
--
-- > zhp centerFreq q asig
zhp :: Sig -> Sig -> Sig -> Sig
zhp :: Sig -> Sig -> Sig -> Sig
zhp = Sig -> Sig -> Sig -> Sig -> Sig
zpole2 Sig
1

-- | zero delay feedback 2 pole Band pass. Q is unipolar [0, 1]
--
-- > zbp centerFreq q asig
zbp :: Sig -> Sig -> Sig -> Sig
zbp :: Sig -> Sig -> Sig -> Sig
zbp = Sig -> Sig -> Sig -> Sig -> Sig
zpole2 Sig
2

-- | Unity-gain bandpass (zero delay feedback 2 pole). Q is unipolar [0, 1]
--
-- > zubp centerFreq q asig
zubp :: Sig -> Sig -> Sig -> Sig
zubp :: Sig -> Sig -> Sig -> Sig
zubp = Sig -> Sig -> Sig -> Sig -> Sig
zpole2 Sig
3

-- | zero delay feedback 2 pole Notch (band reject). Q is unipolar [0, 1]
--
-- > zbr centerFreq q asig
zbr :: Sig -> Sig -> Sig -> Sig
zbr :: Sig -> Sig -> Sig -> Sig
zbr = Sig -> Sig -> Sig -> Sig -> Sig
zpole2 Sig
4

-- | zero delay feedback 2 pole Allpass filter. Q is unipolar [0, 1]
--
-- > zap centerFreq q asig
zap :: Sig -> Sig -> Sig -> Sig
zap :: Sig -> Sig -> Sig -> Sig
zap = Sig -> Sig -> Sig -> Sig -> Sig
zpole2 Sig
5

-- | zero delay feedback 2 pole Peak filter. Q is unipolar [0, 1]
--
-- > zpeak centerFreq q asig
zpeak :: Sig -> Sig -> Sig -> Sig
zpeak :: Sig -> Sig -> Sig -> Sig
zpeak = Sig -> Sig -> Sig -> Sig -> Sig
zpole2 Sig
6

-- |  Zero-delay feedback implementation of 4 pole ladder filter. Q is unipolar [0, 1]
--
-- > zladder centerFreq q asig
zladder :: Sig -> Sig -> Sig -> Sig
zladder :: Sig -> Sig -> Sig -> Sig
zladder Sig
cfq Sig
q Sig
asig = Sig -> Sig -> Sig -> Sig
zdf_ladder Sig
asig Sig
cfq (Sig -> Sig -> Sig -> Sig
forall a. SigSpace a => Sig -> Sig -> a -> a
uon Sig
0.5 Sig
25 Sig
q)

-- |  Zero-delay feedback implementation of 4 pole diode ladder filter  (24 dB/oct) .
-- This filter design was originally used in the EMS VCS3 and was the resonant filter in the Roland TB-303.
--
-- * Q is unipolar [0, 1]
--
-- * saturation - amount to use for non-linear processing. Values > 1 increase the steepness of the NLP curve.
--
-- > diode saturation centerFreq q asig
diode :: D -> Sig -> Sig -> Sig -> Sig
diode :: D -> Sig -> Sig -> Sig -> Sig
diode D
isaturation Sig
cfq Sig
fbk Sig
asig = Sig -> Sig -> Sig -> Sig
diode_ladder Sig
asig Sig
cfq (Sig
17 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
fbk)  Sig -> [D] -> Sig
forall a. Tuple a => a -> [D] -> a
`withDs` [D
1, D
isaturation]

-- | Faster diode, but lesser quality
--
-- > fdiode saturation centerFreq q asig
fdiode :: D -> Sig -> Sig -> Sig -> Sig
fdiode :: D -> Sig -> Sig -> Sig -> Sig
fdiode D
isaturation Sig
cfq Sig
fbk Sig
asig = Sig -> Sig -> Sig -> Sig
diode_ladder Sig
asig Sig
cfq (Sig
17 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
fbk) Sig -> [D] -> Sig
forall a. Tuple a => a -> [D] -> a
`withDs` [D
2, D
isaturation]

-- | Linear diode, no saturation involved
--
-- > linDiode centerFreq q asig
linDiode :: Sig -> Sig -> Sig -> Sig
linDiode :: Sig -> Sig -> Sig -> Sig
linDiode Sig
cfq Sig
fbk Sig
asig = Sig -> Sig -> Sig -> Sig
diode_ladder Sig
asig Sig
cfq (Sig
17 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
fbk)  Sig -> [D] -> Sig
forall a. Tuple a => a -> [D] -> a
`withDs` [D
0]

-- | Korg35 resonant low-pass filter. Q is unipolar [0, 1]
--
-- > korg_lp saturation centerFreq q asig
korg_lp :: D -> Sig -> Sig -> Sig -> Sig
korg_lp :: D -> Sig -> Sig -> Sig -> Sig
korg_lp D
isaturation Sig
cfq Sig
q Sig
asig = Sig -> Sig -> Sig -> Sig
k35_lpf Sig
asig Sig
cfq (Sig -> Sig -> Sig -> Sig
forall a. SigSpace a => Sig -> Sig -> a -> a
uon Sig
1 Sig
10 Sig
q) Sig -> [D] -> Sig
forall a. Tuple a => a -> [D] -> a
`withDs` [D
1, D
isaturation]

-- | Korg35 resonant high-pass filter. Q is unipolar [0, 1]
--
-- > korg_hp saturation centerFreq q asig
korg_hp :: D -> Sig -> Sig -> Sig -> Sig
korg_hp :: D -> Sig -> Sig -> Sig -> Sig
korg_hp D
isaturation Sig
cfq Sig
q Sig
asig = Sig -> Sig -> Sig -> Sig
k35_hpf Sig
asig Sig
cfq (Sig -> Sig -> Sig -> Sig
forall a. SigSpace a => Sig -> Sig -> a -> a
uon Sig
1 Sig
10 Sig
q) Sig -> [D] -> Sig
forall a. Tuple a => a -> [D] -> a
`withDs` [D
1, D
isaturation]

-- | Korg35 resonant band-pass filter. Q is unipolar [0, 1]
--
-- > korg_bp saturation centerFreq q asig
korg_bp :: D -> Sig -> Sig -> Sig -> Sig
korg_bp :: D -> Sig -> Sig -> Sig -> Sig
korg_bp D
isaturation Sig
cfq Sig
q Sig
asig = D -> Sig -> Sig -> Sig -> Sig
korg_hp D
isaturation Sig
cfq Sig
q (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ D -> Sig -> Sig -> Sig -> Sig
korg_lp D
isaturation Sig
cfq Sig
q Sig
asig

-- | Linear Korg35 resonant low-pass filter
--
-- > linKorg_lp centerFreq q asig
linKorg_lp :: Sig -> Sig -> Sig -> Sig
linKorg_lp :: Sig -> Sig -> Sig -> Sig
linKorg_lp Sig
cfq Sig
q Sig
asig = Sig -> Sig -> Sig -> Sig
k35_lpf Sig
asig Sig
cfq (Sig -> Sig -> Sig -> Sig
forall a. SigSpace a => Sig -> Sig -> a -> a
uon Sig
1 Sig
10 Sig
q) Sig -> [D] -> Sig
forall a. Tuple a => a -> [D] -> a
`withDs` [D
0]

-- | Linear Korg35 resonant high-pass filter
--
-- > linKorg_hp centerFreq q asig
linKorg_hp :: Sig -> Sig -> Sig -> Sig
linKorg_hp :: Sig -> Sig -> Sig -> Sig
linKorg_hp Sig
cfq Sig
q Sig
asig = Sig -> Sig -> Sig -> Sig
k35_hpf Sig
asig Sig
cfq (Sig -> Sig -> Sig -> Sig
forall a. SigSpace a => Sig -> Sig -> a -> a
uon Sig
1 Sig
10 Sig
q) Sig -> [D] -> Sig
forall a. Tuple a => a -> [D] -> a
`withDs` [D
0]

-- Linear Korg35 resonant band-pass filter
linKorg_bp :: Sig -> Sig -> Sig -> Sig
linKorg_bp :: Sig -> Sig -> Sig -> Sig
linKorg_bp Sig
cfq Sig
q Sig
asig = Sig -> Sig -> Sig -> Sig
linKorg_hp Sig
cfq Sig
q (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig -> Sig
linKorg_lp Sig
cfq Sig
q Sig
asig

-- | Alias for korg_lp
klp :: D -> Sig -> Sig -> Sig -> Sig
klp :: D -> Sig -> Sig -> Sig -> Sig
klp = D -> Sig -> Sig -> Sig -> Sig
korg_lp

-- | Alias for korg_hp
khp :: D -> Sig -> Sig -> Sig -> Sig
khp :: D -> Sig -> Sig -> Sig -> Sig
khp = D -> Sig -> Sig -> Sig -> Sig
korg_hp

-- | Alias for korg_bp
kbp :: D -> Sig -> Sig -> Sig -> Sig
kbp :: D -> Sig -> Sig -> Sig -> Sig
kbp = D -> Sig -> Sig -> Sig -> Sig
korg_bp