Changes in / [c03d191:088760e]
- Files:
-
- 2 added
- 3 deleted
- 42 edited
Legend:
- Unmodified
- Added
- Removed
-
.gitignore
rc03d191 r088760e 49 49 python/tests/sounds 50 50 aubio.egg-info 51 .eggs52 .cache -
MANIFEST.in
rc03d191 r088760e 2 2 include python/README.md 3 3 include this_version.py 4 include waf5 recursive-include waflib *.py6 4 include Makefile wscript */wscript_build 5 include waf waflib/* waflib/*/* 6 exclude waflib/__pycache__/* 7 7 include aubio.pc.in 8 8 include nose2.cfg … … 13 13 include tests/*.h tests/*/*.c tests/*/*/*.c 14 14 include python/ext/*.h 15 recursive-include python *.py 16 include python/README.md 15 include python/__init__.py 16 include python/lib/__init__.py 17 include python/lib/moresetuptools.py 18 include python/lib/gen_external.py 19 include python/lib/gen_code.py 17 20 include python/tests/run_all_tests 21 include python/tests/*.py 18 22 include python/tests/eval_pitch 23 include python/demos/*.py 19 24 include python/tests/*.expected 20 25 include doc/*.txt doc/*.rst doc/*.cfg doc/Makefile doc/make.bat doc/conf.py -
Makefile
rc03d191 r088760e 234 234 uninstall_python \ 235 235 check_clean_python 236 237 coverage_cycle: coverage_zero_counters coverage_report238 239 coverage_zero_counters:240 lcov --zerocounters --directory .241 236 242 237 coverage: export CFLAGS=--coverage … … 252 247 lcov -a build/coverage_python.info -a build/coverage_lib.info -o build/coverage.info 253 248 254 # make sure we don't build the doc, which builds a temporary python module255 coverage_report: export WAFOPTS += --disable-docs256 249 coverage_report: coverage 257 250 genhtml build/coverage.info --output-directory lcov_html -
doc/py_io.rst
rc03d191 r088760e 40 40 down-mixed to produce the new samples. 41 41 42 :returns: A tuple of one array of samples and one integer.42 return: A tuple of one array of samples and one integer. 43 43 :rtype: (array, int) 44 44 -
doc/py_utils.rst
rc03d191 r088760e 28 28 29 29 .. autofunction:: miditofreq 30 31 .. python/ext/py-musicutils.h32 33 .. autofunction:: meltohz34 35 .. autofunction:: hztomel36 30 37 31 .. python/ext/aubiomodule.c -
python/demos/demo_filter.py
rc03d191 r088760e 4 4 import os.path 5 5 import aubio 6 7 6 8 7 def apply_filter(path, target): … … 29 28 total_frames += read 30 29 # end of file reached 31 if read < s.hop_size: 32 break 30 if read < s.hop_size: break 33 31 34 32 # print some info … … 36 34 input_str = "input: {:s} ({:.2f} s, {:d} Hz)" 37 35 output_str = "output: {:s}, A-weighting filtered ({:d} frames total)" 38 print (input_str.format(s.uri, duration, samplerate))39 print (output_str.format(o.uri, total_frames))36 print (input_str.format(s.uri, duration, samplerate)) 37 print (output_str.format(o.uri, total_frames)) 40 38 41 39 if __name__ == '__main__': 42 40 usage = "{:s} <input_file> [output_file]".format(sys.argv[0]) 43 41 if not 1 < len(sys.argv) < 4: 44 print (usage)42 print (usage) 45 43 sys.exit(1) 46 44 if len(sys.argv) < 3: -
python/demos/demo_filterbank.py
rc03d191 r088760e 1 1 #! /usr/bin/env python 2 2 3 """Create a filterbank from a list of frequencies. 3 from aubio import filterbank, fvec 4 from pylab import loglog, show, xlim, ylim, xlabel, ylabel, title 5 from numpy import vstack, arange 4 6 5 This demo uses `aubio.filterbank.set_triangle_bands` to build a set of 6 triangular filters from a list of frequencies. 7 win_s = 2048 8 samplerate = 48000 7 9 8 The filterbank coefficients are then modified before being displayed."""9 10 import aubio11 import numpy as np12 import matplotlib.pyplot as plt13 14 # sampling rate and size of the fft15 samplerate = 4800016 win_s = 204817 18 # define a list of custom frequency19 10 freq_list = [60, 80, 200, 400, 800, 1600, 3200, 6400, 12800, 24000] 20 # number of filters to create21 11 n_filters = len(freq_list) - 2 22 12 23 # create a new filterbank 24 f = aubio.filterbank(n_filters, win_s) 25 freqs = aubio.fvec(freq_list) 13 f = filterbank(n_filters, win_s) 14 freqs = fvec(freq_list) 26 15 f.set_triangle_bands(freqs, samplerate) 27 16 28 # get the coefficients from the filterbank29 17 coeffs = f.get_coeffs() 30 # apply a gain to fifth band 31 coeffs[4] *= 6. 32 # load the modified coeffs into the filterbank 18 coeffs[4] *= 5. 19 33 20 f.set_coeffs(coeffs) 34 21 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() 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() -
python/demos/demo_source_simple.py
rc03d191 r088760e 1 1 #! /usr/bin/env python 2 3 """A simple example using aubio.source."""4 5 2 import sys 6 3 import aubio 7 4 8 samplerate = 0 9 hop_size = 256 5 samplerate = 0 # use original source samplerate 6 hop_size = 256 # number of frames to read in one block 10 7 src = aubio.source(sys.argv[1], samplerate, hop_size) 11 8 total_frames = 0 12 9 13 10 while True: 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 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 18 14 19 15 fmt_string = "read {:d} frames at {:d}Hz from {:s}" 20 print (fmt_string.format(total_frames, src.samplerate, src.uri))16 print (fmt_string.format(total_frames, src.samplerate, src.uri)) -
python/ext/aubiomodule.c
rc03d191 r088760e 373 373 {"shift", Py_aubio_shift, METH_VARARGS, Py_aubio_shift_doc}, 374 374 {"ishift", Py_aubio_ishift, METH_VARARGS, Py_aubio_ishift_doc}, 375 {"hztomel", Py_aubio_hztomel, METH_VARARGS|METH_KEYWORDS, Py_aubio_hztomel_doc},376 {"meltohz", Py_aubio_meltohz, METH_VARARGS|METH_KEYWORDS, Py_aubio_meltohz_doc},377 {"hztomel_htk", Py_aubio_hztomel_htk, METH_VARARGS, Py_aubio_hztomel_htk_doc},378 {"meltohz_htk", Py_aubio_meltohz_htk, METH_VARARGS, Py_aubio_meltohz_htk_doc},379 375 {NULL, NULL, 0, NULL} /* Sentinel */ 380 376 }; -
python/ext/py-filterbank.c
rc03d191 r088760e 139 139 &(self->freqs), samplerate); 140 140 if (err > 0) { 141 if (PyErr_Occurred() == NULL) { 142 PyErr_SetString (PyExc_ValueError, "error running set_triangle_bands"); 143 } else { 144 // change the RuntimeError into ValueError 145 PyObject *type, *value, *traceback; 146 PyErr_Fetch(&type, &value, &traceback); 147 PyErr_Restore(PyExc_ValueError, value, traceback); 148 } 141 PyErr_SetString (PyExc_ValueError, 142 "error when running set_triangle_bands"); 149 143 return NULL; 150 144 } … … 157 151 uint_t err = 0; 158 152 159 smpl_t samplerate;160 if (!PyArg_ParseTuple (args, AUBIO_NPY_SMPL_CHR, &samplerate)) {153 uint_t samplerate; 154 if (!PyArg_ParseTuple (args, "I", &samplerate)) { 161 155 return NULL; 162 156 } … … 164 158 err = aubio_filterbank_set_mel_coeffs_slaney (self->o, samplerate); 165 159 if (err > 0) { 166 if (PyErr_Occurred() == NULL) { 167 PyErr_SetString (PyExc_ValueError, "error running set_mel_coeffs_slaney"); 168 } else { 169 // change the RuntimeError into ValueError 170 PyObject *type, *value, *traceback; 171 PyErr_Fetch(&type, &value, &traceback); 172 PyErr_Restore(PyExc_ValueError, value, traceback); 173 } 174 return NULL; 175 } 176 Py_RETURN_NONE; 177 } 178 179 static PyObject * 180 Py_filterbank_set_mel_coeffs (Py_filterbank * self, PyObject *args) 181 { 182 uint_t err = 0; 183 184 smpl_t samplerate; 185 smpl_t freq_min; 186 smpl_t freq_max; 187 if (!PyArg_ParseTuple (args, AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR 188 AUBIO_NPY_SMPL_CHR, &samplerate, &freq_min, &freq_max)) { 189 return NULL; 190 } 191 192 err = aubio_filterbank_set_mel_coeffs (self->o, samplerate, 193 freq_min, freq_max); 194 if (err > 0) { 195 if (PyErr_Occurred() == NULL) { 196 PyErr_SetString (PyExc_ValueError, "error running set_mel_coeffs"); 197 } else { 198 // change the RuntimeError into ValueError 199 PyObject *type, *value, *traceback; 200 PyErr_Fetch(&type, &value, &traceback); 201 PyErr_Restore(PyExc_ValueError, value, traceback); 202 } 203 return NULL; 204 } 205 Py_RETURN_NONE; 206 } 207 208 static PyObject * 209 Py_filterbank_set_mel_coeffs_htk (Py_filterbank * self, PyObject *args) 210 { 211 uint_t err = 0; 212 213 smpl_t samplerate; 214 smpl_t freq_min; 215 smpl_t freq_max; 216 if (!PyArg_ParseTuple (args, AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR 217 AUBIO_NPY_SMPL_CHR, &samplerate, &freq_min, &freq_max)) { 218 return NULL; 219 } 220 221 err = aubio_filterbank_set_mel_coeffs_htk (self->o, samplerate, 222 freq_min, freq_max); 223 if (err > 0) { 224 if (PyErr_Occurred() == NULL) { 225 PyErr_SetString (PyExc_ValueError, "error running set_mel_coeffs_htk"); 226 } else { 227 // change the RuntimeError into ValueError 228 PyObject *type, *value, *traceback; 229 PyErr_Fetch(&type, &value, &traceback); 230 PyErr_Restore(PyExc_ValueError, value, traceback); 231 } 160 PyErr_SetString (PyExc_ValueError, 161 "error when running set_mel_coeffs_slaney"); 232 162 return NULL; 233 163 } … … 264 194 return (PyObject *)PyAubio_CFmatToArray( 265 195 aubio_filterbank_get_coeffs (self->o) ); 266 }267 268 static PyObject *269 Py_filterbank_set_power(Py_filterbank *self, PyObject *args)270 {271 uint_t power;272 273 if (!PyArg_ParseTuple (args, "I", &power)) {274 return NULL;275 }276 if(aubio_filterbank_set_power (self->o, power)) {277 if (PyErr_Occurred() == NULL) {278 PyErr_SetString (PyExc_ValueError,279 "error running filterbank.set_power");280 } else {281 // change the RuntimeError into ValueError282 PyObject *type, *value, *traceback;283 PyErr_Fetch(&type, &value, &traceback);284 PyErr_Restore(PyExc_ValueError, value, traceback);285 }286 return NULL;287 }288 Py_RETURN_NONE;289 }290 291 static PyObject *292 Py_filterbank_set_norm(Py_filterbank *self, PyObject *args)293 {294 uint_t playing;295 296 if (!PyArg_ParseTuple (args, "I", &playing)) {297 return NULL;298 }299 if(aubio_filterbank_set_norm (self->o, playing)) {300 if (PyErr_Occurred() == NULL) {301 PyErr_SetString (PyExc_ValueError,302 "error running filterbank.set_power");303 } else {304 // change the RuntimeError into ValueError305 PyObject *type, *value, *traceback;306 PyErr_Fetch(&type, &value, &traceback);307 PyErr_Restore(PyExc_ValueError, value, traceback);308 }309 return NULL;310 }311 Py_RETURN_NONE;312 196 } 313 197 … … 317 201 {"set_mel_coeffs_slaney", (PyCFunction) Py_filterbank_set_mel_coeffs_slaney, 318 202 METH_VARARGS, "set coefficients of filterbank as in Auditory Toolbox"}, 319 {"set_mel_coeffs", (PyCFunction) Py_filterbank_set_mel_coeffs,320 METH_VARARGS, "set coefficients of filterbank to linearly spaced mel scale"},321 {"set_mel_coeffs_htk", (PyCFunction) Py_filterbank_set_mel_coeffs_htk,322 METH_VARARGS, "set coefficients of filterbank to linearly spaced mel scale"},323 203 {"get_coeffs", (PyCFunction) Py_filterbank_get_coeffs, 324 204 METH_NOARGS, "get coefficients of filterbank"}, 325 205 {"set_coeffs", (PyCFunction) Py_filterbank_set_coeffs, 326 206 METH_VARARGS, "set coefficients of filterbank"}, 327 {"set_power", (PyCFunction) Py_filterbank_set_power,328 METH_VARARGS, "set power applied to filterbank input spectrum"},329 {"set_norm", (PyCFunction) Py_filterbank_set_norm,330 METH_VARARGS, "set norm applied to filterbank input spectrum"},331 207 {NULL} 332 208 }; -
python/ext/py-musicutils.c
rc03d191 r088760e 182 182 return (PyObject *) PyAubio_CFvecToArray(&vec); 183 183 } 184 185 PyObject*186 Py_aubio_hztomel(PyObject *self, PyObject *args, PyObject *kwds)187 {188 smpl_t v;189 PyObject *htk = NULL;190 static char *kwlist[] = {"f", "htk", NULL};191 if (!PyArg_ParseTupleAndKeywords(args, kwds, AUBIO_NPY_SMPL_CHR "|O",192 kwlist, &v, &htk))193 {194 return NULL;195 }196 if (htk != NULL && PyObject_IsTrue(htk) == 1)197 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_hztomel_htk(v));198 else199 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_hztomel(v));200 }201 202 PyObject*203 Py_aubio_meltohz(PyObject *self, PyObject *args, PyObject *kwds)204 {205 smpl_t v;206 PyObject *htk = NULL;207 static char *kwlist[] = {"m", "htk", NULL};208 if (!PyArg_ParseTupleAndKeywords(args, kwds, AUBIO_NPY_SMPL_CHR "|O",209 kwlist, &v, &htk))210 {211 return NULL;212 }213 if (htk != NULL && PyObject_IsTrue(htk) == 1)214 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_meltohz_htk(v));215 else216 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_meltohz(v));217 }218 219 PyObject*220 Py_aubio_hztomel_htk(PyObject *self, PyObject *args)221 {222 smpl_t v;223 if (!PyArg_ParseTuple(args, AUBIO_NPY_SMPL_CHR, &v)) {224 return NULL;225 }226 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_hztomel_htk(v));227 }228 229 PyObject*230 Py_aubio_meltohz_htk(PyObject *self, PyObject *args)231 {232 smpl_t v;233 if (!PyArg_ParseTuple(args, AUBIO_NPY_SMPL_CHR, &v)) {234 return NULL;235 }236 return Py_BuildValue(AUBIO_NPY_SMPL_CHR, aubio_meltohz_htk(v));237 } -
python/ext/py-musicutils.h
rc03d191 r088760e 301 301 PyObject * Py_aubio_ishift(PyObject *self, PyObject *args); 302 302 303 static char Py_aubio_hztomel_doc[] = ""304 "hztomel(f, htk=False)\n"305 "\n"306 "Convert a scalar from frequency to mel scale.\n"307 "\n"308 "Parameters\n"309 "----------\n"310 "m : float\n"311 " input frequency, in Hz\n"312 "htk : bool\n"313 " if `True`, use Htk mel scale instead of Slaney.\n"314 "\n"315 "Returns\n"316 "-------\n"317 "float\n"318 " output mel\n"319 "\n"320 "See Also\n"321 "--------\n"322 "meltohz\n"323 "";324 PyObject * Py_aubio_hztomel(PyObject *self, PyObject *args);325 326 static char Py_aubio_meltohz_doc[] = ""327 "meltohz(m, htk=False)\n"328 "\n"329 "Convert a scalar from mel scale to frequency.\n"330 "\n"331 "Parameters\n"332 "----------\n"333 "m : float\n"334 " input mel\n"335 "htk : bool\n"336 " if `True`, use Htk mel scale instead of Slaney.\n"337 "\n"338 "Returns\n"339 "-------\n"340 "float\n"341 " output frequency, in Hz\n"342 "\n"343 "See Also\n"344 "--------\n"345 "hztomel\n"346 "";347 PyObject * Py_aubio_meltohz(PyObject *self, PyObject *args);348 349 static char Py_aubio_hztomel_htk_doc[] = ""350 "hztomel_htk(m)\n"351 "\n"352 "Same as `hztomel(m, htk=True)`\n"353 "\n"354 "See Also\n"355 "--------\n"356 "hztomel\n"357 "";358 PyObject * Py_aubio_hztomel_htk(PyObject *self, PyObject *args);359 360 static char Py_aubio_meltohz_htk_doc[] = ""361 "meltohz_htk(m)\n"362 "\n"363 "Same as `meltohz(m, htk=True)`\n"364 "\n"365 "See Also\n"366 "--------\n"367 "meltohz\n"368 "";369 PyObject * Py_aubio_meltohz_htk(PyObject *self, PyObject *args);370 371 303 #endif /* PY_AUBIO_MUSICUTILS_H */ -
python/ext/py-sink.c
rc03d191 r088760e 15 15 "sink(path, samplerate=44100, channels=1)\n" 16 16 "\n" 17 " Write audio samples tofile.\n"17 "Open `path` to write a WAV file.\n" 18 18 "\n" 19 19 "Parameters\n" -
python/ext/py-source.c
rc03d191 r088760e 19 19 "source(path, samplerate=0, hop_size=512, channels=0)\n" 20 20 "\n" 21 " Read audio samples from a media file.\n"21 "Create a new source, opening the given pathname for reading.\n" 22 22 "\n" 23 23 "`source` open the file specified in `path` and creates a callable\n" … … 248 248 "Returns\n" 249 249 "-------\n" 250 "samples : numpy.ndarray \n"250 "samples : numpy.ndarray, shape `(hop_size,)`, dtype aubio.float_type\n" 251 251 " `fvec` of size `hop_size` containing the new samples.\n" 252 252 "read : int\n" … … 284 284 "Returns\n" 285 285 "-------\n" 286 "samples : n umpy.ndarray\n"286 "samples : np.ndarray([hop_size, channels], dtype=aubio.float_type)\n" 287 287 " NumPy array of shape `(hop_size, channels)` containing the new\n" 288 288 " audio samples.\n" -
python/lib/aubio/__init__.py
rc03d191 r088760e 29 29 from .midiconv import * 30 30 from .slicing import * 31 32 31 33 32 class fvec(numpy.ndarray): -
python/lib/aubio/cmd.py
rc03d191 r088760e 12 12 import sys 13 13 import argparse 14 import warnings15 14 import aubio 16 15 … … 170 169 171 170 def add_verbose_help(self): 172 self.add_argument("-v", 171 self.add_argument("-v","--verbose", 173 172 action="count", dest="verbose", default=1, 174 173 help="make lots of noise [default]") 175 self.add_argument("-q", 174 self.add_argument("-q","--quiet", 176 175 action="store_const", dest="verbose", const=0, 177 176 help="be quiet") … … 182 181 183 182 def add_buf_size(self, buf_size=512): 184 self.add_argument("-B", 183 self.add_argument("-B","--bufsize", 185 184 action="store", dest="buf_size", default=buf_size, 186 185 metavar = "<size>", type=int, … … 188 187 189 188 def add_hop_size(self, hop_size=256): 190 self.add_argument("-H", 189 self.add_argument("-H","--hopsize", 191 190 metavar = "<size>", type=int, 192 191 action="store", dest="hop_size", default=hop_size, … … 194 193 195 194 def add_method(self, method='default', helpstr='method'): 196 self.add_argument("-m", 195 self.add_argument("-m","--method", 197 196 metavar = "<method>", type=str, 198 197 action="store", dest="method", default=method, … … 200 199 201 200 def add_threshold(self, default=None): 202 self.add_argument("-t", 201 self.add_argument("-t","--threshold", 203 202 metavar = "<threshold>", type=float, 204 203 action="store", dest="threshold", default=default, … … 241 240 242 241 def add_slicer_options(self): 243 self.add_argument("-o", 242 self.add_argument("-o","--output", type = str, 244 243 metavar = "<outputdir>", 245 244 action="store", dest="output_directory", default=None, 246 help="specify path where slices of the original file should" 247 " be created") 245 help="specify path where slices of the original file should be created") 248 246 self.add_argument("--cut-until-nsamples", type = int, 249 247 metavar = "<samples>", 250 248 action = "store", dest = "cut_until_nsamples", default = None, 251 help="how many extra samples should be added at the end of" 252 " each slice") 249 help="how many extra samples should be added at the end of each slice") 253 250 self.add_argument("--cut-every-nslices", type = int, 254 251 metavar = "<samples>", … … 258 255 metavar = "<slices>", 259 256 action = "store", dest = "cut_until_nslices", default = None, 260 help="how many extra slices should be added at the end of" 261 " each slice") 257 help="how many extra slices should be added at the end of each slice") 262 258 self.add_argument("--create-first", 263 259 action = "store_true", dest = "create_first", default = False, … … 293 289 if args.verbose > 2 and hasattr(self, 'options'): 294 290 name = type(self).__name__.split('_')[1] 295 optstr = ' '.join(['running', name, 'with options', 296 repr(self.options), '\n']) 291 optstr = ' '.join(['running', name, 'with options', repr(self.options), '\n']) 297 292 sys.stderr.write(optstr) 298 293 def flush(self, frames_read, samplerate): … … 302 297 def parse_options(self, args, valid_opts): 303 298 # get any valid options found in a dictionnary of arguments 304 options = {k : v for k,v in vars(args).items() if k in valid_opts}299 options = {k :v for k,v in vars(args).items() if k in valid_opts} 305 300 self.options = options 306 301 … … 383 378 outstr = "unknown bpm" 384 379 else: 385 bpms = 60. 380 bpms = 60./ np.diff(self.beat_locations) 386 381 median_bpm = np.mean(bpms) 387 382 if len(self.beat_locations) < 10: … … 404 399 return self.notes(block) 405 400 def repr_res(self, res, frames_read, samplerate): 406 if res[2] != 0: 401 if res[2] != 0: # note off 407 402 fmt_out = self.time2string(frames_read, samplerate) 408 403 sys.stdout.write(fmt_out + '\n') 409 if res[0] != 0: 404 if res[0] != 0: # note on 410 405 lastmidi = res[0] 411 406 fmt_out = "%f\t" % lastmidi 412 407 fmt_out += self.time2string(frames_read, samplerate) 413 sys.stdout.write(fmt_out) 408 sys.stdout.write(fmt_out) # + '\t') 414 409 def flush(self, frames_read, samplerate): 415 410 eof = self.time2string(frames_read, samplerate) … … 478 473 if self.wassilence != 1: 479 474 self.wassilence = 1 480 return 2 481 return 1 475 return 2 # newly found silence 476 return 1 # silence again 482 477 else: 483 478 if self.wassilence != 0: 484 479 self.wassilence = 0 485 return -1 486 return 0 480 return -1 # newly found noise 481 return 0 # noise again 487 482 488 483 def repr_res(self, res, frames_read, samplerate): … … 504 499 def __call__(self, block): 505 500 ret = super(process_cut, self).__call__(block) 506 if ret: 507 self.slices.append(self.onset.get_last()) 501 if ret: self.slices.append(self.onset.get_last()) 508 502 return ret 509 503 510 504 def flush(self, frames_read, samplerate): 505 from aubio.cut import _cut_slice 511 506 _cut_slice(self.options, self.slices) 512 duration = float(frames_read) / float(samplerate) 513 base_info = '%(source_file)s' % \ 514 {'source_file': self.options.source_uri} 507 duration = float (frames_read) / float(samplerate) 508 base_info = '%(source_file)s' % {'source_file': self.options.source_uri} 515 509 base_info += ' (total %(duration).2fs at %(samplerate)dHz)\n' % \ 516 510 {'duration': duration, 'samplerate': samplerate} 517 511 info = "created %d slices from " % len(self.slices) 518 512 info += base_info 519 513 sys.stderr.write(info) 520 521 def _cut_slice(options, timestamps):522 # cutting pass523 nstamps = len(timestamps)524 if nstamps > 0:525 # generate output files526 timestamps_end = None527 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_nsamples535 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_nslices539 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 514 547 515 def main(): … … 558 526 action="store_true", dest="show_version") 559 527 args, extras = parser_root.parse_known_args() 560 if not args.show_version:# no -V, forward to parser528 if args.show_version == False: # no -V, forward to parser 561 529 args = parser.parse_args(extras, namespace=args) 562 elif len(extras) != 0: 530 elif len(extras) != 0: # -V with other arguments, print help 563 531 parser.print_help() 564 532 sys.exit(1) 565 else: 533 else: # in py3, we can simply use parser directly 566 534 args = parser.parse_args() 567 535 if 'show_version' in args and args.show_version: … … 570 538 elif 'verbose' in args and args.verbose > 3: 571 539 sys.stderr.write('aubio version ' + aubio.version + '\n') 572 if 'command' not in args or args.command is None \ 573 or args.command in ['help']: 540 if 'command' not in args or args.command is None or args.command in ['help']: 574 541 # no command given, print help and return 1 575 542 parser.print_help() … … 605 572 frames_read += read 606 573 # exit loop at end of file 607 if read < a_source.hop_size: 608 break 574 if read < a_source.hop_size: break 609 575 # flush the processor if needed 610 576 processor.flush(frames_read, a_source.samplerate) … … 614 580 fmt_string += " from {:s} at {:d}Hz\n" 615 581 sys.stderr.write(fmt_string.format( 616 frames_read /float(a_source.samplerate),582 frames_read/float(a_source.samplerate), 617 583 frames_read, 618 584 frames_read // a_source.hop_size + 1, -
python/lib/aubio/cut.py
rc03d191 r088760e 6 6 7 7 import sys 8 from aubio.cmd import AubioArgumentParser , _cut_slice8 from aubio.cmd import AubioArgumentParser 9 9 10 10 def aubio_cut_parser(): 11 11 parser = AubioArgumentParser() 12 12 parser.add_input() 13 parser.add_argument("-O", 13 parser.add_argument("-O","--onset-method", 14 14 action="store", dest="onset_method", default='default', 15 15 metavar = "<onset_method>", … … 17 17 complexdomain|hfc|phase|specdiff|energy|kl|mkl") 18 18 # cutting methods 19 parser.add_argument("-b", 19 parser.add_argument("-b","--beat", 20 20 action="store_true", dest="beat", default=False, 21 21 help="slice at beat locations") 22 22 """ 23 parser.add_argument("-S", 23 parser.add_argument("-S","--silencecut", 24 24 action="store_true", dest="silencecut", default=False, 25 25 help="use silence locations") 26 parser.add_argument("-s", 26 parser.add_argument("-s","--silence", 27 27 metavar = "<value>", 28 28 action="store", dest="silence", default=-70, … … 31 31 # algorithm parameters 32 32 parser.add_buf_hop_size() 33 parser.add_argument("-t", 33 parser.add_argument("-t","--threshold", "--onset-threshold", 34 34 metavar = "<threshold>", type=float, 35 35 action="store", dest="threshold", default=0.3, 36 36 help="onset peak picking threshold [default=0.3]") 37 parser.add_argument("-c", 37 parser.add_argument("-c","--cut", 38 38 action="store_true", dest="cut", default=False, 39 39 help="cut input sound file at detected labels") … … 41 41 42 42 """ 43 parser.add_argument("-D", 43 parser.add_argument("-D","--delay", 44 44 action = "store", dest = "delay", type = float, 45 45 metavar = "<seconds>", default=0, 46 46 help="number of seconds to take back [default=system]\ 47 47 default system delay is 3*hopsize/samplerate") 48 parser.add_argument("-C", 48 parser.add_argument("-C","--dcthreshold", 49 49 metavar = "<value>", 50 50 action="store", dest="dcthreshold", default=1., 51 51 help="onset peak picking DC component [default=1.]") 52 parser.add_argument("-L", 52 parser.add_argument("-L","--localmin", 53 53 action="store_true", dest="localmin", default=False, 54 54 help="use local minima after peak detection") 55 parser.add_argument("-d", 55 parser.add_argument("-d","--derivate", 56 56 action="store_true", dest="derivate", default=False, 57 57 help="derivate onset detection function") 58 parser.add_argument("-z", 58 parser.add_argument("-z","--zerocross", 59 59 metavar = "<value>", 60 60 action="store", dest="zerothres", default=0.008, 61 61 help="zero-crossing threshold for slicing [default=0.00008]") 62 62 # plotting functions 63 parser.add_argument("-p", 63 parser.add_argument("-p","--plot", 64 64 action="store_true", dest="plot", default=False, 65 65 help="draw plot") 66 parser.add_argument("-x", 66 parser.add_argument("-x","--xsize", 67 67 metavar = "<size>", 68 68 action="store", dest="xsize", default=1., 69 69 type=float, help="define xsize for plot") 70 parser.add_argument("-y", 70 parser.add_argument("-y","--ysize", 71 71 metavar = "<size>", 72 72 action="store", dest="ysize", default=1., 73 73 type=float, help="define ysize for plot") 74 parser.add_argument("-f", 74 parser.add_argument("-f","--function", 75 75 action="store_true", dest="func", default=False, 76 76 help="print detection function") 77 parser.add_argument("-n", 77 parser.add_argument("-n","--no-onsets", 78 78 action="store_true", dest="nplot", default=False, 79 79 help="do not plot detected onsets") 80 parser.add_argument("-O", 80 parser.add_argument("-O","--outplot", 81 81 metavar = "<output_image>", 82 82 action="store", dest="outplot", default=None, 83 83 help="save plot to output.{ps,png}") 84 parser.add_argument("-F", 84 parser.add_argument("-F","--spectrogram", 85 85 action="store_true", dest="spectro", default=False, 86 86 help="add spectrogram to the plot") … … 106 106 107 107 if options.beat: 108 o = tempo(options.onset_method, bufsize, hopsize, 109 samplerate=samplerate) 108 o = tempo(options.onset_method, bufsize, hopsize, samplerate=samplerate) 110 109 else: 111 o = onset(options.onset_method, bufsize, hopsize, 112 samplerate=samplerate) 110 o = onset(options.onset_method, bufsize, hopsize, samplerate=samplerate) 113 111 if options.minioi: 114 112 if options.minioi.endswith('ms'): … … 125 123 samples, read = s() 126 124 if o(samples): 127 timestamps.append(o.get_last()) 128 if options.verbose: 129 print("%.4f" % o.get_last_s()) 125 timestamps.append (o.get_last()) 126 if options.verbose: print ("%.4f" % o.get_last_s()) 130 127 total_frames += read 131 if read < hopsize: 132 break 128 if read < hopsize: break 133 129 del s 134 130 return timestamps, total_frames 131 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) 135 155 136 156 def main(): … … 148 168 149 169 # print some info 150 duration = float (total_frames) / float(options.samplerate)170 duration = float (total_frames) / float(options.samplerate) 151 171 base_info = '%(source_uri)s' % {'source_uri': options.source_uri} 152 172 base_info += ' (total %(duration).2fs at %(samplerate)dHz)\n' % \ -
python/lib/aubio/midiconv.py
rc03d191 r088760e 2 2 """ utilities to convert midi note number to and from note names """ 3 3 4 __all__ = ['note2midi', 'midi2note', 'freq2note', 'note2freq'] 5 4 6 import sys 5 7 from ._aubio import freqtomidi, miditofreq 6 7 __all__ = ['note2midi', 'midi2note', 'freq2note', 'note2freq']8 8 9 9 py3 = sys.version_info[0] == 3 … … 14 14 str_instances = (str, unicode) 15 15 int_instances = (int, long) 16 17 16 18 17 def note2midi(note): … … 57 56 midi2note, freqtomidi, miditofreq 58 57 """ 59 _valid_notenames = {'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7, 60 'A': 9, 'B': 11} 58 _valid_notenames = {'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7, 'A': 9, 'B': 11} 61 59 _valid_modifiers = { 62 u'𝄫': -2, 63 u'♭': -1, 'b': -1, '\u266d': -1, 64 u'♮': 0, '\u266e': 0, None: 0, 65 '#': +1, u'♯': +1, '\u266f': +1, 66 u'𝄪': +2, 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 67 65 } 68 66 _valid_octaves = range(-1, 10) … … 73 71 msg = "string of 2 to 4 characters expected, got {:d} ({:s})" 74 72 raise ValueError(msg.format(len(note), note)) 75 notename, modifier, octave = [None] *373 notename, modifier, octave = [None]*3 76 74 77 75 if len(note) == 4: … … 96 94 raise ValueError("%s is not a valid octave" % octave) 97 95 98 midi = (octave + 1)* 12 + _valid_notenames[notename] \99 96 midi = 12 + octave * 12 + _valid_notenames[notename] \ 97 + _valid_modifiers[modifier] 100 98 if midi > 127: 101 99 raise ValueError("%s is outside of the range C-2 to G8" % note) 102 100 return midi 103 104 101 105 102 def midi2note(midi): … … 140 137 raise ValueError(msg.format(midi)) 141 138 _valid_notenames = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 142 139 'A', 'A#', 'B'] 143 140 return _valid_notenames[midi % 12] + str(int(midi / 12) - 1) 144 145 141 146 142 def freq2note(freq): … … 167 163 return midi2note(nearest_note) 168 164 169 170 165 def note2freq(note): 171 166 """Convert note name to corresponding frequency, in Hz. -
python/lib/aubio/slicing.py
rc03d191 r088760e 5 5 6 6 _max_timestamp = 1e120 7 8 7 9 8 def slice_source_at_stamps(source_file, timestamps, timestamps_end=None, … … 74 73 """ 75 74 76 if not timestamps:75 if timestamps is None or len(timestamps) == 0: 77 76 raise ValueError("no timestamps given") 78 77 … … 91 90 92 91 regions = list(zip(timestamps, timestamps_end)) 92 #print regions 93 93 94 94 source_base_name, _ = os.path.splitext(os.path.basename(source_file)) … … 98 98 source_base_name = os.path.join(output_dir, source_base_name) 99 99 100 def _new_sink_name(source_base_name, timestamp, samplerate):101 # create name based on a timestamp in samples, converted in seconds100 def new_sink_name(source_base_name, timestamp, samplerate): 101 """ create a sink based on a timestamp in samples, converted in seconds """ 102 102 timestamp_seconds = timestamp / float(samplerate) 103 103 return source_base_name + "_%011.6f" % timestamp_seconds + '.wav' … … 114 114 vec, read = _source.do_multi() 115 115 # if the total number of frames read will exceed the next region start 116 while regions and total_frames + read >= regions[0][0]: 116 while len(regions) and total_frames + read >= regions[0][0]: 117 #print "getting", regions[0], "at", total_frames 117 118 # get next region 118 119 start_stamp, end_stamp = regions.pop(0) 119 120 # create a name for the sink 120 new_sink_path = _new_sink_name(source_base_name, start_stamp, 121 samplerate) 121 new_sink_path = new_sink_name(source_base_name, start_stamp, samplerate) 122 122 # create its sink 123 123 _sink = sink(new_sink_path, samplerate, _source.channels) 124 124 # create a dictionary containing all this 125 new_slice = {'start_stamp': start_stamp, 'end_stamp': end_stamp, 126 'sink': _sink} 125 new_slice = {'start_stamp': start_stamp, 'end_stamp': end_stamp, 'sink': _sink} 127 126 # append the dictionary to the current list of slices 128 127 slices.append(new_slice) … … 136 135 # number of samples yet to written be until end of region 137 136 remaining = end_stamp - total_frames + 1 137 #print current_slice, remaining, start 138 138 # not enough frames remaining, time to split 139 139 if remaining < read: … … 141 141 # write remaining samples from current region 142 142 _sink.do_multi(vec[:, start:remaining], remaining - start) 143 #print("closing region", "remaining", remaining) 143 144 # close this file 144 145 _sink.close() … … 149 150 # remove old slices 150 151 slices = list(filter(lambda s: s['end_stamp'] > total_frames, 151 152 slices)) 152 153 if read < hopsize: 153 154 break -
python/lib/gen_code.py
rc03d191 r088760e 465 465 """.format(**self.__dict__) 466 466 for set_param in self.prototypes['set']: 467 params = get_params_types_names(set_param)[1:] 468 param = self.shortname.split('_set_')[-1] 469 paramdecls = "".join([""" 470 {0} {1};""".format(p['type'], p['name']) for p in params]) 467 params = get_params_types_names(set_param)[1] 468 paramtype = params['type'] 471 469 method_name = get_name(set_param) 472 470 param = method_name.split('aubio_'+self.shortname+'_set_')[-1] 473 refs = ", ".join(["&%s" % p['name'] for p in params]) 474 paramlist = ", ".join(["%s" % p['name'] for p in params]) 475 if len(params): 476 paramlist = "," + paramlist 477 pyparamtypes = ''.join([pyargparse_chars[p['type']] for p in params]) 471 pyparamtype = pyargparse_chars[paramtype] 478 472 out += """ 479 473 static PyObject * … … 481 475 {{ 482 476 uint_t err = 0; 483 {paramdecls} 484 """.format(param = param, paramdecls = paramdecls, **self.__dict__) 485 486 if len(refs) and len(pyparamtypes): 487 out += """ 488 489 if (!PyArg_ParseTuple (args, "{pyparamtypes}", {refs})) {{ 477 {paramtype} {param}; 478 479 if (!PyArg_ParseTuple (args, "{pyparamtype}", &{param})) {{ 490 480 return NULL; 491 481 }} 492 """.format(pyparamtypes = pyparamtypes, refs = refs) 493 494 out += """ 495 err = aubio_{shortname}_set_{param} (self->o {paramlist}); 482 err = aubio_{shortname}_set_{param} (self->o, {param}); 496 483 497 484 if (err > 0) {{ … … 508 495 Py_RETURN_NONE; 509 496 }} 510 """.format(param = param, refs = refs, paramdecls = paramdecls, 511 pyparamtypes = pyparamtypes, paramlist = paramlist, **self.__dict__) 497 """.format(param = param, paramtype = paramtype, pyparamtype = pyparamtype, **self.__dict__) 512 498 return out 513 499 -
python/lib/gen_external.py
rc03d191 r088760e 4 4 import subprocess 5 5 import glob 6 from distutils.sysconfig import customize_compiler7 from gen_code import MappedObject8 6 9 7 header = os.path.join('src', 'aubio.h') … … 52 50 def get_preprocessor(): 53 51 # findout which compiler to use 52 from distutils.sysconfig import customize_compiler 54 53 compiler_name = distutils.ccompiler.get_default_compiler() 55 54 compiler = distutils.ccompiler.new_compiler(compiler=compiler_name) … … 264 263 265 264 sources_list = [] 265 try: 266 from .gen_code import MappedObject 267 except (SystemError, ValueError): 268 from gen_code import MappedObject 266 269 for o in lib: 267 270 out = source_header -
python/lib/moresetuptools.py
rc03d191 r088760e 3 3 import sys, os, glob, subprocess 4 4 import distutils, distutils.command.clean, distutils.dir_util 5 from gen_external import generate_external, header, output_path5 from .gen_external import generate_external, header, output_path 6 6 7 7 from this_version import get_aubio_version -
python/tests/test_fft.py
rc03d191 r088760e 143 143 assert_almost_equal ( r[1:], 0) 144 144 145 class aubio_fft_odd_sizes(TestCase):146 147 def test_reconstruct_with_odd_size(self):148 win_s = 29149 self.recontruct(win_s, 'odd sizes not supported')150 151 def test_reconstruct_with_radix15(self):152 win_s = 2 ** 4 * 15153 self.recontruct(win_s, 'radix 15 supported')154 155 def test_reconstruct_with_radix5(self):156 win_s = 2 ** 4 * 5157 self.recontruct(win_s, 'radix 5 supported')158 159 def test_reconstruct_with_radix3(self):160 win_s = 2 ** 4 * 3161 self.recontruct(win_s, 'radix 3 supported')162 163 def recontruct(self, win_s, skipMessage):164 try:165 f = fft(win_s)166 except RuntimeError:167 self.skipTest(skipMessage)168 input_signal = fvec(win_s)169 input_signal[win_s//2] = 1170 c = f(input_signal)171 output_signal = f.rdo(c)172 assert_almost_equal(input_signal, output_signal)173 174 class aubio_fft_wrong_params(TestCase):175 176 145 def test_large_input_timegrain(self): 177 146 win_s = 1024 … … 202 171 f.rdo(s) 203 172 173 class aubio_fft_wrong_params(TestCase): 174 204 175 def test_wrong_buf_size(self): 205 176 win_s = -1 206 177 with self.assertRaises(ValueError): 207 178 fft(win_s) 179 180 def test_buf_size_not_power_of_two(self): 181 # when compiled with fftw3, aubio supports non power of two fft sizes 182 win_s = 320 183 try: 184 with self.assertRaises(RuntimeError): 185 fft(win_s) 186 except AssertionError: 187 self.skipTest('creating aubio.fft with size %d did not fail' % win_s) 208 188 209 189 def test_buf_size_too_small(self): -
python/tests/test_filter.py
rc03d191 r088760e 78 78 f.set_biquad(0., 0., 0, 0., 0.) 79 79 80 def test_all_available_presets(self):81 f = digital_filter(7)82 for sr in [8000, 11025, 16000, 22050, 24000, 32000,83 44100, 48000, 88200, 96000, 192000]:84 f.set_a_weighting(sr)85 f = digital_filter(5)86 for sr in [8000, 11025, 16000, 22050, 24000, 32000,87 44100, 48000, 88200, 96000, 192000]:88 f.set_c_weighting(sr)89 90 80 class aubio_filter_wrong_params(TestCase): 91 81 -
python/tests/test_filterbank_mel.py
rc03d191 r088760e 4 4 from numpy.testing import TestCase, assert_equal, assert_almost_equal 5 5 6 from aubio import fvec,cvec, filterbank, float_type6 from aubio import cvec, filterbank, float_type 7 7 8 8 import warnings … … 48 48 0.02133301, 0.02133301, 0.02133311, 0.02133334, 0.02133345]) 49 49 50 def test_triangle_freqs_with_zeros(self):51 """make sure set_triangle_bands works when list starts with 0"""52 freq_list = [0, 40, 80]53 freqs = np.array(freq_list, dtype = float_type)54 f = filterbank(len(freqs)-2, 1024)55 f.set_triangle_bands(freqs, 48000)56 assert_equal ( f(cvec(1024)), 0)57 self.assertIsInstance(f.get_coeffs(), np.ndarray)58 59 def test_triangle_freqs_with_wrong_negative(self):60 """make sure set_triangle_bands fails when list contains a negative"""61 freq_list = [-10, 0, 80]62 f = filterbank(len(freq_list)-2, 1024)63 with self.assertRaises(ValueError):64 f.set_triangle_bands(fvec(freq_list), 48000)65 66 def test_triangle_freqs_with_wrong_ordering(self):67 """make sure set_triangle_bands fails when list not ordered"""68 freq_list = [0, 80, 40]69 f = filterbank(len(freq_list)-2, 1024)70 with self.assertRaises(ValueError):71 f.set_triangle_bands(fvec(freq_list), 48000)72 73 def test_triangle_freqs_with_large_freq(self):74 """make sure set_triangle_bands warns when freq > nyquist"""75 samplerate = 2205076 freq_list = [0, samplerate//4, samplerate // 2 + 1]77 f = filterbank(len(freq_list)-2, 1024)78 # TODO add assert_warns79 f.set_triangle_bands(fvec(freq_list), samplerate)80 81 def test_triangle_freqs_with_not_enough_filters(self):82 """make sure set_triangle_bands warns when not enough filters"""83 samplerate = 2205084 freq_list = [0, 100, 1000, 4000, 8000, 10000]85 f = filterbank(len(freq_list)-3, 1024)86 # TODO add assert_warns87 f.set_triangle_bands(fvec(freq_list), samplerate)88 89 def test_triangle_freqs_with_too_many_filters(self):90 """make sure set_triangle_bands warns when too many filters"""91 samplerate = 2205092 freq_list = [0, 100, 1000, 4000, 8000, 10000]93 f = filterbank(len(freq_list)-1, 1024)94 # TODO add assert_warns95 f.set_triangle_bands(fvec(freq_list), samplerate)96 97 def test_triangle_freqs_with_double_value(self):98 """make sure set_triangle_bands works with 2 duplicate freqs"""99 samplerate = 22050100 freq_list = [0, 100, 1000, 4000, 4000, 4000, 10000]101 f = filterbank(len(freq_list)-2, 1024)102 # TODO add assert_warns103 f.set_triangle_bands(fvec(freq_list), samplerate)104 105 def test_triangle_freqs_with_triple(self):106 """make sure set_triangle_bands works with 3 duplicate freqs"""107 samplerate = 22050108 freq_list = [0, 100, 1000, 4000, 4000, 4000, 10000]109 f = filterbank(len(freq_list)-2, 1024)110 # TODO add assert_warns111 f.set_triangle_bands(fvec(freq_list), samplerate)112 113 def test_triangle_freqs_without_norm(self):114 """make sure set_triangle_bands works without """115 samplerate = 22050116 freq_list = fvec([0, 100, 1000, 10000])117 f = filterbank(len(freq_list) - 2, 1024)118 f.set_norm(0)119 f.set_triangle_bands(freq_list, samplerate)120 expected = f.get_coeffs()121 f.set_norm(1)122 f.set_triangle_bands(fvec(freq_list), samplerate)123 assert_almost_equal(f.get_coeffs().T,124 expected.T * 2. / (freq_list[2:] - freq_list[:-2]))125 126 def test_triangle_freqs_wrong_norm(self):127 f = filterbank(10, 1024)128 with self.assertRaises(ValueError):129 f.set_norm(-1)130 131 def test_triangle_freqs_with_power(self):132 f = filterbank(9, 1024)133 freqs = fvec([40, 80, 200, 400, 800, 1600, 3200, 6400, 12800, 15000,134 24000])135 f.set_power(2)136 f.set_triangle_bands(freqs, 48000)137 spec = cvec(1024)138 spec.norm[:] = .1139 expected = fvec([0.02070313, 0.02138672, 0.02127604, 0.02135417,140 0.02133301, 0.02133301, 0.02133311, 0.02133334, 0.02133345])141 expected /= 100.142 assert_almost_equal(f(spec), expected)143 144 def test_mel_coeffs(self):145 f = filterbank(40, 1024)146 f.set_mel_coeffs(44100, 0, 44100 / 2)147 148 def test_zero_fmax(self):149 f = filterbank(40, 1024)150 f.set_mel_coeffs(44100, 0, 0)151 152 def test_wrong_mel_coeffs(self):153 f = filterbank(40, 1024)154 with self.assertRaises(ValueError):155 f.set_mel_coeffs_slaney(0)156 with self.assertRaises(ValueError):157 f.set_mel_coeffs(44100, 0, -44100 / 2)158 with self.assertRaises(ValueError):159 f.set_mel_coeffs(44100, -0.1, 44100 / 2)160 with self.assertRaises(ValueError):161 f.set_mel_coeffs(-44100, 0.1, 44100 / 2)162 with self.assertRaises(ValueError):163 f.set_mel_coeffs_htk(-1, 0, 0)164 165 def test_mel_coeffs_htk(self):166 f = filterbank(40, 1024)167 f.set_mel_coeffs_htk(44100, 0, 44100 / 2)168 169 170 50 if __name__ == '__main__': 171 51 import nose2 -
python/tests/test_mfcc.py
rc03d191 r088760e 111 111 #print coeffs 112 112 113 114 class aubio_mfcc_fb_params(TestCase):115 116 def test_set_scale(self):117 buf_size, n_filters, n_coeffs, samplerate = 512, 20, 10, 16000118 m = mfcc(buf_size, n_filters, n_coeffs, samplerate)119 m.set_scale(10.)120 m(cvec(buf_size))121 122 def test_set_power(self):123 buf_size, n_filters, n_coeffs, samplerate = 512, 20, 10, 16000124 m = mfcc(buf_size, n_filters, n_coeffs, samplerate)125 m.set_power(2.)126 m(cvec(buf_size))127 128 def test_set_mel_coeffs(self):129 buf_size, n_filters, n_coeffs, samplerate = 512, 20, 10, 16000130 m = mfcc(buf_size, n_filters, n_coeffs, samplerate)131 m.set_mel_coeffs(0., samplerate/2.)132 m(cvec(buf_size))133 134 def test_set_mel_coeffs_htk(self):135 buf_size, n_filters, n_coeffs, samplerate = 512, 20, 10, 16000136 m = mfcc(buf_size, n_filters, n_coeffs, samplerate)137 m.set_mel_coeffs_htk(0., samplerate/2.)138 m(cvec(buf_size))139 140 def test_set_mel_coeffs_slaney(self):141 buf_size, n_filters, n_coeffs, samplerate = 512, 40, 10, 16000142 m = mfcc(buf_size, n_filters, n_coeffs, samplerate)143 m.set_mel_coeffs_slaney(samplerate)144 m(cvec(buf_size))145 assert m.get_power() == 1146 assert m.get_scale() == 1147 148 113 if __name__ == '__main__': 149 114 main() -
python/tests/test_onset.py
rc03d191 r088760e 3 3 from unittest import main 4 4 from numpy.testing import TestCase, assert_equal, assert_almost_equal 5 from aubio import onset , fvec5 from aubio import onset 6 6 7 7 class aubio_onset_default(TestCase): … … 84 84 samplerate = 8000 85 85 86 class aubio_onset_coverate(TestCase):87 # extra tests to execute the C routines and improve coverage88 89 def test_all_methods(self):90 for method in ['default', 'energy', 'hfc', 'complexdomain', 'complex',91 'phase', 'wphase', 'mkl', 'kl', 'specflux', 'specdiff',92 'old_default']:93 o = onset(method=method, buf_size=512, hop_size=256)94 o(fvec(256))95 96 def test_get_methods(self):97 o = onset(method='default', buf_size=512, hop_size=256)98 99 assert o.get_silence() == -70100 o.set_silence(-20)101 assert_almost_equal(o.get_silence(), -20)102 103 assert o.get_compression() == 1104 o.set_compression(.99)105 assert_almost_equal(o.get_compression(), .99)106 107 assert o.get_awhitening() == 0108 o.set_awhitening(1)109 assert o.get_awhitening() == 1110 111 o.get_last()112 o.get_last_ms()113 o.get_last_s()114 o.get_descriptor()115 o.get_thresholded_descriptor()116 117 118 86 if __name__ == '__main__': 119 87 main() -
setup.py
rc03d191 r088760e 1 1 #! /usr/bin/env python 2 2 3 import sys 4 import os.path 5 import glob 3 import sys, os.path, glob 6 4 from setuptools import setup, Extension 7 8 # add ./python/lib to current path 9 sys.path.append(os.path.join('python', 'lib')) # noqa 10 from moresetuptools import build_ext, CleanGenerated 11 5 from python.lib.moresetuptools import build_ext, CleanGenerated 12 6 # function to generate gen/*.{c,h} 13 7 from this_version import get_aubio_version, get_aubio_pyversion … … 21 15 extra_link_args = [] 22 16 23 include_dirs += [ 'python/ext']17 include_dirs += [ 'python/ext' ] 24 18 try: 25 19 import numpy 26 include_dirs += [ numpy.get_include()]20 include_dirs += [ numpy.get_include() ] 27 21 except ImportError: 28 22 pass 29 23 30 24 if sys.platform.startswith('darwin'): 31 extra_link_args += ['-framework', 'CoreFoundation', 32 '-framework', 'AudioToolbox'] 25 extra_link_args += ['-framework','CoreFoundation', '-framework','AudioToolbox'] 33 26 34 27 sources = sorted(glob.glob(os.path.join('python', 'ext', '*.c'))) … … 41 34 define_macros = define_macros) 42 35 43 # TODO: find a way to track if package is built against libaubio 44 # if os.path.isfile('src/aubio.h'): 45 # if not os.path.isdir(os.path.join('build','src')): 46 # pass 47 # #__version__ += 'a2' # python only version 36 if os.path.isfile('src/aubio.h'): 37 if not os.path.isdir(os.path.join('build','src')): 38 pass 39 #__version__ += 'a2' # python only version 48 40 49 41 classifiers = [ … … 59 51 'Programming Language :: C', 60 52 'Programming Language :: Python', 61 'License :: OSI Approved :: ' 62 'GNU General Public License v3 or later (GPLv3+)', 53 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)', 63 54 ] 64 55 … … 66 57 version = __version__, 67 58 packages = ['aubio'], 68 package_dir = {'aubio': 59 package_dir = {'aubio':'python/lib/aubio'}, 69 60 ext_modules = [aubio_extension], 70 61 description = 'a collection of tools for music analysis', -
src/io/source_avcodec.c
rc03d191 r088760e 90 90 sint_t selected_stream; 91 91 uint_t eof; 92 uint_t multi; 92 93 }; 93 94 94 95 // create or re-create the context when _do or _do_multi is called 95 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s); 96 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s, 97 uint_t multi); 96 98 // actually read a frame 97 99 void aubio_source_avcodec_readframe(aubio_source_avcodec_t *s, … … 283 285 s->avFrame = avFrame; 284 286 285 aubio_source_avcodec_reset_resampler(s); 287 // default to mono output 288 aubio_source_avcodec_reset_resampler(s, 0); 286 289 287 290 if (s->avr == NULL) goto beach; 288 291 289 292 s->eof = 0; 293 s->multi = 0; 290 294 291 295 //av_log_set_level(AV_LOG_QUIET); … … 300 304 } 301 305 302 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s) 306 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s, 307 uint_t multi) 303 308 { 304 309 // create or reset resampler to/from mono/multi-channel 305 if ( s->avr == NULL) {310 if ( (multi != s->multi) || (s->avr == NULL) ) { 306 311 int err; 307 312 int64_t input_layout = av_get_default_channel_layout(s->input_channels); 308 int64_t output_layout = av_get_default_channel_layout(s->input_channels); 313 uint_t output_channels = multi ? s->input_channels : 1; 314 int64_t output_layout = av_get_default_channel_layout(output_channels); 309 315 #ifdef HAVE_AVRESAMPLE 310 316 AVAudioResampleContext *avr = avresample_alloc_context(); 317 AVAudioResampleContext *oldavr = s->avr; 311 318 #elif defined(HAVE_SWRESAMPLE) 312 319 SwrContext *avr = swr_alloc(); 320 SwrContext *oldavr = s->avr; 313 321 #endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */ 314 322 … … 338 346 } 339 347 s->avr = avr; 348 if (oldavr != NULL) { 349 #ifdef HAVE_AVRESAMPLE 350 avresample_close( oldavr ); 351 #elif defined(HAVE_SWRESAMPLE) 352 swr_close ( oldavr ); 353 #endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */ 354 av_free ( oldavr ); 355 oldavr = NULL; 356 } 357 s->multi = multi; 340 358 } 341 359 } … … 478 496 void aubio_source_avcodec_do(aubio_source_avcodec_t * s, fvec_t * read_data, 479 497 uint_t * read) { 480 uint_t i , j;498 uint_t i; 481 499 uint_t end = 0; 482 500 uint_t total_wrote = 0; 501 // switch from multi 502 if (s->multi == 1) aubio_source_avcodec_reset_resampler(s, 0); 483 503 while (total_wrote < s->hop_size) { 484 504 end = MIN(s->read_samples - s->read_index, s->hop_size - total_wrote); 485 505 for (i = 0; i < end; i++) { 486 read_data->data[i + total_wrote] = 0.; 487 for (j = 0; j < s->input_channels; j++) { 488 read_data->data[i + total_wrote] += 489 s->output[(i + s->read_index) * s->input_channels + j]; 490 } 491 read_data->data[i + total_wrote] *= 1./s->input_channels; 506 read_data->data[i + total_wrote] = s->output[i + s->read_index]; 492 507 } 493 508 total_wrote += end; … … 517 532 uint_t end = 0; 518 533 uint_t total_wrote = 0; 534 // switch from mono 535 if (s->multi == 0) aubio_source_avcodec_reset_resampler(s, 1); 519 536 while (total_wrote < s->hop_size) { 520 537 end = MIN(s->read_samples - s->read_index, s->hop_size - total_wrote); -
src/mathutils.c
rc03d191 r088760e 388 388 } 389 389 390 void391 fvec_mul (fvec_t *o, smpl_t val)392 {393 uint_t j;394 for (j = 0; j < o->length; j++) {395 o->data[j] *= val;396 }397 }398 399 390 void fvec_adapt_thres(fvec_t * vec, fvec_t * tmp, 400 391 uint_t post, uint_t pre) { -
src/mathutils.h
rc03d191 r088760e 193 193 */ 194 194 void fvec_add (fvec_t * v, smpl_t c); 195 196 /** multiply each elements of a vector by a scalar197 198 \param v vector to add constant to199 \param s constant to scale v with200 201 */202 void fvec_mul (fvec_t * v, smpl_t s);203 195 204 196 /** remove the minimum value of the vector to each elements -
src/musicutils.h
rc03d191 r088760e 87 87 smpl_t aubio_freqtobin (smpl_t freq, smpl_t samplerate, smpl_t fftsize); 88 88 89 /** convert frequency (Hz) to mel90 91 \param freq input frequency, in Hz92 93 \return output mel94 95 Converts a scalar from the frequency domain to the mel scale using Slaney96 Auditory Toolbox's implementation:97 98 If \f$ f < 1000 \f$, \f$ m = 3 f / 200 \f$.99 100 If \f$ f >= 1000 \f$, \f$ m = 1000 + 27 \frac{{ln}(f) - ln(1000))}101 {{ln}(6400) - ln(1000)}102 \f$103 104 See also105 --------106 107 aubio_meltohz(), aubio_hztomel_htk().108 109 */110 smpl_t aubio_hztomel (smpl_t freq);111 112 /** convert mel to frequency (Hz)113 114 \param mel input mel115 116 \return output frequency, in Hz117 118 Converts a scalar from the mel scale to the frequency domain using Slaney119 Auditory Toolbox's implementation:120 121 If \f$ f < 1000 \f$, \f$ f = 200 m/3 \f$.122 123 If \f$ f \geq 1000 \f$, \f$ f = 1000 + \left(\frac{6400}{1000}\right)124 ^{\frac{m - 1000}{27}} \f$125 126 See also127 --------128 129 aubio_hztomel(), aubio_meltohz_htk().130 131 References132 ----------133 134 Malcolm Slaney, *Auditory Toolbox Version 2, Technical Report #1998-010*135 https://engineering.purdue.edu/~malcolm/interval/1998-010/136 137 */138 smpl_t aubio_meltohz (smpl_t mel);139 140 /** convert frequency (Hz) to mel141 142 \param freq input frequency, in Hz143 144 \return output mel145 146 Converts a scalar from the frequency domain to the mel scale, using the147 equation defined by O'Shaughnessy, as implemented in the HTK speech148 recognition toolkit:149 150 \f$ m = 1127 + ln(1 + \frac{f}{700}) \f$151 152 See also153 --------154 155 aubio_meltohz_htk(), aubio_hztomel().156 157 References158 ----------159 160 Douglas O'Shaughnessy (1987). *Speech communication: human and machine*.161 Addison-Wesley. p. 150. ISBN 978-0-201-16520-3.162 163 HTK Speech Recognition Toolkit: http://htk.eng.cam.ac.uk/164 165 */166 smpl_t aubio_hztomel_htk (smpl_t freq);167 168 /** convert mel to frequency (Hz)169 170 \param mel input mel171 172 \return output frequency, in Hz173 174 Converts a scalar from the mel scale to the frequency domain, using the175 equation defined by O'Shaughnessy, as implemented in the HTK speech176 recognition toolkit:177 178 \f$ f = 700 * {e}^\left(\frac{f}{1127} - 1\right) \f$179 180 See also181 --------182 183 aubio_hztomel_htk(), aubio_meltohz().184 185 */186 smpl_t aubio_meltohz_htk (smpl_t mel);187 188 89 /** convert frequency (Hz) to midi value (0-128) */ 189 90 smpl_t aubio_freqtomidi (smpl_t freq); -
src/spectral/fft.c
rc03d191 r088760e 90 90 #define aubio_vDSP_vsadd vDSP_vsadd 91 91 #define aubio_vDSP_vsmul vDSP_vsmul 92 #define aubio_vDSP_create_fftsetup vDSP_create_fftsetup 93 #define aubio_vDSP_destroy_fftsetup vDSP_destroy_fftsetup 92 94 #define aubio_DSPComplex DSPComplex 93 95 #define aubio_DSPSplitComplex DSPSplitComplex 94 #define aubio_vDSP_DFT_Setup vDSP_DFT_Setup 95 #define aubio_vDSP_DFT_zrop_CreateSetup vDSP_DFT_zrop_CreateSetup 96 #define aubio_vDSP_DFT_Execute vDSP_DFT_Execute 97 #define aubio_vDSP_DFT_DestroySetup vDSP_DFT_DestroySetup 96 #define aubio_FFTSetup FFTSetup 98 97 #define aubio_vvsqrt vvsqrtf 99 98 #else … … 105 104 #define aubio_vDSP_vsadd vDSP_vsaddD 106 105 #define aubio_vDSP_vsmul vDSP_vsmulD 106 #define aubio_vDSP_create_fftsetup vDSP_create_fftsetupD 107 #define aubio_vDSP_destroy_fftsetup vDSP_destroy_fftsetupD 107 108 #define aubio_DSPComplex DSPDoubleComplex 108 109 #define aubio_DSPSplitComplex DSPDoubleSplitComplex 109 #define aubio_vDSP_DFT_Setup vDSP_DFT_SetupD 110 #define aubio_vDSP_DFT_zrop_CreateSetup vDSP_DFT_zrop_CreateSetupD 111 #define aubio_vDSP_DFT_Execute vDSP_DFT_ExecuteD 112 #define aubio_vDSP_DFT_DestroySetup vDSP_DFT_DestroySetupD 110 #define aubio_FFTSetup FFTSetupD 113 111 #define aubio_vvsqrt vvsqrt 114 112 #endif /* HAVE_AUBIO_DOUBLE */ … … 155 153 156 154 #elif defined HAVE_ACCELERATE // using ACCELERATE 157 aubio_vDSP_DFT_Setup fftSetupFwd;158 aubio_ vDSP_DFT_Setup fftSetupBwd;155 int log2fftsize; 156 aubio_FFTSetup fftSetup; 159 157 aubio_DSPSplitComplex spec; 160 158 smpl_t *in, *out; … … 213 211 214 212 #elif defined HAVE_ACCELERATE // using ACCELERATE 215 {216 uint_t radix = winsize;217 uint_t order = 0;218 while ((radix / 2) * 2 == radix) {219 radix /= 2;220 order++;221 }222 if (order < 4 || (radix != 1 && radix != 3 && radix != 5 && radix != 15)) {223 AUBIO_ERR("fft: vDSP/Accelerate supports FFT with sizes = "224 "f * 2 ** n, where n > 4 and f in [1, 3, 5, 15], but requested %d. "225 "Use the closest power of two, or try recompiling aubio with "226 "--enable-fftw3.\n", winsize);227 goto beach;228 }229 }230 213 s->winsize = winsize; 231 214 s->fft_size = winsize; 232 215 s->compspec = new_fvec(winsize); 216 s->log2fftsize = aubio_power_of_two_order(s->fft_size); 233 217 s->in = AUBIO_ARRAY(smpl_t, s->fft_size); 234 218 s->out = AUBIO_ARRAY(smpl_t, s->fft_size); 235 219 s->spec.realp = AUBIO_ARRAY(smpl_t, s->fft_size/2); 236 220 s->spec.imagp = AUBIO_ARRAY(smpl_t, s->fft_size/2); 237 s->fftSetupFwd = aubio_vDSP_DFT_zrop_CreateSetup(NULL, 238 s->fft_size, vDSP_DFT_FORWARD); 239 s->fftSetupBwd = aubio_vDSP_DFT_zrop_CreateSetup(s->fftSetupFwd, 240 s->fft_size, vDSP_DFT_INVERSE); 221 s->fftSetup = aubio_vDSP_create_fftsetup(s->log2fftsize, FFT_RADIX2); 241 222 242 223 #elif defined HAVE_INTEL_IPP // using Intel IPP … … 312 293 AUBIO_FREE(s->spec.realp); 313 294 AUBIO_FREE(s->spec.imagp); 314 aubio_vDSP_DFT_DestroySetup(s->fftSetupBwd); 315 aubio_vDSP_DFT_DestroySetup(s->fftSetupFwd); 295 aubio_vDSP_destroy_fftsetup(s->fftSetup); 316 296 317 297 #elif defined HAVE_INTEL_IPP // using Intel IPP … … 371 351 aubio_vDSP_ctoz((aubio_DSPComplex*)s->in, 2, &s->spec, 1, s->fft_size/2); 372 352 // compute the FFT 373 aubio_vDSP_DFT_Execute(s->fftSetupFwd, s->spec.realp, s->spec.imagp, 374 s->spec.realp, s->spec.imagp); 353 aubio_vDSP_fft_zrip(s->fftSetup, &s->spec, 1, s->log2fftsize, FFT_FORWARD); 375 354 // convert from vDSP complex split to [ r0, r1, ..., rN, iN-1, .., i2, i1] 376 355 compspec->data[0] = s->spec.realp[0]; … … 440 419 aubio_vDSP_ctoz((aubio_DSPComplex*)s->out, 2, &s->spec, 1, s->fft_size/2); 441 420 // compute the FFT 442 aubio_vDSP_DFT_Execute(s->fftSetupBwd, s->spec.realp, s->spec.imagp, 443 s->spec.realp, s->spec.imagp); 421 aubio_vDSP_fft_zrip(s->fftSetup, &s->spec, 1, s->log2fftsize, FFT_INVERSE); 444 422 // convert result to real output 445 423 aubio_vDSP_ztoc(&s->spec, 1, (aubio_DSPComplex*)output->data, 2, s->fft_size/2); … … 516 494 } 517 495 #endif 518 #ifdef HAVE_FFTW3 519 // for even length only, make sure last element is 0 or PI 520 if (2 * (compspec->length / 2) == compspec->length) { 521 #endif 522 if (compspec->data[compspec->length/2] < 0) { 523 spectrum->phas[spectrum->length - 1] = PI; 524 } else { 525 spectrum->phas[spectrum->length - 1] = 0.; 526 } 527 #ifdef HAVE_FFTW3 496 if (compspec->data[compspec->length/2] < 0) { 497 spectrum->phas[spectrum->length - 1] = PI; 528 498 } else { 529 i = spectrum->length - 1; 530 spectrum->phas[i] = ATAN2(compspec->data[compspec->length-i], 531 compspec->data[i]); 532 } 533 #endif 499 spectrum->phas[spectrum->length - 1] = 0.; 500 } 534 501 } 535 502 … … 541 508 + SQR(compspec->data[compspec->length - i]) ); 542 509 } 543 #ifdef HAVE_FFTW3 544 // for even length, make sure last element is > 0 545 if (2 * (compspec->length / 2) == compspec->length) { 546 #endif 547 spectrum->norm[spectrum->length-1] = 548 ABS(compspec->data[compspec->length/2]); 549 #ifdef HAVE_FFTW3 550 } else { 551 i = spectrum->length - 1; 552 spectrum->norm[i] = SQRT(SQR(compspec->data[i]) 553 + SQR(compspec->data[compspec->length - i]) ); 554 } 555 #endif 510 spectrum->norm[spectrum->length-1] = 511 ABS(compspec->data[compspec->length/2]); 556 512 } 557 513 -
src/spectral/filterbank.c
rc03d191 r088760e 24 24 #include "fmat.h" 25 25 #include "cvec.h" 26 #include "vecutils.h"27 26 #include "spectral/filterbank.h" 28 27 #include "mathutils.h" … … 34 33 uint_t n_filters; 35 34 fmat_t *filters; 36 smpl_t norm;37 smpl_t power;38 35 }; 39 36 … … 48 45 /* allocate filter tables, a matrix of length win_s and of height n_filters */ 49 46 fb->filters = new_fmat (n_filters, win_s / 2 + 1); 50 51 fb->norm = 1;52 53 fb->power = 1;54 47 55 48 return fb; … … 75 68 tmp.data = in->norm; 76 69 77 if (f->power != 1.) fvec_pow(&tmp, f->power);78 79 70 fmat_vecmul(f->filters, &tmp, out); 80 71 … … 94 85 return 0; 95 86 } 96 97 uint_t98 aubio_filterbank_set_norm (aubio_filterbank_t *f, smpl_t norm)99 {100 if (norm != 0 && norm != 1) return AUBIO_FAIL;101 f->norm = norm;102 return AUBIO_OK;103 }104 105 smpl_t106 aubio_filterbank_get_norm (aubio_filterbank_t *f)107 {108 return f->norm;109 }110 111 uint_t112 aubio_filterbank_set_power (aubio_filterbank_t *f, smpl_t power)113 {114 f->power = power;115 return AUBIO_OK;116 }117 118 smpl_t119 aubio_filterbank_get_power (aubio_filterbank_t *f)120 {121 return f->norm;122 } -
src/spectral/filterbank.h
rc03d191 r088760e 84 84 uint_t aubio_filterbank_set_coeffs (aubio_filterbank_t * f, const fmat_t * filters); 85 85 86 /** set norm parameter87 88 \param f filterbank object, as returned by new_aubio_filterbank()89 \param norm `1` to norm the filters, `0` otherwise.90 91 If set to `0`, the filters will not be normalized. If set to `1`,92 each filter will be normalized to one. Defaults to `1`.93 94 This function should be called *before* setting the filters with one of95 aubio_filterbank_set_triangle_bands(), aubio_filterbank_set_mel_coeffs(),96 aubio_filterbank_set_mel_coeffs_htk(), or97 aubio_filterbank_set_mel_coeffs_slaney().98 99 */100 uint_t aubio_filterbank_set_norm (aubio_filterbank_t *f, smpl_t norm);101 102 /** get norm parameter103 104 \param f filterbank object, as returned by new_aubio_filterbank()105 \returns `1` if norm is set, `0` otherwise. Defaults to `1`.106 107 */108 smpl_t aubio_filterbank_get_norm (aubio_filterbank_t *f);109 110 /** set power parameter111 112 \param f filterbank object, as returned by new_aubio_filterbank()113 \param power Raise norm of the input spectrum norm to this power before114 computing filterbank. Defaults to `1`.115 116 */117 uint_t aubio_filterbank_set_power (aubio_filterbank_t *f, smpl_t power);118 119 /** get power parameter120 121 \param f filterbank object, as returned by new_aubio_filterbank()122 \return current power parameter. Defaults to `1`.123 124 */125 smpl_t aubio_filterbank_get_power (aubio_filterbank_t *f);126 127 86 #ifdef __cplusplus 128 87 } -
src/spectral/filterbank_mel.c
rc03d191 r088760e 55 55 } 56 56 57 for (fn = 0; fn < freqs->length; fn++) { 58 if (freqs->data[fn] < 0) { 59 AUBIO_ERR("filterbank_mel: freqs must contain only positive values.\n"); 60 return AUBIO_FAIL; 61 } else if (freqs->data[fn] > samplerate / 2) { 62 AUBIO_WRN("filterbank_mel: freqs should contain only " 63 "values < samplerate / 2.\n"); 64 } else if (fn > 0 && freqs->data[fn] < freqs->data[fn-1]) { 65 AUBIO_ERR("filterbank_mel: freqs should be a list of frequencies " 66 "sorted from low to high, but freq[%d] < freq[%d-1]\n", fn, fn); 67 return AUBIO_FAIL; 68 } else if (fn > 0 && freqs->data[fn] == freqs->data[fn-1]) { 69 AUBIO_WRN("filterbank_mel: set_triangle_bands received a list " 70 "with twice the frequency %f\n", freqs->data[fn]); 71 } 57 if (freqs->data[freqs->length - 1] > samplerate / 2) { 58 AUBIO_WRN ("Nyquist frequency is %fHz, but highest frequency band ends at \ 59 %fHz\n", samplerate / 2, freqs->data[freqs->length - 1]); 72 60 } 73 61 … … 91 79 92 80 /* compute triangle heights so that each triangle has unit area */ 93 if (aubio_filterbank_get_norm(fb)) { 94 for (fn = 0; fn < n_filters; fn++) { 95 triangle_heights->data[fn] = 96 2. / (upper_freqs->data[fn] - lower_freqs->data[fn]); 97 } 98 } else { 99 fvec_ones (triangle_heights); 81 for (fn = 0; fn < n_filters; fn++) { 82 triangle_heights->data[fn] = 83 2. / (upper_freqs->data[fn] - lower_freqs->data[fn]); 100 84 } 101 85 … … 108 92 /* zeroing of all filters */ 109 93 fmat_zeros (filters); 94 95 if (fft_freqs->data[1] >= lower_freqs->data[0]) { 96 /* - 1 to make sure we don't miss the smallest power of two */ 97 uint_t min_win_s = 98 (uint_t) FLOOR (samplerate / lower_freqs->data[0]) - 1; 99 AUBIO_WRN ("Lowest frequency bin (%.2fHz) is higher than lowest frequency \ 100 band (%.2f-%.2fHz). Consider increasing the window size from %d to %d.\n", 101 fft_freqs->data[1], lower_freqs->data[0], 102 upper_freqs->data[0], (win_s - 1) * 2, 103 aubio_next_power_of_two (min_win_s)); 104 } 110 105 111 106 /* building each filter table */ … … 122 117 123 118 /* compute positive slope step size */ 124 riseInc = triangle_heights->data[fn] 125 / (center_freqs->data[fn] - lower_freqs->data[fn]); 119 riseInc = 120 triangle_heights->data[fn] / 121 (center_freqs->data[fn] - lower_freqs->data[fn]); 126 122 127 123 /* compute coefficients in positive slope */ … … 137 133 138 134 /* compute negative slope step size */ 139 downInc = triangle_heights->data[fn] 140 / (upper_freqs->data[fn] - center_freqs->data[fn]); 135 downInc = 136 triangle_heights->data[fn] / 137 (upper_freqs->data[fn] - center_freqs->data[fn]); 141 138 142 139 /* compute coefficents in negative slope */ … … 164 161 del_fvec (fft_freqs); 165 162 166 return AUBIO_OK;163 return 0; 167 164 } 168 165 … … 171 168 smpl_t samplerate) 172 169 { 170 uint_t retval; 171 173 172 /* Malcolm Slaney parameters */ 174 const smpl_t lowestFrequency = 133.3333; 175 const smpl_t linearSpacing = 66.66666666; 176 const smpl_t logSpacing = 1.0711703; 177 178 const uint_t linearFilters = 13; 179 const uint_t logFilters = 27; 180 const uint_t n_filters = linearFilters + logFilters; 181 182 uint_t fn, retval; 173 smpl_t lowestFrequency = 133.3333; 174 smpl_t linearSpacing = 66.66666666; 175 smpl_t logSpacing = 1.0711703; 176 177 uint_t linearFilters = 13; 178 uint_t logFilters = 27; 179 uint_t n_filters = linearFilters + logFilters; 180 181 uint_t fn; /* filter counter */ 182 183 183 smpl_t lastlinearCF; 184 184 185 185 /* buffers to compute filter frequencies */ 186 fvec_t *freqs; 187 188 if (samplerate <= 0) { 189 AUBIO_ERR("filterbank: set_mel_coeffs_slaney samplerate should be > 0\n"); 190 return AUBIO_FAIL; 191 } 192 193 freqs = new_fvec (n_filters + 2); 186 fvec_t *freqs = new_fvec (n_filters + 2); 194 187 195 188 /* first step: fill all the linear filter frequencies */ … … 213 206 return retval; 214 207 } 215 216 static uint_t aubio_filterbank_check_freqs (aubio_filterbank_t *fb UNUSED,217 smpl_t samplerate, smpl_t *freq_min, smpl_t *freq_max)218 {219 if (samplerate <= 0) {220 AUBIO_ERR("filterbank: set_mel_coeffs samplerate should be > 0\n");221 return AUBIO_FAIL;222 }223 if (*freq_max < 0) {224 AUBIO_ERR("filterbank: set_mel_coeffs freq_max should be > 0\n");225 return AUBIO_FAIL;226 } else if (*freq_max == 0) {227 *freq_max = samplerate / 2.;228 }229 if (*freq_min < 0) {230 AUBIO_ERR("filterbank: set_mel_coeffs freq_min should be > 0\n");231 return AUBIO_FAIL;232 }233 return AUBIO_OK;234 }235 236 uint_t237 aubio_filterbank_set_mel_coeffs (aubio_filterbank_t * fb, smpl_t samplerate,238 smpl_t freq_min, smpl_t freq_max)239 {240 uint_t m, retval;241 smpl_t start = freq_min, end = freq_max, step;242 fvec_t *freqs;243 fmat_t *coeffs = aubio_filterbank_get_coeffs(fb);244 uint_t n_bands = coeffs->height;245 246 if (aubio_filterbank_check_freqs(fb, samplerate, &start, &end)) {247 return AUBIO_FAIL;248 }249 250 start = aubio_hztomel(start);251 end = aubio_hztomel(end);252 253 freqs = new_fvec(n_bands + 2);254 step = (end - start) / (n_bands + 1);255 256 for (m = 0; m < n_bands + 2; m++)257 {258 freqs->data[m] = MIN(aubio_meltohz(start + step * m), samplerate/2.);259 }260 261 retval = aubio_filterbank_set_triangle_bands (fb, freqs, samplerate);262 263 /* destroy vector used to store frequency limits */264 del_fvec (freqs);265 return retval;266 }267 268 uint_t269 aubio_filterbank_set_mel_coeffs_htk (aubio_filterbank_t * fb, smpl_t samplerate,270 smpl_t freq_min, smpl_t freq_max)271 {272 uint_t m, retval;273 smpl_t start = freq_min, end = freq_max, step;274 fvec_t *freqs;275 fmat_t *coeffs = aubio_filterbank_get_coeffs(fb);276 uint_t n_bands = coeffs->height;277 278 if (aubio_filterbank_check_freqs(fb, samplerate, &start, &end)) {279 return AUBIO_FAIL;280 }281 282 start = aubio_hztomel_htk(start);283 end = aubio_hztomel_htk(end);284 285 freqs = new_fvec (n_bands + 2);286 step = (end - start) / (n_bands + 1);287 288 for (m = 0; m < n_bands + 2; m++)289 {290 freqs->data[m] = MIN(aubio_meltohz_htk(start + step * m), samplerate/2.);291 }292 293 retval = aubio_filterbank_set_triangle_bands (fb, freqs, samplerate);294 295 /* destroy vector used to store frequency limits */296 del_fvec (freqs);297 return retval;298 } -
src/spectral/filterbank_mel.h
rc03d191 r088760e 56 56 57 57 \param fb filterbank object 58 \param samplerate audio sampling rate , in Hz58 \param samplerate audio sampling rate 59 59 60 The filter coefficients are built to match exactlyMalcolm Slaney's Auditory61 Toolbox implementation (see file mfcc.m). The number of filters should be 40.60 The filter coefficients are built according to Malcolm Slaney's Auditory 61 Toolbox, available online at the following address (see file mfcc.m): 62 62 63 References64 ----------65 66 Malcolm Slaney, *Auditory Toolbox Version 2, Technical Report #1998-010*67 63 https://engineering.purdue.edu/~malcolm/interval/1998-010/ 68 64 … … 71 67 smpl_t samplerate); 72 68 73 /** Mel filterbank initialization74 75 \param fb filterbank object76 \param samplerate audio sampling rate77 \param fmin start frequency, in Hz78 \param fmax end frequency, in Hz79 80 The filterbank will be initialized with bands linearly spaced in the mel81 scale, from `fmin` to `fmax`.82 83 References84 ----------85 86 Malcolm Slaney, *Auditory Toolbox Version 2, Technical Report #1998-010*87 https://engineering.purdue.edu/~malcolm/interval/1998-010/88 89 */90 uint_t aubio_filterbank_set_mel_coeffs(aubio_filterbank_t * fb,91 smpl_t samplerate, smpl_t fmin, smpl_t fmax);92 93 /** Mel filterbank initialization94 95 \param fb filterbank object96 \param samplerate audio sampling rate97 \param fmin start frequency, in Hz98 \param fmax end frequency, in Hz99 100 The bank of filters will be initalized to to cover linearly spaced bands in101 the Htk mel scale, from `fmin` to `fmax`.102 103 References104 ----------105 106 Douglas O'Shaughnessy (1987). *Speech communication: human and machine*.107 Addison-Wesley. p. 150. ISBN 978-0-201-16520-3.108 109 HTK Speech Recognition Toolkit: http://htk.eng.cam.ac.uk/110 111 */112 uint_t aubio_filterbank_set_mel_coeffs_htk(aubio_filterbank_t * fb,113 smpl_t samplerate, smpl_t fmin, smpl_t fmax);114 115 69 #ifdef __cplusplus 116 70 } -
src/spectral/mfcc.c
rc03d191 r088760e 52 52 fvec_t *output; 53 53 #endif 54 smpl_t scale;55 54 }; 56 55 … … 76 75 /* filterbank allocation */ 77 76 mfcc->fb = new_aubio_filterbank (n_filters, mfcc->win_s); 78 if (n_filters == 40) 79 aubio_filterbank_set_mel_coeffs_slaney (mfcc->fb, samplerate); 80 else 81 aubio_filterbank_set_mel_coeffs(mfcc->fb, samplerate, 82 0, samplerate/2.); 77 aubio_filterbank_set_mel_coeffs_slaney (mfcc->fb, samplerate); 83 78 84 79 /* allocating buffers */ … … 102 97 mfcc->output = new_fvec (n_filters); 103 98 #endif 104 105 mfcc->scale = 1.;106 99 107 100 return mfcc; … … 135 128 fvec_t tmp; 136 129 #endif 137 138 130 /* compute filterbank */ 139 131 aubio_filterbank_do (mf->fb, in, mf->in_dct); … … 142 134 fvec_log10 (mf->in_dct); 143 135 144 if (mf->scale != 1) fvec_mul (mf->in_dct, mf->scale); 136 /* raise power */ 137 //fvec_pow (mf->in_dct, 3.); 145 138 146 139 /* compute mfccs */ … … 158 151 return; 159 152 } 160 161 uint_t aubio_mfcc_set_power (aubio_mfcc_t *mf, smpl_t power)162 {163 return aubio_filterbank_set_power(mf->fb, power);164 }165 166 uint_t aubio_mfcc_get_power (aubio_mfcc_t *mf)167 {168 return aubio_filterbank_get_power(mf->fb);169 }170 171 uint_t aubio_mfcc_set_scale (aubio_mfcc_t *mf, smpl_t scale)172 {173 mf->scale = scale;174 return AUBIO_OK;175 }176 177 uint_t aubio_mfcc_get_scale (aubio_mfcc_t *mf)178 {179 return mf->scale;180 }181 182 uint_t aubio_mfcc_set_mel_coeffs (aubio_mfcc_t *mf, smpl_t freq_min,183 smpl_t freq_max)184 {185 return aubio_filterbank_set_mel_coeffs(mf->fb, mf->samplerate,186 freq_min, freq_max);187 }188 189 uint_t aubio_mfcc_set_mel_coeffs_htk (aubio_mfcc_t *mf, smpl_t freq_min,190 smpl_t freq_max)191 {192 return aubio_filterbank_set_mel_coeffs_htk(mf->fb, mf->samplerate,193 freq_min, freq_max);194 }195 196 uint_t aubio_mfcc_set_mel_coeffs_slaney (aubio_mfcc_t *mf)197 {198 return aubio_filterbank_set_mel_coeffs_slaney (mf->fb, mf->samplerate);199 } -
src/spectral/mfcc.h
rc03d191 r088760e 74 74 void aubio_mfcc_do (aubio_mfcc_t * mf, const cvec_t * in, fvec_t * out); 75 75 76 /** set power parameter77 78 \param mf mfcc object, as returned by new_aubio_mfcc()79 \param power Raise norm of the input spectrum norm to this power before80 computing filterbank. Defaults to `1`.81 82 See aubio_filterbank_set_power().83 84 */85 uint_t aubio_mfcc_set_power (aubio_mfcc_t *mf, smpl_t power);86 87 /** get power parameter88 89 \param mf mfcc object, as returned by new_aubio_mfcc()90 \return current power parameter. Defaults to `1`.91 92 See aubio_filterbank_get_power().93 94 */95 uint_t aubio_mfcc_get_power (aubio_mfcc_t *mf);96 97 /** set scaling parameter98 99 \param mf mfcc object, as returned by new_aubio_mfcc()100 \param scale Scaling value to apply.101 102 Scales the output of the filterbank after taking its logarithm and before103 computing the DCT. Defaults to `1`.104 105 */106 uint_t aubio_mfcc_set_scale (aubio_mfcc_t *mf, smpl_t scale);107 108 /** get scaling parameter109 110 \param mf mfcc object, as returned by new_aubio_mfcc()111 \return current scaling parameter. Defaults to `1`.112 113 */114 uint_t aubio_mfcc_get_scale (aubio_mfcc_t *mf);115 116 /** Mel filterbank initialization117 118 \param mf mfcc object119 \param fmin start frequency, in Hz120 \param fmax end frequency, in Hz121 122 The filterbank will be initialized with bands linearly spaced in the mel123 scale, from `fmin` to `fmax`.124 125 See also126 --------127 128 aubio_filterbank_set_mel_coeffs()129 130 */131 uint_t aubio_mfcc_set_mel_coeffs (aubio_mfcc_t *mf,132 smpl_t fmin, smpl_t fmax);133 134 /** Mel filterbank initialization135 136 \param mf mfcc object137 \param fmin start frequency, in Hz138 \param fmax end frequency, in Hz139 140 The bank of filters will be initalized to to cover linearly spaced bands in141 the Htk mel scale, from `fmin` to `fmax`.142 143 See also144 --------145 146 aubio_filterbank_set_mel_coeffs_htk()147 148 */149 uint_t aubio_mfcc_set_mel_coeffs_htk (aubio_mfcc_t *mf,150 smpl_t fmin, smpl_t fmax);151 152 /** Mel filterbank initialization (Auditory Toolbox's parameters)153 154 \param mf mfcc object155 \param samplerate audio sampling rate, in Hz156 157 The filter coefficients are built to match exactly Malcolm Slaney's Auditory158 Toolbox implementation. The number of filters should be 40.159 160 This is the default filterbank when `mf` was created with `n_filters = 40`.161 162 See also163 --------164 165 aubio_filterbank_set_mel_coeffs_slaney()166 167 */168 uint_t aubio_mfcc_set_mel_coeffs_slaney (aubio_mfcc_t *mf);169 170 76 #ifdef __cplusplus 171 77 } -
tests/src/spectral/test-filterbank.c
rc03d191 r088760e 11 11 // create filterbank object 12 12 aubio_filterbank_t *o = new_aubio_filterbank (n_filters, win_s); 13 14 smpl_t power = aubio_filterbank_get_power(o);15 smpl_t norm = aubio_filterbank_get_norm(o);16 if (aubio_filterbank_set_power(o, power)) {17 return 1;18 }19 if (aubio_filterbank_set_norm(o, norm)) {20 return 1;21 }22 13 23 14 // apply filterbank ten times -
tests/src/temporal/test-filter.c
rc03d191 r088760e 9 9 10 10 aubio_filter_t *o = new_aubio_filter_c_weighting (44100); 11 12 if (new_aubio_filter(0))13 return 1;14 15 if (aubio_filter_get_samplerate(o) != 44100)16 return 1;17 18 if (aubio_filter_set_c_weighting (o, -1) == 0)19 return 1;20 21 if (aubio_filter_set_c_weighting (0, 32000) == 0)22 return 1;23 24 11 in->data[impulse_at] = 0.5; 25 12 fvec_print (in); … … 29 16 30 17 o = new_aubio_filter_a_weighting (32000); 31 32 if (aubio_filter_set_a_weighting (o, -1) == 0)33 return 1;34 if (aubio_filter_set_a_weighting (0, 32000) == 0)35 return 1;36 37 18 in->data[impulse_at] = 0.5; 38 19 fvec_print (in); -
wscript
rc03d191 r088760e 43 43 choices = ('debug', 'release'), 44 44 dest = 'build_type', 45 help = 'whether to compile with (--build-type=release)' \ 46 ' or without (--build-type=debug)' \ 47 ' compiler opimizations [default: release]') 45 help = 'whether to compile with (--build-type=release) or without (--build-type=debug) '\ 46 ' compiler opimizations [default: release]') 48 47 add_option_enable_disable(ctx, 'fftw3f', default = False, 49 48 help_str = 'compile with fftw3f instead of ooura (recommended)', … … 111 110 112 111 ctx.add_option('--with-target-platform', type='string', 113 help='set target platform for cross-compilation', 114 dest='target_platform') 112 help='set target platform for cross-compilation', dest='target_platform') 115 113 116 114 ctx.load('compiler_c') … … 208 206 ctx.msg('Checking for AudioToolbox.framework', 'yes') 209 207 else: 210 ctx.msg('Checking for AudioToolbox.framework', 'no (disabled)', 211 color = 'YELLOW') 208 ctx.msg('Checking for AudioToolbox.framework', 'no (disabled)', color = 'YELLOW') 212 209 if (ctx.options.enable_accelerate != False): 213 210 ctx.define('HAVE_ACCELERATE', 1) … … 215 212 ctx.msg('Checking for Accelerate framework', 'yes') 216 213 else: 217 ctx.msg('Checking for Accelerate framework', 'no (disabled)', 218 color = 'YELLOW') 214 ctx.msg('Checking for Accelerate framework', 'no (disabled)', color = 'YELLOW') 219 215 220 216 if target_platform in [ 'ios', 'iosimulator' ]: … … 270 266 # tell emscripten functions we want to expose 271 267 from python.lib.gen_external import get_c_declarations, \ 272 get_cpp_objects_from_c_declarations, \ 273 get_all_func_names_from_lib, \ 268 get_cpp_objects_from_c_declarations, get_all_func_names_from_lib, \ 274 269 generate_lib_from_c_declarations 275 # emscripten can't use double 276 c_decls = get_c_declarations(usedouble=False) 270 c_decls = get_c_declarations(usedouble=False) # emscripten can't use double 277 271 objects = list(get_cpp_objects_from_c_declarations(c_decls)) 278 272 # ensure that aubio structs are exported … … 281 275 exported_funcnames = get_all_func_names_from_lib(lib) 282 276 c_mangled_names = ['_' + s for s in exported_funcnames] 283 ctx.env.LINKFLAGS_cshlib += ['-s', 284 'EXPORTED_FUNCTIONS=%s' % c_mangled_names] 277 ctx.env.LINKFLAGS_cshlib += ['-s', 'EXPORTED_FUNCTIONS=%s' % c_mangled_names] 285 278 286 279 # check support for C99 __VA_ARGS__ macros … … 312 305 # check for Intel IPP 313 306 if (ctx.options.enable_intelipp != False): 314 has_ipp_headers = ctx.check(header_name=['ippcore.h', 'ippvm.h', 315 'ipps.h'],mandatory = False)307 has_ipp_headers = ctx.check(header_name=['ippcore.h', 'ippvm.h', 'ipps.h'], 308 mandatory = False) 316 309 has_ipp_libs = ctx.check(lib=['ippcore', 'ippvm', 'ipps'], 317 310 uselib_store='INTEL_IPP', mandatory = False) … … 320 313 ctx.define('HAVE_INTEL_IPP', 1) 321 314 if ctx.env.CC_NAME == 'msvc': 322 # force linking multi-threaded static IPP libraries on Windows 323 # with msvc 315 # force linking multi-threaded static IPP libraries on Windows with msvc 324 316 ctx.define('_IPP_SEQUENTIAL_STATIC', 1) 325 317 else: … … 370 362 if (ctx.options.enable_double): 371 363 if (ctx.options.enable_samplerate): 372 ctx.fatal("Could not compile aubio in double precision mode' \ 373 ' with libsamplerate") 364 ctx.fatal("Could not compile aubio in double precision mode with libsamplerate") 374 365 else: 375 366 ctx.options.enable_samplerate = False 376 ctx.msg('Checking if using samplerate', 377 'no (disabled in double precision mode)',color = 'YELLOW')367 ctx.msg('Checking if using samplerate', 'no (disabled in double precision mode)', 368 color = 'YELLOW') 378 369 if (ctx.options.enable_samplerate != False): 379 370 ctx.check_cfg(package = 'samplerate', … … 418 409 elif 'HAVE_AVUTIL' not in ctx.env: 419 410 ctx.msg(msg_check, 'not found (missing avutil)', color = 'YELLOW') 420 elif 'HAVE_SWRESAMPLE' not in ctx.env \ 421 and 'HAVE_AVRESAMPLE' not in ctx.env: 411 elif 'HAVE_SWRESAMPLE' not in ctx.env and 'HAVE_AVRESAMPLE' not in ctx.env: 422 412 resample_missing = 'not found (avresample or swresample required)' 423 413 ctx.msg(msg_check, resample_missing, color = 'YELLOW') … … 432 422 if (ctx.options.enable_wavread != False): 433 423 ctx.define('HAVE_WAVREAD', 1) 434 ctx.msg('Checking if using source_wavread', 435 ctx.options.enable_wavread and 'yes' or 'no') 424 ctx.msg('Checking if using source_wavread', ctx.options.enable_wavread and 'yes' or 'no') 436 425 if (ctx.options.enable_wavwrite!= False): 437 426 ctx.define('HAVE_WAVWRITE', 1) 438 ctx.msg('Checking if using sink_wavwrite', 439 ctx.options.enable_wavwrite and 'yes' or 'no') 427 ctx.msg('Checking if using sink_wavwrite', ctx.options.enable_wavwrite and 'yes' or 'no') 440 428 441 429 # use BLAS/ATLAS … … 555 543 556 544 def sphinx(bld): 557 # build documentation from source files using sphinx-build note: build in558 # ../doc/_build/html, otherwise waf wont install unsigned files545 # build documentation from source files using sphinx-build 546 # note: build in ../doc/_build/html, otherwise waf wont install unsigned files 559 547 if bld.env['SPHINX']: 560 548 bld.env.VERSION = VERSION 561 549 bld( name = 'sphinx', 562 rule = '${SPHINX} -b html -D release=${VERSION}' \ 563 ' -D version=${VERSION} -a -q' \ 564 ' `dirname ${SRC}` `dirname ${TGT}`', 550 rule = '${SPHINX} -b html -D release=${VERSION} -D version=${VERSION} -a -q `dirname ${SRC}` `dirname ${TGT}`', 565 551 source = 'doc/conf.py', 566 552 target = '../doc/_build/html/index.html') … … 592 578 from waflib import Logs 593 579 if bld.options.target_platform in ['ios', 'iosimulator']: 594 msg ='building for %s, contact the author for a commercial license' \ 595 % bld.options.target_platform 580 msg ='building for %s, contact the author for a commercial license' % bld.options.target_platform 596 581 Logs.pprint('RED', msg) 597 582 msg =' Paul Brossier <piem@aubio.org>' … … 599 584 600 585 def dist(ctx): 601 ctx.excl = ' **/.waf*' 602 ctx.excl += ' **/.git*' 603 ctx.excl += ' **/*~ **/*.pyc **/*.swp **/*.swo **/*.swn **/.lock-w*' 586 ctx.excl = ' **/.waf* **/*~ **/*.pyc **/*.swp **/*.swo **/*.swn **/.lock-w* **/.git*' 604 587 ctx.excl += ' **/build/*' 605 588 ctx.excl += ' doc/_build' … … 609 592 ctx.excl += ' **/python/lib/aubio/_aubio.so' 610 593 ctx.excl += ' **.egg-info' 611 ctx.excl += ' **/.eggs'612 ctx.excl += ' **/.pytest_cache'613 ctx.excl += ' **/.cache'614 594 ctx.excl += ' **/**.zip **/**.tar.bz2' 615 595 ctx.excl += ' **.tar.bz2'
Note: See TracChangeset
for help on using the changeset viewer.