@@ -140,6 +140,11 @@ def has_flags(self, f):
140
140
# if f != f & FLAGS:
141
141
# raise ParseError('invalid flags')
142
142
return self .flags & f
143
+ def midifile_write (self , ch , msg ):
144
+ # ch: midi channel index, not midi channel # (index 0 of self.channels tuple item)
145
+ while ch >= len (self .ctx .midifile .tracks ):
146
+ self .ctx .midifile .tracks .append (mido .MidiTrack ())
147
+ self .ctx .midifile .tracks [ch ].append (msg )
143
148
def enable (self , v = True ):
144
149
was = v
145
150
if not was and v :
@@ -152,7 +157,10 @@ def stop(self):
152
157
for ch in self .channels :
153
158
status = (MIDI_CC << 4 ) + ch [1 ]
154
159
if self .ctx .showmidi : log (FG .YELLOW + 'MIDI: CC (%s, %s, %s)' % (status ,120 ,0 ))
155
- self .midi [ch [0 ]].write_short (status , 120 , 0 )
160
+ if self .ctx .midifile :
161
+ self .midifile_write (ch [0 ], mido .UnknownMetaMessage (status ,data = [120 , 0 ],time = self .us ()))
162
+ else :
163
+ self .midi [ch [0 ]].write_short (status , 120 , 0 )
156
164
if self .modval > 0 :
157
165
self .refresh ()
158
166
self .modval = False
@@ -161,7 +169,10 @@ def panic(self):
161
169
for ch in self .channels :
162
170
status = (MIDI_CC << 4 ) + ch [1 ]
163
171
if self .ctx .showmidi : log (FG .YELLOW + 'MIDI: CC (%s, %s, %s)' % (status ,123 ,0 ))
164
- self .midi [ch [0 ]].write_short (status , 123 , 0 )
172
+ if self .ctx .midifile :
173
+ self .midifile_write (ch [0 ], mido .UnknownMetaMessage (status , [123 , 0 ], time = self .us ()))
174
+ else :
175
+ self .midi [ch [0 ]].write_short (status , 123 , 0 )
165
176
if self .modval > 0 :
166
177
self .refresh ()
167
178
self .modval = False
@@ -183,9 +194,7 @@ def note_on(self, n, v=-1, sustain=False):
183
194
if (not self .ctx .muted or (self .ctx .muted and self .soloed ))\
184
195
and self .enabled and self .ctx .startrow == - 1 :
185
196
if self .ctx .midifile :
186
- while ch [0 ] >= len (self .ctx .midifile .tracks ):
187
- self .ctx .midifile .tracks .append (mido .MidiTrack ())
188
- self .ctx .midifile .tracks [ch [0 ]].append (mido .Message (
197
+ self .midifile_write (ch [0 ], mido .Message (
189
198
'note_on' ,note = n ,velocity = v ,time = self .us (),channel = ch [1 ]
190
199
))
191
200
else :
@@ -205,12 +214,10 @@ def note_off(self, n, v=-1):
205
214
self .notes [n ] = 0
206
215
self .sustain_notes [n ] = 0
207
216
if self .ctx .midifile :
208
- while ch [0 ] >= len (self .ctx .midifile .tracks ):
209
- self .ctx .midifile .tracks .append (mido .MidiTrack ())
210
- self .ctx .midifile .tracks [ch [0 ]].append (mido .Message (
217
+ self .midifile_write (ch [0 ], mido .Message (
211
218
'note_on' ,note = n ,velocity = 0 ,time = self .us (),channel = ch [1 ]
212
219
))
213
- self .ctx . midifile . tracks [ ch [0 ]]. append ( mido .Message (
220
+ self .midifile_write ( ch [0 ], mido .Message (
214
221
'note_off' ,note = n ,velocity = v ,time = self .us (),channel = ch [1 ]
215
222
))
216
223
@@ -261,13 +268,19 @@ def pitch(self, val): # [-1.0,1.0]
261
268
for ch in self .channels :
262
269
status = (MIDI_PITCH << 4 ) + ch [1 ]
263
270
if self .ctx .showmidi : log (FG .YELLOW + 'MIDI: PITCH (%s, %s)' % (val ,val2 ))
264
- self .midi [ch [0 ]].write_short (status ,val ,val2 )
271
+ if self .ctx .midifile :
272
+ self .midifile_write (ch [0 ],mido .UnknownMetaMessage (status ,data = [val1 ,val2 ], time = self .us ()))
273
+ else :
274
+ self .midi [ch [0 ]].write_short (status ,val ,val2 )
265
275
def cc (self , cc , val ): # control change
266
276
if type (val ) == type (bool ): val = 127 if val else 0 # allow cc bool switches
267
277
for ch in self .channels :
268
278
status = (MIDI_CC << 4 ) + ch [1 ]
269
279
if self .ctx .showmidi : log (FG .YELLOW + 'MIDI: CC (%s, %s, %s)' % (status , cc ,val ))
270
- self .midi [ch [0 ]].write_short (status ,cc ,val )
280
+ if self .ctx .midifile :
281
+ self .midifile_write (ch [0 ], mido .UnknownMetaMessage (status ,data = [cc ,val ],time = self .us ()))
282
+ else :
283
+ self .midi [ch [0 ]].write_short (status ,cc ,val )
271
284
self .ccs [cc ] = v
272
285
if cc == 1 :
273
286
self .modval = val
0 commit comments