-# -*- coding: ISO-8859-1 -*-\r
-\r
-from MidiOutStream import MidiOutStream\r
-class MidiToText(MidiOutStream):\r
-\r
-\r
- """\r
- This class renders a midi file as text. It is mostly used for debugging\r
- """\r
-\r
- #############################\r
- # channel events\r
- \r
- def channel_message(self, message_type, channel, data):\r
- """The default event handler for channel messages"""\r
- print 'message_type:%X, channel:%X, data size:%X' % (message_type, channel, len(data))\r
-\r
-\r
- def note_on(self, channel=0, note=0x40, velocity=0x40):\r
- print 'note_on - ch:%02X, note:%02X, vel:%02X time:%s' % (channel, note, velocity, self.timeInMs())\r
-\r
- def note_off(self, channel=0, note=0x40, velocity=0x40):\r
- print 'note_off - ch:%02X, note:%02X, vel:%02X time:%s' % (channel, note, velocity, self.abs_time())\r
-\r
- def aftertouch(self, channel=0, note=0x40, velocity=0x40):\r
- print 'aftertouch', channel, note, velocity\r
-\r
-\r
- def continuous_controller(self, channel, controller, value):\r
- print 'controller - ch: %02X, cont: #%02X, value: %02X' % (channel, controller, value)\r
-\r
-\r
- def patch_change(self, channel, patch):\r
- print 'patch_change - ch:%02X, patch:%02X' % (channel, patch)\r
-\r
-\r
- def channel_pressure(self, channel, pressure):\r
- print 'channel_pressure', channel, pressure\r
-\r
-\r
- def pitch_bend(self, channel, value):\r
- print 'pitch_bend ch:%s, value:%s' % (channel, value)\r
-\r
-\r
-\r
- #####################\r
- ## Common events\r
-\r
-\r
- def system_exclusive(self, data):\r
- print 'system_exclusive - data size: %s' % len(data)\r
-\r
-\r
- def song_position_pointer(self, value):\r
- print 'song_position_pointer: %s' % value\r
-\r
-\r
- def song_select(self, songNumber):\r
- print 'song_select: %s' % songNumber\r
-\r
-\r
- def tuning_request(self):\r
- print 'tuning_request'\r
-\r
-\r
- def midi_time_code(self, msg_type, values):\r
- print 'midi_time_code - msg_type: %s, values: %s' % (msg_type, values)\r
-\r
-\r
-\r
- #########################\r
- # header does not really belong here. But anyhoo!!!\r
-\r
- def header(self, format=0, nTracks=1, division=96):\r
- print 'format: %s, nTracks: %s, division: %s' % (format, nTracks, division)\r
- print '----------------------------------'\r
- print ''\r
- print division\r
- self.division = division\r
-\r
- def eof(self):\r
- print 'End of file'\r
-\r
-\r
- def start_of_track(self, n_track=0):\r
- print 'Start - track #%s' % n_track\r
-\r
-\r
- def end_of_track(self):\r
- print 'End of track'\r
- print ''\r
-\r
-\r
-\r
- ###############\r
- # sysex event\r
-\r
- def sysex_event(self, data):\r
- print 'sysex_event - datasize: %X' % len(data)\r
-\r
-\r
- #####################\r
- ## meta events\r
-\r
- def meta_event(self, meta_type, data):\r
- print 'undefined_meta_event:', meta_type, len(data)\r
-\r
-\r
- def sequence_number(self, value):\r
- print 'sequence_number', value\r
-\r
-\r
- def text(self, text):\r
- print 'text', text\r
-\r
-\r
- def copyright(self, text):\r
- print 'copyright', text\r
-\r
-\r
- def sequence_name(self, text):\r
- print 'sequence_name:', text\r
-\r
-\r
- def instrument_name(self, text):\r
- print 'instrument_name:', text\r
-\r
-\r
- def lyric(self, text):\r
- print 'lyric', text\r
-\r
-\r
- def marker(self, text):\r
- print 'marker', text\r
-\r
-\r
- def cuepoint(self, text):\r
- print 'cuepoint', text\r
-\r
-\r
- def midi_ch_prefix(self, channel):\r
- print 'midi_ch_prefix', channel\r
-\r
-\r
- def midi_port(self, value):\r
- print 'midi_port:', value\r
-\r
-\r
- def tempo(self, value):\r
- print 'tempo:', value\r
- self.tempo = value\r
-\r
-\r
- def smtp_offset(self, hour, minute, second, frame, framePart):\r
- print 'smtp_offset', hour, minute, second, frame, framePart\r
-\r
-\r
- def time_signature(self, nn, dd, cc, bb):\r
- print 'time_signature:', nn, dd, cc, bb\r
-\r
-\r
- def key_signature(self, sf, mi):\r
- print 'key_signature', sf, mi\r
-\r
-\r
- def sequencer_specific(self, data):\r
- print 'sequencer_specific', len(data)\r
- \r
- def timeInMs(self):\r
- return(long(self.abs_time())*1000000000/(long(self.tempo)*long(self.division)))\r
-\r
-\r
-\r
-if __name__ == '__main__':\r
-\r
- # get data\r
- test_file = '../songs/midis/test.mid'\r
- f = open(test_file, 'rb')\r
- \r
- # do parsing\r
- from MidiInFile import MidiInFile\r
- midiIn = MidiInFile(MidiToText(), f)\r
- midiIn.read()\r
- f.close()\r