Skip to content

Commit c9d8f3d

Browse files
committed
more work on midifile support (still incomplete)
1 parent 7b27188 commit c9d8f3d

File tree

2 files changed

+29
-16
lines changed

2 files changed

+29
-16
lines changed

textbeat/player.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -515,11 +515,11 @@ def run(self):
515515
if self.midifile:
516516
if not self.midifile.tracks:
517517
self.midifile.tracks.append(mido.MidiTrack())
518-
# self.midifile.tracks[0].append(mido.MetaMessage(
519-
# 'set_tempo', tempo=mido.bpm2tempo(int(
520-
# val.split('x')[0]
521-
# ))
522-
# ))
518+
self.midifile.tracks[0].append(mido.MetaMessage(
519+
'set_tempo', tempo=mido.bpm2tempo(int(
520+
val.split('x')[0]
521+
))
522+
))
523523
self.row += 1
524524
continue
525525

textbeat/track.py

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,11 @@ def has_flags(self, f):
140140
# if f != f & FLAGS:
141141
# raise ParseError('invalid flags')
142142
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)
143148
def enable(self, v=True):
144149
was = v
145150
if not was and v:
@@ -152,7 +157,10 @@ def stop(self):
152157
for ch in self.channels:
153158
status = (MIDI_CC<<4) + ch[1]
154159
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)
156164
if self.modval>0:
157165
self.refresh()
158166
self.modval = False
@@ -161,7 +169,10 @@ def panic(self):
161169
for ch in self.channels:
162170
status = (MIDI_CC<<4) + ch[1]
163171
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)
165176
if self.modval>0:
166177
self.refresh()
167178
self.modval = False
@@ -183,9 +194,7 @@ def note_on(self, n, v=-1, sustain=False):
183194
if (not self.ctx.muted or (self.ctx.muted and self.soloed))\
184195
and self.enabled and self.ctx.startrow==-1:
185196
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(
189198
'note_on',note=n,velocity=v,time=self.us(),channel=ch[1]
190199
))
191200
else:
@@ -205,12 +214,10 @@ def note_off(self, n, v=-1):
205214
self.notes[n] = 0
206215
self.sustain_notes[n] = 0
207216
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(
211218
'note_on',note=n,velocity=0,time=self.us(),channel=ch[1]
212219
))
213-
self.ctx.midifile.tracks[ch[0]].append(mido.Message(
220+
self.midifile_write(ch[0], mido.Message(
214221
'note_off',note=n,velocity=v,time=self.us(),channel=ch[1]
215222
))
216223

@@ -261,13 +268,19 @@ def pitch(self, val): # [-1.0,1.0]
261268
for ch in self.channels:
262269
status = (MIDI_PITCH<<4) + ch[1]
263270
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)
265275
def cc(self, cc, val): # control change
266276
if type(val) ==type(bool): val = 127 if val else 0 # allow cc bool switches
267277
for ch in self.channels:
268278
status = (MIDI_CC<<4) + ch[1]
269279
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)
271284
self.ccs[cc] = v
272285
if cc==1:
273286
self.modval = val

0 commit comments

Comments
 (0)