module Csound.Catalog.Wave.TheHeartbeat (
    heartbeat, monoPluck, chorusel
) where

import Csound.Base

-- | Deep kick sound.
heartbeat :: Sig
heartbeat :: Sig
heartbeat = D -> Tab -> Sig
phi D
0.0024 Tab
f12 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ D -> Tab -> Sig
phi D
0.0078 Tab
f13
    where phi :: D -> Tab -> Sig
phi D
dec Tab
ftab = Sig -> Sig -> Tab -> Sig
oscili ([D] -> Sig
linseg [D
1, D
xdur, D
dec, D
1, D
dec]) Sig
4 Tab
ftab
          f12 :: Tab
f12 = [(PartialNumber, PartialNumber)] -> Tab
sines2 [(PartialNumber
10, PartialNumber
1), (PartialNumber
16, PartialNumber
1.5), (PartialNumber
22, PartialNumber
2), (PartialNumber
23, PartialNumber
1.5)]
          f13 :: Tab
f13 = [(PartialNumber, PartialNumber)] -> Tab
sines2 [(PartialNumber
25, PartialNumber
1), (PartialNumber
29, PartialNumber
0.5), (PartialNumber
32, PartialNumber
0.2)] 
          xdur :: D
xdur = D
0.25

-- | 
-- > monoPluck xdur cps
monoPluck :: D -> D -> Sig
monoPluck :: D -> D -> Sig
monoPluck D
xdur D
cps = Sig
a3  
    where repluck' :: D -> Sig -> Sig
repluck' D
freq Sig
a = D -> Sig -> D -> Sig -> Sig -> Sig -> Sig
repluck D
plk (D -> Sig
sig D
amp) D
freq (D -> Sig
sig D
pick) Sig
0.5 Sig
a           
          a1 :: Sig
a1 = [Sig] -> Sig
forall a. Fractional a => [a] -> a
mean 
                [ D -> Sig -> Sig
repluck' (D
cps D -> D -> D
forall a. Num a => a -> a -> a
- D
1) (Sig -> Sig
osc (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ D -> Sig
sig (D -> Sig) -> D -> Sig
forall a b. (a -> b) -> a -> b
$ D
cps D -> D -> D
forall a. Num a => a -> a -> a
- D
2) 
                , D -> Sig -> Sig
repluck' (D
cps D -> D -> D
forall a. Num a => a -> a -> a
+ D
1) (Sig -> Sig
osc (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ D -> Sig
sig (D -> Sig) -> D -> Sig
forall a b. (a -> b) -> a -> b
$ D
cps D -> D -> D
forall a. Num a => a -> a -> a
+ D
2) ]
          a2 :: Sig
a2 = Sig -> D -> D -> D -> Sig
linen (Sig
a1Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/Sig
2) (D
0.2 D -> D -> D
forall a. Num a => a -> a -> a
* D
xdur) D
xdur (D
0.8 D -> D -> D
forall a. Num a => a -> a -> a
* D
xdur)
          arev :: Sig
arev = Sig -> Sig -> Sig -> Sig
reverb2 Sig
a2 Sig
1.5 Sig
1
          a3 :: Sig
a3 = (Sig
a2 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
0.6 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
arev) Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ Sig
1.6
          pick :: D
pick = D
0.8
          plk :: D
plk  = D
0.3
          amp :: D
amp  = D
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 :: D -> D -> D -> Sig -> (Sig, Sig)
chorusel D
xdur D
rise D
dec Sig
cps = (Sig
a1, Sig
a2)
    where k1 :: Sig
k1 = Sig -> D -> D -> D -> Sig
linen Sig
1 D
rise D
xdur D
dec
          k2 :: Sig
k2 = [D] -> Sig
linseg [D
1, D
xdur, D
0]
          k3 :: Sig
k3 = Sig -> Sig
kr (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig
osc Sig
2
          k4 :: Sig
k4 = Sig -> Sig
kr (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig
0.5 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig -> Sig
osc Sig
2
          inote :: Sig
inote = Sig
cps
          as :: [Sig]
as = ((Sig, Sig, Sig -> Sig) -> Sig)
-> [(Sig, Sig, Sig -> Sig)] -> [Sig]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(Sig
d, Sig
a, Sig -> Sig
f) -> Sig
k1 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig -> Sig
f (Sig
inote Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
d Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
a)) [
            (-Sig
1, Sig
k3, Sig -> Sig
saw),
            (Sig
1,  Sig
k4, Sig -> Sig
f9),
            (-Sig
0.5, Sig
0, Sig -> Sig
f9),
            (Sig
0.5, Sig
0, Sig -> Sig
saw),
            (-Sig
2, Sig
k4, Sig -> Sig
saw),
            (Sig
2, Sig
k3, Sig -> Sig
f9),
            (-Sig
1.5, Sig
k3, Sig -> Sig
saw),
            (Sig
1.5, Sig
k3, Sig -> Sig
f9),
            (-Sig
0.25, Sig
0, Sig -> Sig
f9),
            (Sig
0.25, Sig
0, Sig -> Sig
saw),
            (-Sig
0.8, Sig
k4, Sig -> Sig
saw),
            (Sig
0.8, Sig
k4, Sig -> Sig
f9)]
            
          ars :: [Sig]
ars = (Sig -> Sig -> Sig -> Sig) -> [Sig] -> [Sig] -> [Sig] -> [Sig]
forall a b c d. (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
zipWith3 (\Sig
a Sig
k Sig
d -> Sig -> D -> Sig
forall a b. (Tuple a, Tuple b) => a -> b -> a
withInits (Sig -> Sig -> Sig -> Sig
areson Sig
a Sig
k Sig
d) (D
1::D)) [Sig]
as (Sig
k2Sig -> [Sig] -> [Sig]
forall a. a -> [a] -> [a]
:(Sig
k2Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
*Sig
k3)Sig -> [Sig] -> [Sig]
forall a. a -> [a] -> [a]
:Sig -> [Sig]
forall a. a -> [a]
repeat Sig
k2) ((PartialNumber -> Sig) -> [PartialNumber] -> [Sig]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (D -> Sig
sig (D -> Sig) -> (PartialNumber -> D) -> PartialNumber -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PartialNumber -> D
double) ([PartialNumber] -> [Sig]) -> [PartialNumber] -> [Sig]
forall a b. (a -> b) -> a -> b
$ [PartialNumber
10, PartialNumber
20 .. PartialNumber
80] [PartialNumber] -> [PartialNumber] -> [PartialNumber]
forall a. [a] -> [a] -> [a]
++ [PartialNumber
50, PartialNumber
60 .. PartialNumber
80])
          meanArs :: [Int] -> Sig
meanArs = (Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ Sig
5.5) (Sig -> Sig) -> ([Int] -> Sig) -> [Int] -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Sig] -> Sig
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([Sig] -> Sig) -> ([Int] -> [Sig]) -> [Int] -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Sig) -> [Int] -> [Sig]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([Sig]
ars [Sig] -> Int -> Sig
forall a. [a] -> Int -> a
!!) 
          asig1 :: Sig
asig1 = [Int] -> Sig
meanArs [Int
0, Int
3, Int
5, Int
7, Int
8]
          asig2 :: Sig
asig2 = [Int] -> Sig
meanArs [Int
1, Int
2, Int
4, Int
6, Int
9]
          asig3 :: Sig
asig3 = Sig
0.5 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* ([Sig]
ars [Sig] -> Int -> Sig
forall a. [a] -> Int -> a
!! Int
10 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ [Sig]
ars [Sig] -> Int -> Sig
forall a. [a] -> Int -> a
!! Int
11)

          a1 :: Sig
a1 = Sig
0.5 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* (Sig
asig1 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
asig3)
          a2 :: Sig
a2 = Sig
0.5 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* (Sig
asig2 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ Sig
asig3)          
                    
          f9 :: Sig -> Sig
f9 Sig
phs = Sig -> Sig -> Tab -> Sig
oscil Sig
1 Sig
phs (Tab -> Sig) -> Tab -> Sig
forall a b. (a -> b) -> a -> b
$ [PartialNumber] -> Tab
sines 
                        [ PartialNumber
0.28, PartialNumber
1, PartialNumber
0.74, PartialNumber
0.66, PartialNumber
0.78, PartialNumber
0.48, PartialNumber
0.05, PartialNumber
0.33, PartialNumber
0.12
                        , PartialNumber
0.08, PartialNumber
0.01, PartialNumber
0.54, PartialNumber
0.19, PartialNumber
0.08, PartialNumber
0.05, PartialNumber
0.16, PartialNumber
0.01
                        , PartialNumber
0.11, PartialNumber
0.3, PartialNumber
0.02, PartialNumber
0.2]