module Csound.Catalog.Wave.TheHeartbeat ( heartbeat, monoPluck, chorusel ) where import Csound.Base -- | Deep kick sound. heartbeat :: Sig heartbeat = phi 0.0024 f12 + phi 0.0078 f13 where phi dec ftab = oscili (linseg [1, xdur, dec, 1, dec]) 4 ftab f12 = sines2 [(10, 1), (16, 1.5), (22, 2), (23, 1.5)] f13 = sines2 [(25, 1), (29, 0.5), (32, 0.2)] xdur = 0.25 -- | -- > monoPluck xdur cps monoPluck :: D -> D -> Sig monoPluck xdur cps = a3 where repluck' freq a = repluck plk (sig amp) freq (sig pick) 0.5 a a1 = mean [ repluck' (cps - 1) (osc $ sig $ cps - 2) , repluck' (cps + 1) (osc $ sig $ cps + 2) ] a2 = linen (a1/2) (0.2 * xdur) xdur (0.8 * xdur) arev = reverb2 a2 1.5 1 a3 = (a2 + 0.6 * arev) / 1.6 pick = 0.8 plk = 0.3 amp = 1 -- | -- > chorusel dur rise dec cps -- -- * dur - note duration -- -- * rise - rise time -- -- * dec - decay time -- -- * cps - frequency of the note chorusel :: D -> D -> D -> Sig -> (Sig, Sig) chorusel xdur rise dec cps = (a1, a2) where k1 = linen 1 rise xdur dec k2 = linseg [1, xdur, 0] k3 = kr $ osc 2 k4 = kr $ 0.5 * osc 2 inote = cps as = fmap (\(d, a, f) -> k1 * f (inote + d + a)) [ (-1, k3, saw), (1, k4, f9), (-0.5, 0, f9), (0.5, 0, saw), (-2, k4, saw), (2, k3, f9), (-1.5, k3, saw), (1.5, k3, f9), (-0.25, 0, f9), (0.25, 0, saw), (-0.8, k4, saw), (0.8, k4, f9)] ars = zipWith3 (\a k d -> withInits (areson a k d) (1::D)) as (k2:(k2*k3):repeat k2) (fmap (sig . double) $ [10, 20 .. 80] ++ [50, 60 .. 80]) meanArs = (/ 5.5) . sum . fmap (ars !!) asig1 = meanArs [0, 3, 5, 7, 8] asig2 = meanArs [1, 2, 4, 6, 9] asig3 = 0.5 * (ars !! 10 + ars !! 11) a1 = 0.5 * (asig1 + asig3) a2 = 0.5 * (asig2 + asig3) f9 phs = oscil 1 phs $ sines [ 0.28, 1, 0.74, 0.66, 0.78, 0.48, 0.05, 0.33, 0.12 , 0.08, 0.01, 0.54, 0.19, 0.08, 0.05, 0.16, 0.01 , 0.11, 0.3, 0.02, 0.2]