lib/aubio/midiconv.py: add note2 midi
authorPaul Brossier <piem@piem.org>
Sun, 10 Mar 2013 16:14:49 +0000 (11:14 -0500)
committerPaul Brossier <piem@piem.org>
Sun, 10 Mar 2013 16:14:49 +0000 (11:14 -0500)
python/lib/aubio/midiconv.py
python/tests/test_midi2note.py [new file with mode: 0644]

index a42b69f63bcf3f3133b6a5fc134c26371a41429c..e658290a545a9b6b04f4bf6c1434977592242365 100644 (file)
@@ -36,3 +36,13 @@ def note2midi(note):
     if midi > 127:
         raise ValueError, "%s is outside of the range C-2 to G8" % note
     return midi
+
+def midi2note(midi):
+    " convert midi note number to note name, e.g. [0, 127] -> [C-1, G9] "
+    if type(midi) != int:
+        raise TypeError, "an integer is required, got %s" % midi
+    if not (-1 < midi < 128):
+        raise ValueError, "an integer between 0 and 127 is excepted, got %d" % midi
+    midi = int(midi)
+    _valid_notenames = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B']
+    return _valid_notenames[midi % 12] + str( midi / 12 - 1)
diff --git a/python/tests/test_midi2note.py b/python/tests/test_midi2note.py
new file mode 100644 (file)
index 0000000..cf865d6
--- /dev/null
@@ -0,0 +1,42 @@
+# -*- encoding: utf8 -*-
+
+from aubio import midi2note
+import unittest
+
+list_of_known_midis = (
+        ( 0, 'C-1' ),
+        ( 1, 'C#-1' ),
+        ( 38, 'D2' ),
+        ( 48, 'C3' ),
+        ( 59, 'B3' ),
+        ( 60, 'C4' ),
+        ( 127, 'G9' ),
+        )
+
+class TestMidi2NoteGoodValues(unittest.TestCase):
+
+    def test_midi2note_known_values(self):
+        " known values are correctly converted "
+        for midi, note in list_of_known_midis:
+            self.assertEqual ( midi2note(midi), note )
+
+class TestNote2MidiWrongValues(unittest.TestCase):
+
+    def test_midi2note_negative_value(self):
+        " fails when passed a negative value "
+        self.assertRaises(ValueError, midi2note, -2)
+
+    def test_midi2note_negative_value(self):
+        " fails when passed a value greater than 127 "
+        self.assertRaises(ValueError, midi2note, 128)
+
+    def test_midi2note_floating_value(self):
+        " fails when passed a floating point "
+        self.assertRaises(TypeError, midi2note, 69.2)
+
+    def test_midi2note_character_value(self):
+        " fails when passed a value that can not be transformed to integer "
+        self.assertRaises(TypeError, midi2note, "a")
+
+if __name__ == '__main__':
+    unittest.main()