|
6 | 6 |
|
7 | 7 | # contains the finalized data after analysis |
8 | 8 | class MidiData: |
9 | | - def __init__(self, midiFilename, middle_c="C4"): |
10 | | - self.eventDecoder = MidiEventDecoder(midiFilename) |
11 | | - headerData = self.eventDecoder.headerData() |
| 9 | + def __init__(self, midi_filename, middle_c="C4"): |
| 10 | + self.event_decoder = MidiEventDecoder(midi_filename) |
| 11 | + header_data = self.event_decoder.header_data() |
12 | 12 | # variables |
13 | | - self.format = headerData.formatType |
14 | | - self.numTracks = headerData.numTracks |
15 | | - self.isTicksPerBeat = False |
| 13 | + self.format = header_data.format_type |
| 14 | + self.num_tracks = header_data.num_tracks |
| 15 | + self.is_ticks_per_beat = False |
16 | 16 | self.middle_c = middle_c |
17 | | - if headerData.ticksPerBeat is None: |
18 | | - self.isTicksPerBeat = False |
19 | | - self.ticksPerSecond = (headerData.framesPerSecond * |
20 | | - headerData.ticksPerFrame) |
| 17 | + if header_data.ticks_per_beat is None: |
| 18 | + self.is_ticks_per_beat = False |
| 19 | + self.ticks_per_second = (header_data.frames_per_second * |
| 20 | + header_data.ticks_per_frame) |
21 | 21 | else: |
22 | | - self.isTicksPerBeat = True |
23 | | - self.ticksPerBeat = headerData.ticksPerBeat |
| 22 | + self.is_ticks_per_beat = True |
| 23 | + self.ticks_per_beat = header_data.ticks_per_beat |
24 | 24 |
|
25 | | - if headerData.formatType != 1 and headerData.formatType != 0: |
26 | | - raise NotSupportedException("Midi files of format " + str(headerData.formatType) |
| 25 | + if header_data.format_type != 1 and header_data.format_type != 0: |
| 26 | + raise NotSupportedException("Midi files of format " + str(header_data.format_type) |
27 | 27 | + " are not supported") |
28 | 28 |
|
29 | 29 | # maps running total of delta times to microsecondsPerQuarter |
30 | | - tempoChanges = TempoChanges() |
| 30 | + tempo_changes = TempoChanges() |
31 | 31 | self.tracks = [] |
32 | 32 |
|
33 | | - self.msPerBeat = 500 # default 120 bpm |
| 33 | + self.ms_per_beat = 500 # default 120 bpm |
34 | 34 |
|
35 | 35 | # read in each track |
36 | 36 | tracknum = 0 # used to create temporary track names |
37 | | - while self.eventDecoder.hasMoreEvents(): |
38 | | - trackName = "Track" + str(tracknum) |
| 37 | + while self.event_decoder.has_more_events(): |
| 38 | + track_name = "Track" + str(tracknum) |
39 | 39 | tracknum += 1 |
40 | | - trackData = TrackData(name=trackName, middle_c=self.middle_c) |
| 40 | + track_data = TrackData(name=track_name, middle_c=self.middle_c) |
41 | 41 | # should be a track header |
42 | | - event = self.eventDecoder.nextEvent() |
| 42 | + event = self.event_decoder.next_event() |
43 | 43 | if not (isinstance(event, TrackHeader)): |
44 | 44 | raise UnexpectedEventException(event, TrackHeader()) |
45 | | - # set up tempoChanges |
46 | | - tempoChanges.reset() |
47 | | - self.msPerBeat = 500 # default 120 bpm |
48 | | - deltaTimeTotal = 0 # current time in ticks |
49 | | - msTotal = 0 # current time in ms |
| 45 | + # set up tempo_changes |
| 46 | + tempo_changes.reset() |
| 47 | + self.ms_per_beat = 500 # default 120 bpm |
| 48 | + delta_time_total = 0 # current time in ticks |
| 49 | + ms_total = 0 # current time in ms |
50 | 50 | # add events |
51 | 51 | while not (isinstance(event, EndOfTrackEvent)): |
52 | | - event = self.eventDecoder.nextEvent() |
| 52 | + event = self.event_decoder.next_event() |
53 | 53 | if isinstance(event, SetTempoEvent): |
54 | | - tempoChanges.addTempoChange(deltaTimeTotal, event.tempo) |
55 | | - nextTotal = deltaTimeTotal + event.deltaTime |
| 54 | + tempo_changes.add_tempo_change(delta_time_total, event.tempo) |
| 55 | + next_total = delta_time_total + event.delta_time |
56 | 56 | # calculate absolute start time for event in ms |
57 | | - if self.isTicksPerBeat: |
58 | | - while (tempoChanges.hasMore() and |
59 | | - nextTotal >= tempoChanges.deltaTimeTotal()): |
60 | | - msTotal += ((tempoChanges.deltaTimeTotal() - deltaTimeTotal)*self.msPerBeat/self.ticksPerBeat) |
61 | | - deltaTimeTotal = tempoChanges.deltaTimeTotal() |
62 | | - self.msPerBeat = tempoChanges.usPerQuarter() * .001 |
63 | | - tempoChanges.findNext() |
64 | | - msTotal += ((nextTotal - deltaTimeTotal) * self.msPerBeat / self.ticksPerBeat) |
| 57 | + if self.is_ticks_per_beat: |
| 58 | + while (tempo_changes.has_more() and |
| 59 | + next_total >= tempo_changes.delta_time_total()): |
| 60 | + ms_total += ((tempo_changes.delta_time_total() - delta_time_total) * self.ms_per_beat / self.ticks_per_beat) |
| 61 | + delta_time_total = tempo_changes.delta_time_total() |
| 62 | + self.ms_per_beat = tempo_changes.us_per_quarter() * .001 |
| 63 | + tempo_changes.find_next() |
| 64 | + ms_total += ((next_total - delta_time_total) * self.ms_per_beat / self.ticks_per_beat) |
65 | 65 | else: |
66 | | - msTotal = (event.deltaTime / self.ticksPerSecond) * .001 |
67 | | - # add event to trackData |
68 | | - deltaTimeTotal = nextTotal |
69 | | - event.setStartTimeMs(msTotal) |
70 | | - event.setStartTimeTicks(deltaTimeTotal) |
71 | | - trackData.addEvent(event) |
72 | | - self.tracks.append(trackData) |
| 66 | + ms_total = (event.delta_time / self.ticks_per_second) * .001 |
| 67 | + # add event to track_data |
| 68 | + delta_time_total = next_total |
| 69 | + event.set_start_time_ms(ms_total) |
| 70 | + event.set_start_time_ticks(delta_time_total) |
| 71 | + track_data.add_event(event) |
| 72 | + self.tracks.append(track_data) |
73 | 73 |
|
74 | | - def getNumTracks(self): |
| 74 | + def get_num_tracks(self): |
75 | 75 | return len(self.tracks) |
76 | 76 |
|
77 | | - def getTrack(self, index): |
| 77 | + def get_track(self, index): |
78 | 78 | return self.tracks[index] |
79 | 79 |
|
80 | 80 |
|
81 | 81 | class UnexpectedEventException(Exception): |
82 | | - def __init__(self, event, expectedEvent): |
| 82 | + def __init__(self, event, expected_event): |
83 | 83 | self.event = event |
84 | | - self.expectedEvent = expectedEvent |
| 84 | + self.expected_event = expected_event |
85 | 85 |
|
86 | 86 | def __str__(self): |
87 | | - return str("MidiData expected event of type " + str(type(self.expectedEvent)) |
| 87 | + return str("MidiData expected event of type " + str(type(self.expected_event)) |
88 | 88 | + ", got event of type " + str(type(self.event))) |
89 | 89 |
|
90 | 90 |
|
|
0 commit comments