module Csound.Catalog.Wave.Bitwig(
pwPad, triPad, triPadFx, triPadBy, pwPadBy,
Accordeon(..), accordeon, accordeonFx
) where
import Csound.Base
triPadFx :: Sig2 -> SE Sig2
triPadFx a = mixAt 0.5 smallHall2 $ at (chorus 0.2 0.3 0.25) (return a :: SE Sig2)
triPad = triPadBy mlp
triPadBy :: ResonFilter -> Sig -> SE Sig
triPadBy filter x = mul (1.5 * fades 0.3 0.5) $ at (filter (x * 5) 0.15) $ do
lfo <- rand 1.2
mul 0.5 $ rndTri (x + 1.5 * lfo) + rndTri (x * cent 8)
pwPad :: Sig -> SE Sig
pwPad = pwPadBy mlp
pwPadBy :: ResonFilter -> Sig -> SE Sig
pwPadBy filter x = mul (fades 0.3 0.95) $ at (filter (x * 5) 0.15) $ do
let lfo = uosc 4
return $ mul 0.5 $ pw (0.2 + 0.4 * lfo) x + tri (x * cent 8)
pwPadMidi = mul 0.5 $ mixAt 0.5 smallHall2 $ at (chorus 0.2 0.3 0.25) $ at fromMono $ midi $ onMsg pwPad
osc4 freq1 freq2 freq3 freq4 a b cps = cfd4 a b (saw (cps * freq1)) (sqr (cps * freq2)) (saw (cps * freq3)) (sqr (cps * freq4))
mlpTrack cps center q = mlp (cps + 6500 * center) q
data Accordeon = Accordeon
{ accordeonFreq1 :: Sig
, accordeonFreq2 :: Sig
, accordeonFreq3 :: Sig
, accordeonFreq4 :: Sig
}
instance Default Accordeon where
def = Accordeon 1 0.5 2.01 2
accordeon :: Accordeon -> Sig -> SE Sig2
accordeon spec cps = fmap fromMono $ liftA2 (\a b -> mul vcaEg $ mlpTrack (cps * 2) (0.5 * vcfEg) 0.1 $ f a b cps) (rndPointer 6 (0.3, 0.2)) (rndPointer 10 (0.4, 0.1))
where
vcaEg = leg 0.01 0.3 0.5 0.3
vcfEg = leg 0.05 0.3 0.2 0.2
rndPointer' a dt b cps (x, y) = fmap (\r -> x + y * linseg [0, 0.01, a, dt, b] * r) (randi 1 cps)
rndPointer = rndPointer' 1 5 0.35
f = osc4 (accordeonFreq1 spec) (accordeonFreq2 spec) (accordeonFreq3 spec) (accordeonFreq4 spec)
accordeonFx :: Sig2 -> SE Sig2
accordeonFx a = at smallHall2 $ mixAt 0.35 (echo 0.25 0.55) (return a :: SE Sig2)