-
Notifications
You must be signed in to change notification settings - Fork 9
/
MidiRules.ahk
270 lines (208 loc) · 10.1 KB
/
MidiRules.ahk
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
; Last edited 12/18/2018 3:03 PM by genmce
;*************************************************
;* RULES - MIDI FILTERS -
; MIDI INPUT TO KEY PRESS
;*************************************************
/*
This section will deal with transforming midi; NoteOns, NoteOffs, Continuous Controllers and Program Change messages
You can
- Transform the midi input > computer keypress(s) like a macro.
- Transform the midi input > to some other type of midi output.
Both are possible in the same script.
This script does NOT, currently, pass the original midi messsage out.
There are a few ways to handle transformations
1. Set up a filter to detect correct type and data1 val - then run commands or
2. Set up filter after type filter (NoteOn, NoteOff, CC or PC) under that section below -
(Keep rules together under proper section, notes, cc, program change etc.
Keep them after the statusbyte has been determined.
Examples for each type of rule will be shown.
The example below is for note type message.)
Statusbyte between 128 and 159 ; see range of values for notemsg var defined in autoexec section. "in" used because ranges of note on and note off
{ ; beginning of note block
statusbyte between 128 and 143 ARE NOTE OFF'S
statusbyte between 144 and 159 ARE NOTE ON'S
statusbyte between 176 and 191 ARE CONTINUOS CONTROLLERS
statusbyte between 192 and 208 ARE PROGRAM CHANGE for data1 values
Remember:
NoteOn/Off data1 = note number, data2 = velocity of that note.
CC - data1 = cc #, data2 = cc value
Program Change - data1 = pc #, data2 - ignored
ifequal, data1, 20 ; if the note number coming in is note # 20
{
data1 := (do something in here) ; could be do something to the velocity(data2)
gosub, SendNote ; send the note out.
}
*/
/*
WHAT DO YOU REALLY WANT TO DO?
CONVERT MIDI TO KEYSTROKE? Line 45 this file
MODIFY MIDI INPUT AND SEND IT BACK OUT?
*/
;*****************************************************************
; Midi input is detected in Midi_In_Out_Lib -
; it automatically runs the MidiRules label
;*****************************************************************
MidiRules: ; This label is where midi input is modified or converted to keypress.
;*****************************************************************
; EXAMPLE OF MIDI TO KEYPRESS -
;*****************************************************************
;if (stb = "NoteOn" And data1 = "36") ; Example - if msg is midi noteOn AND note# 36 - trigger msg box - could trigger keycommands
{
; MsgBox, 0, , Note %data1%, 1 ; show the msgbox with the note# for 1 sec
;msgbox,,,midirules %CC_num%,1
;UNCOMMENT LINE BELOW TO SEND A KEYPRESS WHEN NOTE 36 IS RECEIVED
;send , {NumLock} ; send a keypress when note number 20 is received.
; }
;*****************************************************************
; Compare statusbyte of recieved midi msg to determine type of
; You could write your methods under which ever type of midi you want to convert
; RETHINK HOW THESE ARE ORGANIZED AND MAYBE TO IT BY LINE
;*****************************************************************
; =============== Is midi input a Note On or Note off message? ===============
; If statusbyte between 128 and 159 ; see range of values for notemsg var defined in autoexec section. "in" used because ranges of note on and note off
; { ; beginning of note block
if statusbyte between 144 and 159 ; detect if note message is "note on"
;*****************************************************************
; PUT ALL "NOTE ON" TRANSFORMATIONS HERE
;*****************************************************************
;ifequal, data1, 57 ; if the note number coming in is note # 20
{
;MsgBox, 64, Note on Note = %data1%, Note %data1%, 1
;data1 := (data1 +1) ; transpose that note up 1 note number
gosub, RelayNote ; send the note out.
}
; =============== END OF NOTE ON MESSAGES ; ===============
if statusbyte between 128 and 143 ; detect if note message is "note off"
;*****************************************************************
; PUT ALL NOTE OFF TRANSFORMATIONS HERE
;*****************************************************************
;gosub, ShowMidiInMessage
;GuiControl,12:, MidiMsOut, noteOff:%statusbyte% %chan% %data1% %data2% ; display note off in gui
; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! above end of no edit
; =============== add your note MidiRules here ==; ===============
{
}
/*
Write your own note filters and put them in this section.
Remember data1 for a noteon/off is the note number, data2 is the velocity of that note.
example
ifequal, data1, 20 ; if the note number coming in is note # 20
{
data1 := (do something in here) ; could be do something to the velocity(data2)
gosub, SendNote ; send the note out.
}
*/
; ++++++++++++++++++++++++++++++++ examples of note rules ++++++++++ feel free to add more.
/*
;*****************************************************************
; ANOTHER MIDI TO KEYPRESS EXAMPLE
;*****************************************************************
ifequal, data1, 30 ; if the note number coming in is note # 30
{
send , {NumLock} ; send a keypress when note number 20 is received.
}
; a little more complex filter two notes
if ((data1 != 60) and (data1 != 62)) ; if note message is not(!) 60 and not(!) 62 send the note out - ie - do nothing except statements above (note 20 and 30 have things to do) to it.
{
gosub, SendNote ; send it out the selected output midi port
;msgbox, ,straight note, note %data1% message, 1 ; this messagebox for testing only.
}
IfEqual, data1, 60 ; if the note number is middle C (60) (you can change this)
{
data1 := (data1 + 5) ;transpost up 5 steps
gosub, SendNote ;(h_midiout, note) ;send a note transposed up 5 notes.
;msgbox, ,transpose up 5, note on %data1% message, 1 ; for testing only - show msgbox for 1 sec
}
IfEqual, data1, 62 ; if note on is note number 62 (just another example of note detection)
{
data1 := (data1 -5) ;transpose down 5 steps
gosub, SendNote
;msgbox, ,transpose down 5, note on %data1% message, 1 ; for testing only, uncomment if you need it.
}
; ++++++++++++++++++++++++++++++++ End of examples of note rules ++++++++++
;}
*/
; =============== IS INCOMING MIDI MESSAGE A CC? ----
;*****************************************************************
; IS INCOMING MSG IS A CC?
;*****************************************************************
if statusbyte between 176 and 191 ; check status byte for cc 176-191 is the range for CC messages
{
;MsgBox,,,,1
;*****************************************************************
; PUT ALL CC TRANSFORMATIONS HERE
;*****************************************************************
;++++++++++++++++++++++++++++++++ examples of CC rules ++++++++++ feel free to add more.
IfEqual, data1, 7
{
; msgbox, ,,7,1
CC_num := (data1 + 3) ; Will change all cc#'s up 3 for a different controller number
;CCintVal = data2
gosub, RelayCC
return
}
ifEqual, data1, 20
{
CC_num := 60
; MsgBox,,,20,1
gosub, RelayCC
return
}
Else
{
CC_num := data1
gosub, RelayCC ; relay message unchanged
; MsgBox,,,else %data1%,1
return
}
; ++++++++++++++++++++++++++++++++ examples of cc rules ends ++++++++++++
}
;*****************************************************************
; IS INCOMING MSG A PROGRAM CHANGE MESSAGE?
;*****************************************************************
if statusbyte between 192 and 208 ; check if message is in range of program change messages for data1 values. ; !!!!!!!!!!!! no edit
{
;*****************************************************************
; PUT ALL PC TRANSFORMATIONS HERE
;*****************************************************************
; ++++++++++++++++++++++++++++++++ examples of program change rules ++++++++++
; Sorry I have not created anything for here nor for pitchbends....
;GuiControl,12:, MidiMsOut, ProgC:%statusbyte% %chan% %data1% %data2%
;gosub, ShowMidiInMessage
gosub, sendPC
; need something for it to do here, could be converting to a cc or a note or changing the value of the pc
; however, at this point the only thing that happens is the gui change, not midi is output here.
; you may want to make a SendPc: label below
; ++++++++++++++++++++++++++++++++ examples of program change rules ++++++++++
}
;msgbox filter triggered
; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ end of edit section
}
Return
/* =============================
THIS SECTION MOVED
;*************************************************
;* MIDI OUTPUT LABELS TO CALL
;*************************************************
SendNote: ;(h_midiout,Note) ; send out note messages ; this should probably be a funciton but... eh.
;{
;GuiControl,12:, MidiMsOutSend, NoteOut:%statusbyte% %chan% %data1% %data2%
;global chan, EventType, NoteVel
;MidiStatus := 143 + chan
note = %data1% ; this var is added to allow transpostion of a note
midiOutShortMsg(h_midiout, statusbyte, note, data2) ; call the midi funcitons with these params.
gosub, ShowMidiOutMessage
Return
SendCC: ; not sure i actually did anything changing cc's here but it is possible.
;GuiControl,12:, MidiMsOutSend, CCOut:%statusbyte% %chan% %cc% %data2%
midiOutShortMsg(h_midiout, statusbyte, cc, data2)
;MsgBox, 0, ,sendcc triggered , 1
Return
SendPC:
gosub, ShowMidiOutMessage
;GuiControl,12:, MidiMsOutSend, ProgChOut:%statusbyte% %chan% %data1% %data2%
midiOutShortMsg(h_midiout, statusbyte, pc, data2)
;COULD BE TRANSLATED TO SOME OTHER MIDI MESSAGE IF NEEDED.
Return
;==========================================
*/