@@ -20,11 +20,12 @@ def __init__(self, midiFilename):
2020 self .ticksPerBeat = headerData .ticksPerBeat
2121
2222 #maps running total of delta times to microsecondsPerQuarter
23- self . tempoChanges = TempoChanges ()
23+ tempoChanges = TempoChanges ()
2424 self .trackZeroEvents = []
2525 self .tracks = []
2626
27- deltaTimeTotal = 0
27+ deltaTimeTotal = 0
28+ self .msPerBeat = 500 #default 120 bpm
2829 #should be a track header
2930 event = self .eventDecoder .nextEvent ()
3031
@@ -36,7 +37,7 @@ def __init__(self, midiFilename):
3637 self .trackZeroEvents .append (event )
3738 if (event .eventClass == "Meta" and
3839 event .eventType == "SetTempo" ):
39- self . tempoChanges .addTempoChange (deltaTimeTotal , event )
40+ tempoChanges .addTempoChange (deltaTimeTotal , event )
4041
4142
4243 #read in each track
@@ -47,14 +48,42 @@ def __init__(self, midiFilename):
4748 #should be a track header
4849 event = self .eventDecoder .nextEvent ()
4950 trackData = TrackData (trackName )
51+ #set up tempoChanges
52+ tempoChanges .reset ()
53+ deltaTimeTotal = 0
54+ nextTotal = 0
55+ msTotal = 0 #current time in ms
56+ while (tempoChanges .hasMore () and
57+ tempoChanges .deltaTimeTotal () == 0 ):
58+ self .msPerBeat = tempoChanges .usPerQuarter ()* .001
59+ tempoChanges .findNext ()
60+ #add events
5061 while not (event .eventClass == "Meta"
5162 and event .eventType == "EndOfTrack" ):
5263 event = self .eventDecoder .nextEvent ()
64+ nextTotal = deltaTimeTotal + event .deltaTime
65+ #calcaute absolute start time for event in ms
66+ if self .isTicksPerBeat :
67+ while (tempoChanges .hasMore () and
68+ nextTotal > tempoChanges .deltaTimeTotal ()):
69+ msTotal = msTotal + ((tempoChanges .deltaTimeTotal () -
70+ deltaTimeTotal )* self .msPerBeat / self .ticksPerBeat )
71+ deltaTimeTotal = (tempoChanges .deltaTimeTotal () -
72+ deltaTimeTotal ) + deltaTimeTotal
73+ tempoChanges .findNext ()
74+ self .msPerBeat = tempoChanges .usPerQuarter ()* .001
75+ msTotal = (msTotal +
76+ ((nextTotal - deltaTimeTotal )* self .msPerBeat / self .ticksPerBeat ))
77+ else :
78+ msTotal = (event .deltaTime / self .ticksPerSecond )* .001
79+ #add event to trackData
80+ deltaTimeTotal = nextTotal
81+ event .setStartTime (msTotal )
5382 trackData .addEvent (event )
5483 self .tracks .append (trackData )
5584
5685#this line just for testing
57- MidiData ("testMidiFile .mid" )
86+ MidiData ("Magic Battle .mid" )
5887
5988
6089
0 commit comments