diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..37330db --- /dev/null +++ b/.coveragerc @@ -0,0 +1,3 @@ +[run] +source = src +omit = src/main.py,src/**/__init__.py,src/tests/**,src/ui/** diff --git a/.gitignore b/.gitignore index b6e4761..741bb4d 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,6 @@ dmypy.json # Pyre type checker .pyre/ + +# Ignore midi file folder +*.mid diff --git a/src/midi_kasittelija.py b/src/midi_kasittelija.py new file mode 100644 index 0000000..1c65c6d --- /dev/null +++ b/src/midi_kasittelija.py @@ -0,0 +1,58 @@ +import mido + +savellaji_arvot = { + "C":0, + "C#":-1, + "Db":-1, + "D":-2, + "Eb":-3, + "E":-4, + "F":-5, + "F#":-6, + "Gb":-6, + "G":5, + "Ab":4, + "A":3, + "Bb":2, + "B":1, + "Cb":1, + } + +def LueMidi(tiedostopolku): + midi = mido.MidiFile(tiedostopolku) + tulos = [] + for raita in midi.tracks: + raidan_nuotit = [] + vaara_savellaji = False + transponointi = 0 + + for viesti in raita: + if viesti.type == "key_signature": + if viesti.key[-1] == "m": + vaara_savellaji = True + + vaara_savellaji = False + transponointi = savellaji_arvot[viesti.key] + elif not vaara_savellaji: + if viesti.type == "note_on" and viesti.velocity > 0: + raidan_nuotit.append(viesti.note+transponointi) + if raidan_nuotit: + tulos.append(raidan_nuotit) + + return tulos + +def KirjoitaMidi(tiedostopolku, nuotit): + midi = mido.MidiFile() + track = mido.MidiTrack() + + track.append(mido.MetaMessage("set_tempo", tempo=mido.bpm2tempo(120), time=0)) + track.append(mido.MetaMessage("time_signature")) + + for nuotti in nuotit: + if nuotti: + track.append(mido.Message("note_on", note=nuotti, velocity=64, time=0)) + track.append(mido.Message("note_on", note=nuotti, velocity=0, time=480)) + + midi.tracks.append(track) + + midi.save(tiedostopolku) diff --git a/src/tests/midi_kasittelija_test.py b/src/tests/midi_kasittelija_test.py new file mode 100644 index 0000000..a91ae0e --- /dev/null +++ b/src/tests/midi_kasittelija_test.py @@ -0,0 +1,14 @@ +import os +import unittest +from midi_kasittelija import LueMidi, KirjoitaMidi + +class TestMidiKasittelija(unittest.TestCase): + def test_molemmat(self): + testi_polku = "src/tests/testiMidi.mid" + if os.path.exists(testi_polku): + os.remove(testi_polku) + + nuotit = [60, 62, 64] + KirjoitaMidi(testi_polku, nuotit) + luetut_nuotit = LueMidi(testi_polku)[0] + self.assertEqual(nuotit, luetut_nuotit)