History

Merge branch 'master' into feature/docstrings

Paul Brossier committed 8 years ago

Commit ed596f72 parents f9400d0 4bc10e228 files · +322 −92Browse files

Showing the changes to python/lib (2 of 28 files). Show all

Unified · Split

2 files
  1. python/lib/aubio/cmd.py +30 −1
  2. python/lib/aubio/midiconv.py +38 −9
python/lib/aubio/cmd.py+30−1
@@ -101,6 +101,8 @@ def parser_add_subcommand_notes(subparsers): · 100 unmodified lines
101101 help='estimate midi-like notes (monophonic)')
102102 subparser.add_input()
103103 subparser.add_buf_hop_size()
104+ subparser.add_silence()
105+ subparser.add_release_drop()
104106 subparser.add_time_format()
105107 subparser.add_verbose_help()
106108 subparser.set_defaults(process=process_notes)
@@ -207,6 +209,12 @@ class AubioArgumentParser(argparse.ArgumentParser): · 100 unmodified lines
207209 action="store", dest="silence", default=-70,
208210 help="silence threshold")
209211
212+ def add_release_drop(self):
213+ self.add_argument("-d", "--release-drop",
214+ metavar = "<value>", type=float,
215+ action="store", dest="release_drop", default=10,
216+ help="release drop threshold")
217+
210218 def add_minioi(self, default="12ms"):
211219 self.add_argument("-M", "--minioi",
212220 metavar = "<value>", type=str,
@@ -382,6 +390,10 @@ class process_notes(default_process): · 169 unmodified lines
382390 def __init__(self, args):
383391 self.parse_options(args, self.valid_opts)
384392 self.notes = aubio.notes(**self.options)
393+ if args.silence is not None:
394+ self.notes.set_silence(args.silence)
395+ if args.release_drop is not None:
396+ self.notes.set_release_drop(args.release_drop)
385397 super(process_notes, self).__init__(args)
386398 def __call__(self, block):
387399 return self.notes(block)
@@ -502,7 +514,24 @@ class process_cut(process_onset): · 114 unmodified lines
502514
503515 def main():
504516 parser = aubio_parser()
505− args = parser.parse_args()
517+ if sys.version_info[0] != 3:
518+ # on py2, create a dummy ArgumentParser to workaround the
519+ # optional subcommand issue. See https://bugs.python.org/issue9253
520+ # This ensures that:
521+ # - version string is shown when only '-V' is passed
522+ # - help is printed if '-V' is passed with any other argument
523+ # - any other argument get forwarded to the real parser
524+ parser_root = argparse.ArgumentParser(add_help=False)
525+ parser_root.add_argument('-V', '--version', help="show version",
526+ action="store_true", dest="show_version")
527+ args, extras = parser_root.parse_known_args()
528+ if args.show_version == False: # no -V, forward to parser
529+ args = parser.parse_args(extras, namespace=args)
530+ elif len(extras) != 0: # -V with other arguments, print help
531+ parser.print_help()
532+ sys.exit(1)
533+ else: # in py3, we can simply use parser directly
534+ args = parser.parse_args()
506535 if 'show_version' in args and args.show_version:
507536 sys.stdout.write('aubio version ' + aubio.version + '\n')
508537 sys.exit(0)
python/lib/aubio/midiconv.py+38−9
@@ -1,9 +1,11 @@
11 # -*- coding: utf-8 -*-
22 """ utilities to convert midi note number to and from note names """
33
4−__all__ = ['note2midi', 'midi2note', 'freq2note']
4+__all__ = ['note2midi', 'midi2note', 'freq2note', 'note2freq']
55
66 import sys
7+from ._aubio import freqtomidi, miditofreq
8+
79 py3 = sys.version_info[0] == 3
810 if py3:
911 str_instances = str
@@ -63,10 +65,11 @@ def note2midi(note): · 53 unmodified lines
6365 }
6466 _valid_octaves = range(-1, 10)
6567 if not isinstance(note, str_instances):
66− raise TypeError("a string is required, got %s (%s)" % (note, str(type(note))))
68+ msg = "a string is required, got {:s} ({:s})"
69+ raise TypeError(msg.format(str(type(note)), repr(note)))
6770 if len(note) not in range(2, 5):
68− raise ValueError("string of 2 to 4 characters expected, got %d (%s)" \
69− % (len(note), note))
71+ msg = "string of 2 to 4 characters expected, got {:d} ({:s})"
72+ raise ValueError(msg.format(len(note), note))
7073 notename, modifier, octave = [None]*3
7174
7275 if len(note) == 4:
@@ -90,7 +93,8 @@ def note2midi(note): · 17 unmodified lines
9093 if octave not in _valid_octaves:
9194 raise ValueError("%s is not a valid octave" % octave)
9295
93− midi = 12 + octave * 12 + _valid_notenames[notename] + _valid_modifiers[modifier]
96+ midi = 12 + octave * 12 + _valid_notenames[notename] \
97+ + _valid_modifiers[modifier]
9498 if midi > 127:
9599 raise ValueError("%s is outside of the range C-2 to G8" % note)
96100 return midi
@@ -129,8 +133,10 @@ def midi2note(midi): · 32 unmodified lines
129133 if not isinstance(midi, int_instances):
130134 raise TypeError("an integer is required, got %s" % midi)
131135 if midi not in range(0, 128):
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']
136+ msg = "an integer between 0 and 127 is excepted, got {:d}"
137+ raise ValueError(msg.format(midi))
138+ _valid_notenames = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#',
139+ 'A', 'A#', 'B']
134140 return _valid_notenames[midi % 12] + str(int(midi / 12) - 1)
135141
136142 def freq2note(freq):
@@ -153,5 +159,28 @@ def freq2note(freq): · 16 unmodified lines
153159 >>> aubio.freq2note(220.1)
154160 'A3'
155161 """
156− from aubio import freqtomidi
157− return midi2note(int(freqtomidi(freq)))
162+ nearest_note = int(freqtomidi(freq) + .5)
163+ return midi2note(nearest_note)
164+
165+def note2freq(note):
166+ """Convert note name to corresponding frequency, in Hz.
167+
168+ Parameters
169+ ----------
170+ note : str
171+ input note name
172+
173+ Returns
174+ -------
175+ freq : float [0, 23000[
176+ frequency, in Hz
177+
178+ Example
179+ -------
180+ >>> aubio.note2freq('A4')
181+ 440
182+ >>> aubio.note2freq('A3')
183+ 220.1
184+ """
185+ midi = note2midi(note)
186+ return miditofreq(midi)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t