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 = doublePattern 0
lforsaw = doublePattern 1
lfosaw = doublePattern 2
lfopulse = doublePattern 3
lforand = doublePattern 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 d |+| lfo1rate r |+| lfo1amt a
lfo2 s d r a = lfo2shape s |+| lfo2dest d |+| lfo2rate r |+| lfo2amt a
lfo3 s d r a = lfo3shape s |+| lfo3dest d |+| lfo3rate r |+| lfo3amt a
lfo4 s d r a = lfo4shape s |+| lfo4dest d |+| lfo4rate r |+| lfo4amt a
mod1 s d a = mod1src s |+| mod1dst d |+| mod1amt a
mod2 s d a = mod2src s |+| mod2dst d |+| mod2amt a
mod3 s d a = mod3src s |+| mod3dst d |+| mod3amt a
mod4 s d a = mod4src s |+| mod4dst d |+| mod4amt a
doublePattern d = (p $ show d) :: Pattern Double
dosc1 = doublePattern 1
dosc2 = doublePattern 2
dosc = doublePattern 3
dmix = doublePattern 4
dnoise = doublePattern 5
dpw1 = doublePattern 6
dpw2 = doublePattern 7
dpw = doublePattern 8
dcut = doublePattern 9
dres = doublePattern 10
damod = doublePattern 11
dvca = doublePattern 12
dspread = doublePattern 13
dlfo1f = doublePattern 14
dlfo2f = doublePattern 15
dlfo3f = doublePattern 16
dlfo4f = doublePattern 17
dlfof = doublePattern 18
dlfo1a = doublePattern 19
dlfo2a = doublePattern 20
dlfo3a = doublePattern 21
dlfo4a = doublePattern 22
dlfoa = doublePattern 23
dfamt = doublePattern 24
dvamt = doublePattern 25
deamt = doublePattern 26
damt = doublePattern 27
dfatk = doublePattern 28
dvatk = doublePattern 29
deatk = doublePattern 30
datk = doublePattern 31
dfdcy = doublePattern 32
dvdcy = doublePattern 33
dedcy = doublePattern 34
ddcy = doublePattern 35
dfrel = doublePattern 36
dvrel = doublePattern 37
derel = doublePattern 38
drel = doublePattern 39
dmod1 = doublePattern 40
dmod2 = doublePattern 41
dmod3 = doublePattern 42
dmod4 = doublePattern 43
dfb = doublePattern 44
dsub1 = doublePattern 45
dsub2 = doublePattern 46
dfbgain = doublePattern 47
dslew = doublePattern 48
sseq1 = doublePattern 1
sseq2 = doublePattern 2
sseq3 = doublePattern 3
sseq4 = doublePattern 4
slfo1 = doublePattern 5
slfo2 = doublePattern 6
slfo3 = doublePattern 7
slfo4 = doublePattern 8
sfenv = doublePattern 9
svenv = doublePattern 10
seenv = doublePattern 11
spitchb = doublePattern 12
smodwh = doublePattern 13
saftert = doublePattern 14
sbreath = doublePattern 15
sfoot = doublePattern 16
sexpr = doublePattern 17
svel = doublePattern 18
snote = doublePattern 19
snoise = doublePattern 20
snare d p' = note p'
|+| osc1shape zero |+| osc1kbd zero
|+| osc2shape zero |+| osc2kbd zero
|+| noise one
|+| vrel d |+| vsus zero |+| vdcy d
|+| kcutoff (p "1")
|+| dur (p "0.01")
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"