module Sound.Tidal.Tetra where
import Sound.Tidal.Stream (makeI, makeF, (|+|), merge, OscPattern)
import Sound.Tidal.MIDI.Control
import Sound.Tidal.Parse
import Sound.Tidal.Pattern
import Control.Applicative
makeSeqTracks = concat $ map makeSeqTrack [0..3]
where makeSeqTrack t = map (makeSeqStep t) [0..15]
makeSeqStep t s = NRPN (makeName t s) (makeCC t s) (0, 127) 0 passThru
makeName t s = "seq" ++ (show $ t + 1) ++ "step" ++ (show $ s + 1)
makeCC t s = (t * 16) + (s + 120)
polysynth :: ControllerShape
polysynth = ControllerShape { params = ([
mrNRPN "osc1freq" 0 (0, 120) 0.2,
mrNRPN "osc1detune" 1 (0, 100) 0.5,
NRPN "osc1shape" 2 (0, 103) 1 passThru,
mNRPN "osc1glide" 3,
NRPN "osc1kbd" 4 (0, 1) 1 passThru,
mrNRPN "osc2freq" 5 (0, 120) 0.2,
mrNRPN "osc2detune" 6 (0, 100) 0.5,
NRPN "osc2shape" 7 (0, 103) 1 passThru,
mNRPN "osc2glide" 8,
NRPN "osc2kbd" 9 (0, 1) 1 passThru,
NRPN "oscsync" 10 (0, 1) 0 passThru,
NRPN "glidemode" 11 (0, 3) 0 passThru,
NRPN "oscslop" 12 (0, 5) 0 passThru,
mrNRPN "oscmix" 13 (0, 127) 0.5,
mNRPN "noise" 14,
mrNRPN "kcutoff" 15 (0, 164) 1,
mNRPN "kresonance" 16,
mNRPN "kamt" 17,
mNRPN "audiomod" 18,
NRPN "fpoles" 19 (0, 1) 1 passThru,
mrNRPN "famt" 20 (0, 254) 0.5,
mNRPN "fvel" 21,
mNRPN "fdel" 22,
mNRPN "fatk" 23,
mNRPN "fdcy" 24,
mNRPN "fsus" 25,
mNRPN "frel" 26,
mNRPN "vcavol" 27,
mNRPN "outspread" 28,
mrNRPN "vol" 29 (0, 127) 1,
mrNRPN "vamt" 30 (0, 127) 1,
mNRPN "vvel" 31,
mNRPN "vdel" 32,
mNRPN "vatk" 33,
mrNRPN "vdcy" 34 (0, 127) 0.5,
mrNRPN "vsus" 35 (0, 127) 0.5,
mNRPN "vrel" 36,
NRPN "lfo1rate" 37 (0, 166) 0 passThru,
NRPN "lfo1shape" 38 (0, 4) 0 passThru,
mNRPN "lfo1amt" 39,
NRPN "lfo1dest" 40 (0, 43) 0 passThru,
NRPN "lfo1sync" 41 (0, 1) 0 passThru,
NRPN "lfo2rate" 42 (0, 166) 0 passThru,
NRPN "lfo2shape" 43 (0, 4) 0 passThru,
mNRPN "lfo2amt" 44,
NRPN "lfo2dest" 45 (0, 43) 0 passThru,
NRPN "lfo2sync" 46 (0, 1) 0 passThru,
NRPN "lfo3rate" 47 (0, 166) 0 passThru,
NRPN "lfo3shape" 48 (0, 4) 0 passThru,
mNRPN "lfo3amt" 49,
NRPN "lfo3dest" 50 (0, 43) 0 passThru,
NRPN "lfo3sync" 51 (0, 1) 0 passThru,
NRPN "lfo4rate" 52 (0, 166) 0 passThru,
NRPN "lfo4shape" 53 (0, 4) 0 passThru,
mNRPN "lfo4amt" 54,
NRPN "lfo4dest" 55 (0, 43) 0 passThru,
NRPN "lfo4sync" 56 (0, 1) 0 passThru,
NRPN "emod" 57 (0, 43) 0 passThru,
mrNRPN "eamt" 58 (0, 254) 0.5,
mNRPN "evel" 59,
mNRPN "edel" 60,
mNRPN "eatk" 61,
mNRPN "edcy" 62,
mNRPN "esus" 63,
mNRPN "erel" 64,
NRPN "mod1src" 65 (0, 20) 0 passThru,
mrNRPN "mod1amt" 66 (0, 254) 0.5,
NRPN "mod1dst" 67 (0, 47) 0 passThru,
NRPN "mod2src" 68 (0, 20) 0 passThru,
mrNRPN "mod2amt" 69 (0, 254) 0.5,
NRPN "mod2dst" 70 (0, 47) 0 passThru,
NRPN "mod3src" 71 (0, 20) 0 passThru,
mrNRPN "mod3amt" 72 (0, 254) 0.5,
NRPN "mod3dst" 73 (0, 47) 0 passThru,
NRPN "mod4src" 74 (0, 20) 0 passThru,
mrNRPN "mod4amt" 75 (0, 254) 0.5,
NRPN "mod4dst" 76 (0, 47) 0 passThru,
NRPN "seq1dst" 77 (0, 47) 0 passThru,
NRPN "seq2dst" 78 (0, 47) 0 passThru,
NRPN "seq3dst" 79 (0, 47) 0 passThru,
NRPN "seq4dst" 80 (0, 47) 0 passThru,
mrNRPN "mwhl" 81 (0, 254) 0.5,
NRPN "mwhldst" 82 (0, 47) 0 passThru,
mrNRPN "aftt" 83 (0, 254) 0.5,
NRPN "afttdst" 84 (0, 47) 0 passThru,
mrNRPN "breath" 85 (0, 254) 0.5,
NRPN "breathdst" 86 (0, 47) 0 passThru,
mrNRPN "mvel" 87 (0, 254) 0.5,
NRPN "mveldst" 88 (0, 47) 0 passThru,
mrNRPN "foot" 89 (0, 254) 0.5,
NRPN "footdst" 90 (0, 47) 0 passThru,
NRPN "kbpm" 91 (30, 250) 0 passThru,
NRPN "clockdiv" 92 (0, 12) 0 passThru,
NRPN "bendrng" 93 (0, 12) 0 passThru,
NRPN "sqntrig" 94 (0, 4) 0 passThru,
NRPN "unisonkey" 95 (0, 5) 0 passThru,
NRPN "unisonmode" 96 (0, 4) 0 passThru,
NRPN "arpmode" 97 (0, 14) 0 passThru,
NRPN "erepeat" 98 (0, 1) 0 passThru,
NRPN "unison" 99 (0, 1) 0 passThru,
NRPN "arp" 100 (0, 1) 0 passThru,
NRPN "sqn" 101 (0, 1) 0 passThru,
NRPN "mcr1" 105 (0, 183) 0 passThru,
NRPN "mcr2" 106 (0, 183) 0 passThru,
NRPN "mcr3" 107 (0, 183) 0 passThru,
NRPN "mcr4" 108 (0, 183) 0 passThru,
mNRPN "fbgain" 110,
mrNRPN "btnfreq" 111 (0, 127) 0.25,
mrNRPN "btnvel" 112 (0, 127) 1,
NRPN "btnmode" 113 (0, 1) 0 passThru,
mNRPN "sub1vol" 114,
mNRPN "sub2vol" 115,
mNRPN "fbvol" 116,
mrNRPN "ksplitpoint" 118 (0, 127) 0.5,
NRPN "kmode" 119 (0, 2) 0 passThru,
mCC "notesoff" 123,
mCC "ccreset" 121,
mCC "damp" 64
] ++ makeSeqTracks),
duration = ("dur", 0.2),
velocity = ("vel", 0.5),
latency = 0.04
}
oscPolysynth = toOscShape polysynth
note = makeI oscPolysynth "note"
dur = makeF oscPolysynth "dur"
vel = makeF oscPolysynth "vel"
notesoff = makeF oscPolysynth "notesoff"
ccreset = makeF oscPolysynth "ccreset"
damp = makeF oscPolysynth "damp"
osc1freq = makeF oscPolysynth "osc1freq"
osc1detune = makeF oscPolysynth "osc1detune"
osc1shape = makeF oscPolysynth "osc1shape"
osc1glide = makeF oscPolysynth "osc1glide"
osc1kbd = makeF oscPolysynth "osc1kbd"
osc2freq = makeF oscPolysynth "osc2freq"
osc2detune = makeF oscPolysynth "osc2detune"
osc2shape = makeF oscPolysynth "osc2shape"
osc2glide = makeF oscPolysynth "osc2glide"
osc2kbd = makeF oscPolysynth "osc2kbd"
oscsync = makeF oscPolysynth "oscsync"
glidemode = makeF oscPolysynth "glidemode"
oscslop = makeF oscPolysynth "oscslop"
oscmix = makeF oscPolysynth "oscmix"
noise = makeF oscPolysynth "noise"
kcutoff = makeF oscPolysynth "kcutoff"
kresonance = makeF oscPolysynth "kresonance"
kamt = makeF oscPolysynth "kamt"
audiomod = makeF oscPolysynth "audiomod"
fpoles = makeF oscPolysynth "fpoles"
twopole = fpoles (p "0")
fourpole = fpoles (p "1")
famt = makeF oscPolysynth "famt"
fvel = makeF oscPolysynth "fvel"
fdel = makeF oscPolysynth "fdel"
fatk = makeF oscPolysynth "fatk"
fdcy = makeF oscPolysynth "fdcy"
fsus = makeF oscPolysynth "fsus"
frel = makeF oscPolysynth "frel"
vcavol = makeF oscPolysynth "vcavol"
outspread = makeF oscPolysynth "outspread"
vol = makeF oscPolysynth "vol"
vamt = makeF oscPolysynth "vamt"
vvel = makeF oscPolysynth "vvel"
vdel = makeF oscPolysynth "vdel"
vatk = makeF oscPolysynth "vatk"
vdcy = makeF oscPolysynth "vdcy"
vsus = makeF oscPolysynth "vsus"
vrel = makeF oscPolysynth "vrel"
lfo1rate = makeF oscPolysynth "lfo1rate"
lfo1shape = makeF oscPolysynth "lfo1shape"
lfo1amt = makeF oscPolysynth "lfo1amt"
lfo1dest = makeF oscPolysynth "lfo1dest"
lfo1sync = makeF oscPolysynth "lfo1sync"
lfo2rate = makeF oscPolysynth "lfo2rate"
lfo2shape = makeF oscPolysynth "lfo2shape"
lfo2amt = makeF oscPolysynth "lfo2amt"
lfo2dest = makeF oscPolysynth "lfo2dest"
lfo2sync = makeF oscPolysynth "lfo2sync"
lfo3rate = makeF oscPolysynth "lfo3rate"
lfo3shape = makeF oscPolysynth "lfo3shape"
lfo3amt = makeF oscPolysynth "lfo3amt"
lfo3dest = makeF oscPolysynth "lfo3dest"
lfo3sync = makeF oscPolysynth "lfo3sync"
lfo4rate = makeF oscPolysynth "lfo4rate"
lfo4shape = makeF oscPolysynth "lfo4shape"
lfo4amt = makeF oscPolysynth "lfo4amt"
lfo4dest = makeF oscPolysynth "lfo4dest"
lfo4sync = makeF oscPolysynth "lfo4sync"
emod = makeF oscPolysynth "emod"
eamt = makeF oscPolysynth "eamt"
evel = makeF oscPolysynth "evel"
edel = makeF oscPolysynth "edel"
eatk = makeF oscPolysynth "eatk"
edcy = makeF oscPolysynth "edcy"
esus = makeF oscPolysynth "esus"
erel = makeF oscPolysynth "erel"
mod1src = makeF oscPolysynth "mod1src"
mod1amt = makeF oscPolysynth "mod1amt"
mod1dst = makeF oscPolysynth "mod1dst"
mod2src = makeF oscPolysynth "mod2src"
mod2amt = makeF oscPolysynth "mod2amt"
mod2dst = makeF oscPolysynth "mod2dst"
mod3src = makeF oscPolysynth "mod3src"
mod3amt = makeF oscPolysynth "mod3amt"
mod3dst = makeF oscPolysynth "mod3dst"
mod4src = makeF oscPolysynth "mod4src"
mod4amt = makeF oscPolysynth "mod4amt"
mod4dst = makeF oscPolysynth "mod4dst"
seq1dst = makeF oscPolysynth "seq1dst"
seq2dst = makeF oscPolysynth "seq2dst"
seq3dst = makeF oscPolysynth "seq3dst"
seq4dst = makeF oscPolysynth "seq4dst"
mwhl = makeF oscPolysynth "mwhl"
mwhldst = makeF oscPolysynth "mwhldst"
aftt = makeF oscPolysynth "aftt"
afttdst = makeF oscPolysynth "afttdst"
breath = makeF oscPolysynth "breath"
breathdst = makeF oscPolysynth "breathdst"
mvel = makeF oscPolysynth "mvel"
mveldst = makeF oscPolysynth "mveldst"
foot = makeF oscPolysynth "foot"
footdst = makeF oscPolysynth "footdst"
bendrng = makeF oscPolysynth "bendrng"
kbpm = makeF oscPolysynth "kbpm"
clockdiv = makeF oscPolysynth "clockdiv"
sqntrig = makeF oscPolysynth "sqntrig"
unisonkey = makeF oscPolysynth "unisonkey"
unisonmode = makeF oscPolysynth "unisonmode"
arpmode = makeF oscPolysynth "arpmode"
erepeat = makeF oscPolysynth "erepeat"
unison = makeF oscPolysynth "unison"
arp = makeF oscPolysynth "arp"
sqn = makeF oscPolysynth "sqn"
mcr1 = makeF oscPolysynth "mcr1"
mcr2 = makeF oscPolysynth "mcr2"
mcr3 = makeF oscPolysynth "mcr3"
mcr4 = makeF oscPolysynth "mcr4"
fbgain = makeF oscPolysynth "fbgain"
btnfreq = makeF oscPolysynth "btnfreq"
btnvel = makeF oscPolysynth "btnvel"
btnmode = makeF oscPolysynth "btnmode"
sub1vol = makeF oscPolysynth "sub1vol"
sub2vol = makeF oscPolysynth "sub2vol"
fbvol = makeF oscPolysynth "fbvol"
ksplitpoint = makeF oscPolysynth "ksplitpoint"
kmode = makeF oscPolysynth "kmode"
knormal = kmode (p "0")
kstack = kmode (p "0.5")
ksplit = kmode (p "1")
seqtrack1 = map (makeF oscPolysynth . (\x -> "seq1step" ++ show x)) [1..16]
seqtrack2 = map (makeF oscPolysynth . (\x -> "seq2step" ++ show x)) [1..16]
seqtrack3 = map (makeF oscPolysynth . (\x -> "seq3step" ++ show x)) [1..16]
seqtrack4 = map (makeF oscPolysynth . (\x -> "seq4step" ++ show x)) [1..16]
seqpatterns p' = map onlyValues events
where arc' = arc p'
events = arc' (0,1)
onlyValues = \(_, _, a) -> p a
sqnp i t p' = foldr (|+|) i (zipWith ($) t patterns)
where patterns = seqpatterns p'
sqnp1 d p' = sqnp (seq1dst $ p $ show d) seqtrack1 p'
sqnp2 d p' = sqnp (seq2dst $ p $ show d) seqtrack2 p'
sqnp3 d p' = sqnp (seq3dst $ p $ show d) seqtrack3 p'
sqnp4 d p' = sqnp (seq4dst $ p $ show d) seqtrack4 p'
atk p' = vatk p' |+| fatk p' |+| eatk p'
dcy p' = vdcy p' |+| fdcy p' |+| edcy p'
sus p' = vsus p' |+| fsus p' |+| esus p'
rel p' = vrel p' |+| frel p' |+| erel p'
adsr a d s r = atk a |+| dcy d |+| sus s |+| rel r
asr a d r = atk a |+| dcy d |+| rel r
lfotri = 0
lforsaw = 1
lfosaw = 2
lfopulse = 3
lforand = 4
lrate r = ((min 150) . (max 0)) <$> p r
lstep s = ((min 166) . (max 151) . (+150)) <$> p s
lfo1 s d r a = lfo1shape s |+| lfo1dest (p $ show d) |+| lfo1rate r |+| lfo1amt a
lfo2 s d r a = lfo2shape s |+| lfo2dest (p $ show d) |+| lfo2rate r |+| lfo2amt a
lfo3 s d r a = lfo3shape s |+| lfo3dest (p $ show d) |+| lfo3rate r |+| lfo3amt a
lfo4 s d r a = lfo4shape s |+| lfo4dest (p $ show d) |+| lfo4rate r |+| lfo4amt a
mod1 s d a = mod1src (p $ show s) |+| mod1dst (p $ show d) |+| mod1amt a
mod2 s d a = mod2src (p $ show s) |+| mod2dst (p $ show d) |+| mod2amt a
mod3 s d a = mod3src (p $ show s) |+| mod3dst (p $ show d) |+| mod3amt a
mod4 s d a = mod4src (p $ show s) |+| mod4dst (p $ show d) |+| mod4amt a
dosc1 = 1
dosc2 = 2
dosc = 3
dmix = 4
dnoise = 5
dpw1 = 6
dpw2 = 7
dpw = 8
dcut = 9
dres = 10
damod = 11
dvca = 12
dspread = 13
dlfo1f = 14
dlfo2f = 15
dlfo3f = 16
dlfo4f = 17
dlfof = 18
dlfo1a = 19
dlfo2a = 20
dlfo3a = 21
dlfo4a = 22
dlfoa = 23
dfamt = 24
dvamt = 25
deamt = 26
damt = 27
dfatk = 28
dvatk = 29
deatk = 30
datk = 31
dfdcy = 32
dvdcy = 33
dedcy = 34
ddcy = 35
dfrel = 36
dvrel = 37
derel = 38
drel = 39
dmod1 = 40
dmod2 = 41
dmod3 = 42
dmod4 = 43
dfb = 44
dsub1 = 45
dsub2 = 46
dfbgain = 47
dslew = 48
sseq1 = 1
sseq2 = 2
sseq3 = 3
sseq4 = 4
slfo1 = 5
slfo2 = 6
slfo3 = 7
slfo4 = 8
sfenv = 9
svenv = 10
seenv = 11
spitchb = 12
smodwh = 13
saftert = 14
sbreath = 15
sfoot = 16
sexpr = 17
svel = 18
snote = 19
snoise = 20
snare d p' = note p'
|+| osc1shape zero |+| osc1kbd zero
|+| osc2shape zero |+| osc2kbd zero
|+| noise one
|+| vrel zero |+| vsus zero |+| vdcy d
|+| kcutoff (p "1")
|+| dur d
where zero = p "0"
one = p "1"
kick blp p' = note p'
|+| fourpole
|+| osc1shape zero |+| osc1kbd zero
|+| osc2shape zero |+| osc2kbd zero
|+| vsus zero |+| vdcy (p "0.95") |+| vrel (p "0.5")
|+| kresonance (p "0.99") |+| kcutoff zero
|+| eamt (p "0.8") |+| emod (p "9") |+| edcy blp
|+| dur (p "0.2")
where zero = p "0"