import unittest from typing import List from tempfile import NamedTemporaryFile from assert_fns import assert_notes_almost_equal from utils.note_event_dataclasses import Note from utils.midi import note_event2midi from utils.midi import midi2note from utils.note2event import note2note_event # yapf: disable class TestNoteMidiConversion(unittest.TestCase): def test_note2midi2note_z(self): original_notes = [ Note(is_drum=False, program=3, onset=0., offset=1., pitch=60, velocity=1), Note(is_drum=False, program=3, onset=1., offset=2., pitch=64, velocity=1), ] with NamedTemporaryFile(suffix=".mid", delete=True) as temp_file: # Convert original_notes to MIDI and save it to the temporary file note_events = note2note_event(notes=original_notes, sort=True) note_event2midi(note_events, temp_file.name, velocity=100) # Convert the MIDI back to notes converted_notes, _ = midi2note(temp_file.name) # Compare original notes and converted notes assert_notes_almost_equal(original_notes, converted_notes) def test_midi2note2midi2note_piano_z(self): file = 'extras/examples/piano.mid' # This MIDI file is missing the program change event, so we force it to be 0 notes, _ = midi2note(file, quantize=False, force_all_program_to=0)[:1000] note_events = note2note_event(notes=notes, sort=True) note_event2midi(note_events, 'extras/examples/piano_converted.mid', velocity=100) reconverted_notes, _ = midi2note('extras/examples/piano_converted.mid', quantize=False) assert_notes_almost_equal(notes, reconverted_notes, delta=0.01) def test_midi2note2midi2note_force_drum_z(self): file = 'extras/examples/drum.mid' conv_file = 'extras/examples/drum_converted.mid' # This MIDI file is missing the program change event, so we force it to be 0 notes, _ = midi2note(file, quantize=True, force_all_drum=True)[:100] note_events = note2note_event(notes=notes, sort=True) note_event2midi(note_events, conv_file, velocity=100, ticks_per_beat=960) reconverted_notes, _ = midi2note(conv_file, quantize=True, force_all_drum=True) assert_notes_almost_equal(notes, reconverted_notes, delta=0.005) # In drum, this is very inaccurate. We should fix this in the future. # Even for the first 100 notes, the timing is off by 170 ms. def test_midi2note_ignore_pedal_true_z(self): file = 'extras/examples/piano.mid' notes, _ = midi2note(file, quantize=False, ignore_pedal=True, force_all_program_to=0) note_events = note2note_event(notes=notes, sort=True) note_event2midi(note_events, 'extras/examples/piano_converted.mid', velocity=100) reconverted_notes, _ = midi2note('extras/examples/piano_converted.mid', quantize=False) assert_notes_almost_equal(notes, reconverted_notes, delta=0.01) # yapf: enable if __name__ == '__main__': unittest.main()