Skip to content

Commit fa98ee3

Browse files
committed
style cleanup
1 parent 089b573 commit fa98ee3

File tree

9 files changed

+574
-304
lines changed

9 files changed

+574
-304
lines changed

MidiData.py

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,70 +3,92 @@
33
from TrackData import TempoChanges
44
from MidiEvents import *
55

6-
#contains the finalized data after anylisis
6+
7+
# contains the finalized data after analysis
78
class MidiData:
89
def __init__(self, midiFilename):
910
self.eventDecoder = MidiEventDecoder(midiFilename)
1011
headerData = self.eventDecoder.headerData()
11-
#variables
12+
# variables
1213
self.format = headerData.formatType
1314
self.numTracks = headerData.numTracks
1415
self.isTicksPerBeat = False
15-
if headerData.ticksPerBeat == None:
16+
if headerData.ticksPerBeat is None:
1617
self.isTicksPerBeat = False
1718
self.ticksPerSecond = (headerData.framesPerSecond *
1819
headerData.ticksPerFrame)
1920
else:
2021
self.isTicksPerBeat = True
2122
self.ticksPerBeat = headerData.ticksPerBeat
2223

23-
#maps running total of delta times to microsecondsPerQuarter
24+
if headerData.formatType != 1:
25+
raise NotSupportedException("Midi files of format " + str(headerData.formatType)
26+
+ " are not supported")
27+
28+
# maps running total of delta times to microsecondsPerQuarter
2429
tempoChanges = TempoChanges()
2530
self.tracks = []
2631

27-
deltaTimeTotal = 0
28-
self.msPerBeat = 500 #default 120 bpm
32+
self.msPerBeat = 500 # default 120 bpm
2933

30-
#read in each track
31-
tracknum = 0 #used to create temporary track names
34+
# read in each track
35+
tracknum = 0 # used to create temporary track names
3236
while self.eventDecoder.hasMoreEvents():
3337
trackName = "Track" + str(tracknum)
34-
tracknum = tracknum + 1
35-
#should be a track header
38+
tracknum += 1
3639
trackData = TrackData(trackName)
40+
# should be a track header
3741
event = self.eventDecoder.nextEvent()
38-
#set up tempoChanges
42+
if not(isinstance(event, TrackHeader)):
43+
raise UnexpectedEventException(event, TrackHeader())
44+
# set up tempoChanges
3945
tempoChanges.reset()
40-
self.msPerBeat = 500 #default 120 bpm
46+
self.msPerBeat = 500 # default 120 bpm
4147
deltaTimeTotal = 0
42-
nextTotal = 0
43-
msTotal = 0 #current time in ms
44-
#add events
48+
msTotal = 0 # current time in ms
49+
# add events
4550
while not(isinstance(event, EndOfTrackEvent)):
4651
event = self.eventDecoder.nextEvent()
47-
if (isinstance(event, SetTempoEvent)):
52+
if isinstance(event, SetTempoEvent):
4853
tempoChanges.addTempoChange(deltaTimeTotal, event.tempo)
4954
nextTotal = deltaTimeTotal + event.deltaTime
50-
#calcaute absolute start time for event in ms
55+
# calculate absolute start time for event in ms
5156
if self.isTicksPerBeat:
5257
while (tempoChanges.hasMore() and
5358
nextTotal >= tempoChanges.deltaTimeTotal()):
54-
msTotal = msTotal + ((tempoChanges.deltaTimeTotal() -
55-
deltaTimeTotal)*self.msPerBeat/self.ticksPerBeat)
59+
msTotal += ((tempoChanges.deltaTimeTotal() - deltaTimeTotal)*self.msPerBeat/self.ticksPerBeat)
5660
deltaTimeTotal = tempoChanges.deltaTimeTotal()
5761
self.msPerBeat = tempoChanges.usPerQuarter()*.001
5862
tempoChanges.findNext()
59-
msTotal = (msTotal +
60-
((nextTotal-deltaTimeTotal)*self.msPerBeat/self.ticksPerBeat))
63+
msTotal += ((nextTotal-deltaTimeTotal)*self.msPerBeat/self.ticksPerBeat)
6164
else:
6265
msTotal = (event.deltaTime/self.ticksPerSecond)*.001
63-
#add event to trackData
66+
# add event to trackData
6467
deltaTimeTotal = nextTotal
6568
event.setStartTime(msTotal)
6669
trackData.addEvent(event)
6770
self.tracks.append(trackData)
6871

6972
def getNumTracks(self):
7073
return len(self.tracks)
74+
7175
def getTrack(self, index):
7276
return self.tracks[index]
77+
78+
79+
class UnexpectedEventException(Exception):
80+
def __init__(self, event, expectedEvent):
81+
self.event = event
82+
self.expectedEvent = expectedEvent
83+
84+
def __str__(self):
85+
return str("MidiData expected event of type " + str(type(self.expectedEvent))
86+
+ ", got event of type " + str(type(self.event)))
87+
88+
89+
class NotSupportedException(Exception):
90+
def __init__(self, value):
91+
self.value = value
92+
93+
def __str__(self):
94+
return str(self.value)

MidiEventDecoder.py

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,47 @@
22
from MidiEvents import *
33
from Util import Util
44

5-
#decodes data from the MidiParser into data easier to work with in MidiData
6-
#(will decode each piece of data from midiParser into an event,
7-
#including header chunk pieces)
5+
6+
# decodes data from the MidiParser into data easier to work with in MidiData
7+
# (will decode each piece of data from midiParser into an event,
8+
# including header chunk pieces)
89
class MidiEventDecoder:
910
def __init__(self, midiFilename):
1011
self.midiParser = MidiParser(midiFilename)
1112
self.runningStatus = False
13+
self.lastChannelStatusByte = None # the first byte of the last channel event that didn't use running status
1214
return
15+
1316
def hasMoreEvents(self):
1417
return self.midiParser.hasMoreData()
15-
#be sure to call this once before calling nextEvent
18+
# be sure to call this once before calling nextEvent
19+
1620
def headerData(self):
1721
data = HeaderData()
1822
data.setFromBytes(self.midiParser.readNextData(),
1923
self.midiParser.readNextData())
2024
return data
21-
#returns a MidiEvent
25+
26+
# returns a MidiEvent
2227
def nextEvent(self):
2328
return self.midiEvent(self.midiParser.readNextData())
24-
#creates a MidiEvent from the midiData
29+
# creates a MidiEvent from the midiData
30+
2531
def midiEvent(self, midiData):
26-
#check if TrackHeader
32+
# check if TrackHeader
2733
if midiData[0:4] == b'MTrk':
2834
trackHeader = TrackHeader()
2935
trackHeader.setFromBytes(midiData)
3036
return trackHeader
31-
#find deltaTime
37+
# find deltaTime
3238
tempData = midiData
33-
temp = 0
34-
while Util.msbIsOne(tempData[temp:]):
35-
temp = temp+1
36-
temp = temp + 1
37-
deltaTime = tempData[:temp]
38-
midiData = tempData[temp:]
39-
#Meta Event
39+
deltaTimeBytesLength = 0
40+
while Util.msbIsOne(tempData[deltaTimeBytesLength:]):
41+
deltaTimeBytesLength += 1
42+
deltaTimeBytesLength += 1
43+
deltaTime = tempData[:deltaTimeBytesLength]
44+
midiData = tempData[deltaTimeBytesLength:]
45+
# Meta Event
4046
if midiData[0:1] == b'\xff':
4147
if midiData[1] in EventDictionaries.META_EVENT_DICTIONARY:
4248
metaEventClass = EventDictionaries.META_EVENT_DICTIONARY[midiData[1]]
@@ -46,26 +52,27 @@ def midiEvent(self, midiData):
4652
metaEvent.setDeltaTimeFromBytes(deltaTime)
4753
metaEvent.setFromBytes(midiData)
4854
return metaEvent
49-
#System Event
55+
# System Event
5056
if midiData[0:1] == b'\xf0' or midiData[0:1] == b'\xf7':
5157
systemEvent = SystemExclusiveEvent()
5258
systemEvent.setDeltaTimeFromBytes(deltaTime)
5359
systemEvent.setFromBytes(midiData)
5460
return systemEvent
55-
#Channel Event
56-
if Util.msbIsOne(midiData): #running status
61+
# Channel Event
62+
if Util.msbIsOne(midiData): # running status
5763
self.lastChannelStatusByte = midiData[0]
58-
else: #not running status
64+
else: # not running status
5965
midiData = self.lastChannelStatusByte + midiData
60-
channelEventIdentifier = midiData[0] & int('f0',16)
61-
if (channelEventIdentifier in EventDictionaries.CHANNEL_EVENT_DICTIONARY):
66+
channelEventIdentifier = midiData[0] & int('f0', 16)
67+
if channelEventIdentifier in EventDictionaries.CHANNEL_EVENT_DICTIONARY:
6268
channelEventClass = EventDictionaries.CHANNEL_EVENT_DICTIONARY[channelEventIdentifier]
6369
else:
6470
channelEventClass = ChannelEvent
6571
channelEvent = channelEventClass()
6672
channelEvent.setDeltaTimeFromBytes(deltaTime)
6773
channelEvent.setFromBytes(midiData)
6874
return channelEvent
75+
6976
def close(self):
7077
self.midiParser.close()
7178

0 commit comments

Comments
 (0)