vivid-0.3.0.0: Vivid/UGens/Filters/Linear.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoIncoherentInstances #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE NoUndecidableInstances #-}
module Vivid.UGens.Filters.Linear (
apf
, bpf
, bpz2
, brf
, brz2
--- , changed
, decay
, decay2
--- , dynKlank
, fos
, formlet
, hpf
, hpz1
, hpz2
, integrator
, klank
, lag
, lag2
, lag3
, leakDC
, lpf
, lpz1
, lpz2
, midEQ
, onePole
, oneZero
, rhpf
, rlpf
, ramp
, resonz
, ringz
, sos
, slope
, twoPole
, twoZero
--- , varLag
) where
-- import Vivid.OSC
import Vivid.SC.SynthDef.Types (CalculationRate(..))
import Vivid.SynthDef
import Vivid.UGens.Args
import Vivid.SynthDef.FromUA
import qualified Data.ByteString.UTF8 as UTF8
import Data.Monoid
import Data.Proxy
-- import Data.ByteString (ByteString)
apf :: (Args '["in"] '["freq", "radius"] a) => a -> SDBody a Signal
apf = makeUGen
"APF" AR
(Vs::Vs '["in", "freq", "radius"])
(freq_ (440::Float), radius_ (0.8::Float))
-- | Band-pass filter
--
-- Rq: bandwidth / cutofffreq
bpf :: (Args '["in"] '["freq", "rq"] a) => a -> SDBody a Signal
bpf = makeUGen
"BPF" AR
(Vs::Vs '["in", "freq", "rq"])
(freq_ (440::Float), rq_ (1::Float))
bpz2 :: (Args '["in"] '[] a) => a -> SDBody a Signal
bpz2 = makeUGen
"BPZ2" AR
(Vs::Vs '["in"])
NoDefaults
brf :: (Args '["in"] '["freq", "rq"] a) => a -> SDBody a Signal
brf = makeUGen
"BRF" AR
(Vs::Vs '["in", "freq", "rq"])
(freq_ (440::Float), rq_ (1::Float))
brz2 :: (Args '["in"] '[] a) => a -> SDBody a Signal
brz2 = makeUGen
"BRZ2" AR
(Vs::Vs '["in"])
NoDefaults
--- changed ::
--- changed =
decay :: (Args '["in"] '["decaySecs"] a) => a -> SDBody a Signal
decay = makeUGen
"Decay" AR
(Vs::Vs '["in", "decaySecs"])
(decayTime_ (1::Float))
decay2 :: (Args '["in"] '["attackSecs", "decaySecs"] a) => a -> SDBody a Signal
decay2 = makeUGen
"Decay2" AR
(Vs::Vs '["in", "attackSecs", "decaySecs"])
(attackTime_ (0.01::Float), decayTime_ (1::Float))
--- dynKlank ::
--- dynKlank =
fos :: (Args '["in"] '["a0", "a1", "b1"] a) => a -> SDBody a Signal
fos = makeUGen
"FOS" AR
(Vs::Vs '["in", "a0", "a1", "b1"])
(a0_ (0::Float), a1_ (0::Float), b1_ (0::Float))
formlet :: (Args '["in"] '["freq", "attackSecs", "decaySecs"] a) => a -> SDBody a Signal
formlet = makeUGen
"Formlet" AR
(Vs::Vs '["in", "freq", "attackSecs", "decaySecs"])
(freq_ (440::Float), attackTime_ (1::Float), decayTime_ (1::Float))
-- | High-pass filter
hpf :: (Args '["in"] '["freq"] a) => a -> SDBody a Signal
hpf = passFilter "HPF"
hpz1 :: (Args '["in"] '[] a) => a -> SDBody a Signal
hpz1 = makeUGen
"HPZ1" AR
(Vs::Vs '["in"])
NoDefaults
hpz2 :: Args '["in"] '[] a => a -> SDBody a Signal
hpz2 = makeUGen
"HPZ2" AR
(Vs::Vs '["in"])
NoDefaults
integrator :: Args '["in"] '["coef"] a => a -> SDBody a Signal
integrator = makeUGen
"Integrator" AR
(Vs::Vs '["in", "coef"])
(coef_ (1::Float))
-- todo: i want either 'freqScale' or a way to pass in params to the list of frequencies
-- | \"Klank is a bank of fixed frequency resonators which can be used to simulate the resonant modes of an object. Each mode is given a ring time, which is the time for the mode to decay by 60 dB\"
--
-- The 'in_' argument is \"the excitation input to the resonant filter bank\"
--
-- Each tuple in the list argument is a triple of frequency, amplitude, and ring time
--
-- Can only run in 'AR'
klank :: Args '["in"] '[] a => a -> [(Float, Float, Float)] -> SDBody a Signal
klank args resonators = do
in' <- uaArgVal args (Proxy::Proxy "in")
addMonoUGen $ UGen (UGName_S (UTF8.fromString "Klank")) AR (outs in') 1
where
outs inThing = [
inThing
-- These may be added as parameters in the future:
, Constant 1 -- freqscale
, Constant 0 -- freqoffset
, Constant 1 -- decayscale
] <> concat [ map Constant [a,b,c] | (a,b,c) <- resonators ]
{-
3 "Klank" - AR (1 outputs)
UGOut: (2,0) -- "excitation input" thing
Constant: 1.0 (index 3) -- freqscale
Constant: 0.0 (index 4) -- freqoffset
Constant: 1.0 (index 5) -- decayscale
Constant: 220.0 (index 6) -- frequency
Constant: 0.5 (index 7) -- amplitude
Constant: 1.0 (index 8) -- rungTime
Constant: 440.0 (index 9)
Constant: 1.0 (index 8)
Constant: 1.0 (index 8)
Constant: 880.0 (index 10)
Constant: 0.5 (index 7)
Constant: 1.0 (index 8)
-}
-- | The \"lagSecs\" arg is the same as the \"lagTime\" arg in SC
-- (you can use 'Vivid.UGens.Args.lagTime_' if you like)
--
-- The calculation rate of this is whatever its \"in\" is (cool, right?)
lag :: Args '["in"] '["lagSecs"] a => a -> SDBody a Signal
lag as = do
makeThing =<< getCalcRate =<< uaArgVal as (Proxy::Proxy "in")
where
makeThing calcRate = ($ as) $ makeUGen
"Lag" calcRate
(Vs::Vs '["in", "lagSecs"])
(lagSecs_ (0.1::Float))
-- | 'lag2 (in_ x)' is equal to 'lag (in_ (lag (in_ x)))'
--
-- The calculation rate of this is whatever its \"in\" is
lag2 :: (Args '["in"] '["lagSecs"] a) => a -> SDBody a Signal
lag2 as =
makeThing =<< getCalcRate =<< uaArgVal as (Proxy::Proxy "in")
where
makeThing calcRate = ($ as) $ makeUGen
"Lag2" calcRate
(Vs::Vs '["in", "lagSecs"])
(lagTime_ (0.1::Float))
-- | 'lag3 (in_ x)' is equal to 'lag (in_ $ lag (in_ $ lag (in_ x)))'
--
-- The calculation rate of this is whatever its \"in\" is
lag3 :: (Args '["in"] '["lagSecs"] a) => a -> SDBody a Signal
lag3 as =
makeThing =<< getCalcRate =<< uaArgVal as (Proxy::Proxy "in")
where
makeThing calcRate = ($ as) $ makeUGen
"Lag3" calcRate
(Vs::Vs '["in", "lagSecs"])
(lagTime_ (0.1::Float))
-- | Note the default for both AR and KR are the same: 0.995. In SC lang, the KR
-- one defaults to 0.9.
leakDC :: (Args '["in"] '["coef"] a) => a -> SDBody a Signal
leakDC = makeUGen
"LeakDC" AR
(Vs::Vs '["in", "coef"])
(coef_ (0.995::Float))
-- also look at RLPF:
-- | Low-pass filter
lpf :: (Args '["in"] '["freq"] a) => a -> SDBody a Signal
lpf = passFilter "LPF"
lpz1 :: (Args '["in"] '[] a) => a -> SDBody a Signal
lpz1 = makeUGen
"LPZ1" AR
(Vs::Vs '["in"])
NoDefaults
lpz2 :: (Args '["in"] '[] a) => a -> SDBody a Signal
lpz2 = makeUGen
"LPZ2" AR
(Vs::Vs '["in"])
NoDefaults
-- | 'Db' is the boost or attenuation of the signal in decibels
midEQ :: (Args '["in", "freq", "db"] '["rq"] a) => a -> SDBody a Signal
midEQ = makeUGen
"MidEQ" AR
(Vs::Vs '["in", "freq", "rq", "db"])
(rq_ (1::Float))
passFilter :: (Args '["in"] '["freq"] a) => String -> a -> SDBody a Signal
passFilter filterName = makeUGen
filterName AR
(Vs::Vs '["in", "freq"])
(freq_ (440::Float))
onePole :: (Args '["in"] '["coef"] a) => a -> SDBody a Signal
onePole = makeUGen
"OnePole" AR
(Vs::Vs '["in", "coef"])
(coef_ (0.5::Float))
oneZero :: (Args '["in"] '["coef"] a) => a -> SDBody a Signal
oneZero = makeUGen
"OneZero" AR
(Vs::Vs '["in", "coef"])
(coef_ (0.5::Float))
rhpf :: (Args '["in"] '["freq", "rq"] a) => a -> SDBody a Signal
rhpf = makeUGen
"RHPF" AR
(Vs::Vs '["in", "freq", "rq"])
(freq_ (440::Float), rq_ (1::Float))
rlpf :: (Args '["in"] '["freq", "rq"] a) => a -> SDBody a Signal
rlpf = makeUGen
"RLPF" AR
(Vs::Vs '["in", "freq", "rq"])
(freq_ (440::Float), rq_ (1::Float))
ramp :: (Args '["in"] '["lagSecs"] a) => a -> SDBody a Signal
ramp = makeUGen
"Ramp" AR
(Vs::Vs '["in", "lagSecs"])
(lagTime_ (0.1::Float))
resonz :: (Args '["in"] '["freq", "bwr"] a) => a -> SDBody a Signal
resonz = makeUGen
"Resonz" AR
(Vs::Vs '["in", "freq", "bwr"])
(freq_ (440::Float), bwr_ (1::Float))
ringz :: (Args '["in"] '["freq", "decaySecs"] a) => a -> SDBody a Signal
ringz = makeUGen
"Ringz" AR
(Vs::Vs '["in", "freq", "decaySecs"])
(freq_ (440::Float), decaySecs_ (1::Float))
slope :: (Args '["in"] '[] a) => a -> SDBody a Signal
slope = makeUGen
"Slope" AR
(Vs::Vs '["in"])
NoDefaults
sos :: (Args '["in"] '["a0", "a1", "a2", "b1", "b2"] a) => a -> SDBody a Signal
sos = makeUGen
"SOS" AR
(Vs::Vs '["in", "a0", "a1", "a2", "b1", "b2"])
(a0_ (0::Float), a1_ (0::Float), a2_ (0::Float), b1_ (0::Float), b2_ (0::Float))
twoPole :: (Args '["in"] '["freq", "radius"] a) => a -> SDBody a Signal
twoPole = makeUGen
"TwoPole" AR
(Vs::Vs '["in", "freq", "radius"])
(freq_ (440::Float), radius_ (0.8::Float))
twoZero :: (Args '["in"] '["freq", "radius"] a) => a -> SDBody a Signal
twoZero = makeUGen
"TwoZero" AR
(Vs::Vs '["in", "freq", "radius"])
(freq_ (440::Float), radius_ (0.8::Float))
--- varLag ::
--- varLag =