Changes in python/lib/aubio/midiconv.py [476cb41:7165fc56]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
python/lib/aubio/midiconv.py
r476cb41 r7165fc56 2 2 """ utilities to convert midi note number to and from note names """ 3 3 4 __all__ = ['note2midi', 'midi2note', 'freq2note' , 'note2freq']4 __all__ = ['note2midi', 'midi2note', 'freq2note'] 5 5 6 6 import sys 7 from ._aubio import freqtomidi, miditofreq8 9 7 py3 = sys.version_info[0] == 3 10 8 if py3: … … 16 14 17 15 def note2midi(note): 18 " convert note name to midi note number, e.g. [C-1, G9] -> [0, 127] " 16 """Convert note name to midi note number. 17 18 Input string `note` should be composed of one note root 19 and one octave, with optionally one modifier in between. 20 21 List of valid components: 22 23 - note roots: `C`, `D`, `E`, `F`, `G`, `A`, `B`, 24 - modifiers: `b`, `#`, as well as unicode characters 25 `𝄫`, `♭`, `♮`, `♯` and `𝄪`, 26 - octave numbers: `-1` -> `11`. 27 28 Parameters 29 ---------- 30 note : str 31 note name 32 33 Returns 34 ------- 35 int 36 corresponding midi note number 37 38 Examples 39 -------- 40 >>> aubio.note2midi('C#4') 41 61 42 >>> aubio.note2midi('B♭5') 43 82 44 45 Raises 46 ------ 47 TypeError 48 If `note` was not a string. 49 ValueError 50 If an error was found while converting `note`. 51 52 See Also 53 -------- 54 midi2note, freqtomidi, miditofreq 55 """ 19 56 _valid_notenames = {'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7, 'A': 9, 'B': 11} 20 57 _valid_modifiers = { … … 27 64 _valid_octaves = range(-1, 10) 28 65 if not isinstance(note, str_instances): 29 msg = "a string is required, got {:s} ({:s})" 30 raise TypeError(msg.format(str(type(note)), repr(note))) 66 raise TypeError("a string is required, got %s (%s)" % (note, str(type(note)))) 31 67 if len(note) not in range(2, 5): 32 msg = "string of 2 to 4 characters expected, got {:d} ({:s})"33 raise ValueError(msg.format(len(note), note))68 raise ValueError("string of 2 to 4 characters expected, got %d (%s)" \ 69 % (len(note), note)) 34 70 notename, modifier, octave = [None]*3 35 71 … … 55 91 raise ValueError("%s is not a valid octave" % octave) 56 92 57 midi = 12 + octave * 12 + _valid_notenames[notename] \ 58 + _valid_modifiers[modifier] 93 midi = 12 + octave * 12 + _valid_notenames[notename] + _valid_modifiers[modifier] 59 94 if midi > 127: 60 95 raise ValueError("%s is outside of the range C-2 to G8" % note) … … 62 97 63 98 def midi2note(midi): 64 " convert midi note number to note name, e.g. [0, 127] -> [C-1, G9] " 99 """Convert midi note number to note name. 100 101 Parameters 102 ---------- 103 midi : int [0, 128] 104 input midi note number 105 106 Returns 107 ------- 108 str 109 note name 110 111 Examples 112 -------- 113 >>> aubio.midi2note(70) 114 'A#4' 115 >>> aubio.midi2note(59) 116 'B3' 117 118 Raises 119 ------ 120 TypeError 121 If `midi` was not an integer. 122 ValueError 123 If `midi` is out of the range `[0, 128]`. 124 125 See Also 126 -------- 127 note2midi, miditofreq, freqtomidi 128 """ 65 129 if not isinstance(midi, int_instances): 66 130 raise TypeError("an integer is required, got %s" % midi) 67 131 if midi not in range(0, 128): 68 msg = "an integer between 0 and 127 is excepted, got {:d}" 69 raise ValueError(msg.format(midi)) 70 _valid_notenames = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 71 'A', 'A#', 'B'] 132 raise ValueError("an integer between 0 and 127 is excepted, got %d" % midi) 133 _valid_notenames = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'] 72 134 return _valid_notenames[midi % 12] + str(int(midi / 12) - 1) 73 135 74 136 def freq2note(freq): 75 " convert frequency in Hz to nearest note name, e.g. [0, 22050.] -> [C-1, G9] " 76 nearest_note = int(freqtomidi(freq) + .5) 77 return midi2note(nearest_note) 78 79 def note2freq(note): 80 """Convert note name to corresponding frequency, in Hz. 137 """Convert frequency in Hz to nearest note name. 81 138 82 139 Parameters 83 140 ---------- 84 note : str85 input note name141 freq : float [0, 23000[ 142 input frequency, in Hz 86 143 87 144 Returns 88 145 ------- 89 freq : float [0, 23000[90 frequency, in Hz146 str 147 name of the nearest note 91 148 92 149 Example 93 150 ------- 94 >>> aubio. note2freq('A4')95 44096 >>> aubio. note2freq('A3')97 220.1151 >>> aubio.freq2note(440) 152 'A4' 153 >>> aubio.freq2note(220.1) 154 'A3' 98 155 """ 99 midi = note2midi(note)100 return midi tofreq(midi)156 from aubio import freqtomidi 157 return midi2note(int(freqtomidi(freq)))
Note: See TracChangeset
for help on using the changeset viewer.