History

Merge branch 'master' into feature/pytest

Paul Brossier committed 8 years ago

Commit 568fc602 parents a9e3bd0 bc1ed6315 files · +236 −170Browse files

Showing the changes to python (10 of 15 files). Show all

Unified · Split

10 files
  1. python/demos/demo_filter.py +6 −4
  2. python/demos/demo_filterbank.py +31 −17
  3. python/demos/demo_source_simple.py +10 −6
  4. python/ext/py-sink.c +1 −1
  5. python/ext/py-source.c +3 −3
  6. python/lib/aubio/__init__.py +1 −0
  7. python/lib/aubio/cmd.py +65 −31
  8. python/lib/aubio/cut.py +29 −49
  9. python/lib/aubio/midiconv.py +17 −12
  10. python/lib/aubio/slicing.py +10 −11
python/demos/demo_filter.py+6−4
@@ -4,6 +4,7 @@ import sys · 3 unmodified lines
44 import os.path
55 import aubio
66
7+
78 def apply_filter(path, target):
89 # open input file, get its samplerate
910 s = aubio.source(path)
@@ -27,19 +28,20 @@ def apply_filter(path, target): · 17 unmodified lines
2728 # count frames read
2829 total_frames += read
2930 # end of file reached
30− if read < s.hop_size: break
31+ if read < s.hop_size:
32+ break
3133
3234 # print some info
3335 duration = total_frames / float(samplerate)
3436 input_str = "input: {:s} ({:.2f} s, {:d} Hz)"
3537 output_str = "output: {:s}, A-weighting filtered ({:d} frames total)"
36− print (input_str.format(s.uri, duration, samplerate))
37− print (output_str.format(o.uri, total_frames))
38+ print(input_str.format(s.uri, duration, samplerate))
39+ print(output_str.format(o.uri, total_frames))
3840
3941 if __name__ == '__main__':
4042 usage = "{:s} <input_file> [output_file]".format(sys.argv[0])
4143 if not 1 < len(sys.argv) < 4:
42− print (usage)
44+ print(usage)
4345 sys.exit(1)
4446 if len(sys.argv) < 3:
4547 input_path = sys.argv[1]
python/demos/demo_filterbank.py+31−17
@@ -1,30 +1,44 @@
11 #! /usr/bin/env python
22
3−from aubio import filterbank, fvec
4−from pylab import loglog, show, xlim, ylim, xlabel, ylabel, title
5−from numpy import vstack, arange
3+"""Create a filterbank from a list of frequencies.
64
7−win_s = 2048
5+This demo uses `aubio.filterbank.set_triangle_bands` to build a set of
6+triangular filters from a list of frequencies.
7+
8+The filterbank coefficients are then modified before being displayed."""
9+
10+import aubio
11+import numpy as np
12+import matplotlib.pyplot as plt
13+
14+# sampling rate and size of the fft
815 samplerate = 48000
16+win_s = 2048
917
18+# define a list of custom frequency
1019 freq_list = [60, 80, 200, 400, 800, 1600, 3200, 6400, 12800, 24000]
20+# number of filters to create
1121 n_filters = len(freq_list) - 2
1222
13−f = filterbank(n_filters, win_s)
14−freqs = fvec(freq_list)
23+# create a new filterbank
24+f = aubio.filterbank(n_filters, win_s)
25+freqs = aubio.fvec(freq_list)
1526 f.set_triangle_bands(freqs, samplerate)
1627
28+# get the coefficients from the filterbank
1729 coeffs = f.get_coeffs()
18−coeffs[4] *= 5.
19−
30+# apply a gain to fifth band
31+coeffs[4] *= 6.
32+# load the modified coeffs into the filterbank
2033 f.set_coeffs(coeffs)
2134
22−times = vstack([arange(win_s // 2 + 1) * samplerate / win_s] * n_filters)
23−title('Bank of filters built using a simple list of boundaries\nThe middle band has been amplified by 2.')
24−loglog(times.T, f.get_coeffs().T, '.-')
25−xlim([50, samplerate/2])
26−ylim([1.0e-6, 2.0e-2])
27−xlabel('log frequency (Hz)')
28−ylabel('log amplitude')
29−
30−show()
35+# display the band gains in a loglog plot
36+freqs = np.vstack([np.arange(win_s // 2 + 1) * samplerate / win_s] * n_filters)
37+plt.title('filterbank built from a list of frequencies\n'
38+ 'The 5th band has been amplified by a factor 6.')
39+plt.loglog(freqs.T, f.get_coeffs().T, '.-')
40+plt.xlim([50, samplerate/2])
41+plt.ylim([1.0e-6, 2.0e-2])
42+plt.xlabel('log frequency (Hz)')
43+plt.ylabel('log amplitude')
44+plt.show()
python/demos/demo_source_simple.py+10−6
@@ -1,16 +1,20 @@
11 #! /usr/bin/env python
2+
3+"""A simple example using aubio.source."""
4+
25 import sys
36 import aubio
47
5−samplerate = 0 # use original source samplerate
6−hop_size = 256 # number of frames to read in one block
8+samplerate = 0 # use original source samplerate
9+hop_size = 256 # number of frames to read in one block
710 src = aubio.source(sys.argv[1], samplerate, hop_size)
811 total_frames = 0
912
1013 while True:
11− samples, read = src() # read hop_size new samples from source
12− total_frames += read # increment total number of frames
13− if read < hop_size: break # end of file reached
14+ samples, read = src() # read hop_size new samples from source
15+ total_frames += read # increment total number of frames
16+ if read < hop_size: # end of file reached
17+ break
1418
1519 fmt_string = "read {:d} frames at {:d}Hz from {:s}"
16−print (fmt_string.format(total_frames, src.samplerate, src.uri))
20+print(fmt_string.format(total_frames, src.samplerate, src.uri))
python/ext/py-sink.c+1−1
@@ -14,7 +14,7 @@ typedef struct · 13 unmodified lines
1414 static char Py_sink_doc[] = ""
1515 "sink(path, samplerate=44100, channels=1)\n"
1616 "\n"
17−"Open `path` to write a WAV file.\n"
17+"Write audio samples to file.\n"
1818 "\n"
1919 "Parameters\n"
2020 "----------\n"
python/ext/py-source.c+3−3
@@ -18,7 +18,7 @@ typedef struct · 17 unmodified lines
1818 static char Py_source_doc[] = ""
1919 "source(path, samplerate=0, hop_size=512, channels=0)\n"
2020 "\n"
21−"Create a new source, opening the given pathname for reading.\n"
21+"Read audio samples from a media file.\n"
2222 "\n"
2323 "`source` open the file specified in `path` and creates a callable\n"
2424 "returning `hop_size` new audio samples at each invocation.\n"
@@ -247,7 +247,7 @@ static char Py_source_do_doc[] = "" · 222 unmodified lines
247247 "\n"
248248 "Returns\n"
249249 "-------\n"
250−"samples : numpy.ndarray, shape `(hop_size,)`, dtype aubio.float_type\n"
250+"samples : numpy.ndarray\n"
251251 " `fvec` of size `hop_size` containing the new samples.\n"
252252 "read : int\n"
253253 " Number of samples read from the source, equals to `hop_size`\n"
@@ -283,7 +283,7 @@ static char Py_source_do_multi_doc[] = "" · 29 unmodified lines
283283 "\n"
284284 "Returns\n"
285285 "-------\n"
286−"samples : np.ndarray([hop_size, channels], dtype=aubio.float_type)\n"
286+"samples : numpy.ndarray\n"
287287 " NumPy array of shape `(hop_size, channels)` containing the new\n"
288288 " audio samples.\n"
289289 "read : int\n"
python/lib/aubio/__init__.py+1−0
@@ -29,6 +29,7 @@ from ._aubio import * · 28 unmodified lines
2929 from .midiconv import *
3030 from .slicing import *
3131
32+
3233 class fvec(numpy.ndarray):
3334 """fvec(input_arg=1024)
3435 A vector holding float samples.
python/lib/aubio/cmd.py+65−31
@@ -11,6 +11,7 @@ readable code examples, check out the `python/demos` folder.""" · 10 unmodified lines
1111
1212 import sys
1313 import argparse
14+import warnings
1415 import aubio
1516
1617 def aubio_parser():
@@ -168,10 +169,10 @@ class AubioArgumentParser(argparse.ArgumentParser): · 151 unmodified lines
168169 help="samplerate at which the file should be represented")
169170
170171 def add_verbose_help(self):
171− self.add_argument("-v","--verbose",
172+ self.add_argument("-v", "--verbose",
172173 action="count", dest="verbose", default=1,
173174 help="make lots of noise [default]")
174− self.add_argument("-q","--quiet",
175+ self.add_argument("-q", "--quiet",
175176 action="store_const", dest="verbose", const=0,
176177 help="be quiet")
177178
@@ -180,25 +181,25 @@ class AubioArgumentParser(argparse.ArgumentParser): · 2 unmodified lines
180181 self.add_hop_size(hop_size=hop_size)
181182
182183 def add_buf_size(self, buf_size=512):
183− self.add_argument("-B","--bufsize",
184+ self.add_argument("-B", "--bufsize",
184185 action="store", dest="buf_size", default=buf_size,
185186 metavar = "<size>", type=int,
186187 help="buffer size [default=%d]" % buf_size)
187188
188189 def add_hop_size(self, hop_size=256):
189− self.add_argument("-H","--hopsize",
190+ self.add_argument("-H", "--hopsize",
190191 metavar = "<size>", type=int,
191192 action="store", dest="hop_size", default=hop_size,
192193 help="overlap size [default=%d]" % hop_size)
193194
194195 def add_method(self, method='default', helpstr='method'):
195− self.add_argument("-m","--method",
196+ self.add_argument("-m", "--method",
196197 metavar = "<method>", type=str,
197198 action="store", dest="method", default=method,
198199 help="%s [default=%s]" % (helpstr, method))
199200
200201 def add_threshold(self, default=None):
201− self.add_argument("-t","--threshold",
202+ self.add_argument("-t", "--threshold",
202203 metavar = "<threshold>", type=float,
203204 action="store", dest="threshold", default=default,
204205 help="threshold [default=%s]" % default)
@@ -239,14 +240,16 @@ class AubioArgumentParser(argparse.ArgumentParser): · 34 unmodified lines
239240 help=helpstr)
240241
241242 def add_slicer_options(self):
242− self.add_argument("-o","--output", type = str,
243+ self.add_argument("-o", "--output", type = str,
243244 metavar = "<outputdir>",
244245 action="store", dest="output_directory", default=None,
245− help="specify path where slices of the original file should be created")
246+ help="specify path where slices of the original file should"
247+ " be created")
246248 self.add_argument("--cut-until-nsamples", type = int,
247249 metavar = "<samples>",
248250 action = "store", dest = "cut_until_nsamples", default = None,
249− help="how many extra samples should be added at the end of each slice")
251+ help="how many extra samples should be added at the end of"
252+ " each slice")
250253 self.add_argument("--cut-every-nslices", type = int,
251254 metavar = "<samples>",
252255 action = "store", dest = "cut_every_nslices", default = None,
@@ -254,7 +257,8 @@ class AubioArgumentParser(argparse.ArgumentParser): · 1 unmodified line
254257 self.add_argument("--cut-until-nslices", type = int,
255258 metavar = "<slices>",
256259 action = "store", dest = "cut_until_nslices", default = None,
257− help="how many extra slices should be added at the end of each slice")
260+ help="how many extra slices should be added at the end of"
261+ " each slice")
258262 self.add_argument("--create-first",
259263 action = "store_true", dest = "create_first", default = False,
260264 help="always include first slice")
@@ -288,7 +292,8 @@ class default_process(object): · 27 unmodified lines
288292 self.time2string = timefunc(args.time_format)
289293 if args.verbose > 2 and hasattr(self, 'options'):
290294 name = type(self).__name__.split('_')[1]
291− optstr = ' '.join(['running', name, 'with options', repr(self.options), '\n'])
295+ optstr = ' '.join(['running', name, 'with options',
296+ repr(self.options), '\n'])
292297 sys.stderr.write(optstr)
293298 def flush(self, frames_read, samplerate):
294299 # optionally called at the end of process
@@ -296,7 +301,7 @@ class default_process(object): · 1 unmodified line
296301
297302 def parse_options(self, args, valid_opts):
298303 # get any valid options found in a dictionnary of arguments
299− options = {k :v for k,v in vars(args).items() if k in valid_opts}
304+ options = {k: v for k, v in vars(args).items() if k in valid_opts}
300305 self.options = options
301306
302307 def remap_pvoc_options(self, options):
@@ -377,7 +382,7 @@ class process_tempo(process_beat): · 74 unmodified lines
377382 if len(self.beat_locations) < 2:
378383 outstr = "unknown bpm"
379384 else:
380− bpms = 60./ np.diff(self.beat_locations)
385+ bpms = 60. / np.diff(self.beat_locations)
381386 median_bpm = np.mean(bpms)
382387 if len(self.beat_locations) < 10:
383388 outstr = "%.2f bpm (uncertain)" % median_bpm
@@ -398,14 +403,14 @@ class process_notes(default_process): · 14 unmodified lines
398403 def __call__(self, block):
399404 return self.notes(block)
400405 def repr_res(self, res, frames_read, samplerate):
401− if res[2] != 0: # note off
406+ if res[2] != 0: # note off
402407 fmt_out = self.time2string(frames_read, samplerate)
403408 sys.stdout.write(fmt_out + '\n')
404− if res[0] != 0: # note on
409+ if res[0] != 0: # note on
405410 lastmidi = res[0]
406411 fmt_out = "%f\t" % lastmidi
407412 fmt_out += self.time2string(frames_read, samplerate)
408− sys.stdout.write(fmt_out) # + '\t')
413+ sys.stdout.write(fmt_out) # + '\t')
409414 def flush(self, frames_read, samplerate):
410415 eof = self.time2string(frames_read, samplerate)
411416 sys.stdout.write(eof + '\n')
@@ -472,13 +477,13 @@ class process_quiet(default_process): · 60 unmodified lines
472477 if aubio.silence_detection(block, self.silence) == 1:
473478 if self.wassilence != 1:
474479 self.wassilence = 1
475− return 2 # newly found silence
476− return 1 # silence again
480+ return 2 # newly found silence
481+ return 1 # silence again
477482 else:
478483 if self.wassilence != 0:
479484 self.wassilence = 0
480− return -1 # newly found noise
481− return 0 # noise again
485+ return -1 # newly found noise
486+ return 0 # noise again
482487
483488 def repr_res(self, res, frames_read, samplerate):
484489 fmt_out = None
@@ -498,20 +503,47 @@ class process_cut(process_onset): · 13 unmodified lines
498503
499504 def __call__(self, block):
500505 ret = super(process_cut, self).__call__(block)
501− if ret: self.slices.append(self.onset.get_last())
506+ if ret:
507+ self.slices.append(self.onset.get_last())
502508 return ret
503509
504510 def flush(self, frames_read, samplerate):
505− from aubio.cut import _cut_slice
506511 _cut_slice(self.options, self.slices)
507− duration = float (frames_read) / float(samplerate)
508− base_info = '%(source_file)s' % {'source_file': self.options.source_uri}
512+ duration = float(frames_read) / float(samplerate)
513+ base_info = '%(source_file)s' % \
514+ {'source_file': self.options.source_uri}
509515 base_info += ' (total %(duration).2fs at %(samplerate)dHz)\n' % \
510− {'duration': duration, 'samplerate': samplerate}
516+ {'duration': duration, 'samplerate': samplerate}
511517 info = "created %d slices from " % len(self.slices)
512518 info += base_info
513519 sys.stderr.write(info)
514520
521+def _cut_slice(options, timestamps):
522+ # cutting pass
523+ nstamps = len(timestamps)
524+ if nstamps > 0:
525+ # generate output files
526+ timestamps_end = None
527+ if options.cut_every_nslices:
528+ timestamps = timestamps[::options.cut_every_nslices]
529+ nstamps = len(timestamps)
530+ if options.cut_until_nslices and options.cut_until_nsamples:
531+ msg = "using cut_until_nslices, but cut_until_nsamples is set"
532+ warnings.warn(msg)
533+ if options.cut_until_nsamples:
534+ lag = options.cut_until_nsamples
535+ timestamps_end = [t + lag for t in timestamps[1:]]
536+ timestamps_end += [1e120]
537+ if options.cut_until_nslices:
538+ slice_lag = options.cut_until_nslices
539+ timestamps_end = [t for t in timestamps[1 + slice_lag:]]
540+ timestamps_end += [1e120] * (options.cut_until_nslices + 1)
541+ aubio.slice_source_at_stamps(options.source_uri,
542+ timestamps, timestamps_end = timestamps_end,
543+ output_dir = options.output_directory,
544+ samplerate = options.samplerate,
545+ create_first = options.create_first)
546+
515547 def main():
516548 parser = aubio_parser()
517549 if sys.version_info[0] != 3:
@@ -525,19 +557,20 @@ def main(): · 7 unmodified lines
525557 parser_root.add_argument('-V', '--version', help="show version",
526558 action="store_true", dest="show_version")
527559 args, extras = parser_root.parse_known_args()
528− if args.show_version == False: # no -V, forward to parser
560+ if not args.show_version: # no -V, forward to parser
529561 args = parser.parse_args(extras, namespace=args)
530− elif len(extras) != 0: # -V with other arguments, print help
562+ elif len(extras) != 0: # -V with other arguments, print help
531563 parser.print_help()
532564 sys.exit(1)
533− else: # in py3, we can simply use parser directly
565+ else: # in py3, we can simply use parser directly
534566 args = parser.parse_args()
535567 if 'show_version' in args and args.show_version:
536568 sys.stdout.write('aubio version ' + aubio.version + '\n')
537569 sys.exit(0)
538570 elif 'verbose' in args and args.verbose > 3:
539571 sys.stderr.write('aubio version ' + aubio.version + '\n')
540− if 'command' not in args or args.command is None or args.command in ['help']:
572+ if 'command' not in args or args.command is None \
573+ or args.command in ['help']:
541574 # no command given, print help and return 1
542575 parser.print_help()
543576 if args.command and args.command in ['help']:
@@ -571,7 +604,8 @@ def main(): · 27 unmodified lines
571604 # increment total number of frames read
572605 frames_read += read
573606 # exit loop at end of file
574− if read < a_source.hop_size: break
607+ if read < a_source.hop_size:
608+ break
575609 # flush the processor if needed
576610 processor.flush(frames_read, a_source.samplerate)
577611 if args.verbose > 1:
@@ -579,7 +613,7 @@ def main(): · 1 unmodified line
579613 fmt_string += " ({:d} samples in {:d} blocks of {:d})"
580614 fmt_string += " from {:s} at {:d}Hz\n"
581615 sys.stderr.write(fmt_string.format(
582− frames_read/float(a_source.samplerate),
616+ frames_read / float(a_source.samplerate),
583617 frames_read,
584618 frames_read // a_source.hop_size + 1,
585619 a_source.hop_size,
python/lib/aubio/cut.py+29−49
@@ -5,83 +5,83 @@ · 4 unmodified lines
55 """
66
77 import sys
8−from aubio.cmd import AubioArgumentParser
8+from aubio.cmd import AubioArgumentParser, _cut_slice
99
1010 def aubio_cut_parser():
1111 parser = AubioArgumentParser()
1212 parser.add_input()
13− parser.add_argument("-O","--onset-method",
13+ parser.add_argument("-O", "--onset-method",
1414 action="store", dest="onset_method", default='default',
1515 metavar = "<onset_method>",
1616 help="onset detection method [default=default] \
1717 complexdomain|hfc|phase|specdiff|energy|kl|mkl")
1818 # cutting methods
19− parser.add_argument("-b","--beat",
19+ parser.add_argument("-b", "--beat",
2020 action="store_true", dest="beat", default=False,
2121 help="slice at beat locations")
2222 """
23− parser.add_argument("-S","--silencecut",
23+ parser.add_argument("-S", "--silencecut",
2424 action="store_true", dest="silencecut", default=False,
2525 help="use silence locations")
26− parser.add_argument("-s","--silence",
26+ parser.add_argument("-s", "--silence",
2727 metavar = "<value>",
2828 action="store", dest="silence", default=-70,
2929 help="silence threshold [default=-70]")
3030 """
3131 # algorithm parameters
3232 parser.add_buf_hop_size()
33− parser.add_argument("-t","--threshold", "--onset-threshold",
33+ parser.add_argument("-t", "--threshold", "--onset-threshold",
3434 metavar = "<threshold>", type=float,
3535 action="store", dest="threshold", default=0.3,
3636 help="onset peak picking threshold [default=0.3]")
37− parser.add_argument("-c","--cut",
37+ parser.add_argument("-c", "--cut",
3838 action="store_true", dest="cut", default=False,
3939 help="cut input sound file at detected labels")
4040 parser.add_minioi()
4141
4242 """
43− parser.add_argument("-D","--delay",
43+ parser.add_argument("-D", "--delay",
4444 action = "store", dest = "delay", type = float,
4545 metavar = "<seconds>", default=0,
4646 help="number of seconds to take back [default=system]\
4747 default system delay is 3*hopsize/samplerate")
48− parser.add_argument("-C","--dcthreshold",
48+ parser.add_argument("-C", "--dcthreshold",
4949 metavar = "<value>",
5050 action="store", dest="dcthreshold", default=1.,
5151 help="onset peak picking DC component [default=1.]")
52− parser.add_argument("-L","--localmin",
52+ parser.add_argument("-L", "--localmin",
5353 action="store_true", dest="localmin", default=False,
5454 help="use local minima after peak detection")
55− parser.add_argument("-d","--derivate",
55+ parser.add_argument("-d", "--derivate",
5656 action="store_true", dest="derivate", default=False,
5757 help="derivate onset detection function")
58− parser.add_argument("-z","--zerocross",
58+ parser.add_argument("-z", "--zerocross",
5959 metavar = "<value>",
6060 action="store", dest="zerothres", default=0.008,
6161 help="zero-crossing threshold for slicing [default=0.00008]")
6262 # plotting functions
63− parser.add_argument("-p","--plot",
63+ parser.add_argument("-p", "--plot",
6464 action="store_true", dest="plot", default=False,
6565 help="draw plot")
66− parser.add_argument("-x","--xsize",
66+ parser.add_argument("-x", "--xsize",
6767 metavar = "<size>",
6868 action="store", dest="xsize", default=1.,
6969 type=float, help="define xsize for plot")
70− parser.add_argument("-y","--ysize",
70+ parser.add_argument("-y", "--ysize",
7171 metavar = "<size>",
7272 action="store", dest="ysize", default=1.,
7373 type=float, help="define ysize for plot")
74− parser.add_argument("-f","--function",
74+ parser.add_argument("-f", "--function",
7575 action="store_true", dest="func", default=False,
7676 help="print detection function")
77− parser.add_argument("-n","--no-onsets",
77+ parser.add_argument("-n", "--no-onsets",
7878 action="store_true", dest="nplot", default=False,
7979 help="do not plot detected onsets")
80− parser.add_argument("-O","--outplot",
80+ parser.add_argument("-O", "--outplot",
8181 metavar = "<output_image>",
8282 action="store", dest="outplot", default=None,
8383 help="save plot to output.{ps,png}")
84− parser.add_argument("-F","--spectrogram",
84+ parser.add_argument("-F", "--spectrogram",
8585 action="store_true", dest="spectro", default=False,
8686 help="add spectrogram to the plot")
8787 """
@@ -105,9 +105,11 @@ def _cut_analyze(options): · 17 unmodified lines
105105 options.samplerate = samplerate
106106
107107 if options.beat:
108− o = tempo(options.onset_method, bufsize, hopsize, samplerate=samplerate)
108+ o = tempo(options.onset_method, bufsize, hopsize,
109+ samplerate=samplerate)
109110 else:
110− o = onset(options.onset_method, bufsize, hopsize, samplerate=samplerate)
111+ o = onset(options.onset_method, bufsize, hopsize,
112+ samplerate=samplerate)
111113 if options.minioi:
112114 if options.minioi.endswith('ms'):
113115 o.set_minioi_ms(int(options.minioi[:-2]))
@@ -122,37 +124,15 @@ def _cut_analyze(options): · 8 unmodified lines
122124 while True:
123125 samples, read = s()
124126 if o(samples):
125− timestamps.append (o.get_last())
126− if options.verbose: print ("%.4f" % o.get_last_s())
127+ timestamps.append(o.get_last())
128+ if options.verbose:
129+ print("%.4f" % o.get_last_s())
127130 total_frames += read
128− if read < hopsize: break
131+ if read < hopsize:
132+ break
129133 del s
130134 return timestamps, total_frames
131135
132−def _cut_slice(options, timestamps):
133− # cutting pass
134− nstamps = len(timestamps)
135− if nstamps > 0:
136− # generate output files
137− from aubio.slicing import slice_source_at_stamps
138− timestamps_end = None
139− if options.cut_every_nslices:
140− timestamps = timestamps[::options.cut_every_nslices]
141− nstamps = len(timestamps)
142− if options.cut_until_nslices and options.cut_until_nsamples:
143− print ("warning: using cut_until_nslices, but cut_until_nsamples is set")
144− if options.cut_until_nsamples:
145− timestamps_end = [t + options.cut_until_nsamples for t in timestamps[1:]]
146− timestamps_end += [ 1e120 ]
147− if options.cut_until_nslices:
148− timestamps_end = [t for t in timestamps[1 + options.cut_until_nslices:]]
149− timestamps_end += [ 1e120 ] * (options.cut_until_nslices + 1)
150− slice_source_at_stamps(options.source_uri,
151− timestamps, timestamps_end = timestamps_end,
152− output_dir = options.output_directory,
153− samplerate = options.samplerate,
154− create_first = options.create_first)
155−
156136 def main():
157137 parser = aubio_cut_parser()
158138 options = parser.parse_args()
@@ -167,7 +147,7 @@ def main(): · 8 unmodified lines
167147 timestamps, total_frames = _cut_analyze(options)
168148
169149 # print some info
170− duration = float (total_frames) / float(options.samplerate)
150+ duration = float(total_frames) / float(options.samplerate)
171151 base_info = '%(source_uri)s' % {'source_uri': options.source_uri}
172152 base_info += ' (total %(duration).2fs at %(samplerate)dHz)\n' % \
173153 {'duration': duration, 'samplerate': options.samplerate}
python/lib/aubio/midiconv.py+17−12
@@ -1,11 +1,11 @@
11 # -*- coding: utf-8 -*-
22 """ utilities to convert midi note number to and from note names """
33
4−__all__ = ['note2midi', 'midi2note', 'freq2note', 'note2freq']
5−
64 import sys
75 from ._aubio import freqtomidi, miditofreq
86
7+__all__ = ['note2midi', 'midi2note', 'freq2note', 'note2freq']
8+
99 py3 = sys.version_info[0] == 3
1010 if py3:
1111 str_instances = str
@@ -14,6 +14,7 @@ else: · 2 unmodified lines
1414 str_instances = (str, unicode)
1515 int_instances = (int, long)
1616
17+
1718 def note2midi(note):
1819 """Convert note name to midi note number.
1920
@@ -55,13 +56,14 @@ def note2midi(note): · 35 unmodified lines
5556 --------
5657 midi2note, freqtomidi, miditofreq
5758 """
58− _valid_notenames = {'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7, 'A': 9, 'B': 11}
59+ _valid_notenames = {'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7,
60+ 'A': 9, 'B': 11}
5961 _valid_modifiers = {
60− u'𝄫': -2, # double flat
61− u'♭': -1, 'b': -1, '\u266d': -1, # simple flat
62− u'♮': 0, '\u266e': 0, None: 0, # natural
63− '#': +1, u'♯': +1, '\u266f': +1, # sharp
64− u'𝄪': +2, # double sharp
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
6567 }
6668 _valid_octaves = range(-1, 10)
6769 if not isinstance(note, str_instances):
@@ -70,7 +72,7 @@ def note2midi(note): · 2 unmodified lines
7072 if len(note) not in range(2, 5):
7173 msg = "string of 2 to 4 characters expected, got {:d} ({:s})"
7274 raise ValueError(msg.format(len(note), note))
73− notename, modifier, octave = [None]*3
75+ notename, modifier, octave = [None] * 3
7476
7577 if len(note) == 4:
7678 notename, modifier, octave_sign, octave = note
@@ -93,12 +95,13 @@ def note2midi(note): · 16 unmodified lines
9395 if octave not in _valid_octaves:
9496 raise ValueError("%s is not a valid octave" % octave)
9597
96− midi = 12 + octave * 12 + _valid_notenames[notename] \
97− + _valid_modifiers[modifier]
98+ midi = (octave + 1) * 12 + _valid_notenames[notename] \
99+ + _valid_modifiers[modifier]
98100 if midi > 127:
99101 raise ValueError("%s is outside of the range C-2 to G8" % note)
100102 return midi
101103
104+
102105 def midi2note(midi):
103106 """Convert midi note number to note name.
104107
@@ -136,9 +139,10 @@ def midi2note(midi): · 31 unmodified lines
136139 msg = "an integer between 0 and 127 is excepted, got {:d}"
137140 raise ValueError(msg.format(midi))
138141 _valid_notenames = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#',
139− 'A', 'A#', 'B']
142+ 'A', 'A#', 'B']
140143 return _valid_notenames[midi % 12] + str(int(midi / 12) - 1)
141144
145+
142146 def freq2note(freq):
143147 """Convert frequency in Hz to nearest note name.
144148
@@ -162,6 +166,7 @@ def freq2note(freq): · 17 unmodified lines
162166 nearest_note = int(freqtomidi(freq) + .5)
163167 return midi2note(nearest_note)
164168
169+
165170 def note2freq(note):
166171 """Convert note name to corresponding frequency, in Hz.
167172
python/lib/aubio/slicing.py+10−11
@@ -5,6 +5,7 @@ from aubio import source, sink · 4 unmodified lines
55
66 _max_timestamp = 1e120
77
8+
89 def slice_source_at_stamps(source_file, timestamps, timestamps_end=None,
910 output_dir=None, samplerate=0, hopsize=256,
1011 create_first=False):
@@ -72,7 +73,7 @@ def slice_source_at_stamps(source_file, timestamps, timestamps_end=None, · 61 unmodified lines
7273 the file.
7374 """
7475
75− if timestamps is None or len(timestamps) == 0:
76+ if not timestamps:
7677 raise ValueError("no timestamps given")
7778
7879 if timestamps[0] != 0 and create_first:
@@ -89,7 +90,6 @@ def slice_source_at_stamps(source_file, timestamps, timestamps_end=None, · 10 unmodified lines
8990 timestamps_end = [t - 1 for t in timestamps[1:]] + [_max_timestamp]
9091
9192 regions = list(zip(timestamps, timestamps_end))
92− #print regions
9393
9494 source_base_name, _ = os.path.splitext(os.path.basename(source_file))
9595 if output_dir is not None:
@@ -97,8 +97,8 @@ def slice_source_at_stamps(source_file, timestamps, timestamps_end=None, · 1 unmodified line
9797 os.makedirs(output_dir)
9898 source_base_name = os.path.join(output_dir, source_base_name)
9999
100− def new_sink_name(source_base_name, timestamp, samplerate):
101− """ create a sink based on a timestamp in samples, converted in seconds """
100+ def _new_sink_name(source_base_name, timestamp, samplerate):
101+ # create name based on a timestamp in samples, converted in seconds
102102 timestamp_seconds = timestamp / float(samplerate)
103103 return source_base_name + "_%011.6f" % timestamp_seconds + '.wav'
104104
@@ -113,16 +113,17 @@ def slice_source_at_stamps(source_file, timestamps, timestamps_end=None, · 8 unmodified lines
113113 # get hopsize new samples from source
114114 vec, read = _source.do_multi()
115115 # if the total number of frames read will exceed the next region start
116− while len(regions) and total_frames + read >= regions[0][0]:
117− #print "getting", regions[0], "at", total_frames
116+ while regions and total_frames + read >= regions[0][0]:
118117 # get next region
119118 start_stamp, end_stamp = regions.pop(0)
120119 # create a name for the sink
121− new_sink_path = new_sink_name(source_base_name, start_stamp, samplerate)
120+ new_sink_path = _new_sink_name(source_base_name, start_stamp,
121+ samplerate)
122122 # create its sink
123123 _sink = sink(new_sink_path, samplerate, _source.channels)
124124 # create a dictionary containing all this
125− new_slice = {'start_stamp': start_stamp, 'end_stamp': end_stamp, 'sink': _sink}
125+ new_slice = {'start_stamp': start_stamp, 'end_stamp': end_stamp,
126+ 'sink': _sink}
126127 # append the dictionary to the current list of slices
127128 slices.append(new_slice)
128129
@@ -134,13 +135,11 @@ def slice_source_at_stamps(source_file, timestamps, timestamps_end=None, · 5 unmodified lines
134135 start = max(start_stamp - total_frames, 0)
135136 # number of samples yet to written be until end of region
136137 remaining = end_stamp - total_frames + 1
137− #print current_slice, remaining, start
138138 # not enough frames remaining, time to split
139139 if remaining < read:
140140 if remaining > start:
141141 # write remaining samples from current region
142142 _sink.do_multi(vec[:, start:remaining], remaining - start)
143− #print("closing region", "remaining", remaining)
144143 # close this file
145144 _sink.close()
146145 elif read > start:
@@ -149,6 +148,6 @@ def slice_source_at_stamps(source_file, timestamps, timestamps_end=None, · 2 unmodified lines
149148 total_frames += read
150149 # remove old slices
151150 slices = list(filter(lambda s: s['end_stamp'] > total_frames,
152− slices))
151+ slices))
153152 if read < hopsize:
154153 break

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