Changeset c03d191
- Timestamp:
- Nov 17, 2018, 10:19:27 PM (6 years ago)
- Branches:
- feature/constantq
- Children:
- d1d4ad4
- Parents:
- 088760e (diff), a114fe0 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 3 added
- 2 deleted
- 42 edited
Legend:
- Unmodified
- Added
- Removed
-
.gitignore
r088760e rc03d191 49 49 python/tests/sounds 50 50 aubio.egg-info 51 .eggs 52 .cache -
MANIFEST.in
r088760e rc03d191 2 2 include python/README.md 3 3 include this_version.py 4 include waf 5 recursive-include waflib *.py 4 6 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 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 15 recursive-include python *.py 16 include python/README.md 20 17 include python/tests/run_all_tests 21 include python/tests/*.py22 18 include python/tests/eval_pitch 23 include python/demos/*.py24 19 include python/tests/*.expected 25 20 include doc/*.txt doc/*.rst doc/*.cfg doc/Makefile doc/make.bat doc/conf.py -
Makefile
r088760e rc03d191 234 234 uninstall_python \ 235 235 check_clean_python 236 237 coverage_cycle: coverage_zero_counters coverage_report 238 239 coverage_zero_counters: 240 lcov --zerocounters --directory . 236 241 237 242 coverage: export CFLAGS=--coverage … … 247 252 lcov -a build/coverage_python.info -a build/coverage_lib.info -o build/coverage.info 248 253 254 # make sure we don't build the doc, which builds a temporary python module 255 coverage_report: export WAFOPTS += --disable-docs 249 256 coverage_report: coverage 250 257 genhtml build/coverage.info --output-directory lcov_html -
doc/py_io.rst
r088760e rc03d191 40 40 down-mixed to produce the new samples. 41 41 42 return: A tuple of one array of samples and one integer.42 :returns: A tuple of one array of samples and one integer. 43 43 :rtype: (array, int) 44 44 -
doc/py_utils.rst
r088760e rc03d191 28 28 29 29 .. autofunction:: miditofreq 30 31 .. python/ext/py-musicutils.h 32 33 .. autofunction:: meltohz 34 35 .. autofunction:: hztomel 30 36 31 37 .. python/ext/aubiomodule.c -
python/demos/demo_filter.py
r088760e rc03d191 4 4 import os.path 5 5 import aubio 6 6 7 7 8 def apply_filter(path, target): … … 28 29 total_frames += read 29 30 # end of file reached 30 if read < s.hop_size: break 31 if read < s.hop_size: 32 break 31 33 32 34 # print some info … … 34 36 input_str = "input: {:s} ({:.2f} s, {:d} Hz)" 35 37 output_str = "output: {:s}, A-weighting filtered ({:d} frames total)" 36 print 37 print 38 print(input_str.format(s.uri, duration, samplerate)) 39 print(output_str.format(o.uri, total_frames)) 38 40 39 41 if __name__ == '__main__': 40 42 usage = "{:s} <input_file> [output_file]".format(sys.argv[0]) 41 43 if not 1 < len(sys.argv) < 4: 42 print 44 print(usage) 43 45 sys.exit(1) 44 46 if len(sys.argv) < 3: -
python/demos/demo_filterbank.py
r088760e rc03d191 1 1 #! /usr/bin/env python 2 2 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. 6 4 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 15 samplerate = 48000 7 16 win_s = 2048 8 samplerate = 480009 17 18 # define a list of custom frequency 10 19 freq_list = [60, 80, 200, 400, 800, 1600, 3200, 6400, 12800, 24000] 20 # number of filters to create 11 21 n_filters = len(freq_list) - 2 12 22 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) 15 26 f.set_triangle_bands(freqs, samplerate) 16 27 28 # get the coefficients from the filterbank 17 29 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 20 33 f.set_coeffs(coeffs) 21 34 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
r088760e rc03d191 1 1 #! /usr/bin/env python 2 3 """A simple example using aubio.source.""" 4 2 5 import sys 3 6 import aubio 4 7 5 samplerate = 0 # use original source samplerate6 hop_size = 256 # number of frames to read in one block8 samplerate = 0 # use original source samplerate 9 hop_size = 256 # number of frames to read in one block 7 10 src = aubio.source(sys.argv[1], samplerate, hop_size) 8 11 total_frames = 0 9 12 10 13 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 14 18 15 19 fmt_string = "read {:d} frames at {:d}Hz from {:s}" 16 print 20 print(fmt_string.format(total_frames, src.samplerate, src.uri)) -
python/ext/aubiomodule.c
r088760e rc03d191 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}, 375 379 {NULL, NULL, 0, NULL} /* Sentinel */ 376 380 }; -
python/ext/py-filterbank.c
r088760e rc03d191 139 139 &(self->freqs), samplerate); 140 140 if (err > 0) { 141 PyErr_SetString (PyExc_ValueError, 142 "error when running set_triangle_bands"); 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 } 143 149 return NULL; 144 150 } … … 151 157 uint_t err = 0; 152 158 153 uint_t samplerate;154 if (!PyArg_ParseTuple (args, "I", &samplerate)) {159 smpl_t samplerate; 160 if (!PyArg_ParseTuple (args, AUBIO_NPY_SMPL_CHR, &samplerate)) { 155 161 return NULL; 156 162 } … … 158 164 err = aubio_filterbank_set_mel_coeffs_slaney (self->o, samplerate); 159 165 if (err > 0) { 160 PyErr_SetString (PyExc_ValueError, 161 "error when running set_mel_coeffs_slaney"); 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 } 162 232 return NULL; 163 233 } … … 194 264 return (PyObject *)PyAubio_CFmatToArray( 195 265 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 ValueError 282 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 ValueError 305 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; 196 312 } 197 313 … … 201 317 {"set_mel_coeffs_slaney", (PyCFunction) Py_filterbank_set_mel_coeffs_slaney, 202 318 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"}, 203 323 {"get_coeffs", (PyCFunction) Py_filterbank_get_coeffs, 204 324 METH_NOARGS, "get coefficients of filterbank"}, 205 325 {"set_coeffs", (PyCFunction) Py_filterbank_set_coeffs, 206 326 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"}, 207 331 {NULL} 208 332 }; -
python/ext/py-musicutils.c
r088760e rc03d191 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 else 199 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 else 216 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
r088760e rc03d191 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 303 371 #endif /* PY_AUBIO_MUSICUTILS_H */ -
python/ext/py-sink.c
r088760e rc03d191 15 15 "sink(path, samplerate=44100, channels=1)\n" 16 16 "\n" 17 " Open `path` to write a WAVfile.\n"17 "Write audio samples to file.\n" 18 18 "\n" 19 19 "Parameters\n" -
python/ext/py-source.c
r088760e rc03d191 19 19 "source(path, samplerate=0, hop_size=512, channels=0)\n" 20 20 "\n" 21 " Create a new source, opening the given pathname for reading.\n"21 "Read audio samples from a media file.\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 , shape `(hop_size,)`, dtype aubio.float_type\n"250 "samples : numpy.ndarray\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 p.ndarray([hop_size, channels], dtype=aubio.float_type)\n"286 "samples : numpy.ndarray\n" 287 287 " NumPy array of shape `(hop_size, channels)` containing the new\n" 288 288 " audio samples.\n" -
python/lib/aubio/__init__.py
r088760e rc03d191 29 29 from .midiconv import * 30 30 from .slicing import * 31 31 32 32 33 class fvec(numpy.ndarray): -
python/lib/aubio/cmd.py
r088760e rc03d191 12 12 import sys 13 13 import argparse 14 import warnings 14 15 import aubio 15 16 … … 169 170 170 171 def add_verbose_help(self): 171 self.add_argument("-v", "--verbose",172 self.add_argument("-v", "--verbose", 172 173 action="count", dest="verbose", default=1, 173 174 help="make lots of noise [default]") 174 self.add_argument("-q", "--quiet",175 self.add_argument("-q", "--quiet", 175 176 action="store_const", dest="verbose", const=0, 176 177 help="be quiet") … … 181 182 182 183 def add_buf_size(self, buf_size=512): 183 self.add_argument("-B", "--bufsize",184 self.add_argument("-B", "--bufsize", 184 185 action="store", dest="buf_size", default=buf_size, 185 186 metavar = "<size>", type=int, … … 187 188 188 189 def add_hop_size(self, hop_size=256): 189 self.add_argument("-H", "--hopsize",190 self.add_argument("-H", "--hopsize", 190 191 metavar = "<size>", type=int, 191 192 action="store", dest="hop_size", default=hop_size, … … 193 194 194 195 def add_method(self, method='default', helpstr='method'): 195 self.add_argument("-m", "--method",196 self.add_argument("-m", "--method", 196 197 metavar = "<method>", type=str, 197 198 action="store", dest="method", default=method, … … 199 200 200 201 def add_threshold(self, default=None): 201 self.add_argument("-t", "--threshold",202 self.add_argument("-t", "--threshold", 202 203 metavar = "<threshold>", type=float, 203 204 action="store", dest="threshold", default=default, … … 240 241 241 242 def add_slicer_options(self): 242 self.add_argument("-o", "--output", type = str,243 self.add_argument("-o", "--output", type = str, 243 244 metavar = "<outputdir>", 244 245 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") 246 248 self.add_argument("--cut-until-nsamples", type = int, 247 249 metavar = "<samples>", 248 250 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") 250 253 self.add_argument("--cut-every-nslices", type = int, 251 254 metavar = "<samples>", … … 255 258 metavar = "<slices>", 256 259 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") 258 262 self.add_argument("--create-first", 259 263 action = "store_true", dest = "create_first", default = False, … … 289 293 if args.verbose > 2 and hasattr(self, 'options'): 290 294 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']) 292 297 sys.stderr.write(optstr) 293 298 def flush(self, frames_read, samplerate): … … 297 302 def parse_options(self, args, valid_opts): 298 303 # 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} 300 305 self.options = options 301 306 … … 378 383 outstr = "unknown bpm" 379 384 else: 380 bpms = 60. / np.diff(self.beat_locations)385 bpms = 60. / np.diff(self.beat_locations) 381 386 median_bpm = np.mean(bpms) 382 387 if len(self.beat_locations) < 10: … … 399 404 return self.notes(block) 400 405 def repr_res(self, res, frames_read, samplerate): 401 if res[2] != 0: # note off406 if res[2] != 0: # note off 402 407 fmt_out = self.time2string(frames_read, samplerate) 403 408 sys.stdout.write(fmt_out + '\n') 404 if res[0] != 0: # note on409 if res[0] != 0: # note on 405 410 lastmidi = res[0] 406 411 fmt_out = "%f\t" % lastmidi 407 412 fmt_out += self.time2string(frames_read, samplerate) 408 sys.stdout.write(fmt_out) # + '\t')413 sys.stdout.write(fmt_out) # + '\t') 409 414 def flush(self, frames_read, samplerate): 410 415 eof = self.time2string(frames_read, samplerate) … … 473 478 if self.wassilence != 1: 474 479 self.wassilence = 1 475 return 2 # newly found silence476 return 1 # silence again480 return 2 # newly found silence 481 return 1 # silence again 477 482 else: 478 483 if self.wassilence != 0: 479 484 self.wassilence = 0 480 return -1 # newly found noise481 return 0 # noise again485 return -1 # newly found noise 486 return 0 # noise again 482 487 483 488 def repr_res(self, res, frames_read, samplerate): … … 499 504 def __call__(self, block): 500 505 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()) 502 508 return ret 503 509 504 510 def flush(self, frames_read, samplerate): 505 from aubio.cut import _cut_slice506 511 _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} 509 515 base_info += ' (total %(duration).2fs at %(samplerate)dHz)\n' % \ 510 {'duration': duration, 'samplerate': samplerate}516 {'duration': duration, 'samplerate': samplerate} 511 517 info = "created %d slices from " % len(self.slices) 512 518 info += base_info 513 519 sys.stderr.write(info) 520 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) 514 546 515 547 def main(): … … 526 558 action="store_true", dest="show_version") 527 559 args, extras = parser_root.parse_known_args() 528 if args.show_version == False:# no -V, forward to parser560 if not args.show_version: # no -V, forward to parser 529 561 args = parser.parse_args(extras, namespace=args) 530 elif len(extras) != 0: # -V with other arguments, print help562 elif len(extras) != 0: # -V with other arguments, print help 531 563 parser.print_help() 532 564 sys.exit(1) 533 else: # in py3, we can simply use parser directly565 else: # in py3, we can simply use parser directly 534 566 args = parser.parse_args() 535 567 if 'show_version' in args and args.show_version: … … 538 570 elif 'verbose' in args and args.verbose > 3: 539 571 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']: 541 574 # no command given, print help and return 1 542 575 parser.print_help() … … 572 605 frames_read += read 573 606 # exit loop at end of file 574 if read < a_source.hop_size: break 607 if read < a_source.hop_size: 608 break 575 609 # flush the processor if needed 576 610 processor.flush(frames_read, a_source.samplerate) … … 580 614 fmt_string += " from {:s} at {:d}Hz\n" 581 615 sys.stderr.write(fmt_string.format( 582 frames_read /float(a_source.samplerate),616 frames_read / float(a_source.samplerate), 583 617 frames_read, 584 618 frames_read // a_source.hop_size + 1, -
python/lib/aubio/cut.py
r088760e rc03d191 6 6 7 7 import sys 8 from aubio.cmd import AubioArgumentParser 8 from aubio.cmd import AubioArgumentParser, _cut_slice 9 9 10 10 def aubio_cut_parser(): 11 11 parser = AubioArgumentParser() 12 12 parser.add_input() 13 parser.add_argument("-O", "--onset-method",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", "--beat",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", "--silencecut",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", "--silence",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", "--threshold", "--onset-threshold",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", "--cut",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", "--delay",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", "--dcthreshold",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", "--localmin",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", "--derivate",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", "--zerocross",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", "--plot",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", "--xsize",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", "--ysize",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", "--function",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", "--no-onsets",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", "--outplot",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", "--spectrogram",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, samplerate=samplerate) 108 o = tempo(options.onset_method, bufsize, hopsize, 109 samplerate=samplerate) 109 110 else: 110 o = onset(options.onset_method, bufsize, hopsize, samplerate=samplerate) 111 o = onset(options.onset_method, bufsize, hopsize, 112 samplerate=samplerate) 111 113 if options.minioi: 112 114 if options.minioi.endswith('ms'): … … 123 125 samples, read = s() 124 126 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()) 127 130 total_frames += read 128 if read < hopsize: break 131 if read < hopsize: 132 break 129 133 del s 130 134 return timestamps, total_frames 131 132 def _cut_slice(options, timestamps):133 # cutting pass134 nstamps = len(timestamps)135 if nstamps > 0:136 # generate output files137 from aubio.slicing import slice_source_at_stamps138 timestamps_end = None139 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 135 156 136 def main(): … … 168 148 169 149 # print some info 170 duration = float 150 duration = float(total_frames) / float(options.samplerate) 171 151 base_info = '%(source_uri)s' % {'source_uri': options.source_uri} 172 152 base_info += ' (total %(duration).2fs at %(samplerate)dHz)\n' % \ -
python/lib/aubio/midiconv.py
r088760e rc03d191 2 2 """ utilities to convert midi note number to and from note names """ 3 3 4 __all__ = ['note2midi', 'midi2note', 'freq2note', 'note2freq']5 6 4 import sys 7 5 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 16 17 17 18 def note2midi(note): … … 56 57 midi2note, freqtomidi, miditofreq 57 58 """ 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} 59 61 _valid_modifiers = { 60 u'𝄫': -2, # double flat61 u'♭': -1, 'b': -1, '\u266d': -1, # simple flat62 u'♮': 0, '\u266e': 0, None: 0, # natural63 '#': +1, u'♯': +1, '\u266f': +1, # sharp64 u'𝄪': +2, # double sharp62 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 65 67 } 66 68 _valid_octaves = range(-1, 10) … … 71 73 msg = "string of 2 to 4 characters expected, got {:d} ({:s})" 72 74 raise ValueError(msg.format(len(note), note)) 73 notename, modifier, octave = [None] *375 notename, modifier, octave = [None] * 3 74 76 75 77 if len(note) == 4: … … 94 96 raise ValueError("%s is not a valid octave" % octave) 95 97 96 midi = 12 + octave* 12 + _valid_notenames[notename] \97 + _valid_modifiers[modifier]98 midi = (octave + 1) * 12 + _valid_notenames[notename] \ 99 + _valid_modifiers[modifier] 98 100 if midi > 127: 99 101 raise ValueError("%s is outside of the range C-2 to G8" % note) 100 102 return midi 103 101 104 102 105 def midi2note(midi): … … 137 140 raise ValueError(msg.format(midi)) 138 141 _valid_notenames = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 139 'A', 'A#', 'B']142 'A', 'A#', 'B'] 140 143 return _valid_notenames[midi % 12] + str(int(midi / 12) - 1) 144 141 145 142 146 def freq2note(freq): … … 163 167 return midi2note(nearest_note) 164 168 169 165 170 def note2freq(note): 166 171 """Convert note name to corresponding frequency, in Hz. -
python/lib/aubio/slicing.py
r088760e rc03d191 5 5 6 6 _max_timestamp = 1e120 7 7 8 8 9 def slice_source_at_stamps(source_file, timestamps, timestamps_end=None, … … 73 74 """ 74 75 75 if timestamps is None or len(timestamps) == 0:76 if not timestamps: 76 77 raise ValueError("no timestamps given") 77 78 … … 90 91 91 92 regions = list(zip(timestamps, timestamps_end)) 92 #print regions93 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 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 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 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]: 118 117 # get next region 119 118 start_stamp, end_stamp = regions.pop(0) 120 119 # 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) 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, 'sink': _sink} 125 new_slice = {'start_stamp': start_stamp, 'end_stamp': end_stamp, 126 'sink': _sink} 126 127 # append the dictionary to the current list of slices 127 128 slices.append(new_slice) … … 135 136 # number of samples yet to written be until end of region 136 137 remaining = end_stamp - total_frames + 1 137 #print current_slice, remaining, start138 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)144 143 # close this file 145 144 _sink.close() … … 150 149 # remove old slices 151 150 slices = list(filter(lambda s: s['end_stamp'] > total_frames, 152 slices))151 slices)) 153 152 if read < hopsize: 154 153 break -
python/lib/gen_code.py
r088760e rc03d191 465 465 """.format(**self.__dict__) 466 466 for set_param in self.prototypes['set']: 467 params = get_params_types_names(set_param)[1] 468 paramtype = params['type'] 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]) 469 471 method_name = get_name(set_param) 470 472 param = method_name.split('aubio_'+self.shortname+'_set_')[-1] 471 pyparamtype = pyargparse_chars[paramtype] 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]) 472 478 out += """ 473 479 static PyObject * … … 475 481 {{ 476 482 uint_t err = 0; 477 {paramtype} {param}; 478 479 if (!PyArg_ParseTuple (args, "{pyparamtype}", &{param})) {{ 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})) {{ 480 490 return NULL; 481 491 }} 482 err = aubio_{shortname}_set_{param} (self->o, {param}); 492 """.format(pyparamtypes = pyparamtypes, refs = refs) 493 494 out += """ 495 err = aubio_{shortname}_set_{param} (self->o {paramlist}); 483 496 484 497 if (err > 0) {{ … … 495 508 Py_RETURN_NONE; 496 509 }} 497 """.format(param = param, paramtype = paramtype, pyparamtype = pyparamtype, **self.__dict__) 510 """.format(param = param, refs = refs, paramdecls = paramdecls, 511 pyparamtypes = pyparamtypes, paramlist = paramlist, **self.__dict__) 498 512 return out 499 513 -
python/lib/gen_external.py
r088760e rc03d191 4 4 import subprocess 5 5 import glob 6 from distutils.sysconfig import customize_compiler 7 from gen_code import MappedObject 6 8 7 9 header = os.path.join('src', 'aubio.h') … … 50 52 def get_preprocessor(): 51 53 # findout which compiler to use 52 from distutils.sysconfig import customize_compiler53 54 compiler_name = distutils.ccompiler.get_default_compiler() 54 55 compiler = distutils.ccompiler.new_compiler(compiler=compiler_name) … … 263 264 264 265 sources_list = [] 265 try:266 from .gen_code import MappedObject267 except (SystemError, ValueError):268 from gen_code import MappedObject269 266 for o in lib: 270 267 out = source_header -
python/lib/moresetuptools.py
r088760e rc03d191 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
r088760e rc03d191 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 = 29 149 self.recontruct(win_s, 'odd sizes not supported') 150 151 def test_reconstruct_with_radix15(self): 152 win_s = 2 ** 4 * 15 153 self.recontruct(win_s, 'radix 15 supported') 154 155 def test_reconstruct_with_radix5(self): 156 win_s = 2 ** 4 * 5 157 self.recontruct(win_s, 'radix 5 supported') 158 159 def test_reconstruct_with_radix3(self): 160 win_s = 2 ** 4 * 3 161 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] = 1 170 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 145 176 def test_large_input_timegrain(self): 146 177 win_s = 1024 … … 170 201 with self.assertRaises(ValueError): 171 202 f.rdo(s) 172 173 class aubio_fft_wrong_params(TestCase):174 203 175 204 def test_wrong_buf_size(self): … … 177 206 with self.assertRaises(ValueError): 178 207 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 sizes182 win_s = 320183 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)188 208 189 209 def test_buf_size_too_small(self): -
python/tests/test_filter.py
r088760e rc03d191 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 80 90 class aubio_filter_wrong_params(TestCase): 81 91 -
python/tests/test_filterbank_mel.py
r088760e rc03d191 4 4 from numpy.testing import TestCase, assert_equal, assert_almost_equal 5 5 6 from aubio import cvec, filterbank, float_type6 from aubio import fvec, 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 = 22050 76 freq_list = [0, samplerate//4, samplerate // 2 + 1] 77 f = filterbank(len(freq_list)-2, 1024) 78 # TODO add assert_warns 79 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 = 22050 84 freq_list = [0, 100, 1000, 4000, 8000, 10000] 85 f = filterbank(len(freq_list)-3, 1024) 86 # TODO add assert_warns 87 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 = 22050 92 freq_list = [0, 100, 1000, 4000, 8000, 10000] 93 f = filterbank(len(freq_list)-1, 1024) 94 # TODO add assert_warns 95 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 = 22050 100 freq_list = [0, 100, 1000, 4000, 4000, 4000, 10000] 101 f = filterbank(len(freq_list)-2, 1024) 102 # TODO add assert_warns 103 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 = 22050 108 freq_list = [0, 100, 1000, 4000, 4000, 4000, 10000] 109 f = filterbank(len(freq_list)-2, 1024) 110 # TODO add assert_warns 111 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 = 22050 116 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[:] = .1 139 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 50 170 if __name__ == '__main__': 51 171 import nose2 -
python/tests/test_mfcc.py
r088760e rc03d191 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, 16000 118 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, 16000 124 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, 16000 130 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, 16000 136 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, 16000 142 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() == 1 146 assert m.get_scale() == 1 147 113 148 if __name__ == '__main__': 114 149 main() -
python/tests/test_onset.py
r088760e rc03d191 3 3 from unittest import main 4 4 from numpy.testing import TestCase, assert_equal, assert_almost_equal 5 from aubio import onset 5 from aubio import onset, fvec 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 coverage 88 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() == -70 100 o.set_silence(-20) 101 assert_almost_equal(o.get_silence(), -20) 102 103 assert o.get_compression() == 1 104 o.set_compression(.99) 105 assert_almost_equal(o.get_compression(), .99) 106 107 assert o.get_awhitening() == 0 108 o.set_awhitening(1) 109 assert o.get_awhitening() == 1 110 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 86 118 if __name__ == '__main__': 87 119 main() -
setup.py
r088760e rc03d191 1 1 #! /usr/bin/env python 2 2 3 import sys, os.path, glob 3 import sys 4 import os.path 5 import glob 4 6 from setuptools import setup, Extension 5 from python.lib.moresetuptools import build_ext, CleanGenerated 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 6 12 # function to generate gen/*.{c,h} 7 13 from this_version import get_aubio_version, get_aubio_pyversion … … 15 21 extra_link_args = [] 16 22 17 include_dirs += [ 'python/ext']23 include_dirs += ['python/ext'] 18 24 try: 19 25 import numpy 20 include_dirs += [ numpy.get_include()]26 include_dirs += [numpy.get_include()] 21 27 except ImportError: 22 28 pass 23 29 24 30 if sys.platform.startswith('darwin'): 25 extra_link_args += ['-framework','CoreFoundation', '-framework','AudioToolbox'] 31 extra_link_args += ['-framework', 'CoreFoundation', 32 '-framework', 'AudioToolbox'] 26 33 27 34 sources = sorted(glob.glob(os.path.join('python', 'ext', '*.c'))) … … 34 41 define_macros = define_macros) 35 42 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 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 40 48 41 49 classifiers = [ … … 51 59 'Programming Language :: C', 52 60 'Programming Language :: Python', 53 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)', 61 'License :: OSI Approved :: ' 62 'GNU General Public License v3 or later (GPLv3+)', 54 63 ] 55 64 … … 57 66 version = __version__, 58 67 packages = ['aubio'], 59 package_dir = {'aubio': 'python/lib/aubio'},68 package_dir = {'aubio': 'python/lib/aubio'}, 60 69 ext_modules = [aubio_extension], 61 70 description = 'a collection of tools for music analysis', -
src/io/source_avcodec.c
r088760e rc03d191 90 90 sint_t selected_stream; 91 91 uint_t eof; 92 uint_t multi;93 92 }; 94 93 95 94 // create or re-create the context when _do or _do_multi is called 96 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s, 97 uint_t multi); 95 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s); 98 96 // actually read a frame 99 97 void aubio_source_avcodec_readframe(aubio_source_avcodec_t *s, … … 285 283 s->avFrame = avFrame; 286 284 287 // default to mono output 288 aubio_source_avcodec_reset_resampler(s, 0); 285 aubio_source_avcodec_reset_resampler(s); 289 286 290 287 if (s->avr == NULL) goto beach; 291 288 292 289 s->eof = 0; 293 s->multi = 0;294 290 295 291 //av_log_set_level(AV_LOG_QUIET); … … 304 300 } 305 301 306 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s, 307 uint_t multi) 302 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s) 308 303 { 309 304 // create or reset resampler to/from mono/multi-channel 310 if ( (multi != s->multi) || (s->avr == NULL)) {305 if ( s->avr == NULL ) { 311 306 int err; 312 307 int64_t input_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); 308 int64_t output_layout = av_get_default_channel_layout(s->input_channels); 315 309 #ifdef HAVE_AVRESAMPLE 316 310 AVAudioResampleContext *avr = avresample_alloc_context(); 317 AVAudioResampleContext *oldavr = s->avr;318 311 #elif defined(HAVE_SWRESAMPLE) 319 312 SwrContext *avr = swr_alloc(); 320 SwrContext *oldavr = s->avr;321 313 #endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */ 322 314 … … 346 338 } 347 339 s->avr = avr; 348 if (oldavr != NULL) {349 #ifdef HAVE_AVRESAMPLE350 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;358 340 } 359 341 } … … 496 478 void aubio_source_avcodec_do(aubio_source_avcodec_t * s, fvec_t * read_data, 497 479 uint_t * read) { 498 uint_t i ;480 uint_t i, j; 499 481 uint_t end = 0; 500 482 uint_t total_wrote = 0; 501 // switch from multi502 if (s->multi == 1) aubio_source_avcodec_reset_resampler(s, 0);503 483 while (total_wrote < s->hop_size) { 504 484 end = MIN(s->read_samples - s->read_index, s->hop_size - total_wrote); 505 485 for (i = 0; i < end; i++) { 506 read_data->data[i + total_wrote] = s->output[i + s->read_index]; 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; 507 492 } 508 493 total_wrote += end; … … 532 517 uint_t end = 0; 533 518 uint_t total_wrote = 0; 534 // switch from mono535 if (s->multi == 0) aubio_source_avcodec_reset_resampler(s, 1);536 519 while (total_wrote < s->hop_size) { 537 520 end = MIN(s->read_samples - s->read_index, s->hop_size - total_wrote); -
src/mathutils.c
r088760e rc03d191 388 388 } 389 389 390 void 391 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 390 399 void fvec_adapt_thres(fvec_t * vec, fvec_t * tmp, 391 400 uint_t post, uint_t pre) { -
src/mathutils.h
r088760e rc03d191 193 193 */ 194 194 void fvec_add (fvec_t * v, smpl_t c); 195 196 /** multiply each elements of a vector by a scalar 197 198 \param v vector to add constant to 199 \param s constant to scale v with 200 201 */ 202 void fvec_mul (fvec_t * v, smpl_t s); 195 203 196 204 /** remove the minimum value of the vector to each elements -
src/musicutils.h
r088760e rc03d191 87 87 smpl_t aubio_freqtobin (smpl_t freq, smpl_t samplerate, smpl_t fftsize); 88 88 89 /** convert frequency (Hz) to mel 90 91 \param freq input frequency, in Hz 92 93 \return output mel 94 95 Converts a scalar from the frequency domain to the mel scale using Slaney 96 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 also 105 -------- 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 mel 115 116 \return output frequency, in Hz 117 118 Converts a scalar from the mel scale to the frequency domain using Slaney 119 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 also 127 -------- 128 129 aubio_hztomel(), aubio_meltohz_htk(). 130 131 References 132 ---------- 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 mel 141 142 \param freq input frequency, in Hz 143 144 \return output mel 145 146 Converts a scalar from the frequency domain to the mel scale, using the 147 equation defined by O'Shaughnessy, as implemented in the HTK speech 148 recognition toolkit: 149 150 \f$ m = 1127 + ln(1 + \frac{f}{700}) \f$ 151 152 See also 153 -------- 154 155 aubio_meltohz_htk(), aubio_hztomel(). 156 157 References 158 ---------- 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 mel 171 172 \return output frequency, in Hz 173 174 Converts a scalar from the mel scale to the frequency domain, using the 175 equation defined by O'Shaughnessy, as implemented in the HTK speech 176 recognition toolkit: 177 178 \f$ f = 700 * {e}^\left(\frac{f}{1127} - 1\right) \f$ 179 180 See also 181 -------- 182 183 aubio_hztomel_htk(), aubio_meltohz(). 184 185 */ 186 smpl_t aubio_meltohz_htk (smpl_t mel); 187 89 188 /** convert frequency (Hz) to midi value (0-128) */ 90 189 smpl_t aubio_freqtomidi (smpl_t freq); -
src/spectral/fft.c
r088760e rc03d191 90 90 #define aubio_vDSP_vsadd vDSP_vsadd 91 91 #define aubio_vDSP_vsmul vDSP_vsmul 92 #define aubio_vDSP_create_fftsetup vDSP_create_fftsetup93 #define aubio_vDSP_destroy_fftsetup vDSP_destroy_fftsetup94 92 #define aubio_DSPComplex DSPComplex 95 93 #define aubio_DSPSplitComplex DSPSplitComplex 96 #define aubio_FFTSetup FFTSetup 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 97 98 #define aubio_vvsqrt vvsqrtf 98 99 #else … … 104 105 #define aubio_vDSP_vsadd vDSP_vsaddD 105 106 #define aubio_vDSP_vsmul vDSP_vsmulD 106 #define aubio_vDSP_create_fftsetup vDSP_create_fftsetupD107 #define aubio_vDSP_destroy_fftsetup vDSP_destroy_fftsetupD108 107 #define aubio_DSPComplex DSPDoubleComplex 109 108 #define aubio_DSPSplitComplex DSPDoubleSplitComplex 110 #define aubio_FFTSetup FFTSetupD 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 111 113 #define aubio_vvsqrt vvsqrt 112 114 #endif /* HAVE_AUBIO_DOUBLE */ … … 153 155 154 156 #elif defined HAVE_ACCELERATE // using ACCELERATE 155 int log2fftsize;156 aubio_ FFTSetup fftSetup;157 aubio_vDSP_DFT_Setup fftSetupFwd; 158 aubio_vDSP_DFT_Setup fftSetupBwd; 157 159 aubio_DSPSplitComplex spec; 158 160 smpl_t *in, *out; … … 211 213 212 214 #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 } 213 230 s->winsize = winsize; 214 231 s->fft_size = winsize; 215 232 s->compspec = new_fvec(winsize); 216 s->log2fftsize = aubio_power_of_two_order(s->fft_size);217 233 s->in = AUBIO_ARRAY(smpl_t, s->fft_size); 218 234 s->out = AUBIO_ARRAY(smpl_t, s->fft_size); 219 235 s->spec.realp = AUBIO_ARRAY(smpl_t, s->fft_size/2); 220 236 s->spec.imagp = AUBIO_ARRAY(smpl_t, s->fft_size/2); 221 s->fftSetup = aubio_vDSP_create_fftsetup(s->log2fftsize, FFT_RADIX2); 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); 222 241 223 242 #elif defined HAVE_INTEL_IPP // using Intel IPP … … 293 312 AUBIO_FREE(s->spec.realp); 294 313 AUBIO_FREE(s->spec.imagp); 295 aubio_vDSP_destroy_fftsetup(s->fftSetup); 314 aubio_vDSP_DFT_DestroySetup(s->fftSetupBwd); 315 aubio_vDSP_DFT_DestroySetup(s->fftSetupFwd); 296 316 297 317 #elif defined HAVE_INTEL_IPP // using Intel IPP … … 351 371 aubio_vDSP_ctoz((aubio_DSPComplex*)s->in, 2, &s->spec, 1, s->fft_size/2); 352 372 // compute the FFT 353 aubio_vDSP_fft_zrip(s->fftSetup, &s->spec, 1, s->log2fftsize, FFT_FORWARD); 373 aubio_vDSP_DFT_Execute(s->fftSetupFwd, s->spec.realp, s->spec.imagp, 374 s->spec.realp, s->spec.imagp); 354 375 // convert from vDSP complex split to [ r0, r1, ..., rN, iN-1, .., i2, i1] 355 376 compspec->data[0] = s->spec.realp[0]; … … 419 440 aubio_vDSP_ctoz((aubio_DSPComplex*)s->out, 2, &s->spec, 1, s->fft_size/2); 420 441 // compute the FFT 421 aubio_vDSP_fft_zrip(s->fftSetup, &s->spec, 1, s->log2fftsize, FFT_INVERSE); 442 aubio_vDSP_DFT_Execute(s->fftSetupBwd, s->spec.realp, s->spec.imagp, 443 s->spec.realp, s->spec.imagp); 422 444 // convert result to real output 423 445 aubio_vDSP_ztoc(&s->spec, 1, (aubio_DSPComplex*)output->data, 2, s->fft_size/2); … … 494 516 } 495 517 #endif 496 if (compspec->data[compspec->length/2] < 0) { 497 spectrum->phas[spectrum->length - 1] = PI; 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 498 528 } else { 499 spectrum->phas[spectrum->length - 1] = 0.; 500 } 529 i = spectrum->length - 1; 530 spectrum->phas[i] = ATAN2(compspec->data[compspec->length-i], 531 compspec->data[i]); 532 } 533 #endif 501 534 } 502 535 … … 508 541 + SQR(compspec->data[compspec->length - i]) ); 509 542 } 510 spectrum->norm[spectrum->length-1] = 511 ABS(compspec->data[compspec->length/2]); 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 512 556 } 513 557 -
src/spectral/filterbank.c
r088760e rc03d191 24 24 #include "fmat.h" 25 25 #include "cvec.h" 26 #include "vecutils.h" 26 27 #include "spectral/filterbank.h" 27 28 #include "mathutils.h" … … 33 34 uint_t n_filters; 34 35 fmat_t *filters; 36 smpl_t norm; 37 smpl_t power; 35 38 }; 36 39 … … 45 48 /* allocate filter tables, a matrix of length win_s and of height n_filters */ 46 49 fb->filters = new_fmat (n_filters, win_s / 2 + 1); 50 51 fb->norm = 1; 52 53 fb->power = 1; 47 54 48 55 return fb; … … 68 75 tmp.data = in->norm; 69 76 77 if (f->power != 1.) fvec_pow(&tmp, f->power); 78 70 79 fmat_vecmul(f->filters, &tmp, out); 71 80 … … 85 94 return 0; 86 95 } 96 97 uint_t 98 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_t 106 aubio_filterbank_get_norm (aubio_filterbank_t *f) 107 { 108 return f->norm; 109 } 110 111 uint_t 112 aubio_filterbank_set_power (aubio_filterbank_t *f, smpl_t power) 113 { 114 f->power = power; 115 return AUBIO_OK; 116 } 117 118 smpl_t 119 aubio_filterbank_get_power (aubio_filterbank_t *f) 120 { 121 return f->norm; 122 } -
src/spectral/filterbank.h
r088760e rc03d191 84 84 uint_t aubio_filterbank_set_coeffs (aubio_filterbank_t * f, const fmat_t * filters); 85 85 86 /** set norm parameter 87 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 of 95 aubio_filterbank_set_triangle_bands(), aubio_filterbank_set_mel_coeffs(), 96 aubio_filterbank_set_mel_coeffs_htk(), or 97 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 parameter 103 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 parameter 111 112 \param f filterbank object, as returned by new_aubio_filterbank() 113 \param power Raise norm of the input spectrum norm to this power before 114 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 parameter 120 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 86 127 #ifdef __cplusplus 87 128 } -
src/spectral/filterbank_mel.c
r088760e rc03d191 55 55 } 56 56 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]); 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 } 60 72 } 61 73 … … 79 91 80 92 /* compute triangle heights so that each triangle has unit area */ 81 for (fn = 0; fn < n_filters; fn++) { 82 triangle_heights->data[fn] = 83 2. / (upper_freqs->data[fn] - lower_freqs->data[fn]); 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); 84 100 } 85 101 … … 92 108 /* zeroing of all filters */ 93 109 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 }105 110 106 111 /* building each filter table */ … … 117 122 118 123 /* compute positive slope step size */ 119 riseInc = 120 triangle_heights->data[fn] / 121 (center_freqs->data[fn] - lower_freqs->data[fn]); 124 riseInc = triangle_heights->data[fn] 125 / (center_freqs->data[fn] - lower_freqs->data[fn]); 122 126 123 127 /* compute coefficients in positive slope */ … … 133 137 134 138 /* compute negative slope step size */ 135 downInc = 136 triangle_heights->data[fn] / 137 (upper_freqs->data[fn] - center_freqs->data[fn]); 139 downInc = triangle_heights->data[fn] 140 / (upper_freqs->data[fn] - center_freqs->data[fn]); 138 141 139 142 /* compute coefficents in negative slope */ … … 161 164 del_fvec (fft_freqs); 162 165 163 return 0;166 return AUBIO_OK; 164 167 } 165 168 … … 168 171 smpl_t samplerate) 169 172 { 170 uint_t retval;171 172 173 /* Malcolm Slaney parameters */ 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 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; 183 183 smpl_t lastlinearCF; 184 184 185 185 /* buffers to compute filter frequencies */ 186 fvec_t *freqs = new_fvec (n_filters + 2); 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); 187 194 188 195 /* first step: fill all the linear filter frequencies */ … … 206 213 return retval; 207 214 } 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_t 237 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_t 269 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
r088760e rc03d191 56 56 57 57 \param fb filterbank object 58 \param samplerate audio sampling rate 58 \param samplerate audio sampling rate, in Hz 59 59 60 The filter coefficients are built according toMalcolm Slaney's Auditory61 Toolbox , available online at the following address (see file mfcc.m):60 The filter coefficients are built to match exactly Malcolm Slaney's Auditory 61 Toolbox implementation (see file mfcc.m). The number of filters should be 40. 62 62 63 References 64 ---------- 65 66 Malcolm Slaney, *Auditory Toolbox Version 2, Technical Report #1998-010* 63 67 https://engineering.purdue.edu/~malcolm/interval/1998-010/ 64 68 … … 67 71 smpl_t samplerate); 68 72 73 /** Mel filterbank initialization 74 75 \param fb filterbank object 76 \param samplerate audio sampling rate 77 \param fmin start frequency, in Hz 78 \param fmax end frequency, in Hz 79 80 The filterbank will be initialized with bands linearly spaced in the mel 81 scale, from `fmin` to `fmax`. 82 83 References 84 ---------- 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 initialization 94 95 \param fb filterbank object 96 \param samplerate audio sampling rate 97 \param fmin start frequency, in Hz 98 \param fmax end frequency, in Hz 99 100 The bank of filters will be initalized to to cover linearly spaced bands in 101 the Htk mel scale, from `fmin` to `fmax`. 102 103 References 104 ---------- 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 69 115 #ifdef __cplusplus 70 116 } -
src/spectral/mfcc.c
r088760e rc03d191 52 52 fvec_t *output; 53 53 #endif 54 smpl_t scale; 54 55 }; 55 56 … … 75 76 /* filterbank allocation */ 76 77 mfcc->fb = new_aubio_filterbank (n_filters, mfcc->win_s); 77 aubio_filterbank_set_mel_coeffs_slaney (mfcc->fb, samplerate); 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.); 78 83 79 84 /* allocating buffers */ … … 97 102 mfcc->output = new_fvec (n_filters); 98 103 #endif 104 105 mfcc->scale = 1.; 99 106 100 107 return mfcc; … … 128 135 fvec_t tmp; 129 136 #endif 137 130 138 /* compute filterbank */ 131 139 aubio_filterbank_do (mf->fb, in, mf->in_dct); … … 134 142 fvec_log10 (mf->in_dct); 135 143 136 /* raise power */ 137 //fvec_pow (mf->in_dct, 3.); 144 if (mf->scale != 1) fvec_mul (mf->in_dct, mf->scale); 138 145 139 146 /* compute mfccs */ … … 151 158 return; 152 159 } 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
r088760e rc03d191 74 74 void aubio_mfcc_do (aubio_mfcc_t * mf, const cvec_t * in, fvec_t * out); 75 75 76 /** set power parameter 77 78 \param mf mfcc object, as returned by new_aubio_mfcc() 79 \param power Raise norm of the input spectrum norm to this power before 80 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 parameter 88 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 parameter 98 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 before 103 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 parameter 109 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 initialization 117 118 \param mf mfcc object 119 \param fmin start frequency, in Hz 120 \param fmax end frequency, in Hz 121 122 The filterbank will be initialized with bands linearly spaced in the mel 123 scale, from `fmin` to `fmax`. 124 125 See also 126 -------- 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 initialization 135 136 \param mf mfcc object 137 \param fmin start frequency, in Hz 138 \param fmax end frequency, in Hz 139 140 The bank of filters will be initalized to to cover linearly spaced bands in 141 the Htk mel scale, from `fmin` to `fmax`. 142 143 See also 144 -------- 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 object 155 \param samplerate audio sampling rate, in Hz 156 157 The filter coefficients are built to match exactly Malcolm Slaney's Auditory 158 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 also 163 -------- 164 165 aubio_filterbank_set_mel_coeffs_slaney() 166 167 */ 168 uint_t aubio_mfcc_set_mel_coeffs_slaney (aubio_mfcc_t *mf); 169 76 170 #ifdef __cplusplus 77 171 } -
tests/src/spectral/test-filterbank.c
r088760e rc03d191 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 } 13 22 14 23 // apply filterbank ten times -
tests/src/temporal/test-filter.c
r088760e rc03d191 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 11 24 in->data[impulse_at] = 0.5; 12 25 fvec_print (in); … … 16 29 17 30 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 18 37 in->data[impulse_at] = 0.5; 19 38 fvec_print (in); -
wscript
r088760e rc03d191 43 43 choices = ('debug', 'release'), 44 44 dest = 'build_type', 45 help = 'whether to compile with (--build-type=release) or without (--build-type=debug) '\ 46 ' compiler opimizations [default: release]') 45 help = 'whether to compile with (--build-type=release)' \ 46 ' or without (--build-type=debug)' \ 47 ' compiler opimizations [default: release]') 47 48 add_option_enable_disable(ctx, 'fftw3f', default = False, 48 49 help_str = 'compile with fftw3f instead of ooura (recommended)', … … 110 111 111 112 ctx.add_option('--with-target-platform', type='string', 112 help='set target platform for cross-compilation', dest='target_platform') 113 help='set target platform for cross-compilation', 114 dest='target_platform') 113 115 114 116 ctx.load('compiler_c') … … 206 208 ctx.msg('Checking for AudioToolbox.framework', 'yes') 207 209 else: 208 ctx.msg('Checking for AudioToolbox.framework', 'no (disabled)', color = 'YELLOW') 210 ctx.msg('Checking for AudioToolbox.framework', 'no (disabled)', 211 color = 'YELLOW') 209 212 if (ctx.options.enable_accelerate != False): 210 213 ctx.define('HAVE_ACCELERATE', 1) … … 212 215 ctx.msg('Checking for Accelerate framework', 'yes') 213 216 else: 214 ctx.msg('Checking for Accelerate framework', 'no (disabled)', color = 'YELLOW') 217 ctx.msg('Checking for Accelerate framework', 'no (disabled)', 218 color = 'YELLOW') 215 219 216 220 if target_platform in [ 'ios', 'iosimulator' ]: … … 266 270 # tell emscripten functions we want to expose 267 271 from python.lib.gen_external import get_c_declarations, \ 268 get_cpp_objects_from_c_declarations, get_all_func_names_from_lib, \ 272 get_cpp_objects_from_c_declarations, \ 273 get_all_func_names_from_lib, \ 269 274 generate_lib_from_c_declarations 270 c_decls = get_c_declarations(usedouble=False) # emscripten can't use double 275 # emscripten can't use double 276 c_decls = get_c_declarations(usedouble=False) 271 277 objects = list(get_cpp_objects_from_c_declarations(c_decls)) 272 278 # ensure that aubio structs are exported … … 275 281 exported_funcnames = get_all_func_names_from_lib(lib) 276 282 c_mangled_names = ['_' + s for s in exported_funcnames] 277 ctx.env.LINKFLAGS_cshlib += ['-s', 'EXPORTED_FUNCTIONS=%s' % c_mangled_names] 283 ctx.env.LINKFLAGS_cshlib += ['-s', 284 'EXPORTED_FUNCTIONS=%s' % c_mangled_names] 278 285 279 286 # check support for C99 __VA_ARGS__ macros … … 305 312 # check for Intel IPP 306 313 if (ctx.options.enable_intelipp != False): 307 has_ipp_headers = ctx.check(header_name=['ippcore.h', 'ippvm.h', 'ipps.h'],308 314 has_ipp_headers = ctx.check(header_name=['ippcore.h', 'ippvm.h', 315 'ipps.h'], mandatory = False) 309 316 has_ipp_libs = ctx.check(lib=['ippcore', 'ippvm', 'ipps'], 310 317 uselib_store='INTEL_IPP', mandatory = False) … … 313 320 ctx.define('HAVE_INTEL_IPP', 1) 314 321 if ctx.env.CC_NAME == 'msvc': 315 # force linking multi-threaded static IPP libraries on Windows with msvc 322 # force linking multi-threaded static IPP libraries on Windows 323 # with msvc 316 324 ctx.define('_IPP_SEQUENTIAL_STATIC', 1) 317 325 else: … … 362 370 if (ctx.options.enable_double): 363 371 if (ctx.options.enable_samplerate): 364 ctx.fatal("Could not compile aubio in double precision mode with libsamplerate") 372 ctx.fatal("Could not compile aubio in double precision mode' \ 373 ' with libsamplerate") 365 374 else: 366 375 ctx.options.enable_samplerate = False 367 ctx.msg('Checking if using samplerate', 'no (disabled in double precision mode)',368 color = 'YELLOW')376 ctx.msg('Checking if using samplerate', 377 'no (disabled in double precision mode)', color = 'YELLOW') 369 378 if (ctx.options.enable_samplerate != False): 370 379 ctx.check_cfg(package = 'samplerate', … … 409 418 elif 'HAVE_AVUTIL' not in ctx.env: 410 419 ctx.msg(msg_check, 'not found (missing avutil)', color = 'YELLOW') 411 elif 'HAVE_SWRESAMPLE' not in ctx.env and 'HAVE_AVRESAMPLE' not in ctx.env: 420 elif 'HAVE_SWRESAMPLE' not in ctx.env \ 421 and 'HAVE_AVRESAMPLE' not in ctx.env: 412 422 resample_missing = 'not found (avresample or swresample required)' 413 423 ctx.msg(msg_check, resample_missing, color = 'YELLOW') … … 422 432 if (ctx.options.enable_wavread != False): 423 433 ctx.define('HAVE_WAVREAD', 1) 424 ctx.msg('Checking if using source_wavread', ctx.options.enable_wavread and 'yes' or 'no') 434 ctx.msg('Checking if using source_wavread', 435 ctx.options.enable_wavread and 'yes' or 'no') 425 436 if (ctx.options.enable_wavwrite!= False): 426 437 ctx.define('HAVE_WAVWRITE', 1) 427 ctx.msg('Checking if using sink_wavwrite', ctx.options.enable_wavwrite and 'yes' or 'no') 438 ctx.msg('Checking if using sink_wavwrite', 439 ctx.options.enable_wavwrite and 'yes' or 'no') 428 440 429 441 # use BLAS/ATLAS … … 543 555 544 556 def sphinx(bld): 545 # build documentation from source files using sphinx-build 546 # note: build in../doc/_build/html, otherwise waf wont install unsigned files557 # build documentation from source files using sphinx-build note: build in 558 # ../doc/_build/html, otherwise waf wont install unsigned files 547 559 if bld.env['SPHINX']: 548 560 bld.env.VERSION = VERSION 549 561 bld( name = 'sphinx', 550 rule = '${SPHINX} -b html -D release=${VERSION} -D version=${VERSION} -a -q `dirname ${SRC}` `dirname ${TGT}`', 562 rule = '${SPHINX} -b html -D release=${VERSION}' \ 563 ' -D version=${VERSION} -a -q' \ 564 ' `dirname ${SRC}` `dirname ${TGT}`', 551 565 source = 'doc/conf.py', 552 566 target = '../doc/_build/html/index.html') … … 578 592 from waflib import Logs 579 593 if bld.options.target_platform in ['ios', 'iosimulator']: 580 msg ='building for %s, contact the author for a commercial license' % bld.options.target_platform 594 msg ='building for %s, contact the author for a commercial license' \ 595 % bld.options.target_platform 581 596 Logs.pprint('RED', msg) 582 597 msg =' Paul Brossier <piem@aubio.org>' … … 584 599 585 600 def dist(ctx): 586 ctx.excl = ' **/.waf* **/*~ **/*.pyc **/*.swp **/*.swo **/*.swn **/.lock-w* **/.git*' 601 ctx.excl = ' **/.waf*' 602 ctx.excl += ' **/.git*' 603 ctx.excl += ' **/*~ **/*.pyc **/*.swp **/*.swo **/*.swn **/.lock-w*' 587 604 ctx.excl += ' **/build/*' 588 605 ctx.excl += ' doc/_build' … … 592 609 ctx.excl += ' **/python/lib/aubio/_aubio.so' 593 610 ctx.excl += ' **.egg-info' 611 ctx.excl += ' **/.eggs' 612 ctx.excl += ' **/.pytest_cache' 613 ctx.excl += ' **/.cache' 594 614 ctx.excl += ' **/**.zip **/**.tar.bz2' 595 615 ctx.excl += ' **.tar.bz2'
Note: See TracChangeset
for help on using the changeset viewer.