-- | Development of the example Osc.hs (see it first).
-- Now oscillators are equipped with filter.
module Filter where
import Csound.Base
import Osc(OscInit(..), moogOscs)
data FilterInit = FilterInit
{ filterInitResonance :: Double -- the Q
, filterInitFreq :: Double -- the minimum of the center frequency
, filterInitRange :: Double } -- center frequency range
-- | A moog like filter with ADSR-envelope for center frequency.
moogFilter :: String -> Sig -> FilterInit -> Source (Sig -> Sig)
moogFilter name env (FilterInit initQ initCfq initRange) = source $ do
(gq, q) <- knob "resonance" uspan initQ
(gcfq, cfq) <- knob "freq" (linSpan 0 1000) initCfq
(grange, range) <- knob "range" (linSpan 0 10000) initRange
let cfqSig = cfq + env * range
gui <- setTitle name $ hor [gq, gcfq, grange]
return (gui, mlp cfqSig q)
adsrBound = AdsrBound 3 3 5
adsrInit = AdsrInit 0.1 0.1 0.5 0.2
main = vdac $ do
(gampEnv, ampEnv) <- linAdsr "amplitude" adsrBound adsrInit
(gfiltEnv, filtEnv) <- linAdsr "filter" adsrBound adsrInit
(goscs, oscs) <- moogOscs [OscInit 1 1 1, OscInit 0.5 2 2, OscInit 0.125 3 3]
(gfilt, filt) <- moogFilter "" filtEnv (FilterInit 0.6 100 3000)
(gvol, vol) <- masterVolume
let instr cps = vol * ampEnv * (filt $ oscs cps)
let gui = hor [goscs, ver [gampEnv, gfiltEnv, gfilt], sca 0.1 gvol]
panelBy "" (Just $ Rect 50 50 900 800) gui
return $ midi $ onMsg instr