Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • python/lib/aubio/midiconv.py

    ra3e152a r476cb41  
    22""" utilities to convert midi note number to and from note names """
    33
     4__all__ = ['note2midi', 'midi2note', 'freq2note', 'note2freq']
     5
    46import sys
    57from ._aubio import freqtomidi, miditofreq
    6 
    7 __all__ = ['note2midi', 'midi2note', 'freq2note', 'note2freq']
    88
    99py3 = sys.version_info[0] == 3
     
    1515    int_instances = (int, long)
    1616
    17 
    1817def note2midi(note):
    19     """Convert note name to midi note number.
    20 
    21     Input string `note` should be composed of one note root
    22     and one octave, with optionally one modifier in between.
    23 
    24     List of valid components:
    25 
    26     - note roots: `C`, `D`, `E`, `F`, `G`, `A`, `B`,
    27     - modifiers: `b`, `#`, as well as unicode characters
    28       `𝄫`, `♭`, `♮`, `♯` and `𝄪`,
    29     - octave numbers: `-1` -> `11`.
    30 
    31     Parameters
    32     ----------
    33     note : str
    34         note name
    35 
    36     Returns
    37     -------
    38     int
    39         corresponding midi note number
    40 
    41     Examples
    42     --------
    43     >>> aubio.note2midi('C#4')
    44     61
    45     >>> aubio.note2midi('B♭5')
    46     82
    47 
    48     Raises
    49     ------
    50     TypeError
    51         If `note` was not a string.
    52     ValueError
    53         If an error was found while converting `note`.
    54 
    55     See Also
    56     --------
    57     midi2note, freqtomidi, miditofreq
    58     """
    59     _valid_notenames = {'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7,
    60                         'A': 9, 'B': 11}
     18    " convert note name to midi note number, e.g. [C-1, G9] -> [0, 127] "
     19    _valid_notenames = {'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7, 'A': 9, 'B': 11}
    6120    _valid_modifiers = {
    62             u'𝄫': -2,                         # double flat
    63             u'♭': -1, 'b': -1, '\u266d': -1,  # simple flat
    64             u'♮': 0, '\u266e': 0, None: 0,    # natural
    65             '#': +1, u'♯': +1, '\u266f': +1,  # sharp
    66             u'𝄪': +2,                         # double sharp
     21            u'𝄫': -2,                        # double flat
     22            u'♭': -1, 'b': -1, '\u266d': -1, # simple flat
     23            u'♮': 0, '\u266e': 0, None: 0,   # natural
     24            '#': +1, u'♯': +1, '\u266f': +1, # sharp
     25            u'𝄪': +2,                        # double sharp
    6726            }
    6827    _valid_octaves = range(-1, 10)
     
    7332        msg = "string of 2 to 4 characters expected, got {:d} ({:s})"
    7433        raise ValueError(msg.format(len(note), note))
    75     notename, modifier, octave = [None] * 3
     34    notename, modifier, octave = [None]*3
    7635
    7736    if len(note) == 4:
     
    9655        raise ValueError("%s is not a valid octave" % octave)
    9756
    98     midi = (octave + 1) * 12 + _valid_notenames[notename] \
    99                              + _valid_modifiers[modifier]
     57    midi = 12 + octave * 12 + _valid_notenames[notename] \
     58            + _valid_modifiers[modifier]
    10059    if midi > 127:
    10160        raise ValueError("%s is outside of the range C-2 to G8" % note)
    10261    return midi
    10362
    104 
    10563def midi2note(midi):
    106     """Convert midi note number to note name.
    107 
    108     Parameters
    109     ----------
    110     midi : int [0, 128]
    111         input midi note number
    112 
    113     Returns
    114     -------
    115     str
    116         note name
    117 
    118     Examples
    119     --------
    120     >>> aubio.midi2note(70)
    121     'A#4'
    122     >>> aubio.midi2note(59)
    123     'B3'
    124 
    125     Raises
    126     ------
    127     TypeError
    128         If `midi` was not an integer.
    129     ValueError
    130         If `midi` is out of the range `[0, 128]`.
    131 
    132     See Also
    133     --------
    134     note2midi, miditofreq, freqtomidi
    135     """
     64    " convert midi note number to note name, e.g. [0, 127] -> [C-1, G9] "
    13665    if not isinstance(midi, int_instances):
    13766        raise TypeError("an integer is required, got %s" % midi)
     
    14069        raise ValueError(msg.format(midi))
    14170    _valid_notenames = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#',
    142                         'A', 'A#', 'B']
     71            'A', 'A#', 'B']
    14372    return _valid_notenames[midi % 12] + str(int(midi / 12) - 1)
    14473
    145 
    14674def freq2note(freq):
    147     """Convert frequency in Hz to nearest note name.
    148 
    149     Parameters
    150     ----------
    151     freq : float [0, 23000[
    152         input frequency, in Hz
    153 
    154     Returns
    155     -------
    156     str
    157         name of the nearest note
    158 
    159     Example
    160     -------
    161     >>> aubio.freq2note(440)
    162     'A4'
    163     >>> aubio.freq2note(220.1)
    164     'A3'
    165     """
     75    " convert frequency in Hz to nearest note name, e.g. [0, 22050.] -> [C-1, G9] "
    16676    nearest_note = int(freqtomidi(freq) + .5)
    16777    return midi2note(nearest_note)
    168 
    16978
    17079def note2freq(note):
Note: See TracChangeset for help on using the changeset viewer.