-- | Ready to use instruments.
--
-- An instrument takes in a note (@N@ which is shortcut for @CsdNote Unit@
-- or @Dr@ which is shortcut for @CsdDrum Unit@) and procuces a signal.
-- We can use instruments with functions 'Csound.notes' and 'Csound.drums'.
--
-- > import Csound
-- > import Csound.Patch(stringPad)
-- >
-- > -- | Plays C-major chord.
-- > main = dac $ mul 0.2 $ smallHall $ mix $ notes stringPad $
-- > str 0.5 $ mel [c, e, g, str 4 $ har [c, e, g, high c], rest 4]
--
-- Let's explain the functions:
--
-- > -- dac -- sends signal to speakers
-- > --
-- > -- mul -- scales the signal
-- > --
-- > -- smallHall -- adds a reverb
-- > --
-- > -- mix -- mixes several tracks to a single signal
-- > --
-- > -- notes -- applies an instrument to the notes
-- > --
-- > -- stringPad -- predefined instrument
-- > --
-- > -- str -- stretch the notes in time domain
-- > --
-- > -- mel, har -- sequential and parallel composition of the notes
-- > --
-- > -- c, e, g -- notes in western notation (a, b, c, d, ...), a is 440 Hz
-- > --
-- > -- high -- an octave higher
-- > --
-- > -- rest -- pause for a given amount of time
module Csound.Patch(
-- * Pads
stringPad, phasingSynth, pulseWidthPad,
melodica, tibetan,
-- * Mystic
sparkles, xanaduHarp,
-- * Lead
delaySaw, pulseWidth, toneWheel,
-- * Tech
okComp, OkCompParam(..), fmMod,
-- * Plucked
delayedStringLong, delayedStringShort,
plucked, xanadu1, xanadu2,
guitar, harpsichord, harpsichordHarp, plainString, plainStringHarp,
-- * Strike
noisyMarimba, dahina, banyan, xylophone,
spinelSphere, aluminumBar,
vibraphone1, vibraphone2, wineGlass, xing,
-- ** Bells
amBell, fmTubularBell, tubularBell, albertClockBellBelfast,
-- * Drums
dumb, dumbBass, pluckSnare, knockSweep, metalBoink,
snare, openHihat, closedHihat, bassDrum, crash, handClap,
bambooDr, guiroDr, tambourineDr, cabasaDr, crunchDr,
sleighbellsDr, sekereDr, sandpaperDr
) where
import Csound(N, Dr, CsdNote, CsdDrum)
import Csound.Base
import qualified Csound.Catalog.Wave as C
import qualified Csound.Catalog.Effect as C
import qualified Csound.Catalog.Reson as C
import qualified Csound.Catalog.Drum as C
import Csound.Converter
fade :: SigSpace a => D -> D -> (b -> a) -> (b -> a)
fade ris dec f = mul (fades ris dec) . f
--------------------------------------------------------------------
-- Padds
stringPad :: N -> Sig
stringPad = fade 0.5 1.5 $ fromAsFs C.stringPad
phasingSynth :: N -> Sig
phasingSynth = fade 0.3 1.5 $ fromAsFs C.phasingSynth
melodica :: N -> SE Sig
melodica = fade 0.5 2.5 $ fromFs $ C.melody 5
-- | Parameter is time of fade out in seconds.
tibetan :: D -> N -> Sig
tibetan dec = fade 1 dec $ fromF $ C.tibetan 9 0.02
pulseWidthPad :: N -> Sig
pulseWidthPad = fade 1 1.5 $ fromAsFs C.pulseWidth
--------------------------------------------------------------------
-- Mystic
sparkles :: N -> SE Sig
sparkles = fade 0.01 2.5 $ fromFs $ C.blue 3 8 0.5 15
xanaduHarp :: N -> SE Sig
xanaduHarp = fade 0.01 5 $ fromF C.xanadu1
--------------------------------------------------------------------
-- Lead
pulseWidth :: N -> Sig
pulseWidth = fade 0.1 0.1 $ fromAsFs C.pulseWidth
delaySaw :: N -> Sig
delaySaw = fade 0.1 0.2 $ fromFs $ C.delaySaw
toneWheel :: N -> Sig
toneWheel = fade 0.01 0.1 $ fromF C.toneWheel
--------------------------------------------------------------------
-- Tech
okComp :: CsdDrum OkCompParam -> SE Sig
okComp = fade 0.01 0.1 $ \(amp, OkCompParam rate) -> mul (sig amp) $ C.okComputer (sig rate)
newtype OkCompParam = OkCompParam { unOkCompParam :: D }
instance Tuple OkCompParam where
tupleMethods = makeTupleMethods OkCompParam unOkCompParam
instance Arg OkCompParam
instance Default OkCompParam where
def = OkCompParam 10
fmMod :: N -> Sig
fmMod = fade 0.01 0.1 $ fromFs $ C.fmMod 5
--------------------------------------------------------------------
-- Plucked
pick :: SigSpace b => D -> (a -> b) -> (a -> b)
pick dec = fade 0.01 dec
delayedStringLong :: N -> Sig
delayedStringLong = pick 2.5 $ fromF C.delayedString
delayedStringShort :: N -> Sig
delayedStringShort = pick 0.1 $ fromF C.delayedString
plucked :: N -> Sig
plucked = pick 0.3 $ fromFs C.rhodes
xanadu1 :: N -> SE Sig
xanadu1 = pick 1.5 $ fromF C.xanadu1
xanadu2 :: N -> SE Sig
xanadu2 = pick 0.8 $ fromF C.xanadu2
guitar :: N -> Sig
guitar = fade 0.05 2 $ fromF C.guitar
harpsichord :: N -> Sig
harpsichord = pick 0.2 $ fromF C.harpsichord
harpsichordHarp :: N -> Sig
harpsichordHarp = pick 5 $ fromF C.harpsichord
plainString :: N -> Sig
plainString = pick 0.5 $ fromF C.plainString
plainStringHarp :: N -> Sig
plainStringHarp = pick 5 $ fromF C.plainString
--------------------------------------------------------------------
-- Striked
strk :: SigSpace b => (a -> b) -> (a -> b)
strk = pick 2.5
noisyMarimba :: N -> SE Sig
noisyMarimba = strk $ fromFs C.blackMarimba
dahina :: N -> Sig
dahina = strk $ fromFs C.dahina
banyan :: N -> Sig
banyan = strk $ fromFs C.banyan
xylophone :: N -> Sig
xylophone = strk $ fromFs C.xylophone
spinelSphere :: N -> Sig
spinelSphere = strk $ fromFs C.spinelSphere
aluminumBar :: N -> Sig
aluminumBar = strk $ fromFs C.uniformAluminumBar
vibraphone1 :: N -> Sig
vibraphone1 = strk $ fromFs C.vibraphone1
vibraphone2 :: N -> Sig
vibraphone2 = strk $ fromFs C.vibraphone2
wineGlass :: N -> Sig
wineGlass = strk $ fromFs C.wineGlass
xing :: N -> Sig
xing = strk $ fromFs $ C.xing 3
-- Bells
bl :: SigSpace b => (a -> b) -> (a -> b)
bl = pick 4
amBell :: N -> Sig
amBell = bl $ fromAFs $ C.amBell
fmTubularBell :: N -> Sig
fmTubularBell = bl $ fromFs $ C.fmTubularBell
tubularBell :: N -> Sig
tubularBell = bl $ fromFs C.tubularBell
albertClockBellBelfast :: N -> Sig
albertClockBellBelfast = bl $ fromFs C.albertClockBellBelfast
--------------------------------------------------------------------
-- drums
dumb :: Dr -> SE Sig
dumb = fromDrum C.dumb
dumbBass :: Dr -> SE Sig
dumbBass = fromDrum C.dumbBass
pluckSnare :: Dr -> Sig
pluckSnare = fromDrum C.pluckSnare
knockSweep :: Dr -> SE Sig
knockSweep = fromDrum C.sortaKnockSweep
metalBoink :: Dr -> Sig
metalBoink = fromDrum C.metalBoink
snare :: Dr -> SE Sig
snare = fromDrum C.snare
openHihat :: Dr -> SE Sig
openHihat = fromDrum C.openHihat
closedHihat :: Dr -> SE Sig
closedHihat = fromDrum C.closedHihat
bassDrum :: D -> Dr -> Sig
bassDrum cps = fromDrum $ C.bassDrum cps
-- | Recommended values for frequency parameter @cpspch(13.03) - cpspch(13.10)@
crash :: D -> Dr -> SE Sig
crash cps = fromDrum $ C.crash cps
handClap :: D -> Dr -> SE Sig
handClap cps = fromDrum $ C.handClap cps
-- models
fromModel :: (Sig -> D -> Sig) -> Dr -> Sig
fromModel f (amp, _) = f (sig amp) 0.01
fromModelD :: (D -> D -> Sig) -> Dr -> Sig
fromModelD f (amp, _) = f amp 0.01
bambooDr :: Dr -> Sig
bambooDr = fromModel bamboo
guiroDr :: Dr -> Sig
guiroDr = fromModel guiro
tambourineDr :: Dr -> Sig
tambourineDr = fromModel tambourine
cabasaDr :: Dr -> Sig
cabasaDr = fromModelD cabasa
crunchDr :: Dr -> Sig
crunchDr = fromModelD crunch
sleighbellsDr :: Dr -> Sig
sleighbellsDr = fromModel sleighbells
sekereDr :: Dr -> Sig
sekereDr = fromModelD sekere
sandpaperDr :: Dr -> Sig
sandpaperDr = fromModelD sandpaper