def get_timings(input_filename): # Avoid needing this during venusian scan import pykar def errback(msg): print msg kardata = open(input_filename, 'rb').read() midifile = pykar.midiParseData( kardata, errback, '' ) lyrics_list = midifile.lyrics.list timings = [] last_line = lyrics_list[0].line first_ms = lyrics_list[0].ms current_line = [] for i, lyric in enumerate(lyrics_list): current_line.append([float(lyric.ms-first_ms)/1000, lyric.text]) try: next_lyric = lyrics_list[i+1] except IndexError: next_lyric = None if lyric.line != last_line: last_ms = lyric.ms timings.append( ( float(first_ms)/1000, float(last_ms)/1000, current_line, ) ) last_line = lyric.line current_line = [] if next_lyric: first_ms = next_lyric.ms else: first_ms = last_ms timings.append( ( float(first_ms)/1000, float(lyrics_list[-1].ms)/1000, current_line, ) ) return json.dumps(timings, indent=2)
def parse_midi(filename): with open(filename) as f: fdata = f.read() midifile = pykar.midiParseData(fdata, None, 'cp1252') return midifile.lyrics.list