X-Git-Url: https://git.ao2.it/vidi-player.git/blobdiff_plain/2780f9db87ca6f82d325aabe88fa0e8ba14f3817..HEAD:/vidi-timeline.py diff --git a/vidi-timeline.py b/vidi-timeline.py index 1068545..7e58863 100755 --- a/vidi-timeline.py +++ b/vidi-timeline.py @@ -22,47 +22,36 @@ import sys import mido import vidi -# TODO: turn that into a command line option +# TODO: turn these into command line options ADD_REST_BACKGROUND = True +ADD_TITLE = True +TITLE_TEXT = None +TITLE_DURATION = 5 +TITLE_CREDITS = "Created with vidi-timeline\nhttps://git.ao2.it/vidi-player.git" +CANVAS_SIZE = (640, 480) -def is_note(msg): - return msg.type == 'note_on' or msg.type == 'note_off' +def timeline_from_midi(midi_file, canvas_size, video_font_path): + timeline = vidi.Timeline(canvas_size) + if ADD_TITLE: + title = TITLE_TEXT + if not title: + title = os.path.splitext(os.path.basename(midi_file.filename))[0] + title += "\n\n" + title += TITLE_CREDITS -def is_note_on(msg): - return msg.type == 'note_on' and msg.velocity > 0 + timeline.add_title_clip(title, 0, TITLE_DURATION) + elapsed_time = start_time = TITLE_DURATION + else: + elapsed_time = start_time = 0 -def is_note_off(msg): - return ((msg.type == 'note_on' and msg.velocity == 0) or - (msg.type == 'note_off')) - - -def check_overlapping_notes(midi_file): - previous_note_on = False - for msg in midi_file: - if is_note_on(msg) and msg.channel == 0: - if previous_note_on: - return True - - previous_note_on = True - elif is_note_off(msg) and msg.channel == 0: - previous_note_on = False - - return False - - -def timeline_from_midi(midi_file, video_font_path): - timeline = vidi.Timeline() - - elapsed_time = 0 - start_time = 0 for msg in midi_file: elapsed_time += msg.time - if is_note_on(msg) and msg.channel == 0: + if vidi.is_note_on(msg) and msg.channel == 0: start_time = elapsed_time - elif is_note_off(msg) and msg.channel == 0: + elif vidi.is_note_off(msg) and msg.channel == 0: note = vidi.MidiNote(msg.note) duration = elapsed_time - start_time print("Note name: %3s start_time: %f duration: %f" % @@ -104,14 +93,14 @@ def main(): midi_file = mido.MidiFile(sys.argv[1]) - overlapping_notes = check_overlapping_notes(midi_file) + overlapping_notes = vidi.check_overlapping_notes(midi_file) if overlapping_notes: sys.stderr.write("Sorry, supporting only midi file with no overlapping notes on channel 0\n") return 1 video_font_path = os.path.realpath(sys.argv[2]) - timeline = timeline_from_midi(midi_file, video_font_path) + timeline = timeline_from_midi(midi_file, CANVAS_SIZE, video_font_path) if len(sys.argv) > 3: timeline.save(sys.argv[3])