module Csound.Catalog.Wave.Misc (
okComputer, polySynthFx, polySynth,
dreamPad, underwaterPad, lightIsTooBrightPad, whaleSongPad,
dreamPadBy, lightIsTooBrightPadBy, whaleSongPadBy,
deepBass,
impulseMarimba1, impulseMarimba2,
celloWave
) where
import Csound.Base
okComputer :: Sig -> SE Sig
okComputer cps = fmap go $ noise 11000 0.99
where
go anoise = osc (samphold anoise kgate)
kgate = kr $ oscil 1 cps (elins [1, 0, 0])
polySynth x = mul (fades 0.01 0.15) $ uni rndSaw x + uni rndSaw (x * cent 14) + (mul 0.2 $ at (lp 400 0.1) white)
where uni = multiHz 2 (cent 50)
polySynthFx :: ResonFilter -> SE Sig -> SE Sig2
polySynthFx filter = mixAt 0.25 largeHall2 . mixAt 0.25 (echo 0.25 0.65) . at (chorus 0.07 1.25 0.25) . at (fromMono . filter 5500 0.12 . filt 2 br 18000 0.3)
uni = multiHz 2 (cent 50)
lightIsTooBrightPad :: ResonFilter -> Sig -> Sig -> SE Sig
lightIsTooBrightPad filter = lightIsTooBrightPadBy filter rndSaw
lightIsTooBrightPadBy :: ResonFilter -> Wave -> Sig -> Sig -> SE Sig
lightIsTooBrightPadBy filter wave brightness = genDreamPadInstr filter mkOsc brightness
where mkOsc vibLfo1 vibLfo2 x = uni wave (vibLfo1 x) + uni wave (vibLfo2 $ x * cent 14) + mul 0.3 (mul (uosc 0.25) (rndTri (vibLfo2 $ x * 7 * cent 4)) + mul (isawSeq [1, 0.5, 0.25] 6 * uosc 0.17) (rndTri (vibLfo2 $ x * 13)) + mul (sqrSeq [1, 0.5, 0.25, 0.1] 8 * uosc 0.28) (rndOsc (vibLfo2 $ x * 9 * cent 3)))
whaleSongPad :: ResonFilter -> Sig -> Sig -> SE Sig
whaleSongPad filter = whaleSongPadBy filter rndTri
whaleSongPadBy :: ResonFilter -> Wave -> Sig -> Sig -> SE Sig
whaleSongPadBy filter wave brightness = genDreamPadInstr filter mkOsc brightness
where mkOsc vibLfo1 vibLfo2 x = uni wave (vibLfo1 x) + uni wave (vibLfo2 $ x * cent 14) + uni wave (vibLfo2 $ 3 * x * cent 14) + mul 0.15 (uni wave (vibLfo2 $ 7 * x * cent 14)) + mul 0.15 (uni wave ((vibLfo2 $ 11 * x * cent 14) + 400 * uosc 0.2))
underwaterPad :: ResonFilter -> Sig -> Sig -> SE Sig
underwaterPad filter = dreamPadBy filter rndTri
dreamPad :: ResonFilter -> Sig -> Sig -> SE Sig
dreamPad filter = dreamPadBy filter rndSaw
dreamPadBy :: ResonFilter -> Wave -> Sig -> Sig -> SE Sig
dreamPadBy filter wave brightness = genDreamPadInstr filter mkOsc brightness
where mkOsc vibLfo1 vibLfo2 x = uni wave (vibLfo1 x) + uni wave (vibLfo2 $ x * cent 14)
genDreamPadInstr filter mkOsc brightness x = do
a1 <- oscs
a2 <- nois
return $ mul (fades 0.85 0.95) $ fx1 (a2 + a1) + fx2 a1
where
fx1 = filt 2 filter (filtLfo1 (700 + brightness * 2500)) 0.26
fx2 = filter (filtLfo2 (1200 + brightness * 2500)) 0.32
oscs = mkOsc vibLfo1 vibLfo2 x
nois = mul 0.35 $ at (lp 2400 0.1) white
uni = multiHz 2 (cent 50)
lfo1 y x = x * (1 + y * osc (0.35 + 0.05 * osc 0.1))
lfo2 y x = x * (1 + y * osc (0.22 + 0.043 * osc 0.14))
filtLfo1 = lfo1 0.18
filtLfo2 = lfo2 0.13
vibLfo1 = lfo1 0.005
vibLfo2 = lfo2 0.007
deepBass x = mul 0.5 $ at (hp1 45) $ at (\x -> dam x 0.45 2 2 0.01 0.01) $ mul (xeg 0.005 0.6 1 0.05) $ sum [(filt 2 lp 275 0.25) (saw $ x * 0.5), osc (x * 0.5)]
impulseMarimba1 :: Sig -> Sig
impulseMarimba1 cps = mul 4 $ at (mlp cps 0.95) $ impulse 0
impulseMarimba2 :: Sig -> Sig
impulseMarimba2 cps = bat (bp cps 120) $ impulse 0
celloWave :: (D, Sig) -> SE Sig
celloWave = go p t x y z
where
go p t x y z = (\(amp, cps) -> ($ cps) ((mul $ sig amp) . at (
mlp (800) 0.45 .
hp 50 10 .
bat (\x -> sum [
bp (300 + 200 * (p 0.5)) 60 x,
bp (700 + 300 * (t 0.5)) 40 x,
bp (1500 + 600 * (x 0.5)) 30 x]) .
mul (leg (0.1 + 0.5 * (1 amp)) 0.5 0.8 0.1)) .
rndSaw .
(\x -> x * (1 + y * 0.07 * linsegr [0, 0.2, 0.3, 0.2, 0.85, 5, 1] 0.2 1 * osc (12 * z)))))
p = 0.25
t = 0.3
x = 0.45
y = 0.15
z = 0.45