From f778b0ade9ac49e0deab3f694c7e4a0905388f1b Mon Sep 17 00:00:00 2001 From: Antonio Ospite Date: Mon, 5 Dec 2016 15:47:41 +0100 Subject: [PATCH] Add vidi/MidiUtils.py to share some utilities to analyze midi files --- vidi-timeline.py | 33 +++------------------------------ vidi/MidiUtils.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ vidi/__init__.py | 1 + 3 files changed, 49 insertions(+), 30 deletions(-) create mode 100755 vidi/MidiUtils.py diff --git a/vidi-timeline.py b/vidi-timeline.py index 1068545..17165fc 100755 --- a/vidi-timeline.py +++ b/vidi-timeline.py @@ -26,33 +26,6 @@ import vidi ADD_REST_BACKGROUND = True -def is_note(msg): - return msg.type == 'note_on' or msg.type == 'note_off' - - -def is_note_on(msg): - return msg.type == 'note_on' and msg.velocity > 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() @@ -60,9 +33,9 @@ def timeline_from_midi(midi_file, video_font_path): 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,7 +77,7 @@ 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 diff --git a/vidi/MidiUtils.py b/vidi/MidiUtils.py new file mode 100755 index 0000000..f9b964b --- /dev/null +++ b/vidi/MidiUtils.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +# +# MidiUtils - misc utilities to analyze midi files opened with python-mido +# +# Copyright (C) 2016 Antonio Ospite +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +def is_note(msg): + return msg.type == 'note_on' or msg.type == 'note_off' + + +def is_note_on(msg): + return msg.type == 'note_on' and msg.velocity > 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 diff --git a/vidi/__init__.py b/vidi/__init__.py index 060bc66..53d457d 100755 --- a/vidi/__init__.py +++ b/vidi/__init__.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 +from .MidiUtils import is_note, is_note_on, is_note_off, check_overlapping_notes from .Note import SpnNote, MidiNote, PIANO_88_KEYS_RANGE from .Player import Player from .Timeline import Timeline -- 2.1.4