-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBootTidal.hs
161 lines (147 loc) · 5.52 KB
/
BootTidal.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
:set -XOverloadedStrings
:set prompt ""
import Sound.Tidal.Context
import System.IO (hSetEncoding, stdout, utf8)
import qualified Control.Concurrent.MVar as MV
import qualified Sound.Tidal.Tempo as Tempo
import qualified Sound.OSC.FD as O
hSetEncoding stdout utf8
:{
linlin slo shi dlo dhi value =
let norm = (value - slo) / shi
in dlo + norm * (dhi - dlo)
:}
:{
let renoise = Target {
oName="renoise",
oAddress="127.0.0.1",
oPort=8000,
oLatency=0.2,
oSchedule=Live,
oWindow=Nothing,
oBusPort=Nothing,
oHandshake=False
}
formats = [
-- send note_on event
OSC "/renoise/trigger/note_on" $ ArgList [
("instrument", Just $ VI (-1)),
("track", Just $ VI (-1)),
("note", Nothing),
("velocity", Just $ VI 127)
],
-- send note_off event (not very useful if you ask me)
OSC "/renoise/trigger/note_off" $ ArgList [
("sound", Just $ VI (-1)),
("track", Just $ VI (-1)),
("noteOff", Nothing)
],
-- instrument macro controls
OSC "/renoise/song/instrument/{instrument}/macro1" $ ArgList [("m1", Nothing)],
OSC "/renoise/song/instrument/{instrument}/macro2" $ ArgList [("m2", Nothing)],
OSC "/renoise/song/instrument/{instrument}/macro3" $ ArgList [("m3", Nothing)],
OSC "/renoise/song/instrument/{instrument}/macro4" $ ArgList [("m4", Nothing)],
OSC "/renoise/song/instrument/{instrument}/macro5" $ ArgList [("m5", Nothing)],
OSC "/renoise/song/instrument/{instrument}/macro6" $ ArgList [("m6", Nothing)],
OSC "/renoise/song/instrument/{instrument}/macro7" $ ArgList [("m7", Nothing)],
OSC "/renoise/song/instrument/{instrument}/macro8" $ ArgList [("m8", Nothing)],
-- set device parameters (effects)
OSC "/renoise/song/track/{track}/device/{device}/set_parameter_by_name" $ ArgList [
("param", Nothing),
("value", Nothing)
]
]
-- use t1 .. t8 to select the track
track = pI "track"
-- sound to select an instrument
sound = pI "instrument"
s = sound
-- triggers note_on event
note = pI "note"
n = note
-- triggers note_off event
noteOff = pI "noteOff"
-- gain controls velocity, remapping from [0 1] to [0 127]
-- gain = pF "velocity" . linlin 0 1 0 127
-- instument macros
m1 = pF "m1"
m2 = pF "m2"
m3 = pF "m3"
m4 = pF "m4"
m5 = pF "m5"
m6 = pF "m6"
m7 = pF "m7"
m8 = pF "m8"
-- device params
device = pI "device"
dev = device
param = pS "param"
par = param
value = pF "value"
val = value
-- redefining octave. use it with operator |+ instead of #
octave = \p -> note (p |* 12)
oscmap = [(renoise, formats)]
:}
tidal <- startStream defaultConfig oscmap
-- total latency = oLatency + cFrameTimespan
-- tidal <- startTidal (superdirtTarget {oLatency = 0.1, oAddress = "127.0.0.1", oPort = 57120}) (defaultConfig {cFrameTimespan = 1/20})
:{
let only = (hush >>)
p = streamReplace tidal
hush = streamHush tidal
panic = do hush
once $ sound "superpanic"
list = streamList tidal
mute = streamMute tidal
unmute = streamUnmute tidal
unmuteAll = streamUnmuteAll tidal
solo = streamSolo tidal
unsolo = streamUnsolo tidal
once = streamOnce tidal
first = streamFirst tidal
asap = once
nudgeAll = streamNudgeAll tidal
all = streamAll tidal
resetCycles = streamResetCycles tidal
setcps = asap . cps
getcps = do tempo <- MV.readMVar $ sTempoMV tidal
return $ Tempo.cps tempo
getnow = do tempo <- MV.readMVar $ sTempoMV tidal
now <- O.time
return $ fromRational $ Tempo.timeToCycles tempo now
xfade i = transition tidal True (Sound.Tidal.Transition.xfadeIn 4) i
xfadeIn i t = transition tidal True (Sound.Tidal.Transition.xfadeIn t) i
histpan i t = transition tidal True (Sound.Tidal.Transition.histpan t) i
wait i t = transition tidal True (Sound.Tidal.Transition.wait t) i
waitT i f t = transition tidal True (Sound.Tidal.Transition.waitT f t) i
jump i = transition tidal True (Sound.Tidal.Transition.jump) i
jumpIn i t = transition tidal True (Sound.Tidal.Transition.jumpIn t) i
jumpIn' i t = transition tidal True (Sound.Tidal.Transition.jumpIn' t) i
jumpMod i t = transition tidal True (Sound.Tidal.Transition.jumpMod t) i
mortal i lifespan release = transition tidal True (Sound.Tidal.Transition.mortal lifespan release) i
interpolate i = transition tidal True (Sound.Tidal.Transition.interpolate) i
interpolateIn i t = transition tidal True (Sound.Tidal.Transition.interpolateIn t) i
clutch i = transition tidal True (Sound.Tidal.Transition.clutch) i
clutchIn i t = transition tidal True (Sound.Tidal.Transition.clutchIn t) i
anticipate i = transition tidal True (Sound.Tidal.Transition.anticipate) i
anticipateIn i t = transition tidal True (Sound.Tidal.Transition.anticipateIn t) i
forId i t = transition tidal False (Sound.Tidal.Transition.mortalOverlay t) i
t1 = p 1 . (|< track 1)
t2 = p 2 . (|< track 2)
t3 = p 3 . (|< track 3)
t4 = p 4 . (|< track 4)
t5 = p 5 . (|< track 5)
t6 = p 6 . (|< track 6)
t7 = p 7 . (|< track 7)
t8 = p 8 . (|< track 8)
:}
:{
let setI = streamSetI tidal
setF = streamSetF tidal
setS = streamSetS tidal
setR = streamSetR tidal
setB = streamSetB tidal
:}
:set prompt "tidal> "
:set prompt-cont ""