-- |  Drums of the Korg TR-808 drum machine (recoded from   Iain McCurdy).
module Csound.Catalog.Drum.Tr808(
  TrSpec(..),

  bass, bass2, snare, openHiHat, closedHiHat,
  lowTom, midTom, highTom, cymbal, claves, rimShot,
  maraca, highConga, midConga, lowConga, cowbell,

  -- * Generic
  bass', bass2', bdSpec, bdSpec2, snare', snSpec, openHiHat', ohSpec, closedHiHat', chSpec,
  lowTom', ltSpec, midTom', mtSpec, highTom', htSpec, cymbal', cymSpec, claves', clSpec, rimShot', rimSpec,
  maraca', marSpec, highConga', hcSpec, midConga', mcSpec, lowConga', lcSpec, cowSpec, cowbell',

  -- * Sampler
  bd, bd2, sn1, ohh, chh, htom, mtom, ltom, cym, cl, rim, mar, hcon, mcon, lcon, cbell,

  -- ** Generic
  bd', bd2', sn1', ohh', chh', htom', mtom', ltom', cym', cl', rim', mar', hcon', mcon', lcon', cbell'

) where

import Control.Monad

import Csound.Base hiding (dur)
import Csound.Sam

-- don't forget to update the gen-opcodes and the hackage opcodes

rndAmp :: Sig -> SE Sig
rndAmp :: Sig -> SE Sig
rndAmp Sig
a = do
  D
k <- D -> SE D
forall a. SigOrD a => a -> SE a
birnd D
0.09
  Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ Sig
a Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* (Sig
1 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ D -> Sig
sig D
k)

data TrSpec = TrSpec {
    TrSpec -> D
trDur   :: D
  , TrSpec -> D
trTune  :: D
  , TrSpec -> D
trCps   :: D
  , TrSpec -> Maybe D
trRnd     :: Maybe D
  }

cpsSpec :: D -> TrSpec
cpsSpec :: D -> TrSpec
cpsSpec D
cps = TrSpec :: D -> D -> D -> Maybe D -> TrSpec
TrSpec
  { trDur :: D
trDur   = D
0.8
  , trTune :: D
trTune  = D
0
  , trCps :: D
trCps   = D
cps
  , trRnd :: Maybe D
trRnd   = D -> Maybe D
forall a. a -> Maybe a
Just D
0.085 }


rndVal :: D -> D -> D -> SE D
rndVal :: D -> D -> D -> SE D
rndVal D
total D
amount D
x = do
  D
k <- D -> SE D
forall a. SigOrD a => a -> SE a
birnd D
amount
  D -> SE D
forall (m :: * -> *) a. Monad m => a -> m a
return (D -> SE D) -> D -> SE D
forall a b. (a -> b) -> a -> b
$ D
x  D -> D -> D
forall a. Num a => a -> a -> a
+ D
k D -> D -> D
forall a. Num a => a -> a -> a
* D
total

rndDur, rndCps, rndTune :: D -> D -> SE D

rndDur :: D -> D -> SE D
rndDur D
amt D
x = D -> D -> D -> SE D
rndVal D
x D
amt D
x
rndCps :: D -> D -> SE D
rndCps D
amt D
x = D -> D -> D -> SE D
rndVal D
x (D
amt D -> D -> D
forall a. Fractional a => a -> a -> a
/ D
10) D
x
rndTune :: D -> D -> SE D
rndTune D
amt D
x = D -> D -> D -> SE D
rndVal D
0.7 D
amt D
x

rndSpec ::TrSpec -> SE TrSpec
rndSpec :: TrSpec -> SE TrSpec
rndSpec TrSpec
spec = do
  D
dur  <- SE D
rndDur'
  D
tune <- SE D
rndTune'
  D
cps  <- SE D
rndCps'
  TrSpec -> SE TrSpec
forall (m :: * -> *) a. Monad m => a -> m a
return (TrSpec -> SE TrSpec) -> TrSpec -> SE TrSpec
forall a b. (a -> b) -> a -> b
$ TrSpec
spec
    { trDur :: D
trDur  = D
dur
    , trTune :: D
trTune = D
tune
    , trCps :: D
trCps  = D
cps }
  where
    rndDur' :: SE D
rndDur'  = ((D -> SE D) -> (D -> D -> SE D) -> Maybe D -> D -> SE D
forall b a. b -> (a -> b) -> Maybe a -> b
maybe D -> SE D
forall (m :: * -> *) a. Monad m => a -> m a
return D -> D -> SE D
rndDur (Maybe D -> D -> SE D) -> Maybe D -> D -> SE D
forall a b. (a -> b) -> a -> b
$ (TrSpec -> Maybe D
trRnd TrSpec
spec)) (D -> SE D) -> D -> SE D
forall a b. (a -> b) -> a -> b
$ TrSpec -> D
trDur TrSpec
spec
    rndTune' :: SE D
rndTune' = ((D -> SE D) -> (D -> D -> SE D) -> Maybe D -> D -> SE D
forall b a. b -> (a -> b) -> Maybe a -> b
maybe D -> SE D
forall (m :: * -> *) a. Monad m => a -> m a
return D -> D -> SE D
rndTune (Maybe D -> D -> SE D) -> Maybe D -> D -> SE D
forall a b. (a -> b) -> a -> b
$ (TrSpec -> Maybe D
trRnd TrSpec
spec)) (D -> SE D) -> D -> SE D
forall a b. (a -> b) -> a -> b
$ TrSpec -> D
trTune TrSpec
spec
    rndCps' :: SE D
rndCps'  = ((D -> SE D) -> (D -> D -> SE D) -> Maybe D -> D -> SE D
forall b a. b -> (a -> b) -> Maybe a -> b
maybe D -> SE D
forall (m :: * -> *) a. Monad m => a -> m a
return D -> D -> SE D
rndCps (Maybe D -> D -> SE D) -> Maybe D -> D -> SE D
forall a b. (a -> b) -> a -> b
$ (TrSpec -> Maybe D
trRnd TrSpec
spec)) (D -> SE D) -> D -> SE D
forall a b. (a -> b) -> a -> b
$ TrSpec -> D
trCps TrSpec
spec

bdSpec :: TrSpec
bdSpec :: TrSpec
bdSpec = TrSpec :: D -> D -> D -> Maybe D -> TrSpec
TrSpec
  { trDur :: D
trDur   = D
0.95
  , trTune :: D
trTune  = D
1
  , trCps :: D
trCps   = D
55
  , trRnd :: Maybe D
trRnd   = D -> Maybe D
forall a. a -> Maybe a
Just D
0.05 }

addDur' :: D -> a -> SE a
addDur' :: D -> a -> SE a
addDur' D
dt a
x = D -> SE ()
xtratim D
dt SE () -> SE a -> SE a
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> a -> SE a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x

addDur :: a -> SE a
addDur :: a -> SE a
addDur = D -> a -> SE a
forall a. D -> a -> SE a
addDur' D
0.1

bass :: SE Sig
bass :: SE Sig
bass = TrSpec -> SE Sig
bass' TrSpec
bdSpec

bass' :: TrSpec -> SE Sig
bass' :: TrSpec -> SE Sig
bass' TrSpec
spec = TrSpec -> SE Sig
pureBass' (TrSpec -> SE Sig) -> SE TrSpec -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TrSpec -> SE TrSpec
rndSpec TrSpec
spec

pureBass' :: TrSpec -> SE Sig
pureBass' :: TrSpec -> SE Sig
pureBass' TrSpec
spec = Sig -> SE Sig
rndAmp (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Sig -> SE Sig
forall a. a -> SE a
addDur Sig
amix
  where
    dur :: D
dur = TrSpec -> D
trDur TrSpec
spec
    cps :: D
cps = TrSpec -> D
trCps TrSpec
spec

    kmul :: Sig
kmul  = [D] -> D -> D -> D -> Sig
transegr [D
0.2, D
dur D -> D -> D
forall a. Num a => a -> a -> a
* D
0.5, -D
15, D
0.01, D
dur D -> D -> D
forall a. Num a => a -> a -> a
* D
0.5, D
0, D
0] D
dur D
0 D
0
    kbend :: Sig
kbend = [D] -> D -> D -> D -> Sig
transegr [D
0.5, D
1.2, -D
4, D
0, D
1, D
0, D
0] D
dur D
0 D
0
    asig :: Sig
asig  = Sig -> Sig -> Sig -> Sig -> Sig -> Tab -> Sig
gbuzz Sig
0.5 (D -> Sig
sig D
cps Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig -> Sig
forall a. SigOrD a => a -> a
semitone Sig
kbend) Sig
20 Sig
1 Sig
kmul Tab
cosine
    aenv :: Sig
aenv  = [D] -> Sig
transeg [D
1, D
dur D -> D -> D
forall a. Num a => a -> a -> a
- D
0.004, -D
6, D
0]
    att :: Sig
att   = [D] -> Sig
linseg [D
0, D
0.004, D
1]
    asig1 :: Sig
asig1 = Sig
asig Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
aenv Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
att

    aenv1 :: Sig
aenv1 = [D] -> Sig
linseg [D
1, D
0.07, D
0]
    acps :: Sig
acps  = [D] -> Sig
expsega [D
8 D -> D -> D
forall a. Num a => a -> a -> a
* D
cps,D
0.07,D
0.001]
    aimp :: Sig
aimp  = Sig -> Sig -> Tab -> Sig
oscili  Sig
aenv1 Sig
acps Tab
sine
    amix :: Sig
amix  = Sig
asig1 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
0.7 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+  Sig
aimp Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
0.25

bdSpec2 :: TrSpec
bdSpec2 :: TrSpec
bdSpec2 = TrSpec :: D -> D -> D -> Maybe D -> TrSpec
TrSpec
  { trDur :: D
trDur   = D
1.3
  , trTune :: D
trTune  = D
1
  , trCps :: D
trCps   = D
57
  , trRnd :: Maybe D
trRnd   = D -> Maybe D
forall a. a -> Maybe a
Just D
0.05 }

bass2 :: SE Sig
bass2 :: SE Sig
bass2 = TrSpec -> SE Sig
bass2' TrSpec
bdSpec2

bass2' :: TrSpec -> SE Sig
bass2' :: TrSpec -> SE Sig
bass2' TrSpec
spec = TrSpec -> SE Sig
pureBass2' (TrSpec -> SE Sig) -> SE TrSpec -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TrSpec -> SE TrSpec
rndSpec TrSpec
spec

pureBass2' :: TrSpec -> SE Sig
pureBass2' :: TrSpec -> SE Sig
pureBass2' TrSpec
spec = (Sig -> SE Sig
rndAmp (Sig -> SE Sig) -> (Sig -> SE Sig) -> Sig -> SE Sig
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< Sig -> SE Sig
forall a. a -> SE a
addDur) (Sig -> SE Sig) -> Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig
compr (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig
forall a. SigSpace a => Sig -> a -> a
mul ([D] -> D -> D -> Sig
expsegr [D
1, D
0.6 D -> D -> D
forall a. Num a => a -> a -> a
* D
dur, D
0.1, D
0.4 D -> D -> D
forall a. Num a => a -> a -> a
* D
dur, D
0.001] (D
0.4 D -> D -> D
forall a. Num a => a -> a -> a
* D
dur) D
0.001) (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$
    Sig -> Sig -> Sig -> Sig -> Sig
fosc Sig
1 Sig
2 (Sig
0.5 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* D -> D -> D -> D -> Sig
xeg D
0.01 D
0.1 D
0.2 D
0.5) (Sig
cps Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig -> Sig
forall a. SigOrD a => a -> a
semitone ([D] -> Sig
expseg [D
12, D
0.01, D
27, D
0.3, D
0.001]))
    where
      compr :: Sig -> Sig
compr Sig
x = Sig -> Sig -> D -> D -> D -> D -> Sig
dam Sig
x Sig
0.65 D
2.4 D
2.3 D
0.05 D
0.1
      dur :: D
dur = TrSpec -> D
trDur TrSpec
spec
      cps :: Sig
cps = D -> Sig
sig (D -> Sig) -> D -> Sig
forall a b. (a -> b) -> a -> b
$ TrSpec -> D
trCps TrSpec
spec


snSpec :: TrSpec
snSpec :: TrSpec
snSpec = D -> TrSpec
cpsSpec D
342

snare :: SE Sig
snare :: SE Sig
snare = TrSpec -> SE Sig
snare' TrSpec
snSpec

snare' :: TrSpec -> SE Sig
snare' :: TrSpec -> SE Sig
snare' TrSpec
spec = TrSpec -> SE Sig
pureSnare' (TrSpec -> SE Sig) -> SE TrSpec -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TrSpec -> SE TrSpec
rndSpec TrSpec
spec

-- sound consists of two sine tones, an octave apart and a noise signal
pureSnare' :: TrSpec -> SE Sig
pureSnare' :: TrSpec -> SE Sig
pureSnare' TrSpec
spec = Sig -> SE Sig
rndAmp (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Sig -> SE Sig
forall a. a -> SE a
addDur (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (SE Sig
apitch SE Sig -> SE Sig -> SE Sig
forall a. Num a => a -> a -> a
+ SE Sig
anoise)
  where
    dur :: D
dur   = TrSpec -> D
trDur  TrSpec
spec
    tune :: D
tune    = TrSpec -> D
trTune TrSpec
spec
    cps :: D
cps     = TrSpec -> D
trCps  TrSpec
spec

    iNseDur :: D
iNseDur = D
dur D -> D -> D
forall a. Num a => a -> a -> a
* D
0.3
    iPchDur :: D
iPchDur  = D
dur D -> D -> D
forall a. Num a => a -> a -> a
* D
0.1

    -- sine tones component
    aenv1 :: Sig
aenv1   = [D] -> D -> D -> Sig
expsegr [D
1, D
iPchDur, D
0.0001] D
iNseDur D
0.0001
    apitch1 :: SE Sig
apitch1 = Sig -> SE Sig
rndOsc (D -> Sig
sig D
cps)
    apitch2 :: SE Sig
apitch2 = Sig -> SE Sig
rndOsc (Sig
0.5 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* D -> Sig
sig D
cps)
    apitch :: SE Sig
apitch  = Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul (Sig
0.75 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
aenv1) (SE Sig
apitch1 SE Sig -> SE Sig -> SE Sig
forall a. Num a => a -> a -> a
+ SE Sig
apitch2)

    -- noise component
    aenv2 :: Sig
aenv2 = D -> D -> D -> Sig
expon D
1 D
iNseDur D
0.0005
    kcf :: Sig
kcf   = [D] -> D -> D -> Sig
expsegr [D
5000, D
0.1, D
3000] D
iNseDur D
0.0001
    anoise :: SE Sig
anoise  = Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
aenv2 (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ do
      Sig
x <- Sig -> Sig -> SE Sig
noise Sig
0.75 Sig
0
      Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig
blp Sig
kcf (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig
bhp Sig
1000 (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig -> Sig
bbp (Sig
10000 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig -> Sig
forall a. SigOrD a => a -> a
octave (D -> Sig
sig D
tune)) Sig
10000 Sig
x

ohSpec, chSpec :: TrSpec

ohSpec :: TrSpec
ohSpec = D -> TrSpec
cpsSpec D
296
chSpec :: TrSpec
chSpec = D -> TrSpec
cpsSpec D
296

openHiHat, closedHiHat :: SE Sig

openHiHat :: SE Sig
openHiHat = TrSpec -> SE Sig
openHiHat' TrSpec
ohSpec
closedHiHat :: SE Sig
closedHiHat = TrSpec -> SE Sig
closedHiHat' TrSpec
chSpec

openHiHat' :: TrSpec -> SE Sig
openHiHat' :: TrSpec -> SE Sig
openHiHat' TrSpec
spec = Sig -> TrSpec -> SE Sig
genHiHat ([D] -> D -> D -> Sig
linsegr [D
1, (D
durD -> D -> D
forall a. Fractional a => a -> a -> a
/D
2) D -> D -> D
forall a. Num a => a -> a -> a
- D
0.05, D
0.1, D
0.05, D
0] D
dur D
0) TrSpec
spec
  where dur :: D
dur = TrSpec -> D
trDur TrSpec
spec

closedHiHat' :: TrSpec -> SE Sig
closedHiHat' :: TrSpec -> SE Sig
closedHiHat' TrSpec
spec = Sig -> TrSpec -> SE Sig
genHiHat ([D] -> Sig
expsega [D
1, (D
dur D -> D -> D
forall a. Fractional a => a -> a -> a
/ D
2), D
0.001]) TrSpec
spec
  where dur :: D
dur = TrSpec -> D
trDur TrSpec
spec

-- sound consists of 6 pulse oscillators mixed with a noise component
-- cps = 296
genHiHat :: Sig -> TrSpec -> SE Sig
genHiHat :: Sig -> TrSpec -> SE Sig
genHiHat Sig
pitchedEnv TrSpec
spec = Sig -> SE Sig
rndAmp (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Sig -> SE Sig
forall a. a -> SE a
addDur (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (SE Sig
amix1 SE Sig -> SE Sig -> SE Sig
forall a. Num a => a -> a -> a
+ SE Sig
anoise)
  where
    dur :: D
dur   = TrSpec -> D
trDur  TrSpec
spec
    tune :: D
tune    = TrSpec -> D
trTune TrSpec
spec
    cps :: D
cps     = TrSpec -> D
trCps  TrSpec
spec

    halfDur :: D
halfDur = D
dur D -> D -> D
forall a. Num a => a -> a -> a
* D
0.5

    -- pitched element
    harmonics :: [D]
harmonics = [D
1.0, D
0.962, D
1.233, D
1.175,D
1.419, D
2.821]
    amix :: SE Sig
amix  = Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
0.5 (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ ([Sig] -> Sig) -> SE [Sig] -> SE Sig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Sig] -> Sig
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum (SE [Sig] -> SE Sig) -> SE [Sig] -> SE Sig
forall a b. (a -> b) -> a -> b
$ (D -> SE Sig) -> [D] -> SE [Sig]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Sig -> Sig -> SE Sig
rndPw Sig
0.25 (Sig -> SE Sig) -> (D -> Sig) -> D -> SE Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. D -> Sig
sig (D -> Sig) -> (D -> D) -> D -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D -> D -> D
forall a. Num a => a -> a -> a
* (D
cps D -> D -> D
forall a. Num a => a -> a -> a
* D -> D
forall a. SigOrD a => a -> a
octave D
tune))) [D]
harmonics
    amix1 :: SE Sig
amix1   = Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
pitchedEnv (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ (Sig -> Sig) -> SE Sig -> AtOut Sig Sig (SE Sig)
forall a b c. At a b c => (a -> b) -> c -> AtOut a b c
at (\Sig
asig -> Sig -> Sig -> Sig
bhp Sig
5000 (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig
bhp Sig
5000 (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig -> Sig
reson Sig
asig (Sig
5000 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig -> Sig
forall a. SigOrD a => a -> a
octave (D -> Sig
sig D
tune)) Sig
5000 Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
1) SE Sig
amix

    -- noise element
    kcf :: Sig
kcf   = [D] -> Sig
expseg [D
20000, D
0.7, D
9000, D
halfDurD -> D -> D
forall a. Num a => a -> a -> a
-D
0.1, D
9000]
    anoise :: SE Sig
anoise  = Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
pitchedEnv (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ do
      Sig
x <- Sig -> Sig -> SE Sig
noise Sig
0.8 Sig
0
      Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig
bhp Sig
8000 (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig
blp Sig
kcf Sig
x

htSpec, mtSpec, ltSpec :: TrSpec

htSpec :: TrSpec
htSpec = D -> TrSpec
cpsSpec D
200
mtSpec :: TrSpec
mtSpec = D -> TrSpec
cpsSpec D
133
ltSpec :: TrSpec
ltSpec = D -> TrSpec
cpsSpec D
90

lowTom, midTom, highTom :: SE Sig

lowTom :: SE Sig
lowTom = TrSpec -> SE Sig
lowTom' TrSpec
ltSpec
midTom :: SE Sig
midTom = TrSpec -> SE Sig
midTom' TrSpec
mtSpec
highTom :: SE Sig
highTom = TrSpec -> SE Sig
highTom' TrSpec
htSpec

-- cps = 200
highTom' :: TrSpec -> SE Sig
highTom' :: TrSpec -> SE Sig
highTom' = D -> (Sig, Sig, Sig) -> TrSpec -> SE Sig
genTom D
0.5 (Sig
400, Sig
100, Sig
1000)

-- cps = 133
midTom' :: TrSpec -> SE Sig
midTom' :: TrSpec -> SE Sig
midTom' = D -> (Sig, Sig, Sig) -> TrSpec -> SE Sig
genTom D
0.6 (Sig
400, Sig
100, Sig
600)

-- cps =  90
lowTom' :: TrSpec -> SE Sig
lowTom' :: TrSpec -> SE Sig
lowTom' = D -> (Sig, Sig, Sig) -> TrSpec -> SE Sig
genTom D
0.6 (Sig
40, Sig
100, Sig
600)

genTom :: D -> (Sig, Sig, Sig) -> TrSpec -> SE Sig
genTom :: D -> (Sig, Sig, Sig) -> TrSpec -> SE Sig
genTom D
durDt (Sig
resonCf, Sig
hpCf, Sig
lpCf) TrSpec
spec = Sig -> SE Sig
rndAmp (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Sig -> SE Sig
forall a. a -> SE a
addDur (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (SE Sig
asig SE Sig -> SE Sig -> SE Sig
forall a. Num a => a -> a -> a
+ SE Sig
anoise)
  where
    dur :: D
dur   = TrSpec -> D
trDur  TrSpec
spec
    tune :: D
tune    = TrSpec -> D
trTune TrSpec
spec
    cps :: D
cps     = TrSpec -> D
trCps  TrSpec
spec

    ifrq :: D
ifrq  = D
cps D -> D -> D
forall a. Num a => a -> a -> a
* D -> D
forall a. SigOrD a => a -> a
octave D
tune
    halfDur :: D
halfDur = D
durDt D -> D -> D
forall a. Num a => a -> a -> a
* D
dur

    -- sine tone signal
    aAmpEnv :: Sig
aAmpEnv = D -> Sig
fadeIn D
0.04 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* [D] -> Sig
transeg [D
1, D
halfDur, -D
10, D
0.001]
    afmod :: Sig
afmod = [D] -> Sig
expsega  [D
5, D
0.125D -> D -> D
forall a. Fractional a => a -> a -> a
/D
ifrq, D
1]
    asig :: SE Sig
asig    = Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul (-Sig
aAmpEnv) (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ Sig -> SE Sig
rndOsc (D -> Sig
sig D
ifrq Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
afmod)

    -- noise signal
    aEnvNse :: Sig
aEnvNse = [D] -> Sig
transeg [D
1, D
halfDur, -D
6 , D
0.001]
    otune :: Sig
otune = D -> Sig
sig (D -> Sig) -> D -> Sig
forall a b. (a -> b) -> a -> b
$ D -> D
forall a. SigOrD a => a -> a
octave D
tune
    anoise :: SE Sig
anoise  = Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
aEnvNse (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ do
      Sig
x <- Sig -> Sig -> SE Sig
noise Sig
1 Sig
0.4
      Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig
blp (Sig
lpCf Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
otune) (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig
bhp (Sig
hpCf Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
otune) (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig -> Sig
reson Sig
x (Sig
resonCf Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
otune) Sig
800 Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
1

cymSpec :: TrSpec
cymSpec :: TrSpec
cymSpec = D -> TrSpec
cpsSpec D
296

cymbal :: SE Sig
cymbal :: SE Sig
cymbal = TrSpec -> SE Sig
cymbal' TrSpec
cymSpec

-- sound consists of 6 pulse oscillators mixed with a noise component
-- cps = 296
cymbal' :: TrSpec -> SE Sig
cymbal' :: TrSpec -> SE Sig
cymbal' TrSpec
spec = Sig -> SE Sig
rndAmp (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Sig -> SE Sig
forall a. a -> SE a
addDur (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ((Sig -> Sig) -> SE Sig -> SE Sig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Sig
amix1 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
+ ) SE Sig
anoise)
  where
    dur :: D
dur   = TrSpec -> D
trDur  TrSpec
spec
    tune :: D
tune    = TrSpec -> D
trTune TrSpec
spec
    cps :: D
cps     = TrSpec -> D
trCps  TrSpec
spec

    fullDur :: D
fullDur = D
dur D -> D -> D
forall a. Num a => a -> a -> a
* D
2

    -- pitched element
    harmonics :: [D]
harmonics = [D
1.0, D
0.962, D
1.233, D
1.175,D
1.419, D
2.821]
    aenv :: Sig
aenv  = D -> D -> D -> Sig
expon D
1 D
fullDur D
0.0001
    amix :: Sig
amix  = Sig -> Sig -> Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
0.5 (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ [Sig] -> Sig
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([Sig] -> Sig) -> [Sig] -> Sig
forall a b. (a -> b) -> a -> b
$ (D -> Sig) -> [D] -> [Sig]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Sig -> Sig -> Sig
pw Sig
0.25 (Sig -> Sig) -> (D -> Sig) -> D -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. D -> Sig
sig (D -> Sig) -> (D -> D) -> D -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (D -> D -> D
forall a. Num a => a -> a -> a
* (D
cps D -> D -> D
forall a. Num a => a -> a -> a
* D -> D
forall a. SigOrD a => a -> a
octave D
tune))) [D]
harmonics
    amix1 :: Sig
amix1   = Sig -> Sig -> Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
aenv (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig
blp Sig
12000 (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig
blp Sig
12000 (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig
bhp Sig
10000 (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig -> Sig
reson Sig
amix (Sig
5000 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig -> Sig
forall a. SigOrD a => a -> a
octave (D -> Sig
sig D
tune)) Sig
5000 Sig -> D -> Sig
forall a. Tuple a => a -> D -> a
`withD` D
1

    -- noise element
    aenv2 :: Sig
aenv2   = [D] -> Sig
expsega [D
1,D
0.3,D
0.07,D
fullDurD -> D -> D
forall a. Num a => a -> a -> a
-D
0.1,D
0.00001]
    kcf :: Sig
kcf   = [D] -> Sig
expseg [D
14000, D
0.7, D
7000, D
fullDurD -> D -> D
forall a. Num a => a -> a -> a
-D
0.1, D
5000]
    anoise :: SE Sig
anoise  = Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
aenv2 (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ do
      Sig
x <- Sig -> Sig -> SE Sig
noise Sig
0.8 Sig
0
      Sig -> SE Sig
forall (m :: * -> *) a. Monad m => a -> m a
return (Sig -> SE Sig) -> Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig
bhp Sig
8000 (Sig -> Sig) -> Sig -> Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> Sig
blp Sig
kcf Sig
x

clSpec :: TrSpec
clSpec :: TrSpec
clSpec = D -> TrSpec
cpsSpec D
2500

claves :: SE Sig
claves :: SE Sig
claves = TrSpec -> SE Sig
claves' TrSpec
clSpec

-- cps = 2500
claves' :: TrSpec -> SE Sig
claves' :: TrSpec -> SE Sig
claves' TrSpec
spec = Sig -> SE Sig
rndAmp (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Sig -> SE Sig
forall a. a -> SE a
addDur (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< SE Sig
asig
  where
    dur :: D
dur   = TrSpec -> D
trDur  TrSpec
spec
    tune :: D
tune    = TrSpec -> D
trTune TrSpec
spec
    cps :: D
cps     = TrSpec -> D
trCps  TrSpec
spec

    ifrq :: D
ifrq = D
cps D -> D -> D
forall a. Num a => a -> a -> a
* D -> D
forall a. SigOrD a => a -> a
octave D
tune
    dt :: D
dt   = D
0.045 D -> D -> D
forall a. Num a => a -> a -> a
* D
dur
    aenv :: Sig
aenv = [D] -> Sig
expsega  [D
1, D
dt, D
0.001]
    afmod :: Sig
afmod = [D] -> Sig
expsega [D
3,D
0.00005,D
1]
    asig :: SE Sig
asig = Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul (- Sig
0.4 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* (Sig
aenvSig -> Sig -> Sig
forall a. Num a => a -> a -> a
-Sig
0.001)) (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ Sig -> SE Sig
rndOsc (D -> Sig
sig D
ifrq Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
afmod)

rimSpec :: TrSpec
rimSpec :: TrSpec
rimSpec = D -> TrSpec
cpsSpec D
1700

rimShot :: SE Sig
rimShot :: SE Sig
rimShot = TrSpec -> SE Sig
rimShot' TrSpec
rimSpec

rimShot' :: TrSpec -> SE Sig
rimShot' :: TrSpec -> SE Sig
rimShot' TrSpec
spec = TrSpec -> SE Sig
pureRimShot' (TrSpec -> SE Sig) -> SE TrSpec -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TrSpec -> SE TrSpec
rndSpec TrSpec
spec

-- cps = 1700
pureRimShot' :: TrSpec -> SE Sig
pureRimShot' :: TrSpec -> SE Sig
pureRimShot' TrSpec
spec = Sig -> SE Sig
rndAmp (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Sig -> SE Sig
forall a. a -> SE a
addDur (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
0.8 (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ SE Sig
aring SE Sig -> SE Sig -> SE Sig
forall a. Num a => a -> a -> a
+ SE Sig
anoise)
  where
    dur :: D
dur   = TrSpec -> D
trDur  TrSpec
spec
    tune :: D
tune    = TrSpec -> D
trTune TrSpec
spec
    cps :: D
cps     = TrSpec -> D
trCps  TrSpec
spec

    fullDur :: D
fullDur = D
0.027 D -> D -> D
forall a. Num a => a -> a -> a
* D
dur

    -- ring
    aenv1 :: Sig
aenv1 = [D] -> Sig
expsega [D
1,D
fullDur,D
0.001]
    ifrq1 :: Sig
ifrq1 = 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 -> D
forall a. SigOrD a => a -> a
octave D
tune
    aring :: SE Sig
aring = Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul (Sig
0.5 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* (Sig
aenv1 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
- Sig
0.001)) (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ (Sig -> Sig) -> SE Sig -> AtOut Sig Sig (SE Sig)
forall a b c. At a b c => (a -> b) -> c -> AtOut a b c
at (Sig -> Sig -> Sig -> Sig
bbp Sig
ifrq1 (Sig
ifrq1 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
8)) (SE Sig -> AtOut Sig Sig (SE Sig))
-> SE Sig -> AtOut Sig Sig (SE Sig)
forall a b. (a -> b) -> a -> b
$ Tab -> Sig -> SE Sig
rndOscBy Tab
tabTR808RimShot Sig
ifrq1

    -- noise
    aenv2 :: Sig
aenv2 = [D] -> Sig
expsega [D
1, D
0.002, D
0.8, D
0.005, D
0.5, D
fullDurD -> D -> D
forall a. Num a => a -> a -> a
-D
0.002D -> D -> D
forall a. Num a => a -> a -> a
-D
0.005, D
0.0001]
    kcf :: Sig
kcf   = [D] -> D -> D -> Sig
expsegr [D
4000, D
fullDur, D
20] D
fullDur D
20
    anoise :: SE Sig
anoise = Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul (Sig
aenv2 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
- Sig
0.001) (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ (Sig -> Sig) -> SE Sig -> SE Sig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Sig -> Sig -> Sig
blp Sig
kcf) (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> SE Sig
noise Sig
1 Sig
0

    tabTR808RimShot :: Tab
tabTR808RimShot = Int -> Tab -> Tab
setSize Int
1024 (Tab -> Tab) -> Tab -> Tab
forall a b. (a -> b) -> a -> b
$ [PartialStrength] -> Tab
sines [PartialStrength
0.971,PartialStrength
0.269,PartialStrength
0.041,PartialStrength
0.054,PartialStrength
0.011,PartialStrength
0.013,PartialStrength
0.08,PartialStrength
0.0065,PartialStrength
0.005,PartialStrength
0.004,PartialStrength
0.003,PartialStrength
0.003,PartialStrength
0.002,PartialStrength
0.002,PartialStrength
0.002,PartialStrength
0.002,PartialStrength
0.002,PartialStrength
0.001,PartialStrength
0.001,PartialStrength
0.001,PartialStrength
0.001,PartialStrength
0.001,PartialStrength
0.002,PartialStrength
0.001,PartialStrength
0.001]

cowSpec :: TrSpec
cowSpec :: TrSpec
cowSpec = D -> TrSpec
cpsSpec D
562

cowbell :: SE Sig
cowbell :: SE Sig
cowbell = TrSpec -> SE Sig
cowbell' TrSpec
cowSpec

-- cps = 562
cowbell' ::  TrSpec -> SE Sig
cowbell' :: TrSpec -> SE Sig
cowbell' TrSpec
spec = Sig -> SE Sig
rndAmp (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Sig -> SE Sig
forall a. a -> SE a
addDur (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< SE Sig
ares
  where
    dur :: D
dur   = TrSpec -> D
trDur  TrSpec
spec
    tune :: D
tune    = TrSpec -> D
trTune TrSpec
spec
    cps :: D
cps     = TrSpec -> D
trCps  TrSpec
spec

    ifrq1 :: Sig
ifrq1 = 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 -> D
forall a. SigOrD a => a -> a
octave D
tune
    ifrq2 :: Sig
ifrq2 = Sig
1.5 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
ifrq1
    fullDur :: D
fullDur = D
0.7 D -> D -> D
forall a. Num a => a -> a -> a
* D
dur
    ishape :: D
ishape  = -D
30
    kenv1 :: Sig
kenv1 = [D] -> Sig
transeg [D
1,D
fullDurD -> D -> D
forall a. Num a => a -> a -> a
*D
0.3,D
ishape,D
0.2, D
fullDurD -> D -> D
forall a. Num a => a -> a -> a
*D
0.7,D
ishape,D
0.2]
    kenv2 :: Sig
kenv2 = D -> D -> D -> Sig
expon D
1 D
fullDur D
0.0005
    kenv :: Sig
kenv    = Sig
kenv1 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
kenv2
    amix :: SE Sig
amix    = Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
0.65 (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> SE Sig
rndPw Sig
0.5 Sig
ifrq1 SE Sig -> SE Sig -> SE Sig
forall a. Num a => a -> a -> a
+ Sig -> Sig -> SE Sig
rndPw Sig
0.5 Sig
ifrq2
    iLPF2 :: D
iLPF2 = D
10000
    kcf :: Sig
kcf   = [D] -> Sig
expseg [D
12000,D
0.07,D
iLPF2,D
1,D
iLPF2]
    alpf :: AtOut Sig Sig (SE Sig)
alpf    = (Sig -> Sig) -> SE Sig -> AtOut Sig Sig (SE Sig)
forall a b c. At a b c => (a -> b) -> c -> AtOut a b c
at (Sig -> Sig -> Sig
blp Sig
kcf) SE Sig
amix
    abpf :: AtOut Sig Sig (SE Sig)
abpf    = (Sig -> Sig) -> SE Sig -> AtOut Sig Sig (SE Sig)
forall a b c. At a b c => (a -> b) -> c -> AtOut a b c
at (\Sig
x -> Sig -> Sig -> Sig -> Sig
reson Sig
x Sig
ifrq2 Sig
25) SE Sig
amix
    ares :: SE Sig
ares    = Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul (Sig
0.08 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
kenv) (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ (Sig -> Sig) -> SE Sig -> AtOut Sig Sig (SE Sig)
forall a b c. At a b c => (a -> b) -> c -> AtOut a b c
at Sig -> Sig
dcblock2 (SE Sig -> AtOut Sig Sig (SE Sig))
-> SE Sig -> AtOut Sig Sig (SE Sig)
forall a b. (a -> b) -> a -> b
$ Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul (Sig
0.06 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
kenv1) SE Sig
abpf SE Sig -> SE Sig -> SE Sig
forall a. Num a => a -> a -> a
+ Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
0.5 SE Sig
alpf SE Sig -> SE Sig -> SE Sig
forall a. Num a => a -> a -> a
+ Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
0.9 SE Sig
amix

-- TODO clap

{-
instr 112 ;CLAP
  krelease  release       ;SENSE RELEASE OF THIS NOTE ('1' WHEN RELEASED, OTHERWISE ZERO)
  chnset  1-krelease,"Act12"                ;TURN ON ACTIVE LIGHT WHEN NOTE STARTS, TURN IT OFF WHEN NOTE ENDS
  iTimGap = 0.01        ;GAP BETWEEN EVENTS DURING ATTACK PORTION OF CLAP
  idur1   = 0.02        ;DURING OF THE THREE INITIAL 'CLAPS'
  idur2   = 2*i(gkdur12)      ;DURATION OF THE FOURTH, MAIN, CLAP
  idens   = 8000        ;DENSITY OF THE NOISE SIGNAL USED TO FORM THE CLAPS
  iamp1   = 0.5       ;AMPLITUDE OF AUDIO BEFORE BANDPASS FILTER IN OUTPUT
  iamp2   = 1       ;AMPLITUDE OF AUDIO AFTER BANDPASS FILTER IN OUTPUT
  if frac(p1)==0 then       ;IF THIS IS THE INITIAL NOTE (p1 WILL BE AN INTEGER)
   ;          del.  dur  env.shape
   event_i  "i", p1+0.1, 0,          idur1, p4  ;CALL THIS INSTRUMENT 4 TIMES. ADD A FRACTION ONTO p1 TO BE ABLE TO DIFFERENTIATE THESE SUBSEQUENT NOTES
   event_i  "i", p1+0.1, iTimGap,    idur1, p4
   event_i  "i", p1+0.1, iTimGap*2,  idur1, p4
   event_i  "i", p1+0.1, iTimGap*3,  idur2, p4
  else
   kenv transeg 1,p3,-25,0        ;AMPLITUDE ENVELOPE
   iamp random  0.7,1         ;SLIGHT RANDOMISATION OF AMPLITUDE
   anoise pinkish kenv*iamp
   iBPF     = 1100*octave(i(gktune12))  ;FREQUENCY OF THE BANDPASS FILTER
   ibw      = 2000*octave(i(gktune12))  ;BANDWIDTH OF THE BANDPASS FILTER
   iHPF     = 1000        ;FREQUENCY OF A HIGHPASS FILTER
   iLPF     = 1       ;SCALER FOR FREQUENCY OF A LOWPASS FILTER
   kcf  expseg  8000,0.07,1700,1,800,2,500,1,500  ;CREATE CUTOFF FREQUENCY ENVELOPE
   asig butlp anoise,kcf*iLPF       ;LOWPASS FILTER THE SOUND
   asig buthp asig,iHPF       ;HIGHPASS FILTER THE SOUND
   ares reson asig,iBPF,ibw,1       ;BANDPASS FILTER THE SOUND (CREATE A NEW SIGNAL)
   asig dcblock2  (asig*iamp1)+(ares*iamp2) ;MIX BANDPASS FILTERED AND NON-BANDPASS FILTERED SOUND ELEMENTS
   asig = asig*p4*i(gklevel12)*1.75*gklevel ;SCALE AMPLITUDE
   aL,aR  pan2  asig,i(gkpan12)       ;PAN MONOPHONIC SIGNAL
    outs  aL,aR         ;SEND AUDIO TO OUTPUTS
  endif
endin
-}

{-
clap ::  D -> D -> D -> Sig
clap dur tune cps =
  where
    iTimGap = 0.01
-}

marSpec :: TrSpec
marSpec :: TrSpec
marSpec = D -> TrSpec
cpsSpec D
450

maraca :: SE Sig
maraca :: SE Sig
maraca = TrSpec -> SE Sig
maraca' TrSpec
marSpec

maraca' ::  TrSpec -> SE Sig
maraca' :: TrSpec -> SE Sig
maraca' TrSpec
spec = Sig -> SE Sig
rndAmp (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Sig -> SE Sig
forall a. a -> SE a
addDur (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< SE Sig
anoise
  where
    dur :: D
dur   = TrSpec -> D
trDur  TrSpec
spec
    tune :: D
tune    = TrSpec -> D
trTune TrSpec
spec

    otune :: Sig
otune   = D -> Sig
sig (D -> Sig) -> D -> Sig
forall a b. (a -> b) -> a -> b
$ D -> D
forall a. SigOrD a => a -> a
octave D
tune
    iHPF :: Sig
iHPF  = Sig -> Sig -> Sig -> Sig
limit (Sig
6000 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
otune) Sig
20 (D -> Sig
sig D
getSampleRate Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ Sig
2)
    iLPF :: Sig
iLPF  = Sig -> Sig -> Sig -> Sig
limit (Sig
12000 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
otune) Sig
20 (D -> Sig
sig D
getSampleRate Sig -> Sig -> Sig
forall a. Fractional a => a -> a -> a
/ Sig
3)
    aenv :: Sig
aenv  = [D] -> Sig
expsega [D
0.4,D
0.014D -> D -> D
forall a. Num a => a -> a -> a
* D
dur,D
1,D
0.01 D -> D -> D
forall a. Num a => a -> a -> a
* D
dur, D
0.05, D
0.05 D -> D -> D
forall a. Num a => a -> a -> a
* D
dur, D
0.001]
    anoise :: SE Sig
anoise  = Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul Sig
aenv (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ (Sig -> Sig) -> SE Sig -> SE Sig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Sig -> Sig -> Sig
blp Sig
iLPF (Sig -> Sig) -> (Sig -> Sig) -> Sig -> Sig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sig -> Sig -> Sig
bhp Sig
iHPF) (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ Sig -> Sig -> SE Sig
noise Sig
0.75 Sig
0

hcSpec, mcSpec, lcSpec :: TrSpec

hcSpec :: TrSpec
hcSpec = D -> TrSpec
cpsSpec D
420
mcSpec :: TrSpec
mcSpec = D -> TrSpec
cpsSpec D
310
lcSpec :: TrSpec
lcSpec = D -> TrSpec
cpsSpec D
227

highConga, midConga, lowConga :: SE Sig

highConga :: SE Sig
highConga = TrSpec -> SE Sig
highConga' TrSpec
hcSpec
midConga :: SE Sig
midConga  = TrSpec -> SE Sig
midConga'  TrSpec
mcSpec
lowConga :: SE Sig
lowConga  = TrSpec -> SE Sig
lowConga'  TrSpec
lcSpec

-- high conga
-- cps = 420
highConga' :: TrSpec -> SE Sig
highConga' :: TrSpec -> SE Sig
highConga' = D -> TrSpec -> SE Sig
genConga D
0.22

-- cps = 310
midConga' :: TrSpec -> SE Sig
midConga' :: TrSpec -> SE Sig
midConga' = D -> TrSpec -> SE Sig
genConga D
0.33

-- cps = 227
lowConga' :: TrSpec -> SE Sig
lowConga' :: TrSpec -> SE Sig
lowConga' = D -> TrSpec -> SE Sig
genConga D
0.41

genConga :: D -> TrSpec -> SE Sig
genConga :: D -> TrSpec -> SE Sig
genConga D
dt TrSpec
spec = Sig -> SE Sig
rndAmp (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Sig -> SE Sig
forall a. a -> SE a
addDur (Sig -> SE Sig) -> SE Sig -> SE Sig
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< SE Sig
asig
  where
    dur :: D
dur   = TrSpec -> D
trDur  TrSpec
spec
    tune :: D
tune    = TrSpec -> D
trTune TrSpec
spec
    cps :: D
cps     = TrSpec -> D
trCps  TrSpec
spec

    ifrq :: D
ifrq = D
cps D -> D -> D
forall a. Num a => a -> a -> a
* D -> D
forall a. SigOrD a => a -> a
octave D
tune
    fullDur :: D
fullDur = D
dt D -> D -> D
forall a. Num a => a -> a -> a
* D
dur
    aenv :: Sig
aenv = [D] -> Sig
transeg [D
0.7,D
1D -> D -> D
forall a. Fractional a => a -> a -> a
/D
ifrq,D
1,D
1,D
fullDur,-D
6,D
0.001]
    afmod :: Sig
afmod = [D] -> Sig
expsega [D
3,D
0.25D -> D -> D
forall a. Fractional a => a -> a -> a
/D
ifrq,D
1]
    asig :: SE Sig
asig = Sig -> SE Sig -> SE Sig
forall a. SigSpace a => Sig -> a -> a
mul (-Sig
0.25 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
aenv) (SE Sig -> SE Sig) -> SE Sig -> SE Sig
forall a b. (a -> b) -> a -> b
$ Sig -> SE Sig
rndOsc (D -> Sig
sig D
ifrq Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
afmod)


-----------------------------------------------------
-- sampler

mkSam :: SE Sig -> Sam
mkSam :: SE Sig -> Sam
mkSam = Sig -> SE Sig -> Sam
forall a. ToSam a => Sig -> a -> Sam
limSam Sig
4

-- | Bass drum
bd :: Sam
bd :: Sam
bd = SE Sig -> Sam
mkSam SE Sig
bass

bd2 :: Sam
bd2 :: Sam
bd2 = SE Sig -> Sam
mkSam SE Sig
bass2

-- | Snare
sn1 :: Sam
sn1 :: Sam
sn1 = SE Sig -> Sam
mkSam SE Sig
snare

-- | Open hi-hat
ohh :: Sam
ohh :: Sam
ohh = Sig -> SE Sig -> Sam
forall a. ToSam a => Sig -> a -> Sam
limSam Sig
8 SE Sig
openHiHat

-- | Closed hi-hat
chh :: Sam
chh :: Sam
chh = SE Sig -> Sam
mkSam SE Sig
closedHiHat

-- | High tom
htom :: Sam
htom :: Sam
htom = SE Sig -> Sam
mkSam SE Sig
highTom

-- | Middle tom
mtom :: Sam
mtom :: Sam
mtom = SE Sig -> Sam
mkSam SE Sig
midTom

-- | Low tom
ltom :: Sam
ltom :: Sam
ltom = SE Sig -> Sam
mkSam SE Sig
lowTom

-- | Cymbal
cym :: Sam
cym :: Sam
cym = Sig -> SE Sig -> Sam
forall a. ToSam a => Sig -> a -> Sam
limSam Sig
8 SE Sig
cymbal

-- | Claves
cl :: Sam
cl :: Sam
cl = SE Sig -> Sam
mkSam SE Sig
claves

-- | Rim shot
rim :: Sam
rim :: Sam
rim = SE Sig -> Sam
mkSam SE Sig
rimShot

-- | Maracas
mar :: Sam
mar :: Sam
mar = SE Sig -> Sam
mkSam SE Sig
maraca

-- | High conga
hcon :: Sam
hcon :: Sam
hcon = SE Sig -> Sam
mkSam SE Sig
highConga

-- | Middle conga
mcon :: Sam
mcon :: Sam
mcon = SE Sig -> Sam
mkSam SE Sig
midConga

-- | Low conga
lcon :: Sam
lcon :: Sam
lcon = SE Sig -> Sam
mkSam SE Sig
lowConga

cbell :: Sam
cbell :: Sam
cbell = SE Sig -> Sam
mkSam SE Sig
cowbell

-- generic sam

mkSam' :: (t -> SE Sig) -> t -> Sam
mkSam' :: (t -> SE Sig) -> t -> Sam
mkSam' t -> SE Sig
f t
spec = SE Sig -> Sam
mkSam (SE Sig -> Sam) -> SE Sig -> Sam
forall a b. (a -> b) -> a -> b
$ t -> SE Sig
f t
spec

-- | Bass drum
bd' :: TrSpec -> Sam
bd' :: TrSpec -> Sam
bd' = (TrSpec -> SE Sig) -> TrSpec -> Sam
forall t. (t -> SE Sig) -> t -> Sam
mkSam' TrSpec -> SE Sig
bass'

bd2' :: TrSpec -> Sam
bd2' :: TrSpec -> Sam
bd2' = (TrSpec -> SE Sig) -> TrSpec -> Sam
forall t. (t -> SE Sig) -> t -> Sam
mkSam' TrSpec -> SE Sig
bass2'

-- | Snare
sn1' :: TrSpec -> Sam
sn1' :: TrSpec -> Sam
sn1' = (TrSpec -> SE Sig) -> TrSpec -> Sam
forall t. (t -> SE Sig) -> t -> Sam
mkSam' TrSpec -> SE Sig
snare'

-- | Open hi-hat
ohh' :: TrSpec -> Sam
ohh' :: TrSpec -> Sam
ohh' = (TrSpec -> SE Sig) -> TrSpec -> Sam
forall t. (t -> SE Sig) -> t -> Sam
mkSam' TrSpec -> SE Sig
openHiHat'

-- | Closed hi-hat
chh' :: TrSpec -> Sam
chh' :: TrSpec -> Sam
chh' = (TrSpec -> SE Sig) -> TrSpec -> Sam
forall t. (t -> SE Sig) -> t -> Sam
mkSam' TrSpec -> SE Sig
closedHiHat'

-- | High tom
htom' :: TrSpec -> Sam
htom' :: TrSpec -> Sam
htom' = (TrSpec -> SE Sig) -> TrSpec -> Sam
forall t. (t -> SE Sig) -> t -> Sam
mkSam' TrSpec -> SE Sig
highTom'

-- | Middle tom
mtom' :: TrSpec -> Sam
mtom' :: TrSpec -> Sam
mtom' = (TrSpec -> SE Sig) -> TrSpec -> Sam
forall t. (t -> SE Sig) -> t -> Sam
mkSam' TrSpec -> SE Sig
midTom'

-- | Low tom
ltom' :: TrSpec -> Sam
ltom' :: TrSpec -> Sam
ltom' = (TrSpec -> SE Sig) -> TrSpec -> Sam
forall t. (t -> SE Sig) -> t -> Sam
mkSam' TrSpec -> SE Sig
lowTom'

-- | Cymbal
cym' :: TrSpec -> Sam
cym' :: TrSpec -> Sam
cym' = (TrSpec -> SE Sig) -> TrSpec -> Sam
forall t. (t -> SE Sig) -> t -> Sam
mkSam' TrSpec -> SE Sig
cymbal'

-- | Claves
cl' :: TrSpec -> Sam
cl' :: TrSpec -> Sam
cl' = (TrSpec -> SE Sig) -> TrSpec -> Sam
forall t. (t -> SE Sig) -> t -> Sam
mkSam' TrSpec -> SE Sig
claves'

-- | Rim shot
rim' :: TrSpec -> Sam
rim' :: TrSpec -> Sam
rim' = (TrSpec -> SE Sig) -> TrSpec -> Sam
forall t. (t -> SE Sig) -> t -> Sam
mkSam' TrSpec -> SE Sig
rimShot'

-- | Maracas
mar' :: TrSpec -> Sam
mar' :: TrSpec -> Sam
mar' = (TrSpec -> SE Sig) -> TrSpec -> Sam
forall t. (t -> SE Sig) -> t -> Sam
mkSam' TrSpec -> SE Sig
maraca'

-- | High conga
hcon' :: TrSpec -> Sam
hcon' :: TrSpec -> Sam
hcon' = (TrSpec -> SE Sig) -> TrSpec -> Sam
forall t. (t -> SE Sig) -> t -> Sam
mkSam' TrSpec -> SE Sig
highConga'

-- | Middle conga
mcon' :: TrSpec -> Sam
mcon' :: TrSpec -> Sam
mcon' = (TrSpec -> SE Sig) -> TrSpec -> Sam
forall t. (t -> SE Sig) -> t -> Sam
mkSam' TrSpec -> SE Sig
midConga'

-- | Low conga
lcon' :: TrSpec -> Sam
lcon' :: TrSpec -> Sam
lcon' = (TrSpec -> SE Sig) -> TrSpec -> Sam
forall t. (t -> SE Sig) -> t -> Sam
mkSam' TrSpec -> SE Sig
lowConga'

-- | Cowbell
cbell' :: TrSpec -> Sam
cbell' :: TrSpec -> Sam
cbell' = (TrSpec -> SE Sig) -> TrSpec -> Sam
forall t. (t -> SE Sig) -> t -> Sam
mkSam' TrSpec -> SE Sig
cowbell'