packages feed

csound-catalog-0.7.4: src/Csound/Catalog/Drum/MiniPops.hs

-- |  Drums of the Korg Mini Pops 7 drum machine (recoded from  Iain McCurdy).
module Csound.Catalog.Drum.MiniPops(
  MpSpec(..),

  bass, snare1, snare2, rimShot, cymbal1, cymbal2, bongo1, bongo2, bongo3,
  claves, cowbell, guiro, maracas, quijada, tamb,

  -- * Generic
  bass', bdSpec, snare1', snSpec1, snare2', snSpec2, rimShot', rimSpec,
  cymbal1', cymSpec1, cymbal2', cymSpec2, bongo1', bonSpec1, bongo2', bonSpec2, bongo3', bonSpec3,
  claves', clSpec, cowbell', cowSpec, guiro', groSpec, maracas', marSpec, quijada', qjSpec, tamb', tamSpec,

  -- * Sample
  bd, sn1, sn2, rim, cym1, cym2, bon1, bon2, bon3, cl, cow, gro, mar, qj, tam,

  -- ** Generic
  bd', sn1', sn2', rim', cym1', cym2', bon1', bon2', bon3', cl', cow', gro', mar', qj', tam'
) where

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

data MpSpec = MpSpec {
    mpDur   :: D
  , mpCps   :: D
  , mpRnd     :: Maybe D }


rndAmp :: Sig -> SE Sig
rndAmp a = do
  k <- birnd 0.09
  return $ a * (1 + sig k)

addDur' :: D -> a -> SE a
addDur' dt x = xtratim dt >> return x

addDur :: a -> SE a
addDur = addDur' 0.1

toDrum :: Sig -> SE Sig
toDrum a = rndAmp =<< addDur a

defSpec :: D -> D -> MpSpec
defSpec dur cps = MpSpec
  { mpDur   = dur
  , mpCps   = cps
  , mpRnd   = Just 0.085 }

rndVal :: D -> D -> D -> SE D
rndVal total amount x = do
  k <- birnd amount
  return $ x  + k * total

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

rndDur amt x = rndVal x amt x
rndCps amt x = rndVal x (amt / 10) x

rndSpec :: MpSpec -> SE MpSpec
rndSpec spec = do
  dur  <- rndDur'
  cps  <- rndCps'
  return $ spec
    { mpDur  = dur
    , mpCps  = cps }
  where
    rndDur'  = (maybe return rndDur $ (mpRnd spec)) $ mpDur spec
    rndCps'  = (maybe return rndCps $ (mpRnd spec)) $ mpCps spec

rezz :: Sig -> Sig -> Sig
rezz cps bw = reson (mpulse 1 0) cps (cps * bw) `withD` 2

bass :: SE Sig
bass = bass' bdSpec

bdSpec :: MpSpec
bdSpec = defSpec 0.43 64

bass' :: MpSpec -> SE Sig
bass' spec = pureBass' =<< rndSpec spec

-- dur = 1.7
-- cps = 64
pureBass' :: MpSpec -> SE Sig
pureBass' spec = toDrum aout
  where
    dur = mpDur spec
    cps = sig $ mpCps spec

    aout = mul (env * 225 * fadeOut dur) $ lp1 500 $ rezz cps 0.001
    env  = transeg [1, dur, -14, 0]


snare1 :: SE Sig
snare1 = snare1' snSpec1

snSpec1 :: MpSpec
snSpec1 = defSpec 0.38 800

snare1' :: MpSpec -> SE Sig
snare1' spec = pureSnare1' =<< rndSpec spec

-- cps = 800
pureSnare1' :: MpSpec -> SE Sig
pureSnare1' spec = toDrum =<< (mul (fadeOut dur) $ aout)
  where
    dur = mpDur spec
    cps = mpCps spec

    anoise = pink
    asig   = fmap (\x -> reson x 6250 9000 `withD` 1) anoise
    aenv   = transeg [1, dur ,-5 , 0]
    asig1  = at (bhp 3000) $ mul aenv asig

    xdur   = 0.006
    astrike = osc (transeg [cps,xdur,-4,60])
    aenv2 = transeg [1,xdur,-2,0]
    astrike1 = aenv2 * astrike

    aout = fmap ((0.7 * astrike1) + ) $ mul 2 $ asig1

snare2 :: SE Sig
snare2 = snare2' snSpec2

snSpec2 :: MpSpec
snSpec2 = defSpec 0.4 800

snare2' :: MpSpec -> SE Sig
snare2' spec = pureSnare2' =<< rndSpec spec

pureSnare2' :: MpSpec -> SE Sig
pureSnare2' spec = toDrum =<< (mul (fadeOut dur) $ aout)
  where
    dur = mpDur spec
    cps = mpCps spec

    anoise = pink
    asig   = fmap (\x -> butbp x 5200 5200 `withD` 1) anoise
    aenv   = transeg [1, dur ,-8 , 0]
    asig1  = at (bhp 3000) $ mul aenv asig

    xdur   = 0.005
    astrike = osc (transeg [cps,xdur,-4,cps / 4])
    aenv2 = transeg [1,xdur,-2,0]
    astrike1 = aenv2 * astrike

    aout = fmap ((0.5 * astrike1) + ) $ mul 2.3 $ asig1


rimShot :: SE Sig
rimShot = rimShot' rimSpec

rimSpec :: MpSpec
rimSpec = defSpec 0.005 1700

rimShot' :: MpSpec -> SE Sig
rimShot' spec = pureRimShot' =<< rndSpec spec

-- cps = 1700
-- dur = 0.005
pureRimShot' :: MpSpec -> SE Sig
pureRimShot' spec = toDrum $ mul (fadeOut dur) $ asig
  where
    dur = mpDur spec
    cps = sig $ mpCps spec

    asig1 = osc' 0.2 cps
    asig2 = reson asig1 cps 1500 `withD` 2
    asig  = bhp 500 (asig1 + asig2 * 0.4 * 0.3)

cymbal1 :: SE Sig
cymbal1 = cymbal1' cymSpec1

cymSpec1 :: MpSpec
cymSpec1 = defSpec 0.304 6000

cymbal1' :: MpSpec -> SE Sig
cymbal1' spec = pureCymbal1' =<< rndSpec spec

-- dur = 0.304
-- cps = 6000
pureCymbal1' :: MpSpec -> SE Sig
pureCymbal1' spec = (toDrum =<< ) $ mul (fadeOut dur) $ do
  anoise <- white
  let asig1 = blp 14000 $ reson (anoise*aenv) icf (icf*0.7) `withD` 1
      asig2 = bhp 6000 $ (asig1 + anoise * 0.001)
  return $ 0.25 * aenv * asig2
  where
    dur = mpDur spec
    cps = sig $ mpCps spec

    aenv = transeg  [1,dur,-2,0]
    icf = cps


cymbal2 :: SE Sig
cymbal2 = cymbal2' cymSpec2

cymSpec2 :: MpSpec
cymSpec2 = defSpec 1.404 1000

cymbal2' :: MpSpec -> SE Sig
cymbal2' spec = pureCymbal2' =<< rndSpec spec

pureCymbal2' :: MpSpec -> SE Sig
pureCymbal2' spec = (toDrum =<< ) $ mul (fadeOut dur) $ do
  anoise <- white
  let asig = mul aenv $ bhp 6000 $ mul aenv $ lp1 12000 $ reson (anoise * aenv) icf (icf * 0.9) `withD` 1
  return $ astrike * 0.2 + asig * 1.5
  where
    dur = mpDur spec
    cps = mpCps spec

    icf = sig $ cps * 5
    aenv = transeg  [1,dur,-2,0]
    xdur = 0.004
    aenv2 = transeg [1,xdur,-2,0]
    astrike = mul aenv2 $ osc (transeg  [cps,xdur,-4,0.4*cps])

-- dur = 0.2
-- cps = 630
bongo1 :: SE Sig
bongo1 = bongo1' bonSpec1

bonSpec1 :: MpSpec
bonSpec1 = defSpec 0.2 630

bongo1' :: MpSpec -> SE Sig
bongo1' spec = pureBongo1' =<< rndSpec spec

pureBongo1' :: MpSpec -> SE Sig
pureBongo1' spec = toDrum $ mul (fadeOut dur) $ asig
  where
    dur = mpDur spec
    cps = sig $ mpCps spec

    asig = mul (4 * aenv ) $ blp 8000 $ bhp 300 $ rezz cps 0.03
    aenv = transeg  [1,dur,13,0]

bongo2 :: SE Sig
bongo2 = bongo2' bonSpec2

bonSpec2 :: MpSpec
bonSpec2 = defSpec 0.2 400

bongo2' :: MpSpec -> SE Sig
bongo2' spec = pureBongo2' =<< rndSpec spec

-- dur = 0.2
-- cps = 400
pureBongo2' :: MpSpec -> SE Sig
pureBongo2' spec = toDrum $ mul (fadeOut dur) $ asig
  where
    dur = mpDur spec
    cps = mpCps spec

    kcps =  expon cps dur (cps * 0.975)
    aenv =  transeg [1,dur-0.005,0,0.1,0.005,0, 0]
    asig = mul (4 * aenv) $ bhp 100 $ lp1 5000 $ rezz kcps 0.03


bongo3 :: SE Sig
bongo3 = bongo3' bonSpec3

bonSpec3 :: MpSpec
bonSpec3 = defSpec 1.229 194

bongo3' :: MpSpec -> SE Sig
bongo3' spec = pureBongo3' =<< rndSpec spec

-- dur = 1.229
-- cps = 194
pureBongo3' :: MpSpec -> SE Sig
pureBongo3' spec = toDrum $ mul (fadeOut dur) $ asig
  where
    dur = mpDur spec
    cps = sig $ mpCps spec

    aenv  = transeg [0, 0.001, -2, 1, dur-0.001, -2, 0]
    kbw   = linseg  [0.05,0.01,0.008]
    asig  = mul (5 * aenv) $ blp 11000 $ rezz cps kbw

claves :: SE Sig
claves = claves' clSpec

clSpec :: MpSpec
clSpec = defSpec 0.186 400

claves' :: MpSpec -> SE Sig
claves' spec = pureClaves' =<< rndSpec spec

pureClaves' :: MpSpec -> SE Sig
pureClaves' spec = toDrum aout
  where
    dur = mpDur spec
    cps = sig $ mpCps spec

    aenv = linseg [1, dur, 0]
    asig1 = rezz cps 0.025
    asig2 = rezz (cps * 5.45) 0.03
    aout  = mul (3.2 * aenv * fadeOut dur) $ asig1 + 1.3 * asig2

cowbell :: SE Sig
cowbell = cowbell' cowSpec

cowSpec :: MpSpec
cowSpec = defSpec 0.3 850

cowbell' :: MpSpec -> SE Sig
cowbell' spec = pureCowbell' =<< rndSpec spec

pureCowbell' :: MpSpec -> SE Sig
pureCowbell' spec = toDrum asig
  where
    dur = mpDur spec
    cps = sig $ mpCps spec

    asig = mul (aenv * 3 * fadeOut dur) $ bhp 100 $
        rezz cps 0.007
      + 0.8 * rezz (cps * 5.537) 0.03
    aenv = linseg [1, dur, 0]

guiro :: SE Sig
guiro = guiro' groSpec

groSpec :: MpSpec
groSpec = defSpec 0.256 66

guiro' :: MpSpec -> SE Sig
guiro' spec = pureGuiro' =<< rndSpec spec

pureGuiro' :: MpSpec -> SE Sig
pureGuiro' spec = toDrum asig
  where
    dur = mpDur spec
    cps = mpCps spec

    aenv =  linseg  [0,0.001,1,dur-0.111,0.6,0.1,1,0.01,0]
    asig = mul (3 * aenv * fadeOut dur) $ bhp 1000 $ reson (0.1 * sqr kcps) 4300 3000 `withD` 1
    kcps =  transeg [cps,dur,2,(1.1 * cps)]

maracas :: SE Sig
maracas = maracas' marSpec

marSpec :: MpSpec
marSpec = defSpec 0.05 5000

maracas' :: MpSpec -> SE Sig
maracas' spec = pureMaracas' =<< rndSpec spec

pureMaracas' :: MpSpec -> SE Sig
pureMaracas' spec = toDrum =<< do
  asig <- noise 1 0.04
  return $ mul (0.35 * aenv * fadeOut dur) $ bhp 2000 $ reson asig 9000 4000 `withD` 2
  where
    dur = mpDur spec
    aenv =  transeg [1,dur,-4,0]


quijada :: SE Sig
quijada = quijada' qjSpec

qjSpec :: MpSpec
qjSpec = defSpec 0.817 550

quijada' :: MpSpec -> SE Sig
quijada' spec = pureQuijada' =<< rndSpec spec

pureQuijada' :: MpSpec -> SE Sig
pureQuijada' spec = toDrum $ bhp cps $ mul (6 * fadeOut dur) $ phi dur (1/22.7272) + phi (dur * 0.39) (1/13.1579)
  where
    dur = mpDur spec
    cps = sig $ mpCps spec

    phi dt freq = mul kenv $ reson (mpulse  1 freq) 2727 400 `withD` 1
      where kenv = transeg  [0.8,0.05,1, 1,dt-0.05,-6,0]


tamb :: SE Sig
tamb = tamb' tamSpec

tamSpec :: MpSpec
tamSpec = defSpec 0.271 7000

tamb', pureTamb' :: MpSpec -> SE Sig

tamb' spec = pureTamb' =<< rndSpec spec

pureTamb' spec = toDrum =<< do
  anoise <- noise 1 0
  return $ mul (1.5 * aenv * fadeOut dur)
    $ reson (bhp cps $ (+ (anoise * 0.1 * aenv)) $ reson (anoise * aenv) 4600 100 `withD` 2) 9000 3000 `withD` 1
  where
    dur = mpDur spec
    cps = sig $ mpCps spec
    aenv = transeg  [1,dur,-8,0]

-------------------------------------------------------
-- Sampler

mkSam :: SE Sig -> Sam
mkSam = limSam 4

-- | Bass drum
bd :: Sam
bd = mkSam bass

-- | Snare 1
sn1 :: Sam
sn1 = mkSam snare1

-- | Snare 2
sn2 :: Sam
sn2 = limSam 2 snare2

-- | Rim shot
rim :: Sam
rim = limSam 1 rimShot

-- | Cymbal 1
cym1 :: Sam
cym1 = mkSam cymbal1

-- | Cymbal 2
cym2 :: Sam
cym2 = mkSam cymbal2

-- | Bongo 1
bon1 :: Sam
bon1 = mkSam bongo1

-- | Bongo 2
bon2 :: Sam
bon2 = mkSam bongo2

-- | Bongo 3
bon3 :: Sam
bon3 = mkSam bongo3

-- | Claves
cl :: Sam
cl = mkSam claves

-- | Cowbell
cow :: Sam
cow = mkSam cowbell

-- | Guiro
gro :: Sam
gro = mkSam guiro

-- | Maracas
mar :: Sam
mar = mkSam maracas

-- | Quijada
qj :: Sam
qj = mkSam quijada

-- | Tambourine
tam :: Sam
tam = mkSam tamb

mkSam' :: (t -> SE Sig) -> t -> Sam
mkSam' f spec = mkSam $ f spec

bd' :: MpSpec -> Sam
bd' = mkSam' bass'

sn1' :: MpSpec -> Sam
sn1' = mkSam' snare1'

sn2' :: MpSpec -> Sam
sn2' = mkSam' snare2'

rim' :: MpSpec -> Sam
rim' = mkSam' rimShot'

cym1' :: MpSpec -> Sam
cym1' = mkSam' cymbal1'

cym2' :: MpSpec -> Sam
cym2' = mkSam' cymbal2'

bon1' :: MpSpec -> Sam
bon1' = mkSam' bongo1'

bon2' :: MpSpec -> Sam
bon2' = mkSam' bongo2'

bon3' :: MpSpec -> Sam
bon3' = mkSam' bongo3'

cl' :: MpSpec -> Sam
cl' = mkSam' claves'

cow' :: MpSpec -> Sam
cow' = mkSam' cowbell'

gro' :: MpSpec -> Sam
gro' = mkSam' guiro'

mar' :: MpSpec -> Sam
mar' = mkSam' maracas'

qj' :: MpSpec -> Sam
qj' = mkSam' quijada'

tam' :: MpSpec -> Sam
tam' = mkSam' tamb'