Skip to content

Instantly share code, notes, and snippets.

@atsukoba
Created April 10, 2022 14:32
Show Gist options
  • Save atsukoba/471836a8cda5e5c0fd7a4633ea0b4349 to your computer and use it in GitHub Desktop.
Save atsukoba/471836a8cda5e5c0fd7a4633ea0b4349 to your computer and use it in GitHub Desktop.
Converter from `miditoolkit.midi.parser.MidiFile` to `note_seq.protobuf.music_pb2.NoteSequence`
from miditoolkit import MidiFile
from miditoolkit.midi.utils import example_midi_file
from note_seq import plot_sequence
from note_seq.protobuf.music_pb2 import NoteSequence
def miditoolkit_to_notesequence(midi: MidiFile) -> NoteSequence:
ticks_per_sec = midi.ticks_per_beat * midi.tempo_changes[0].tempo / 60
ticks_to_sec = lambda ticks: ticks * (1 / ticks_per_sec)
ns = NoteSequence()
ns.tempos.add(qpm=midi.tempo_changes[0].tempo)
for inst in midi.instruments:
for note in inst.notes:
ns.notes.add(pitch=note.pitch,
start_time=ticks_to_sec(note.start),
end_time=ticks_to_sec(note.end),
velocity=note.velocity,
is_drum=inst.is_drum,
# https://ja.wikipedia.org/wiki/General_MIDI
instrument=inst.program if inst.is_drum else 0)
ns.total_time = ticks_to_sec(midi.max_tick)
return ns
def check_conversion_with_plots():
path_midi = example_midi_file()
ns = miditoolkit_to_notesequence(path_midi)
midi = MidiFile(path_midi)
plot_sequence(ns)
plot_sequence(miditoolkit_to_notesequence(midi))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment