88class MidiEventDecoder :
99 def __init__ (self , midiFilename ):
1010 self .midiParser = MidiParser (midiFilename )
11+ self .runningStatus = False
1112 return
1213 def hasMoreEvents (self ):
1314 return self .midiParser .hasMoreData ()
@@ -24,7 +25,9 @@ def nextEvent(self):
2425 def midiEvent (self , midiData ):
2526 #check if TrackHeader
2627 if midiData [0 :4 ] == b'MTrk' :
27- return TrackHeader (midiData )#MidiEvent(b'\x00', midiData)
28+ trackHeader = TrackHeader ()
29+ trackHeader .setFromBytes (midiData )
30+ return trackHeader
2831 #find deltaTime
2932 tempData = midiData
3033 temp = 0
@@ -43,11 +46,26 @@ def midiEvent(self, midiData):
4346 metaEvent .setDeltaTimeFromBytes (deltaTime )
4447 metaEvent .setFromBytes (midiData )
4548 return metaEvent
46- #return MetaEvent(Util.varLenVal(deltaTime), midiData)
4749 #System Event
4850 if midiData [0 :1 ] == b'\xf0 ' or midiData [0 :1 ] == b'\xf7 ' :
49- return SystemEvemt (Util .varLenVal (deltaTime ), midiData )
50- return ChannelEvent (Util .varLenVal (deltaTime ), midiData )
51+ systemEvent = SystemExclusiveEvent ()
52+ systemEvent .setDeltaTimeFromBytes (deltaTime )
53+ systemEvent .setFromBytes (midiData )
54+ return systemEvent
55+ #Channel Event
56+ if Util .msbIsOne (midiData ): #running status
57+ self .lastChannelStatusByte = midiData [0 ]
58+ else : #not running status
59+ midiData = self .lastChannelStatusByte + midiData
60+ channelEventIdentifier = midiData [0 ] & int ('f0' ,16 )
61+ if (channelEventIdentifier in EventDictionaries .CHANNEL_EVENT_DICTIONARY ):
62+ channelEventClass = EventDictionaries .CHANNEL_EVENT_DICTIONARY [channelEventIdentifier ]
63+ else :
64+ channelEventClass = ChannelEvent
65+ channelEvent = channelEventClass ()
66+ channelEvent .setDeltaTimeFromBytes (deltaTime )
67+ channelEvent .setFromBytes (midiData )
68+ return channelEvent
5169 def close (self ):
5270 self .midiParser .close ()
5371
0 commit comments