Changes in / [088760e:45c2c5c]
- Files:
-
- 1 added
- 7 deleted
- 57 edited
Legend:
- Unmodified
- Added
- Removed
-
.appveyor.yml
r088760e r45c2c5c 4 4 environment: 5 5 6 global:7 CUSTOM64PATH: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin8 9 6 matrix: 10 7 11 8 # pre-installed python version, see: 12 9 # http://www.appveyor.com/docs/installed-software#python 13 - PYTHONDIR: C:\Python2714 PYTHON_VERSION: 2.7.x15 PYTHON_ARCH: 3210 - PYTHONDIR: "C:\\Python27" 11 PYTHON_VERSION: "2.7.x" 12 PYTHON_ARCH: "32" 16 13 17 - PYTHONDIR: C:\Python27-x6418 PYTHON_VERSION: 2.7.x19 PYTHON_ARCH: 6414 - PYTHONDIR: "C:\\Python27-x64" 15 PYTHON_VERSION: "2.7.x" 16 PYTHON_ARCH: "64" 20 17 21 - PYTHONDIR: C:\Python3522 PYTHON_VERSION: 3.5.x23 PYTHON_ARCH: 3218 - PYTHONDIR: "C:\\Python34" 19 PYTHON_VERSION: "3.4.x" 20 PYTHON_ARCH: "32" 24 21 25 - PYTHONDIR: C:\Python35-x6426 PYTHON_VERSION: 3.5.x27 PYTHON_ARCH: 6422 - PYTHONDIR: "C:\\Python34-x64" 23 PYTHON_VERSION: "3.4.x" 24 PYTHON_ARCH: "64" 28 25 29 - PYTHONDIR: C:\Python3630 PYTHON_VERSION: 3.6.x31 PYTHON_ARCH: 3226 - PYTHONDIR: "C:\\Python35" 27 PYTHON_VERSION: "3.5.x" 28 PYTHON_ARCH: "32" 32 29 33 - PYTHONDIR: C:\Python36-x64 34 PYTHON_VERSION: 3.6.x 35 PYTHON_ARCH: 64 36 37 - PYTHONDIR: C:\Python37 38 PYTHON_VERSION: 3.7.x 39 PYTHON_ARCH: 32 40 41 - PYTHONDIR: C:\Python37-x64 42 PYTHON_VERSION: 3.7.x 43 PYTHON_ARCH: 64 30 - PYTHONDIR: "C:\\Python35-x64" 31 PYTHON_VERSION: "3.5.x" 32 PYTHON_ARCH: "64" 33 # add path required to run preprocessor step 34 PATH_EXTRAS: "c:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin" 44 35 45 36 install: … … 48 39 - ps: "ls \"C:/Program Files/Microsoft SDKs/Windows\"" 49 40 50 - "SET PATH=%PYTHONDIR%;%PYTHONDIR%\\Scripts;%PATH%" 41 # Check that we have the expected version and architecture for Python 42 - "%PYTHONDIR%\\python.exe --version" 43 - "%PYTHONDIR%\\python.exe -c \"import struct; print(struct.calcsize('P') * 8)\"" 51 44 52 - if [%PYTHON_ARCH%]==[64] SET PATH=%CUSTOM64PATH%;%PATH% 53 54 # Check that we have the expected version and architecture for Python 55 - "python --version" 56 - "python -c \"import struct; print(struct.calcsize('P') * 8)\"" 57 58 - "python -m pip install --disable-pip-version-check --user --upgrade pip" 59 - "python -m pip install --upgrade setuptools" 45 - "%PYTHONDIR%\\python.exe -m pip install --disable-pip-version-check --user --upgrade pip" 46 - "%PYTHONDIR%\\python.exe -m pip install --upgrade setuptools" 60 47 61 48 # We need wheel installed to build wheels 62 - " python-m pip install wheel"49 - "%PYTHONDIR%\\python.exe -m pip install wheel" 63 50 64 - " pip install -r requirements.txt"51 - "SET PATH=%PATH_EXTRAS%;%PYTHONDIR%;%PYTHONDIR%\\Scripts;%PATH%" 65 52 66 53 before_build: … … 68 55 69 56 build_script: 70 # also build libaubio with waf71 - python waf configure build install --verbose --msvc_version="msvc 14.0"72 # clean before building python package73 - python waf distclean74 57 # build python module without using libaubio 75 - pip wheel -v -v -v --wheel-dir=dist . 76 # build, upload and install wheel (inspired by numpy's appveyor) 77 - ps: | 78 pip wheel -v -v -v --wheel-dir=dist . 79 ls dist -r | Foreach-Object { 80 Push-AppveyorArtifact $_.FullName 81 pip install $_.FullName 82 } 83 84 test_script: 58 - "%PYTHONDIR%\\python.exe -m pip install -r requirements.txt" 59 - "python setup.py build" 60 - "%PYTHONDIR%\\python.exe -m pip install ." 85 61 - "python python\\demos\\demo_create_test_sounds.py" 86 62 - "nose2 --verbose" 63 # clean up 64 - "python waf distclean" 65 # build libaubio 66 - python waf configure build --verbose --msvc_version="msvc 14.0" -
.gitignore
r088760e r45c2c5c 44 44 aubio-*.zip 45 45 dist/*.tar.gz 46 dist/*.whl47 46 48 47 # test sounds -
ChangeLog
r088760e r45c2c5c 1 2018-09-22 Paul Brossier <piem@aubio.org>2 3 [ Overview ]4 5 * VERSION: bump to 0.4.76 * src/spectral/dct.h: add dct type II object with optimised versions7 * src/io/, src/notes/, src/pitch: prevent crashes on corrupted files8 * examples/: fix jack midi output, improve messages when jack disabled9 * python/: add dct support, minor bug fixes tests and demos10 * wscript: improve support for BLAS/ATLAS11 12 [ Library fixes ]13 14 * src/pitch/pitchyinfft.c: fix out of bound read when samplerate > 50kHz15 thanks to @fCorleone (closes #189, CVE-2018-14523, debian #904906)16 * src/notes/notes.c: bail out if pitch creation failed (see #188)17 * src/io/source_wavread.c:18 - also exit if samplerate is negative (closes #188, CVE-2018-14522,19 debian #904907)20 - add some input validation (closes #148 and #158, CVE-2017-17054,21 debian #883355)22 * src/io/source_avcodec.c:23 - give up if resampling context failed opening (see #137, closes #187,24 CVE-2018-14521, debian #904908)25 - give up reading file if number of channel changes during stream (closes26 #137, CVE-2017-17554, debian #884237)27 - make sure libavutil > 52 before checking avFrame->channels (see #137)28 - fix build with ffmpeg 4.0, thanks to @jcowgill (closes #168, #173)29 - avoid deprecated call for ffmpeg >= 4.030 * src/onset/onset.c: add dummy default parameters for wphase (closes #150)31 32 [ Tools ]33 34 * examples/parse_args.h: hide jack options if not available, improve error35 message (closes #182)36 * examples/utils.h: process_block returns void37 * examples/utils.c: fix examples failing to send more than one JACK midi38 event per frame, thanks to @cyclopsian (closes #201)39 40 [ New features ]41 42 * src/spectral/dct.h: add dct type II object with implementation factory43 * src/spectral/dct_plain.c: add plain dct implementation44 * src/spectral/dct_ooura.c: add ooura implementation45 * src/spectral/dct_fftw.c: add fftw implementation46 * src/spectral/dct_ipp.c: add ipp version47 * src/spectral/dct_accelerate.c: add vdsp/accelerate dct48 * tests/src/spectral/test-dct.c: check reconstruction works49 * src/spectral/mfcc.c: use new dct to compute mfcc50 51 [ Library internals ]52 53 * src/aubio_priv.h: avoid hard-coded undefs, split BLAS and ATLAS support,54 add vdsp scalar add and multiply55 56 [ Build system ]57 58 * wscript:59 - add options to disable examples and tests60 - detect includes for openblas/libblas/atlas61 * scripts/get_waf.sh: bump to 2.0.11, verify signature if gpg available62 * python/lib/gen_external.py: pass '-x c' to emcc only63 64 [ Python ]65 66 * python/lib/gen_code.py: add support for rdo methods67 * python/tests/test_dct.py: add tests for new dct68 * python/demos/demo_pitch_sinusoid.py: use // to yield an integer, fixing69 demo on py3, thanks to @ancorcruz (closes #176)70 * python/ext/py-musicutils.*: add shift(fvec) and ishift(fvec)71 * python/tests/test_fvec_shift.py: add tests for shift() and ishift()72 * python/lib/aubio/cmd.py: fix typo in comment73 74 [ Documentation ]75 76 * README.md, doc/statuslinks.rst: use latest for commits-since77 * examples/parse_args.h: add yinfast to pitch algorithms78 * doc/requirements.rst: add some blas documentation79 * doc/requirements.rst: split media/optimisation libraries80 * doc/develop.rst: fixed spelling error, thanks to Jon Williams (closes #161)81 * doc/aubio{pitch,notes}.txt: add yinfast to list of pitch methods82 83 [ Continuous integration ]84 85 * .travis.yml: remove xcode8.2 builds, group osx, add alias pip=pip286 * .appveyor.yml: upgrade pip first, always use python -m pip87 88 1 2017-10-02 Paul Brossier <piem@aubio.org> 89 2 -
VERSION
r088760e r45c2c5c 1 1 AUBIO_MAJOR_VERSION=0 2 2 AUBIO_MINOR_VERSION=4 3 AUBIO_PATCH_VERSION= 83 AUBIO_PATCH_VERSION=7 4 4 AUBIO_VERSION_STATUS='~alpha' 5 5 LIBAUBIO_LT_CUR=5 -
doc/about.rst
r088760e r45c2c5c 60 60 ------- 61 61 62 aubio is a `free <http s://www.debian.org/intro/free>`_ and `open source62 aubio is a `free <http://www.debian.org/intro/free>`_ and `open source 63 63 <http://www.opensource.org/docs/definition.php>`_ software; **you** can 64 64 redistribute it and/or modify it under the terms of the `GNU -
doc/aubio.txt
r088760e r45c2c5c 99 99 NOTES 100 100 101 The following additional options can be used with the "notes" subcommand. 102 103 -s <value>, --silence <value> silence threshold, in dB (default: -70) 104 105 -d <value>, --release-drop <value> release drop level, in dB. If the level 106 drops more than this amount since the last note started, the note will be 107 turned off (default: 10). 101 The "note" command accepts all common options and no additional options. 108 102 109 103 MFCC -
doc/aubiomfcc.txt
r088760e r45c2c5c 52 52 url: 53 53 54 http s://engineering.purdue.edu/~malcolm/interval/1998-010/ (see file mfcc.m)54 http://cobweb.ecn.purdue.edu/~malcolm/interval/1998-010/ (see file mfcc.m) 55 55 56 56 SEE ALSO -
doc/aubionotes.txt
r088760e r45c2c5c 7 7 aubionotes [[-i] source] 8 8 [-r rate] [-B win] [-H hop] 9 [-O method] [-t thres] [-d drop]9 [-O method] [-t thres] 10 10 [-p method] [-u unit] [-l thres] 11 11 [-T time-format] … … 69 69 loudest ones. A value of -90.0 would select all onsets. Defaults to -90.0. 70 70 71 -d, --release-drop Set the release drop threshold, in dB. If the level drops72 more than this amount since the last note started, the note will be turned73 off. Defaults to 10.74 75 71 -T, --timeformat format Set time format (samples, ms, seconds). Defaults to 76 72 seconds. … … 92 88 PITCH METHODS 93 89 94 Available methods: default, schmitt, fcomb, mcomb, specacf, yin, yinfft, 95 yinfast. 90 Available methods: default, schmitt, fcomb, mcomb, specacf, yin, yinfft. 96 91 97 92 See aubiopitch(1) for details about these methods. -
doc/aubiopitch.txt
r088760e r45c2c5c 121 121 University of London, London, UK, 2006. 122 122 123 yinfast YIN algorithm (accelerated)124 125 An optimised implementation of the YIN algorithm, yielding results identical126 to the original YIN algorithm, while reducing its computational cost from127 O(n^2) to O(n log(n)).128 129 123 SEE ALSO 130 124 -
doc/conf.py
r088760e r45c2c5c 30 30 # Add any Sphinx extension module names here, as strings. They can be extensions 31 31 # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. 32 extensions = ['sphinx.ext.viewcode', 'sphinx.ext.autodoc', 33 'sphinx.ext.napoleon', 'sphinx.ext.intersphinx'] 34 35 autodoc_member_order = 'groupwise' 36 37 intersphinx_mapping = { 38 'numpy': ('https://docs.scipy.org/doc/numpy/', None), 39 } 32 extensions = ['sphinx.ext.viewcode', 'sphinx.ext.autodoc'] 40 33 41 34 # Add any paths that contain templates here, relative to this directory. … … 53 46 # General information about the project. 54 47 project = u'aubio' 55 copyright = u'201 8, Paul Brossier'48 copyright = u'2016, Paul Brossier' 56 49 57 50 # The version info for the project you're documenting, acts as replacement for -
doc/debian_packages.rst
r088760e r45c2c5c 10 10 ``git-buildpackage`` to build from the git repository. For instance: 11 11 12 .. code-block:: console12 .. code-block:: bash 13 13 14 14 $ git clone git://anonscm.debian.org/collab-maint/aubio.git -
doc/index.rst
r088760e r45c2c5c 71 71 installing 72 72 python_module 73 python74 73 cli 75 74 develop -
doc/installing.rst
r088760e r45c2c5c 32 32 sudo ./waf install 33 33 34 - :ref:`install python-aubio from source <python -install>`::34 - :ref:`install python-aubio from source <python>`:: 35 35 36 36 # from git … … 46 46 pip install -v . 47 47 48 - :ref:`install python-aubio from a pre-compiled binary <python -install>`::48 - :ref:`install python-aubio from a pre-compiled binary <python>`:: 49 49 50 50 # conda [osx, linux, win] -
doc/python_module.rst
r088760e r45c2c5c 1 .. _python -install:1 .. _python: 2 2 3 Installing aubio for Python 4 ============= ==============3 Python module 4 ============= 5 5 6 6 The aubio extension for Python is available for Python 2.7 and Python 3. … … 11 11 aubio can now be installed using ``pip``: 12 12 13 .. code-block:: console13 .. code-block:: bash 14 14 15 15 $ pip install aubio … … 20 20 From ``aubio`` source directory, run the following: 21 21 22 .. code-block:: console22 .. code-block:: bash 23 23 24 24 $ ./setup.py clean … … 26 26 $ sudo ./setup.py install 27 27 28 Using aubio in python 29 --------------------- 28 30 29 .. _py-doubleprecision: 31 Once you have python-aubio installed, you should be able to run ``python -c 32 "import aubio; print(aubio.version)"``. 30 33 31 Double precision 32 ---------------- 34 A simple example 35 ................ 33 36 34 This module can be compiled in double-precision mode, in which case the 35 default type for floating-point samples will be 64-bit. The default is 36 single precision mode (32-bit, recommended). 37 Here is a :download:`simple script <../python/demos/demo_source_simple.py>` 38 that reads all the samples from a media file: 37 39 38 To build the aubio module with double precision, use the option 39 `--enable-double` of the `build_ext` subcommand: 40 .. literalinclude:: ../python/demos/demo_source_simple.py 41 :language: python 40 42 41 .. code:: bash 43 Filtering an input sound file 44 ............................. 42 45 43 $ ./setup.py clean 44 $ ./setup.py build_ext --enable-double 45 $ pip install -v . 46 Here is a more complete example, :download:`demo_filter.py 47 <../python/demos/demo_filter.py>`. This files executes the following: 46 48 47 **Note**: If linking against `libaubio`, make sure the library was also 48 compiled in :ref:`doubleprecision` mode. 49 * read an input media file (``aubio.source``) 49 50 51 * filter it using an `A-weighting <https://en.wikipedia.org/wiki/A-weighting>`_ 52 filter (``aubio.digital_filter``) 50 53 51 Checking your installation 52 -------------------------- 54 * write result to a new file (``aubio.sink``) 53 55 54 Once the python module is installed, its version can be checked with: 56 .. literalinclude:: ../python/demos/demo_filter.py 57 :language: python 55 58 56 .. code-block:: console 59 More demos 60 .......... 57 61 58 $ python -c "import aubio; print(aubio.version, aubio.float_type)" 59 60 The command line `aubio` is also installed: 61 62 .. code-block:: console 63 64 $ aubio -h 65 62 Check out the `python demos folder`_ for more examples. 66 63 67 64 Python tests … … 71 68 ``python/tests/run_all_tests``. 72 69 70 .. _python demos folder: https://github.com/aubio/aubio/blob/master/python/demos 73 71 .. _demo_filter.py: https://github.com/aubio/aubio/blob/master/python/demos/demo_filter.py 74 72 .. _python tests: https://github.com/aubio/aubio/blob/master/python/tests 73 -
doc/requirements.rst
r088760e r45c2c5c 31 31 If ``pkg-config`` is not found in ``PATH``, the configure step will 32 32 succeed, but none of the external libraries will be used. 33 34 Media libraries35 ---------------36 33 37 34 libav … … 82 79 configure with ``--disable-samplerate`` 83 80 84 Optimisation libraries85 ----------------------86 87 81 libfftw3 88 82 ........ … … 98 92 then fail if the required library is not found. To disable this option, 99 93 configure with ``--disable-fftw3`` 100 101 blas102 ....103 104 On macOs/iOS, `blas105 <https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms>`_ are made106 available through the Accelerate framework.107 108 On Linux, they can be enabled with ``--enable-blas``. On Debian (etch),109 `atlas`_, `openblas`_, and `libblas`_ have been successfully tested.110 111 When enabled, ``waf`` will check for the current blas configuration by running112 ``pkg-config --libs blas``. Depending of the library path returned by113 ``pkg-config``, different headers will be searched for.114 115 .. note::116 117 On Debian systems, `multiple versions of BLAS and LAPACK118 <https://wiki.debian.org/DebianScience/LinearAlgebraLibraries>`_ can be119 installed. To configure which libblas is being used:120 121 .. code-block:: console122 123 $ sudo update-alternatives --config libblas.so124 125 ..126 Expected pkg-config output for each alternative:127 /usr/lib/atlas-base/atlas/libblas.so128 -L/usr/lib/atlas-base/atlas -lblas129 /usr/lib/openblas-base/libblas.so130 -L/usr/lib/openblas-base -lblas131 /usr/lib/libblas/libblas.so132 -lblas133 134 atlas135 .....136 137 `ATLAS BLAS APIs <http://math-atlas.sourceforge.net/>`_ will be used the path138 returned by ``pkg-config --libs blas`` contains ``atlas``.139 140 ..141 ``<atlas/cblas.h>`` will be included.142 143 Example:144 145 .. code-block:: console146 147 $ pkg-config --libs blas148 -L/usr/lib/atlas-base/atlas -lblas149 $ ./waf configure --enable-atlas150 [...]151 Checking for 'blas' : yes152 Checking for header atlas/cblas.h : yes153 154 openblas155 ........156 157 `OpenBlas libraries <https://www.openblas.net/>`_ will be used when the output158 of ``pkg-config --libs blas`` contains 'openblas',159 160 ..161 ``<openblas/cblas.h>`` will be included.162 163 Example:164 165 .. code-block:: console166 167 $ pkg-config --libs blas168 -L/usr/lib/openblas-base -lblas169 $ ./waf configure --enable-atlas170 [...]171 Checking for 'blas' : yes172 Checking for header openblas/cblas.h : yes173 174 libblas175 .......176 177 `Netlib's libblas (LAPACK) <https://www.netlib.org/lapack/>`_ will be used if178 no specific library path is specified by ``pkg-config``179 180 ..181 ``<cblas.h>`` will be included.182 183 Example:184 185 .. code-block:: console186 187 $ pkg-config --libs blas188 -lblas189 $ ./waf configure --enable-atlas190 [...]191 Checking for 'blas' : yes192 Checking for header cblas.h : yes193 194 94 195 95 Platform notes … … 298 198 uninstall clean distclean dist distcheck 299 199 300 .. _doubleprecision:301 302 200 Double precision 303 201 ................ … … 305 203 To compile aubio in double precision mode, configure with ``--enable-double``. 306 204 307 To compile aubio in single precision mode, use ``--disable-double`` (default, 308 recommended). 205 To compile aubio in single precision mode, use ``--disable-double`` (default). 309 206 310 207 Disabling the tests -
examples/aubionotes.c
r088760e r45c2c5c 22 22 #define PROG_HAS_PITCH 1 23 23 #define PROG_HAS_ONSET 1 24 #define PROG_HAS_NOTES 125 24 #define PROG_HAS_SILENCE 1 26 25 #define PROG_HAS_JACK 1 … … 84 83 } 85 84 } 86 if (release_drop != 10.) {87 if (aubio_notes_set_release_drop (notes, release_drop) != 0) {88 errmsg ("failed setting notes release drop to %.2f\n",89 release_drop);90 }91 }92 85 93 86 examples_common_process((aubio_process_func_t)process_block, process_print); -
examples/parse_args.h
r088760e r45c2c5c 48 48 // more general stuff 49 49 extern smpl_t silence_threshold; 50 extern smpl_t release_drop;51 50 extern uint_t mix_input; 52 51 // midi tap … … 66 65 extern int blocks; 67 66 68 extern fvec_t *i nput_buffer;69 extern fvec_t *o utput_buffer;67 extern fvec_t *ibuf; 68 extern fvec_t *obuf; 70 69 71 70 const char *prog_name; … … 99 98 #ifdef PROG_HAS_PITCH 100 99 " -p --pitch select pitch detection algorithm\n" 101 " <default|yinfft|yin fast|yin|mcomb|fcomb|schmitt>; default=yinfft\n"100 " <default|yinfft|yin|mcomb|fcomb|schmitt>; default=yinfft\n" 102 101 " -u --pitch-unit select pitch output unit\n" 103 102 " <default|freq|hertz|Hz|midi|cent|bin>; default=freq\n" … … 109 108 " a value in dB, for instance -70, or -100; default=-90\n" 110 109 #endif /* PROG_HAS_SILENCE */ 111 #ifdef PROG_HAS_NOTES112 " -d --release-drop select release drop threshold\n"113 " a positive value in dB; default=10\n"114 #endif115 110 " -T --time-format select time values output format\n" 116 111 " (samples, ms, seconds) default=seconds\n" … … 163 158 "s:" 164 159 #endif /* PROG_HAS_SILENCE */ 165 #ifdef PROG_HAS_NOTES166 "d:"167 #endif /* PROG_HAS_SILENCE */168 160 #ifdef PROG_HAS_OUTPUT 169 161 "mf" … … 201 193 {"silence", 1, NULL, 's'}, 202 194 #endif /* PROG_HAS_SILENCE */ 203 #ifdef PROG_HAS_NOTES204 {"release-drop", 1, NULL, 'd'},205 #endif /* PROG_HAS_NOTES */206 195 {"time-format", 1, NULL, 'T'}, 207 196 #ifdef PROG_HAS_OUTPUT … … 212 201 }; 213 202 #endif /* HAVE_GETOPT_H */ 214 // better safe than sorry203 prog_name = argv[0]; 215 204 if (argc < 1) { 216 205 usage (stderr, 1); 217 }218 prog_name = argv[0];206 return -1; 207 } 219 208 #ifdef HAVE_GETOPT_H 220 209 do { … … 285 274 case 's': /* silence threshold */ 286 275 silence_threshold = (smpl_t) atof (optarg); 287 break;288 case 'd': /* release-drop threshold */289 release_drop = (smpl_t) atof (optarg);290 276 break; 291 277 case 'm': /* mix_input flag */ -
examples/utils.c
r088760e r45c2c5c 55 55 // more general stuff 56 56 smpl_t silence_threshold = -90.; 57 smpl_t release_drop = 10.;58 57 uint_t mix_input = 0; 59 58 … … 64 63 aubio_source_t *this_source = NULL; 65 64 aubio_sink_t *this_sink = NULL; 66 fvec_t *i nput_buffer;67 fvec_t *o utput_buffer;65 fvec_t *ibuf; 66 fvec_t *obuf; 68 67 69 68 smpl_t miditap_note = 69.; … … 77 76 78 77 #if HAVE_JACK 79 #define MAX_MIDI_EVENTS 12880 #define MAX_MIDI_EVENT_SIZE 381 78 aubio_jack_t *jack_setup; 82 79 jack_midi_event_t ev; 83 jack_midi_data_t midi_data[MAX_MIDI_EVENTS * MAX_MIDI_EVENT_SIZE];84 size_t midi_event_count = 0;85 80 #endif /* HAVE_JACK */ 86 81 … … 127 122 #endif /* HAVE_JACK */ 128 123 } 129 i nput_buffer= new_fvec (hop_size);130 o utput_buffer= new_fvec (hop_size);124 ibuf = new_fvec (hop_size); 125 obuf = new_fvec (hop_size); 131 126 132 127 } … … 134 129 void examples_common_del (void) 135 130 { 136 del_fvec (input_buffer); 137 del_fvec (output_buffer); 131 #ifdef HAVE_JACK 132 if (ev.buffer) free(ev.buffer); 133 #endif 134 del_fvec (ibuf); 135 del_fvec (obuf); 138 136 aubio_cleanup (); 139 137 fflush(stderr); … … 149 147 150 148 #ifdef HAVE_JACK 151 ev.size = MAX_MIDI_EVENT_SIZE; 149 ev.size = 3; 150 ev.buffer = malloc (3 * sizeof (jack_midi_data_t)); 152 151 ev.time = 0; // send it now 153 152 debug ("Jack activation ...\n"); … … 167 166 168 167 do { 169 aubio_source_do (this_source, i nput_buffer, &read);170 process_func (i nput_buffer, output_buffer);168 aubio_source_do (this_source, ibuf, &read); 169 process_func (ibuf, obuf); 171 170 // print to console if verbose or no output given 172 171 if (verbose || sink_uri == NULL) { … … 174 173 } 175 174 if (this_sink) { 176 aubio_sink_do (this_sink, o utput_buffer, hop_size);175 aubio_sink_do (this_sink, obuf, hop_size); 177 176 } 178 177 blocks++; … … 195 194 #ifdef HAVE_JACK 196 195 if (usejack) { 197 ev.buffer = midi_data + midi_event_count++ * MAX_MIDI_EVENT_SIZE;198 if (midi_event_count >= MAX_MIDI_EVENTS) {199 midi_event_count = 0;200 }201 196 ev.buffer[2] = velo; 202 197 ev.buffer[1] = pitch; -
python/demos/demo_bpm_extract.py
r088760e r45c2c5c 23 23 pass 24 24 else: 25 raise ValueError("unknown mode {:s}".format(params.mode))25 print("unknown mode {:s}".format(params.mode)) 26 26 # manual settings 27 27 if 'samplerate' in params: … … 70 70 parser.add_argument('-m', '--mode', 71 71 help="mode [default|fast|super-fast]", 72 dest="mode" , default='default')72 dest="mode") 73 73 parser.add_argument('sources', 74 nargs=' +',74 nargs='*', 75 75 help="input_files") 76 76 args = parser.parse_args() -
python/demos/demo_filter.py
r088760e r45c2c5c 1 1 #! /usr/bin/env python 2 2 3 import sys4 import os.path5 import aubio6 3 7 def apply_filter(path, target): 4 def apply_filter(path): 5 from aubio import source, sink, digital_filter 6 from os.path import basename, splitext 7 8 8 # open input file, get its samplerate 9 s = aubio.source(path)9 s = source(path) 10 10 samplerate = s.samplerate 11 11 12 12 # create an A-weighting filter 13 f = aubio.digital_filter(7)13 f = digital_filter(7) 14 14 f.set_a_weighting(samplerate) 15 # alternatively, apply another filter 15 16 16 17 # create output file 17 o = aubio.sink(target, samplerate)18 o = sink("filtered_" + splitext(basename(path))[0] + ".wav", samplerate) 18 19 19 20 total_frames = 0 20 21 while True: 21 # read from source22 22 samples, read = s() 23 # filter samples24 23 filtered_samples = f(samples) 25 # write to sink26 24 o(filtered_samples, read) 27 # count frames read28 25 total_frames += read 29 # end of file reached30 26 if read < s.hop_size: break 31 27 32 # print some info33 28 duration = total_frames / float(samplerate) 34 input_str = "input: {:s} ({:.2f} s, {:d} Hz)" 35 output_str = "output: {:s}, A-weighting filtered ({:d} frames total)" 36 print (input_str.format(s.uri, duration, samplerate)) 37 print (output_str.format(o.uri, total_frames)) 29 print ("read {:s}".format(s.uri)) 30 print ("applied A-weighting filtered ({:d} Hz)".format(samplerate)) 31 print ("wrote {:s} ({:.2f} s)".format(o.uri, duration)) 38 32 39 33 if __name__ == '__main__': 40 usage = "{:s} <input_file> [output_file]".format(sys.argv[0]) 41 if not 1 < len(sys.argv) < 4: 42 print (usage) 43 sys.exit(1) 44 if len(sys.argv) < 3: 45 input_path = sys.argv[1] 46 basename = os.path.splitext(os.path.basename(input_path))[0] + ".wav" 47 output_path = "filtered_" + basename 48 else: 49 input_path, output_path = sys.argv[1:] 50 # run function 51 apply_filter(input_path, output_path) 34 import sys 35 for f in sys.argv[1:]: 36 apply_filter(f) -
python/demos/demo_source_simple.py
r088760e r45c2c5c 1 1 #! /usr/bin/env python 2 import sys 3 import aubio 2 import sys, aubio 4 3 5 samplerate = 0 # use original source samplerate4 samplerate = 0 # use original source samplerate 6 5 hop_size = 256 # number of frames to read in one block 7 s rc= aubio.source(sys.argv[1], samplerate, hop_size)6 s = aubio.source(sys.argv[1], samplerate, hop_size) 8 7 total_frames = 0 9 8 10 while True: 11 samples, read = s rc() # read hop_size new samples from source12 total_frames += read # increment total number of frames9 while True: # reading loop 10 samples, read = s() 11 total_frames += read 13 12 if read < hop_size: break # end of file reached 14 13 15 14 fmt_string = "read {:d} frames at {:d}Hz from {:s}" 16 print (fmt_string.format(total_frames, src.samplerate, src.uri)) 15 print (fmt_string.format(total_frames, s.samplerate, sys.argv[1])) 16 -
python/ext/aubiomodule.c
r088760e r45c2c5c 11 11 12 12 static char Py_alpha_norm_doc[] = "" 13 "alpha_norm(vec, alpha)\n" 14 "\n" 15 "Compute `alpha` normalisation factor of vector `vec`.\n" 16 "\n" 17 "Parameters\n" 18 "----------\n" 19 "vec : fvec\n" 20 " input vector\n" 21 "alpha : float\n" 22 " norm factor\n" 23 "\n" 24 "Returns\n" 25 "-------\n" 26 "float\n" 27 " p-norm of the input vector, where `p=alpha`\n" 28 "\n" 29 "Example\n" 30 "-------\n" 31 "\n" 32 ">>> a = aubio.fvec(np.arange(10)); alpha = 2\n" 33 ">>> aubio.alpha_norm(a, alpha), (sum(a**alpha)/len(a))**(1./alpha)\n" 34 "(5.338539123535156, 5.338539126015656)\n" 35 "\n" 36 "Note\n" 37 "----\n" 38 "Computed as:\n" 39 "\n" 40 ".. math::\n" 41 " l_{\\alpha} = \n" 42 " \\|\\frac{\\sum_{n=0}^{N-1}{{x_n}^{\\alpha}}}{N}\\|^{1/\\alpha}\n" 43 ""; 13 "alpha_norm(fvec, integer) -> float\n" 14 "\n" 15 "Compute alpha normalisation factor on vector, given alpha\n" 16 "\n" 17 "Example\n" 18 "-------\n" 19 "\n" 20 ">>> b = alpha_norm(a, 9)"; 44 21 45 22 static char Py_bintomidi_doc[] = "" 46 "bintomidi(fftbin, samplerate, fftsize)\n" 47 "\n" 48 "Convert FFT bin to frequency in midi note, given the sampling rate\n" 49 "and the size of the FFT.\n" 50 "\n" 51 "Parameters\n" 52 "----------\n" 53 "fftbin : float\n" 54 " input frequency bin\n" 55 "samplerate : float\n" 56 " sampling rate of the signal\n" 57 "fftsize : float\n" 58 " size of the FFT\n" 59 "\n" 60 "Returns\n" 61 "-------\n" 62 "float\n" 63 " Frequency converted to midi note.\n" 64 "\n" 65 "Example\n" 66 "-------\n" 67 "\n" 68 ">>> aubio.bintomidi(10, 44100, 1024)\n" 69 "68.62871551513672\n" 70 ""; 23 "bintomidi(float, samplerate = integer, fftsize = integer) -> float\n" 24 "\n" 25 "Convert bin (float) to midi (float), given the sampling rate and the FFT size\n" 26 "\n" 27 "Example\n" 28 "-------\n" 29 "\n" 30 ">>> midi = bintomidi(float, samplerate = 44100, fftsize = 1024)"; 71 31 72 32 static char Py_miditobin_doc[] = "" 73 "miditobin(midi, samplerate, fftsize)\n" 74 "\n" 75 "Convert frequency in midi note to FFT bin, given the sampling rate\n" 76 "and the size of the FFT.\n" 77 "\n" 78 "Parameters\n" 79 "----------\n" 80 "midi : float\n" 81 " input frequency, in midi note\n" 82 "samplerate : float\n" 83 " sampling rate of the signal\n" 84 "fftsize : float\n" 85 " size of the FFT\n" 86 "\n" 87 "Returns\n" 88 "-------\n" 89 "float\n" 90 " Frequency converted to FFT bin.\n" 91 "\n" 92 "Examples\n" 93 "--------\n" 94 "\n" 95 ">>> aubio.miditobin(69, 44100, 1024)\n" 96 "10.216779708862305\n" 97 ">>> aubio.miditobin(75.08, 32000, 512)\n" 98 "10.002175331115723\n" 99 ""; 33 "miditobin(float, samplerate = integer, fftsize = integer) -> float\n" 34 "\n" 35 "Convert midi (float) to bin (float), given the sampling rate and the FFT size\n" 36 "\n" 37 "Example\n" 38 "-------\n" 39 "\n" 40 ">>> bin = miditobin(midi, samplerate = 44100, fftsize = 1024)"; 100 41 101 42 static char Py_bintofreq_doc[] = "" 102 "bintofreq(fftbin, samplerate, fftsize)\n" 103 "\n" 104 "Convert FFT bin to frequency in Hz, given the sampling rate\n" 105 "and the size of the FFT.\n" 106 "\n" 107 "Parameters\n" 108 "----------\n" 109 "fftbin : float\n" 110 " input frequency bin\n" 111 "samplerate : float\n" 112 " sampling rate of the signal\n" 113 "fftsize : float\n" 114 " size of the FFT\n" 115 "\n" 116 "Returns\n" 117 "-------\n" 118 "float\n" 119 " Frequency converted to Hz.\n" 120 "\n" 121 "Example\n" 122 "-------\n" 123 "\n" 124 ">>> aubio.bintofreq(10, 44100, 1024)\n" 125 "430.6640625\n" 126 ""; 43 "bintofreq(float, samplerate = integer, fftsize = integer) -> float\n" 44 "\n" 45 "Convert bin number (float) in frequency (Hz), given the sampling rate and the FFT size\n" 46 "\n" 47 "Example\n" 48 "-------\n" 49 "\n" 50 ">>> freq = bintofreq(bin, samplerate = 44100, fftsize = 1024)"; 127 51 128 52 static char Py_freqtobin_doc[] = "" 129 "freqtobin(freq, samplerate, fftsize)\n" 130 "\n" 131 "Convert frequency in Hz to FFT bin, given the sampling rate\n" 132 "and the size of the FFT.\n" 133 "\n" 134 "Parameters\n" 135 "----------\n" 136 "midi : float\n" 137 " input frequency, in midi note\n" 138 "samplerate : float\n" 139 " sampling rate of the signal\n" 140 "fftsize : float\n" 141 " size of the FFT\n" 142 "\n" 143 "Returns\n" 144 "-------\n" 145 "float\n" 146 " Frequency converted to FFT bin.\n" 147 "\n" 148 "Examples\n" 149 "--------\n" 150 "\n" 151 ">>> aubio.freqtobin(440, 44100, 1024)\n" 152 "10.216779708862305\n" 153 ""; 53 "freqtobin(float, samplerate = integer, fftsize = integer) -> float\n" 54 "\n" 55 "Convert frequency (Hz) in bin number (float), given the sampling rate and the FFT size\n" 56 "\n" 57 "Example\n" 58 "-------\n" 59 "\n" 60 ">>> bin = freqtobin(freq, samplerate = 44100, fftsize = 1024)"; 154 61 155 62 static char Py_zero_crossing_rate_doc[] = "" 156 "zero_crossing_rate(vec)\n" 157 "\n" 158 "Compute zero-crossing rate of `vec`.\n" 159 "\n" 160 "Parameters\n" 161 "----------\n" 162 "vec : fvec\n" 163 " input vector\n" 164 "\n" 165 "Returns\n" 166 "-------\n" 167 "float\n" 168 " Zero-crossing rate.\n" 169 "\n" 170 "Example\n" 171 "-------\n" 172 "\n" 173 ">>> a = np.linspace(-1., 1., 1000, dtype=aubio.float_type)\n" 174 ">>> aubio.zero_crossing_rate(a), 1/1000\n" 175 "(0.0010000000474974513, 0.001)\n" 176 ""; 63 "zero_crossing_rate(fvec) -> float\n" 64 "\n" 65 "Compute Zero crossing rate of a vector\n" 66 "\n" 67 "Example\n" 68 "-------\n" 69 "\n" 70 ">>> z = zero_crossing_rate(a)"; 177 71 178 72 static char Py_min_removal_doc[] = "" 179 "min_removal(vec)\n" 180 "\n" 181 "Remove the minimum value of a vector to each of its element.\n" 182 "\n" 183 "Modifies the input vector in-place and returns a reference to it.\n" 184 "\n" 185 "Parameters\n" 186 "----------\n" 187 "vec : fvec\n" 188 " input vector\n" 189 "\n" 190 "Returns\n" 191 "-------\n" 192 "fvec\n" 193 " modified input vector\n" 194 "\n" 195 "Example\n" 196 "-------\n" 197 "\n" 198 ">>> aubio.min_removal(aubio.fvec(np.arange(1,4)))\n" 199 "array([0., 1., 2.], dtype=" AUBIO_NPY_SMPL_STR ")\n" 200 ""; 73 "min_removal(fvec) -> float\n" 74 "\n" 75 "Remove the minimum value of a vector, in-place modification\n" 76 "\n" 77 "Example\n" 78 "-------\n" 79 "\n" 80 ">>> min_removal(a)"; 201 81 202 82 extern void add_ufuncs ( PyObject *m ); … … 238 118 smpl_t output; 239 119 240 if (!PyArg_ParseTuple (args, 241 "" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, 242 &input, &samplerate, &fftsize)) { 120 if (!PyArg_ParseTuple (args, "|" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR , &input, &samplerate, &fftsize)) { 243 121 return NULL; 244 122 } … … 255 133 smpl_t output; 256 134 257 if (!PyArg_ParseTuple (args, 258 "" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, 259 &input, &samplerate, &fftsize)) { 135 if (!PyArg_ParseTuple (args, "|" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR , &input, &samplerate, &fftsize)) { 260 136 return NULL; 261 137 } … … 272 148 smpl_t output; 273 149 274 if (!PyArg_ParseTuple (args, 275 "" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, 276 &input, &samplerate, &fftsize)) { 150 if (!PyArg_ParseTuple (args, "|" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, &input, &samplerate, &fftsize)) { 277 151 return NULL; 278 152 } … … 289 163 smpl_t output; 290 164 291 if (!PyArg_ParseTuple (args, 292 "" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, 293 &input, &samplerate, &fftsize)) { 165 if (!PyArg_ParseTuple (args, "|" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, &input, &samplerate, &fftsize)) { 294 166 return NULL; 295 167 } -
python/ext/py-cvec.c
r088760e r45c2c5c 20 20 } Py_cvec; 21 21 22 static char Py_cvec_doc[] = "" 23 "cvec(size)\n" 24 "\n" 25 "A container holding spectral data.\n" 26 "\n" 27 "Create one `cvec` to store the spectral information of a window\n" 28 "of `size` points. The data will be stored in two vectors,\n" 29 ":attr:`phas` and :attr:`norm`, each of shape (:attr:`length`,),\n" 30 "with `length = size // 2 + 1`.\n" 31 "\n" 32 "Parameters\n" 33 "----------\n" 34 "size: int\n" 35 " Size of spectrum to create.\n" 36 "\n" 37 "Examples\n" 38 "--------\n" 39 ">>> c = aubio.cvec(1024)\n" 40 ">>> c\n" 41 "aubio cvec of 513 elements\n" 42 ">>> c.length\n" 43 "513\n" 44 ">>> c.norm.dtype, c.phas.dtype\n" 45 "(dtype('float32'), dtype('float32'))\n" 46 ">>> c.norm.shape, c.phas.shape\n" 47 "((513,), (513,))\n" 48 "\n" 49 "See Also\n" 50 "--------\n" 51 "fvec, fft, pvoc\n" 52 ""; 22 static char Py_cvec_doc[] = "cvec object"; 53 23 54 24 … … 213 183 // TODO remove READONLY flag and define getter/setter 214 184 {"length", T_INT, offsetof (Py_cvec, length), READONLY, 215 " int: Length of `norm` and `phas` vectors."},185 "length attribute"}, 216 186 {NULL} /* Sentinel */ 217 187 }; … … 222 192 223 193 static PyGetSetDef Py_cvec_getseters[] = { 224 {"norm", (getter)Py_cvec_get_norm, (setter)Py_cvec_set_norm, 225 " numpy.ndarray: Vector of shape `(length,)` containing the magnitude.",194 {"norm", (getter)Py_cvec_get_norm, (setter)Py_cvec_set_norm, 195 "Numpy vector of shape (length,) containing the magnitude", 226 196 NULL}, 227 {"phas", (getter)Py_cvec_get_phas, (setter)Py_cvec_set_phas, 228 " numpy.ndarray: Vector of shape `(length,)` containing the phase.",197 {"phas", (getter)Py_cvec_get_phas, (setter)Py_cvec_set_phas, 198 "Numpy vector of shape (length,) containing the phase", 229 199 NULL}, 230 200 {NULL} /* sentinel */ -
python/ext/py-filterbank.c
r088760e r45c2c5c 95 95 if (self->vec.length != self->win_s / 2 + 1) { 96 96 PyErr_Format(PyExc_ValueError, 97 "input cvec has length %d, but f ilterbankexpects length %d",97 "input cvec has length %d, but fft expects length %d", 98 98 self->vec.length, self->win_s / 2 + 1); 99 99 return NULL; … … 140 140 if (err > 0) { 141 141 PyErr_SetString (PyExc_ValueError, 142 "error when running set_triangle_bands");142 "error when setting filter to A-weighting"); 143 143 return NULL; 144 144 } … … 159 159 if (err > 0) { 160 160 PyErr_SetString (PyExc_ValueError, 161 "error when running set_mel_coeffs_slaney");161 "error when setting filter to A-weighting"); 162 162 return NULL; 163 163 } -
python/ext/py-musicutils.h
r088760e r45c2c5c 3 3 4 4 static char Py_aubio_window_doc[] = "" 5 "window( window_type, size)\n"5 "window(string, integer) -> fvec\n" 6 6 "\n" 7 "Create a window of length `size`. `window_type` should be one\n" 8 "of the following:\n" 7 "Create a window\n" 9 8 "\n" 10 "- `default` (same as `hanningz`).\n" 11 "- `ones`\n" 12 "- `rectangle`\n" 13 "- `hamming`\n" 14 "- `hanning`\n" 15 "- `hanningz` [1]_\n" 16 "- `blackman`\n" 17 "- `blackman_harris`\n" 18 "- `gaussian`\n" 19 "- `welch`\n" 20 "- `parzen`\n" 9 "Example\n" 10 "-------\n" 21 11 "\n" 22 "Parameters\n" 23 "----------\n" 24 "window_type : str\n" 25 " Type of window.\n" 26 "size : int\n" 27 " Length of window.\n" 28 "\n" 29 "Returns\n" 30 "-------\n" 31 "fvec\n" 32 " Array of shape `(length,)` containing the new window.\n" 33 "\n" 34 "See Also\n" 35 "--------\n" 36 "pvoc, fft\n" 37 "\n" 38 "Examples\n" 39 "--------\n" 40 "Compute a zero-phase Hann window on `1024` points:\n" 41 "\n" 42 ">>> aubio.window('hanningz', 1024)\n" 12 ">>> window('hanningz', 1024)\n" 43 13 "array([ 0.00000000e+00, 9.41753387e-06, 3.76403332e-05, ...,\n" 44 " 8.46982002e-05, 3.76403332e-05, 9.41753387e-06], dtype=float32)\n" 45 "\n" 46 "Plot different window types with `matplotlib <https://matplotlib.org/>`_:\n" 47 "\n" 48 ">>> import matplotlib.pyplot as plt\n" 49 ">>> modes = ['default', 'ones', 'rectangle', 'hamming', 'hanning',\n" 50 "... 'hanningz', 'blackman', 'blackman_harris', 'gaussian',\n" 51 "... 'welch', 'parzen']; n = 2048\n" 52 ">>> for m in modes: plt.plot(aubio.window(m, n), label=m)\n" 53 "...\n" 54 ">>> plt.legend(); plt.show()\n" 55 "\n" 56 "Note\n" 57 "----\n" 58 "The following examples contain the equivalent source code to compute\n" 59 "each type of window with `NumPy <https://numpy.org>`_:\n" 60 "\n" 61 ">>> n = 1024; x = np.arange(n, dtype=aubio.float_type)\n" 62 ">>> ones = np.ones(n).astype(aubio.float_type)\n" 63 ">>> rectangle = 0.5 * ones\n" 64 ">>> hanning = 0.5 - 0.5 * np.cos(2 * np.pi * x / n)\n" 65 ">>> hanningz = 0.5 * (1 - np.cos(2 * np.pi * x / n))\n" 66 ">>> hamming = 0.54 - 0.46 * np.cos(2.*np.pi * x / (n - 1))\n" 67 ">>> blackman = 0.42 \\\n" 68 "... - 0.50 * np.cos(2 * np.pi * x / (n - 1)) \\\n" 69 "... + 0.08 * np.cos(4 * np.pi * x / (n - 1))\n" 70 ">>> blackman_harris = 0.35875 \\\n" 71 "... - 0.48829 * np.cos(2 * np.pi * x / (n - 1)) \\\n" 72 "... + 0.14128 * np.cos(4 * np.pi * x / (n - 1)) \\\n" 73 "... + 0.01168 * np.cos(6 * np.pi * x / (n - 1))\n" 74 ">>> gaussian = np.exp( - 0.5 * ((x - 0.5 * (n - 1)) \\\n" 75 "... / (0.25 * (n - 1)) )**2 )\n" 76 ">>> welch = 1 - ((2 * x - n) / (n + 1))**2\n" 77 ">>> parzen = 1 - np.abs((2 * x - n) / (n + 1))\n" 78 ">>> default = hanningz\n" 79 "References\n" 80 "----------\n" 81 #if 0 82 "`Window function <https://en.wikipedia.org/wiki/Window_function>`_ on\n" 83 "Wikipedia.\n" 84 "\n" 85 #endif 86 ".. [1] Amalia de Götzen, Nicolas Bernardini, and Daniel Arfib. Traditional\n" 87 " (?) implementations of a phase vocoder: the tricks of the trade.\n" 88 " In *Proceedings of the International Conference on Digital Audio\n" 89 " Effects* (DAFx-00), pages 37–44, University of Verona, Italy, 2000.\n" 90 " (`online version <" 91 "https://www.cs.princeton.edu/courses/archive/spr09/cos325/Bernardini.pdf" 92 ">`_).\n" 93 ""; 14 " 8.46982002e-05, 3.76403332e-05, 9.41753387e-06], dtype=float32)"; 94 15 95 16 PyObject * Py_aubio_window(PyObject *self, PyObject *args); 96 17 97 18 static char Py_aubio_level_lin_doc[] = "" 98 "level_lin( x)\n"19 "level_lin(fvec) -> fvec\n" 99 20 "\n" 100 "Compute sound pressure level of `x`,on a linear scale.\n"21 "Compute sound level on a linear scale.\n" 101 22 "\n" 102 "Parameters\n" 103 "----------\n" 104 "x : fvec\n" 105 " input vector\n" 106 "\n" 107 "Returns\n" 108 "-------\n" 109 "float\n" 110 " Linear level of `x`.\n" 23 "This gives the average of the square amplitudes.\n" 111 24 "\n" 112 25 "Example\n" 113 26 "-------\n" 114 27 "\n" 115 ">>> aubio.level_lin(aubio.fvec(numpy.ones(1024)))\n" 116 "1.0\n" 117 "\n" 118 "Note\n" 119 "----\n" 120 "Computed as the average of the squared amplitudes:\n" 121 "\n" 122 ".. math:: L = \\frac {\\sum_{n=0}^{N-1} {x_n}^2} {N}\n" 123 "\n" 124 "See Also\n" 125 "--------\n" 126 "db_spl, silence_detection, level_detection\n" 127 ""; 28 ">>> level_Lin(numpy.ones(1024))\n" 29 "1.0"; 128 30 129 31 PyObject * Py_aubio_level_lin(PyObject *self, PyObject *args); 130 32 131 33 static char Py_aubio_db_spl_doc[] = "" 132 " db_spl(x)\n"34 "Compute sound pressure level (SPL) in dB\n" 133 35 "\n" 134 " Compute Sound Pressure Level (SPL) of `x`, in dB.\n"36 "This quantity is often wrongly called 'loudness'.\n" 135 37 "\n" 136 "Parameters\n" 137 "----------\n" 138 "x : fvec\n" 139 " input vector\n" 140 "\n" 141 "Returns\n" 142 "-------\n" 143 "float\n" 144 " Level of `x`, in dB SPL.\n" 38 "This gives ten times the log10 of the average of the square amplitudes.\n" 145 39 "\n" 146 40 "Example\n" 147 41 "-------\n" 148 42 "\n" 149 ">>> aubio.db_spl(aubio.fvec(np.ones(1024)))\n" 150 "1.0\n" 151 ">>> aubio.db_spl(0.7*aubio.fvec(np.ones(32)))\n" 152 "-3.098040819168091\n" 153 "\n" 154 "Note\n" 155 "----\n" 156 "Computed as `log10` of :py:func:`level_lin`:\n" 157 "\n" 158 ".. math::\n" 159 "\n" 160 " {SPL}_{dB} = log10{\\frac {\\sum_{n=0}^{N-1}{x_n}^2} {N}}\n" 161 "\n" 162 "This quantity is often incorrectly called 'loudness'.\n" 163 "\n" 164 "See Also\n" 165 "--------\n" 166 "level_lin, silence_detection, level_detection\n" 167 ""; 43 ">>> db_spl(numpy.ones(1024))\n" 44 "1.0"; 168 45 169 46 PyObject * Py_aubio_db_spl(PyObject *self, PyObject *args); 170 47 171 48 static char Py_aubio_silence_detection_doc[] = "" 172 " silence_detection(vec, level)\n"49 "Check if buffer level in dB SPL is under a given threshold\n" 173 50 "\n" 174 " Check if level of `vec`, in dB SPL, is under a given threshold.\n"51 "Return 0 if level is under the given threshold, 1 otherwise.\n" 175 52 "\n" 176 "Parameters\n" 177 "----------\n" 178 "vec : fvec\n" 179 " input vector\n" 180 "level : float\n" 181 " level threshold, in dB SPL\n" 53 "Example\n" 54 "-------\n" 182 55 "\n" 183 "Returns\n" 184 "-------\n" 185 "int\n" 186 " `1` if level of `vec`, in dB SPL, is under `level`,\n" 187 " `0` otherwise.\n" 188 "\n" 189 "Examples\n" 190 "--------\n" 191 "\n" 192 ">>> aubio.silence_detection(aubio.fvec(32), -100.)\n" 193 "1\n" 194 ">>> aubio.silence_detection(aubio.fvec(np.ones(32)), 0.)\n" 195 "0\n" 196 "\n" 197 "See Also\n" 198 "--------\n" 199 "level_detection, db_spl, level_lin\n" 200 ""; 56 ">>> import numpy\n""" 57 ">>> silence_detection(numpy.ones(1024, dtype=\"float32\"), -80)\n" 58 "0"; 201 59 202 60 PyObject * Py_aubio_silence_detection(PyObject *self, PyObject *args); 203 61 204 62 static char Py_aubio_level_detection_doc[] = "" 205 "level_detection(vec, level)\n" 206 "\n" 207 "Check if `vec` is above threshold `level`, in dB SPL.\n" 208 "\n" 209 "Parameters\n" 210 "----------\n" 211 "vec : fvec\n" 212 " input vector\n" 213 "level : float\n" 214 " level threshold, in dB SPL\n" 215 "\n" 216 "Returns\n" 217 "-------\n" 218 "float\n" 219 " `1.0` if level of `vec` in dB SPL is under `level`,\n" 220 " `db_spl(vec)` otherwise.\n" 63 "Get buffer level in dB SPL if over a given threshold, 1. otherwise.\n" 221 64 "\n" 222 65 "Example\n" 223 66 "-------\n" 224 67 "\n" 225 ">>> aubio.level_detection(0.7*aubio.fvec(np.ones(1024)), -3.)\n" 226 "1.0\n" 227 ">>> aubio.level_detection(0.7*aubio.fvec(np.ones(1024)), -4.)\n" 228 "-3.0980708599090576\n" 229 "\n" 230 "See Also\n" 231 "--------\n" 232 "silence_detection, db_spl, level_lin\n" 233 ""; 68 ">>> import numpy\n""" 69 ">>> level_detection(0.7*numpy.ones(1024, dtype=\"float32\"), -80)\n" 70 "0"; 234 71 235 72 PyObject * Py_aubio_level_detection(PyObject *self, PyObject *args); 236 73 237 74 static char Py_aubio_shift_doc[] = "" 238 " shift(vec)\n"75 "Swap left and right partitions of a vector\n" 239 76 "\n" 240 "Swap left and right partitions of a vector, in-place.\n" 241 "\n" 242 "Parameters\n" 243 "----------\n" 244 "vec : fvec\n" 245 " input vector to shift\n" 246 "\n" 247 "Returns\n" 248 "-------\n" 249 "fvec\n" 250 " The swapped vector.\n" 251 "\n" 252 "Notes\n" 253 "-----\n" 254 "The input vector is also modified.\n" 77 "Returns the swapped vector. The input vector is also modified.\n" 255 78 "\n" 256 79 "For a vector of length N, the partition is split at index N - N//2.\n" … … 259 82 "-------\n" 260 83 "\n" 261 ">>> aubio.shift(aubio.fvec(np.arange(3)))\n" 262 "array([2., 0., 1.], dtype=" AUBIO_NPY_SMPL_STR ")\n" 263 "\n" 264 "See Also\n" 265 "--------\n" 266 "ishift\n" 267 ""; 84 ">>> import numpy\n" 85 ">>> shift(numpy.arange(3, dtype=aubio.float_type))\n" 86 "array([2., 0., 1.], dtype=" AUBIO_NPY_SMPL_STR ")"; 268 87 PyObject * Py_aubio_shift(PyObject *self, PyObject *args); 269 88 270 89 static char Py_aubio_ishift_doc[] = "" 271 " ishift(vec)\n"90 "Swap right and left partitions of a vector\n" 272 91 "\n" 273 " Swap right and left partitions of a vector, in-place.\n"92 "Returns the swapped vector. The input vector is also modified.\n" 274 93 "\n" 275 "Parameters\n" 276 "----------\n" 277 "vec : fvec\n" 278 " input vector to shift\n" 279 "\n" 280 "Returns\n" 281 "-------\n" 282 "fvec\n" 283 " The swapped vector.\n" 284 "\n" 285 "Notes\n" 286 "-----\n" 287 "The input vector is also modified.\n" 288 "\n" 289 "Unlike with :py:func:`shift`, the partition is split at index N//2.\n" 94 "Unlike with shift(), the partition is split at index N//2.\n" 290 95 "\n" 291 96 "Example\n" 292 97 "-------\n" 293 98 "\n" 294 ">>> aubio.ishift(aubio.fvec(np.arange(3)))\n" 295 "array([1., 2., 0.], dtype=" AUBIO_NPY_SMPL_STR ")\n" 296 "\n" 297 "See Also\n" 298 "--------\n" 299 "shift\n" 300 ""; 99 ">>> import numpy\n" 100 ">>> ishift(numpy.arange(3, dtype=aubio.float_type))\n" 101 "array([1., 2., 0.], dtype=" AUBIO_NPY_SMPL_STR ")"; 301 102 PyObject * Py_aubio_ishift(PyObject *self, PyObject *args); 302 103 -
python/ext/py-phasevoc.c
r088760e r45c2c5c 1 1 #include "aubio-types.h" 2 2 3 static char Py_pvoc_doc[] = "" 4 "pvoc(win_s=512, hop_s=256)\n" 5 "\n" 6 "Phase vocoder.\n" 7 "\n" 8 "`pvoc` creates callable object implements a phase vocoder [1]_,\n" 9 "using the tricks detailed in [2]_.\n" 10 "\n" 11 "The call function takes one input of type `fvec` and of size\n" 12 "`hop_s`, and returns a `cvec` of length `win_s//2+1`.\n" 13 "\n" 14 "Parameters\n" 15 "----------\n" 16 "win_s : int\n" 17 " number of channels in the phase-vocoder.\n" 18 "hop_s : int\n" 19 " number of samples expected between each call\n" 20 "\n" 21 "Examples\n" 22 "--------\n" 23 ">>> x = aubio.fvec(256)\n" 24 ">>> pv = aubio.pvoc(512, 256)\n" 25 ">>> pv(x)\n" 26 "aubio cvec of 257 elements\n" 27 "\n" 28 "Default values for hop_s and win_s are provided:\n" 29 "\n" 30 ">>> pv = aubio.pvoc()\n" 31 ">>> pv.win_s, pv.hop_s\n" 32 "512, 256\n" 33 "\n" 34 "A `cvec` can be resynthesised using `rdo()`:\n" 35 "\n" 36 ">>> pv = aubio.pvoc(512, 256)\n" 37 ">>> y = aubio.cvec(512)\n" 38 ">>> x_reconstructed = pv.rdo(y)\n" 39 ">>> x_reconstructed.shape\n" 40 "(256,)\n" 41 "\n" 42 "References\n" 43 "----------\n" 44 ".. [1] James A. Moorer. The use of the phase vocoder in computer music\n" 45 " applications. `Journal of the Audio Engineering Society`,\n" 46 " 26(1/2):42–45, 1978.\n" 47 ".. [2] Amalia de Götzen, Nicolas Bernardini, and Daniel Arfib. Traditional\n" 48 " (?) implementations of a phase vocoder: the tricks of the trade.\n" 49 " In `Proceedings of the International Conference on Digital Audio\n" 50 " Effects` (DAFx-00), pages 37–44, University of Verona, Italy, 2000.\n" 51 " (`online version <" 52 "https://www.cs.princeton.edu/courses/archive/spr09/cos325/Bernardini.pdf" 53 ">`_).\n" 54 ""; 55 3 static char Py_pvoc_doc[] = "pvoc object"; 56 4 57 5 typedef struct … … 174 122 static PyMemberDef Py_pvoc_members[] = { 175 123 {"win_s", T_INT, offsetof (Py_pvoc, win_s), READONLY, 176 "int: Size of phase vocoder analysis windows, in samples.\n" 177 ""}, 124 "size of the window"}, 178 125 {"hop_s", T_INT, offsetof (Py_pvoc, hop_s), READONLY, 179 "int: Interval between two analysis, in samples.\n" 180 ""}, 126 "size of the hop"}, 181 127 { NULL } // sentinel 182 128 }; … … 230 176 static PyMethodDef Py_pvoc_methods[] = { 231 177 {"rdo", (PyCFunction) Py_pvoc_rdo, METH_VARARGS, 232 "rdo(fftgrain)\n" 233 "\n" 234 "Read a new spectral grain and resynthesise the next `hop_s`\n" 235 "output samples.\n" 236 "\n" 237 "Parameters\n" 238 "----------\n" 239 "fftgrain : cvec\n" 240 " new input `cvec` to synthesize from, should be of size `win_s/2+1`\n" 241 "\n" 242 "Returns\n" 243 "-------\n" 244 "fvec\n" 245 " re-synthesised output of shape `(hop_s,)`\n" 246 "\n" 247 "Example\n" 248 "-------\n" 249 ">>> pv = aubio.pvoc(2048, 512)\n" 250 ">>> out = pv.rdo(aubio.cvec(2048))\n" 251 ">>> out.shape\n" 252 "(512,)\n" 253 ""}, 254 {"set_window", (PyCFunction) Pyaubio_pvoc_set_window, METH_VARARGS, 255 "set_window(window_type)\n" 256 "\n" 257 "Set window function\n" 258 "\n" 259 "Parameters\n" 260 "----------\n" 261 "window_type : str\n" 262 " the window type to use for this phase vocoder\n" 263 "\n" 264 "Raises\n" 265 "------\n" 266 "ValueError\n" 267 " If an unknown window type was given.\n" 268 "\n" 269 "See Also\n" 270 "--------\n" 271 "window : create a window.\n" 272 ""}, 178 "synthesis of spectral grain"}, 179 {"set_window", (PyCFunction) Pyaubio_pvoc_set_window, METH_VARARGS, ""}, 273 180 {NULL} 274 181 }; -
python/ext/py-sink.c
r088760e r45c2c5c 13 13 14 14 static char Py_sink_doc[] = "" 15 "sink(path, samplerate=44100, channels=1)\n" 16 "\n" 17 "Open `path` to write a WAV file.\n" 18 "\n" 19 "Parameters\n" 20 "----------\n" 21 "path : str\n" 22 " Pathname of the file to be opened for writing.\n" 23 "samplerate : int\n" 24 " Sampling rate of the file, in Hz.\n" 25 "channels : int\n" 26 " Number of channels to create the file with.\n" 27 "\n" 28 "Examples\n" 29 "--------\n" 30 "\n" 31 "Create a new sink at 44100Hz, mono:\n" 32 "\n" 33 ">>> snk = aubio.sink('out.wav')\n" 34 "\n" 35 "Create a new sink at 32000Hz, stereo, write 100 samples into it:\n" 36 "\n" 37 ">>> snk = aubio.sink('out.wav', samplerate=16000, channels=3)\n" 38 ">>> snk(aubio.fvec(100), 100)\n" 39 "\n" 40 "Open a new sink at 48000Hz, stereo, write `1234` samples into it:\n" 41 "\n" 42 ">>> with aubio.sink('out.wav', samplerate=48000, channels=2) as src:\n" 43 "... snk(aubio.fvec(1024), 1024)\n" 44 "... snk(aubio.fvec(210), 210)\n" 45 "...\n" 46 "\n" 47 "See also\n" 48 "--------\n" 49 "source: read audio samples from a file.\n" 15 " __new__(path, samplerate = 44100, channels = 1)\n" 16 "\n" 17 " Create a new sink, opening the given path for writing.\n" 18 "\n" 19 " Examples\n" 20 " --------\n" 21 "\n" 22 " Create a new sink at 44100Hz, mono:\n" 23 "\n" 24 " >>> sink('/tmp/t.wav')\n" 25 "\n" 26 " Create a new sink at 8000Hz, mono:\n" 27 "\n" 28 " >>> sink('/tmp/t.wav', samplerate = 8000)\n" 29 "\n" 30 " Create a new sink at 32000Hz, stereo:\n" 31 "\n" 32 " >>> sink('/tmp/t.wav', samplerate = 32000, channels = 2)\n" 33 "\n" 34 " Create a new sink at 32000Hz, 5 channels:\n" 35 "\n" 36 " >>> sink('/tmp/t.wav', channels = 5, samplerate = 32000)\n" 37 "\n" 38 " __call__(vec, write)\n" 39 " x(vec,write) <==> x.do(vec, write)\n" 40 "\n" 41 " Write vector to sink.\n" 42 "\n" 43 " See also\n" 44 " --------\n" 45 " aubio.sink.do\n" 50 46 "\n"; 51 47 52 48 static char Py_sink_do_doc[] = "" 53 "do(vec, write)\n" 54 "\n" 55 "Write a single channel vector to sink.\n" 56 "\n" 57 "Parameters\n" 58 "----------\n" 59 "vec : fvec\n" 60 " input vector `(n,)` where `n >= 0`.\n" 61 "write : int\n" 62 " Number of samples to write.\n" 63 ""; 49 "x.do(vec, write) <==> x(vec, write)\n" 50 "\n" 51 "write monophonic vector to sink"; 64 52 65 53 static char Py_sink_do_multi_doc[] = "" 66 "do_multi(mat, write)\n" 67 "\n" 68 "Write a matrix containing vectors from multiple channels to sink.\n" 69 "\n" 70 "Parameters\n" 71 "----------\n" 72 "mat : numpy.ndarray\n" 73 " input matrix of shape `(channels, n)`, where `n >= 0`.\n" 74 "write : int\n" 75 " Number of frames to write.\n" 76 ""; 54 "x.do_multi(mat, write)\n" 55 "\n" 56 "write polyphonic vector to sink"; 77 57 78 58 static char Py_sink_close_doc[] = "" 79 "close()\n" 80 "\n" 81 "Close this sink now.\n" 82 "\n" 83 "By default, the sink will be closed before being deleted.\n" 84 "Explicitely closing a sink can be useful to control the number\n" 85 "of files simultaneously opened.\n" 86 ""; 59 "x.close()\n" 60 "\n" 61 "close this sink now"; 87 62 88 63 static PyObject * … … 214 189 static PyMemberDef Py_sink_members[] = { 215 190 {"uri", T_STRING, offsetof (Py_sink, uri), READONLY, 216 " str (read-only): Path at which the sink was created."},191 "path at which the sink was created"}, 217 192 {"samplerate", T_INT, offsetof (Py_sink, samplerate), READONLY, 218 " int (read-only): Samplerate at which the sink was created."},193 "samplerate at which the sink was created"}, 219 194 {"channels", T_INT, offsetof (Py_sink, channels), READONLY, 220 " int (read-only): Number of channels with which the sink was created."},195 "number of channels with which the sink was created"}, 221 196 { NULL } // sentinel 222 197 }; -
python/ext/py-source.c
r088760e r45c2c5c 17 17 18 18 static char Py_source_doc[] = "" 19 "source(path, samplerate=0, hop_size=512, channels=0)\n" 20 "\n" 21 "Create a new source, opening the given pathname for reading.\n" 22 "\n" 23 "`source` open the file specified in `path` and creates a callable\n" 24 "returning `hop_size` new audio samples at each invocation.\n" 25 "\n" 26 "If `samplerate=0` (default), the original sampling rate of `path`\n" 27 "will be used. Otherwise, the output audio samples will be\n" 28 "resampled at the desired sampling-rate.\n" 29 "\n" 30 "If `channels=0` (default), the original number of channels\n" 31 "in `path` will be used. Otherwise, the output audio samples\n" 32 "will be down-mixed or up-mixed to the desired number of\n" 33 "channels.\n" 34 "\n" 35 "If `path` is a URL, a remote connection will be attempted to\n" 36 "open the resource and stream data from it.\n" 37 "\n" 38 "The parameter `hop_size` determines how many samples should be\n" 39 "read at each consecutive calls.\n" 40 "\n" 41 "Parameters\n" 42 "----------\n" 43 "path : str\n" 44 " pathname (or URL) of the file to be opened for reading\n" 45 "samplerate : int, optional\n" 46 " sampling rate of the file\n" 47 "hop_size : int, optional\n" 48 " number of samples to be read per iteration\n" 49 "channels : int, optional\n" 50 " number of channels of the file\n" 51 "\n" 52 "Examples\n" 53 "--------\n" 54 "By default, when only `path` is given, the file will be opened\n" 55 "with its original sampling rate and channel:\n" 56 "\n" 57 ">>> src = aubio.source('stereo.wav')\n" 58 ">>> src.uri, src.samplerate, src.channels, src.duration\n" 59 "('stereo.wav', 48000, 2, 86833)\n" 60 "\n" 61 "A typical loop to read all samples from a local file could\n" 62 "look like this:\n" 63 "\n" 64 ">>> src = aubio.source('stereo.wav')\n" 65 ">>> total_read = 0\n" 66 ">>> while True:\n" 67 "... samples, read = src()\n" 68 "... # do something with samples\n" 69 "... total_read += read\n" 70 "... if read < src.hop_size:\n" 71 "... break\n" 72 "...\n" 73 "\n" 74 "In a more Pythonic way, it can also look like this:\n" 75 "\n" 76 ">>> total_read = 0\n" 77 ">>> with aubio.source('stereo.wav') as src:\n" 78 "... for frames in src:\n" 79 "... total_read += samples.shape[-1]\n" 80 "...\n" 81 "\n" 82 ".. rubric:: Basic interface\n" 83 "\n" 84 "`source` is a **callable**; its :meth:`__call__` method\n" 85 "returns a tuple containing:\n" 86 "\n" 87 "- a vector of shape `(hop_size,)`, filled with the `read` next\n" 88 " samples available, zero-padded if `read < hop_size`\n" 89 "- `read`, an integer indicating the number of samples read\n" 90 "\n" 91 "To read the first `hop_size` samples from the source, simply call\n" 92 "the instance itself, with no argument:\n" 93 "\n" 94 ">>> src = aubio.source('song.ogg')\n" 95 ">>> samples, read = src()\n" 96 ">>> samples.shape, read, src.hop_size\n" 97 "((512,), 512, 512)\n" 98 "\n" 99 "The first call returned the slice of samples `[0 : hop_size]`.\n" 100 "The next call will return samples `[hop_size: 2*hop_size]`.\n" 101 "\n" 102 "After several invocations of :meth:`__call__`, when reaching the end\n" 103 "of the opened stream, `read` might become less than `hop_size`:\n" 104 "\n" 105 ">>> samples, read = src()\n" 106 ">>> samples.shape, read\n" 107 "((512,), 354)\n" 108 "\n" 109 "The end of the vector `samples` is filled with zeros.\n" 110 "\n" 111 "After the end of the stream, `read` will be `0` since no more\n" 112 "samples are available:\n" 113 "\n" 114 ">>> samples, read = src()\n" 115 ">>> samples.shape, read\n" 116 "((512,), 0)\n" 117 "\n" 118 "**Note**: when the source has more than one channels, they\n" 119 "are be down-mixed to mono when invoking :meth:`__call__`.\n" 120 "To read from each individual channel, see :meth:`__next__`.\n" 121 "\n" 122 ".. rubric:: ``for`` statements\n" 123 "\n" 124 "The `source` objects are **iterables**. This allows using them\n" 125 "directly in a ``for`` loop, which calls :meth:`__next__` until\n" 126 "the end of the stream is reached:\n" 127 "\n" 128 ">>> src = aubio.source('stereo.wav')\n" 129 ">>> for frames in src:\n" 130 ">>> print (frames.shape)\n" 131 "...\n" 132 "(2, 512)\n" 133 "(2, 512)\n" 134 "(2, 230)\n" 135 "\n" 136 "**Note**: When `next(self)` is called on a source with multiple\n" 137 "channels, an array of shape `(channels, read)` is returned,\n" 138 "unlike with :meth:`__call__` which always returns the down-mixed\n" 139 "channels.\n" 140 "\n" 141 "If the file is opened with a single channel, `next(self)` returns\n" 142 "an array of shape `(read,)`:\n" 143 "\n" 144 ">>> src = aubio.source('stereo.wav', channels=1)\n" 145 ">>> next(src).shape\n" 146 "(512,)\n" 147 "\n" 148 ".. rubric:: ``with`` statements\n" 149 "\n" 150 "The `source` objects are **context managers**, which allows using\n" 151 "them in ``with`` statements:\n" 152 "\n" 153 ">>> with aubio.source('audiotrack.wav') as source:\n" 154 "... n_frames=0\n" 155 "... for samples in source:\n" 156 "... n_frames += len(samples)\n" 157 "... print('read', n_frames, 'samples in', samples.shape[0], 'channels',\n" 158 "... 'from file \"\%s\"' \% source.uri)\n" 159 "...\n" 160 "read 239334 samples in 2 channels from file \"audiotrack.wav\"\n" 161 "\n" 162 "The file will be closed before exiting the statement.\n" 163 "\n" 164 "See also the methods implementing the context manager,\n" 165 ":meth:`__enter__` and :meth:`__exit__`.\n" 166 "\n" 167 ".. rubric:: Seeking and closing\n" 168 "\n" 169 "At any time, :meth:`seek` can be used to move to any position in\n" 170 "the file. For instance, to rewind to the start of the stream:\n" 171 "\n" 172 ">>> src.seek(0)\n" 173 "\n" 174 "The opened file will be automatically closed when the object falls\n" 175 "out of scope and is scheduled for garbage collection.\n" 176 "\n" 177 "In some cases, it is useful to manually :meth:`close` a given source,\n" 178 "for instance to limit the number of simultaneously opened files:\n" 179 "\n" 180 ">>> src.close()\n" 181 "\n" 182 ".. rubric:: Input formats\n" 183 "\n" 184 "Depending on how aubio was compiled, :class:`source` may or may not\n" 185 "open certain **files format**. Below are some examples that assume\n" 186 "support for compressed files and remote urls was compiled in:\n" 187 "\n" 188 "- open a local file using its original sampling rate and channels,\n" 189 " and with the default hop size:\n" 190 "\n" 191 ">>> s = aubio.source('sample.wav')\n" 192 ">>> s.uri, s.samplerate, s.channels, s.hop_size\n" 193 "('sample.wav', 44100, 2, 512)\n" 194 "\n" 195 "- open a local compressed audio file, resampling to 32000Hz if needed:\n" 196 "\n" 197 ">>> s = aubio.source('song.mp3', samplerate=32000)\n" 198 ">>> s.uri, s.samplerate, s.channels, s.hop_size\n" 199 "('song.mp3', 32000, 2, 512)\n" 200 "\n" 201 "- open a local video file, down-mixing and resampling it to 16kHz:\n" 202 "\n" 203 ">>> s = aubio.source('movie.mp4', samplerate=16000, channels=1)\n" 204 ">>> s.uri, s.samplerate, s.channels, s.hop_size\n" 205 "('movie.mp4', 16000, 1, 512)\n" 206 "\n" 207 "- open a remote resource, with hop_size = 1024:\n" 208 "\n" 209 ">>> s = aubio.source('https://aubio.org/drum.ogg', hop_size=1024)\n" 210 ">>> s.uri, s.samplerate, s.channels, s.hop_size\n" 211 "('https://aubio.org/drum.ogg', 48000, 2, 1024)\n" 212 "\n" 213 "See Also\n" 214 "--------\n" 215 "sink: write audio samples to a file.\n" 216 ""; 19 " __new__(path, samplerate = 0, hop_size = 512, channels = 1)\n" 20 "\n" 21 " Create a new source, opening the given path for reading.\n" 22 "\n" 23 " Examples\n" 24 " --------\n" 25 "\n" 26 " Create a new source, using the original samplerate, with hop_size = 512:\n" 27 "\n" 28 " >>> source('/tmp/t.wav')\n" 29 "\n" 30 " Create a new source, resampling the original to 8000Hz:\n" 31 "\n" 32 " >>> source('/tmp/t.wav', samplerate = 8000)\n" 33 "\n" 34 " Create a new source, resampling it at 32000Hz, hop_size = 32:\n" 35 "\n" 36 " >>> source('/tmp/t.wav', samplerate = 32000, hop_size = 32)\n" 37 "\n" 38 " Create a new source, using its original samplerate:\n" 39 "\n" 40 " >>> source('/tmp/t.wav', samplerate = 0)\n" 41 "\n" 42 " __call__()\n" 43 " vec, read = x() <==> vec, read = x.do()\n" 44 "\n" 45 " Read vector from source.\n" 46 "\n" 47 " See also\n" 48 " --------\n" 49 " aubio.source.do\n" 50 "\n"; 217 51 218 52 static char Py_source_get_samplerate_doc[] = "" 219 "get_samplerate()\n" 220 "\n" 221 "Get sampling rate of source.\n" 222 "\n" 223 "Returns\n" 224 "-------\n" 225 "int\n" 226 " Sampling rate, in Hz.\n" 227 ""; 53 "x.get_samplerate() -> source samplerate\n" 54 "\n" 55 "Get samplerate of source."; 228 56 229 57 static char Py_source_get_channels_doc[] = "" 230 "get_channels()\n" 231 "\n" 232 "Get number of channels in source.\n" 233 "\n" 234 "Returns\n" 235 "-------\n" 236 "int\n" 237 " Number of channels.\n" 238 ""; 58 "x.get_channels() -> number of channels\n" 59 "\n" 60 "Get number of channels in source."; 239 61 240 62 static char Py_source_do_doc[] = "" 241 "source.do()\n" 242 "\n" 243 "Read vector of audio samples.\n" 244 "\n" 245 "If the audio stream in the source has more than one channel,\n" 246 "the channels will be down-mixed.\n" 247 "\n" 248 "Returns\n" 249 "-------\n" 250 "samples : numpy.ndarray, shape `(hop_size,)`, dtype aubio.float_type\n" 251 " `fvec` of size `hop_size` containing the new samples.\n" 252 "read : int\n" 253 " Number of samples read from the source, equals to `hop_size`\n" 254 " before the end-of-file is reached, less when it is reached,\n" 255 " and `0` after.\n" 256 "\n" 257 "See Also\n" 258 "--------\n" 259 "do_multi\n" 260 "\n" 261 "Examples\n" 262 "--------\n" 263 ">>> src = aubio.source('sample.wav', hop_size=1024)\n" 264 ">>> src.do()\n" 265 "(array([-0.00123001, -0.00036685, 0.00097106, ..., -0.2031033 ,\n" 266 " -0.2025854 , -0.20221856], dtype=" AUBIO_NPY_SMPL_STR "), 1024)\n" 267 ""; 63 "vec, read = x.do() <==> vec, read = x()\n" 64 "\n" 65 "Read monophonic vector from source."; 268 66 269 67 static char Py_source_do_multi_doc[] = "" 270 "do_multi()\n" 271 "\n" 272 "Read multiple channels of audio samples.\n" 273 "\n" 274 "If the source was opened with the same number of channels\n" 275 "found in the stream, each channel will be read individually.\n" 276 "\n" 277 "If the source was opened with less channels than the number\n" 278 "of channels in the stream, only the first channels will be read.\n" 279 "\n" 280 "If the source was opened with more channels than the number\n" 281 "of channel in the original stream, the first channels will\n" 282 "be duplicated on the additional output channel.\n" 283 "\n" 284 "Returns\n" 285 "-------\n" 286 "samples : np.ndarray([hop_size, channels], dtype=aubio.float_type)\n" 287 " NumPy array of shape `(hop_size, channels)` containing the new\n" 288 " audio samples.\n" 289 "read : int\n" 290 " Number of samples read from the source, equals to `hop_size`\n" 291 " before the end-of-file is reached, less when it is reached,\n" 292 " and `0` after.\n" 293 "\n" 294 "See Also\n" 295 "--------\n" 296 "do\n" 297 "\n" 298 "Examples\n" 299 "--------\n" 300 ">>> src = aubio.source('sample.wav')\n" 301 ">>> src.do_multi()\n" 302 "(array([[ 0.00668335, 0.0067749 , 0.00714111, ..., -0.05737305,\n" 303 " -0.05856323, -0.06018066],\n" 304 " [-0.00842285, -0.0072937 , -0.00576782, ..., -0.09405518,\n" 305 " -0.09558105, -0.09725952]], dtype=" AUBIO_NPY_SMPL_STR "), 512)\n" 306 ""; 68 "mat, read = x.do_multi()\n" 69 "\n" 70 "Read polyphonic vector from source."; 307 71 308 72 static char Py_source_close_doc[] = "" 309 "close()\n" 310 "\n" 311 "Close this source now.\n" 312 "\n" 313 ".. note:: Closing twice a source will **not** raise any exception.\n" 314 ""; 73 "x.close()\n" 74 "\n" 75 "Close this source now."; 315 76 316 77 static char Py_source_seek_doc[] = "" 317 "seek(position)\n" 318 "\n" 319 "Seek to position in file.\n" 320 "\n" 321 "If the source was not opened with its original sampling-rate,\n" 322 "`position` corresponds to the position in the re-sampled file.\n" 323 "\n" 324 "Parameters\n" 325 "----------\n" 326 "position : str\n" 327 " position to seek to, in samples\n" 328 ""; 78 "x.seek(position)\n" 79 "\n" 80 "Seek to resampled frame position."; 329 81 330 82 static PyObject * … … 466 218 static PyMemberDef Py_source_members[] = { 467 219 {"uri", T_STRING, offsetof (Py_source, uri), READONLY, 468 " str (read-only): pathname or URL"},220 "path at which the source was created"}, 469 221 {"samplerate", T_INT, offsetof (Py_source, samplerate), READONLY, 470 " int (read-only): sampling rate"},222 "samplerate at which the source is viewed"}, 471 223 {"channels", T_INT, offsetof (Py_source, channels), READONLY, 472 " int (read-only): number of channels"},224 "number of channels found in the source"}, 473 225 {"hop_size", T_INT, offsetof (Py_source, hop_size), READONLY, 474 " int (read-only): number of samples read per iteration"},226 "number of consecutive frames that will be read at each do or do_multi call"}, 475 227 {"duration", T_INT, offsetof (Py_source, duration), READONLY, 476 "int (read-only): total number of frames in the source\n" 477 "\n" 478 "Can be estimated, for instance if the opened stream is\n" 479 "a compressed media or a remote resource.\n" 480 "\n" 481 "Example\n" 482 "-------\n" 483 ">>> n = 0\n" 484 ">>> src = aubio.source('track1.mp3')\n" 485 ">>> for samples in src:\n" 486 "... n += samples.shape[-1]\n" 487 "...\n" 488 ">>> n, src.duration\n" 489 "(9638784, 9616561)\n" 490 ""}, 228 "total number of frames in the source (estimated)"}, 491 229 { NULL } // sentinel 492 230 }; -
python/ext/ufuncs.c
r088760e r45c2c5c 59 59 }; 60 60 61 // Note: these docstrings should *not* include the function signatures 62 63 static char Py_unwrap2pi_doc[] = "" 64 "\n" 65 "Map angle to unit circle :math:`[-\\pi, \\pi[`.\n" 66 "\n" 67 "Parameters\n" 68 "----------\n" 69 "x : numpy.ndarray\n" 70 " input array\n" 71 "\n" 72 "Returns\n" 73 "-------\n" 74 "numpy.ndarray\n" 75 " values clamped to the unit circle :math:`[-\\pi, \\pi[`\n" 76 ""; 61 static char Py_unwrap2pi_doc[] = "map angle to unit circle [-pi, pi["; 77 62 78 63 static void* Py_unwrap2pi_data[] = { … … 83 68 }; 84 69 85 static char Py_freqtomidi_doc[] = "" 86 "\n" 87 "Convert frequency `[0; 23000[` to midi `[0; 128[`.\n" 88 "\n" 89 "Parameters\n" 90 "----------\n" 91 "x : numpy.ndarray\n" 92 " Array of frequencies, in Hz.\n" 93 "\n" 94 "Returns\n" 95 "-------\n" 96 "numpy.ndarray\n" 97 " Converted frequencies, in midi note.\n" 98 ""; 70 static char Py_freqtomidi_doc[] = "convert frequency to midi"; 99 71 100 72 static void* Py_freqtomidi_data[] = { … … 103 75 }; 104 76 105 static char Py_miditofreq_doc[] = "" 106 "\n" 107 "Convert midi `[0; 128[` to frequency `[0, 23000]`.\n" 108 "\n" 109 "Parameters\n" 110 "----------\n" 111 "x : numpy.ndarray\n" 112 " Array of frequencies, in midi note.\n" 113 "\n" 114 "Returns\n" 115 "-------\n" 116 "numpy.ndarray\n" 117 " Converted frequencies, in Hz\n" 118 ""; 77 static char Py_miditofreq_doc[] = "convert midi to frequency"; 119 78 120 79 static void* Py_miditofreq_data[] = { -
python/lib/aubio/__init__.py
r088760e r45c2c5c 1 1 #! /usr/bin/env python 2 # -*- coding: utf8 -*-3 4 """5 aubio6 =====7 8 Provides a number of classes and functions for music and audio signal9 analysis.10 11 How to use the documentation12 ----------------------------13 14 Documentation of the python module is available as docstrings provided15 within the code, and a reference guide available online from `the16 aubio homepage <https://aubio.org/documentation>`_.17 18 The docstrings examples are written assuming `aubio` and `numpy` have been19 imported with:20 21 >>> import aubio22 >>> import numpy as np23 """24 2 25 3 import numpy … … 31 9 32 10 class fvec(numpy.ndarray): 33 """fvec(input_arg=1024) 34 A vector holding float samples. 11 """a numpy vector holding audio samples""" 35 12 36 If `input_arg` is an `int`, a 1-dimensional vector of length `input_arg` 37 will be created and filled with zeros. Otherwise, if `input_arg` is an 38 `array_like` object, it will be converted to a 1-dimensional vector of 39 type :data:`float_type`. 40 41 Parameters 42 ---------- 43 input_arg : `int` or `array_like` 44 Can be a positive integer, or any object that can be converted to 45 a numpy array with :func:`numpy.array`. 46 47 Examples 48 -------- 49 >>> aubio.fvec(10) 50 array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32) 51 >>> aubio.fvec([0,1,2]) 52 array([0., 1., 2.], dtype=float32) 53 >>> a = np.arange(10); type(a), type(aubio.fvec(a)) 54 (<class 'numpy.ndarray'>, <class 'numpy.ndarray'>) 55 >>> a.dtype, aubio.fvec(a).dtype 56 (dtype('int64'), dtype('float32')) 57 58 Notes 59 ----- 60 61 In the Python world, `fvec` is simply a subclass of 62 :class:`numpy.ndarray`. In practice, any 1-dimensional `numpy.ndarray` of 63 `dtype` :data:`float_type` may be passed to methods accepting 64 `fvec` as parameter. For instance, `sink()` or `pvoc()`. 65 66 See Also 67 -------- 68 cvec : a container holding spectral data 69 numpy.ndarray : parent class of :class:`fvec` 70 numpy.zeros : create a numpy array filled with zeros 71 numpy.array : create a numpy array from an existing object 72 """ 73 def __new__(cls, input_arg=1024): 13 def __new__(cls, input_arg=1024, **kwargs): 74 14 if isinstance(input_arg, int): 75 15 if input_arg == 0: 76 16 raise ValueError("vector length of 1 or more expected") 77 return numpy.zeros(input_arg, dtype=float_type, order='C')17 return numpy.zeros(input_arg, dtype=float_type, **kwargs) 78 18 else: 79 np_input = numpy.array(input_arg, dtype=float_type, order='C') 80 if len(np_input.shape) != 1: 81 raise ValueError("input_arg should have shape (n,)") 82 if np_input.shape[0] == 0: 83 raise ValueError("vector length of 1 or more expected") 84 return np_input 19 return numpy.array(input_arg, dtype=float_type, **kwargs) -
python/lib/aubio/cmd.py
r088760e r45c2c5c 102 102 subparser.add_input() 103 103 subparser.add_buf_hop_size() 104 subparser.add_silence()105 subparser.add_release_drop()106 104 subparser.add_time_format() 107 105 subparser.add_verbose_help() … … 140 138 141 139 def parser_add_subcommand_cut(subparsers): 142 # cut subcommand140 # quiet subcommand 143 141 subparser = subparsers.add_parser('cut', 144 142 help='slice at timestamps') … … 209 207 action="store", dest="silence", default=-70, 210 208 help="silence threshold") 211 212 def add_release_drop(self):213 self.add_argument("-d", "--release-drop",214 metavar = "<value>", type=float,215 action="store", dest="release_drop", default=10,216 help="release drop threshold")217 209 218 210 def add_minioi(self, default="12ms"): … … 256 248 action = "store", dest = "cut_until_nslices", default = None, 257 249 help="how many extra slices should be added at the end of each slice") 258 self.add_argument("--create-first",259 action = "store_true", dest = "create_first", default = False,260 help="always include first slice")261 250 262 251 # some utilities … … 391 380 self.parse_options(args, self.valid_opts) 392 381 self.notes = aubio.notes(**self.options) 393 if args.silence is not None:394 self.notes.set_silence(args.silence)395 if args.release_drop is not None:396 self.notes.set_release_drop(args.release_drop)397 382 super(process_notes, self).__init__(args) 398 383 def __call__(self, block): … … 515 500 def main(): 516 501 parser = aubio_parser() 517 if sys.version_info[0] != 3: 518 # on py2, create a dummy ArgumentParser to workaround the 519 # optional subcommand issue. See https://bugs.python.org/issue9253 520 # This ensures that: 521 # - version string is shown when only '-V' is passed 522 # - help is printed if '-V' is passed with any other argument 523 # - any other argument get forwarded to the real parser 524 parser_root = argparse.ArgumentParser(add_help=False) 525 parser_root.add_argument('-V', '--version', help="show version", 526 action="store_true", dest="show_version") 527 args, extras = parser_root.parse_known_args() 528 if args.show_version == False: # no -V, forward to parser 529 args = parser.parse_args(extras, namespace=args) 530 elif len(extras) != 0: # -V with other arguments, print help 531 parser.print_help() 532 sys.exit(1) 533 else: # in py3, we can simply use parser directly 534 args = parser.parse_args() 502 args = parser.parse_args() 535 503 if 'show_version' in args and args.show_version: 536 504 sys.stdout.write('aubio version ' + aubio.version + '\n') -
python/lib/aubio/cut.py
r088760e r45c2c5c 102 102 s = source(source_uri, samplerate, hopsize) 103 103 if samplerate == 0: 104 samplerate = s. samplerate104 samplerate = s.get_samplerate() 105 105 options.samplerate = samplerate 106 106 … … 151 151 timestamps, timestamps_end = timestamps_end, 152 152 output_dir = options.output_directory, 153 samplerate = options.samplerate, 154 create_first = options.create_first) 153 samplerate = options.samplerate) 155 154 156 155 def main(): -
python/lib/aubio/midiconv.py
r088760e r45c2c5c 2 2 """ utilities to convert midi note number to and from note names """ 3 3 4 __all__ = ['note2midi', 'midi2note', 'freq2note' , 'note2freq']4 __all__ = ['note2midi', 'midi2note', 'freq2note'] 5 5 6 6 import sys 7 from ._aubio import freqtomidi, miditofreq8 9 7 py3 = sys.version_info[0] == 3 10 8 if py3: … … 16 14 17 15 def note2midi(note): 18 """Convert note name to midi note number. 19 20 Input string `note` should be composed of one note root 21 and one octave, with optionally one modifier in between. 22 23 List of valid components: 24 25 - note roots: `C`, `D`, `E`, `F`, `G`, `A`, `B`, 26 - modifiers: `b`, `#`, as well as unicode characters 27 `𝄫`, `♭`, `♮`, `♯` and `𝄪`, 28 - octave numbers: `-1` -> `11`. 29 30 Parameters 31 ---------- 32 note : str 33 note name 34 35 Returns 36 ------- 37 int 38 corresponding midi note number 39 40 Examples 41 -------- 42 >>> aubio.note2midi('C#4') 43 61 44 >>> aubio.note2midi('B♭5') 45 82 46 47 Raises 48 ------ 49 TypeError 50 If `note` was not a string. 51 ValueError 52 If an error was found while converting `note`. 53 54 See Also 55 -------- 56 midi2note, freqtomidi, miditofreq 57 """ 16 " convert note name to midi note number, e.g. [C-1, G9] -> [0, 127] " 58 17 _valid_notenames = {'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7, 'A': 9, 'B': 11} 59 18 _valid_modifiers = { … … 66 25 _valid_octaves = range(-1, 10) 67 26 if not isinstance(note, str_instances): 68 msg = "a string is required, got {:s} ({:s})" 69 raise TypeError(msg.format(str(type(note)), repr(note))) 27 raise TypeError("a string is required, got %s (%s)" % (note, str(type(note)))) 70 28 if len(note) not in range(2, 5): 71 msg = "string of 2 to 4 characters expected, got {:d} ({:s})"72 raise ValueError(msg.format(len(note), note))29 raise ValueError("string of 2 to 4 characters expected, got %d (%s)" \ 30 % (len(note), note)) 73 31 notename, modifier, octave = [None]*3 74 32 … … 94 52 raise ValueError("%s is not a valid octave" % octave) 95 53 96 midi = 12 + octave * 12 + _valid_notenames[notename] \ 97 + _valid_modifiers[modifier] 54 midi = 12 + octave * 12 + _valid_notenames[notename] + _valid_modifiers[modifier] 98 55 if midi > 127: 99 56 raise ValueError("%s is outside of the range C-2 to G8" % note) … … 101 58 102 59 def midi2note(midi): 103 """Convert midi note number to note name. 104 105 Parameters 106 ---------- 107 midi : int [0, 128] 108 input midi note number 109 110 Returns 111 ------- 112 str 113 note name 114 115 Examples 116 -------- 117 >>> aubio.midi2note(70) 118 'A#4' 119 >>> aubio.midi2note(59) 120 'B3' 121 122 Raises 123 ------ 124 TypeError 125 If `midi` was not an integer. 126 ValueError 127 If `midi` is out of the range `[0, 128]`. 128 129 See Also 130 -------- 131 note2midi, miditofreq, freqtomidi 132 """ 60 " convert midi note number to note name, e.g. [0, 127] -> [C-1, G9] " 133 61 if not isinstance(midi, int_instances): 134 62 raise TypeError("an integer is required, got %s" % midi) 135 63 if midi not in range(0, 128): 136 msg = "an integer between 0 and 127 is excepted, got {:d}" 137 raise ValueError(msg.format(midi)) 138 _valid_notenames = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 139 'A', 'A#', 'B'] 64 raise ValueError("an integer between 0 and 127 is excepted, got %d" % midi) 65 _valid_notenames = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'] 140 66 return _valid_notenames[midi % 12] + str(int(midi / 12) - 1) 141 67 142 68 def freq2note(freq): 143 """Convert frequency in Hz to nearest note name. 144 145 Parameters 146 ---------- 147 freq : float [0, 23000[ 148 input frequency, in Hz 149 150 Returns 151 ------- 152 str 153 name of the nearest note 154 155 Example 156 ------- 157 >>> aubio.freq2note(440) 158 'A4' 159 >>> aubio.freq2note(220.1) 160 'A3' 161 """ 162 nearest_note = int(freqtomidi(freq) + .5) 163 return midi2note(nearest_note) 164 165 def note2freq(note): 166 """Convert note name to corresponding frequency, in Hz. 167 168 Parameters 169 ---------- 170 note : str 171 input note name 172 173 Returns 174 ------- 175 freq : float [0, 23000[ 176 frequency, in Hz 177 178 Example 179 ------- 180 >>> aubio.note2freq('A4') 181 440 182 >>> aubio.note2freq('A3') 183 220.1 184 """ 185 midi = note2midi(note) 186 return miditofreq(midi) 69 " convert frequency in Hz to nearest note name, e.g. [0, 22050.] -> [C-1, G9] " 70 from aubio import freqtomidi 71 return midi2note(int(freqtomidi(freq))) -
python/lib/aubio/slicing.py
r088760e r45c2c5c 7 7 8 8 def slice_source_at_stamps(source_file, timestamps, timestamps_end=None, 9 output_dir=None, samplerate=0, hopsize=256, 10 create_first=False): 11 """Slice a sound file at given timestamps. 12 13 This function reads `source_file` and creates slices, new smaller 14 files each starting at `t` in `timestamps`, a list of integer 15 corresponding to time locations in `source_file`, in samples. 16 17 If `timestamps_end` is unspecified, the slices will end at 18 `timestamps_end[n] = timestamps[n+1]-1`, or the end of file. 19 Otherwise, `timestamps_end` should be a list with the same length 20 as `timestamps` containing the locations of the end of each slice. 21 22 If `output_dir` is unspecified, the new slices will be written in 23 the current directory. If `output_dir` is a string, new slices 24 will be written in `output_dir`, after creating the directory if 25 required. 26 27 The default `samplerate` is 0, meaning the original sampling rate 28 of `source_file` will be used. When using a sampling rate 29 different to the one of the original files, `timestamps` and 30 `timestamps_end` should be expressed in the re-sampled signal. 31 32 The `hopsize` parameter simply tells :class:`source` to use this 33 hopsize and does not change the output slices. 34 35 If `create_first` is True and `timestamps` does not start with `0`, the 36 first slice from `0` to `timestamps[0] - 1` will be automatically added. 37 38 Parameters 39 ---------- 40 source_file : str 41 path of the resource to slice 42 timestamps : :obj:`list` of :obj:`int` 43 time stamps at which to slice, in samples 44 timestamps_end : :obj:`list` of :obj:`int` (optional) 45 time stamps at which to end the slices 46 output_dir : str (optional) 47 output directory to write the slices to 48 samplerate : int (optional) 49 samplerate to read the file at 50 hopsize : int (optional) 51 number of samples read from source per iteration 52 create_first : bool (optional) 53 always create the slice at the start of the file 54 55 Examples 56 -------- 57 Create two slices: the first slice starts at the beginning of the 58 input file `loop.wav` and lasts exactly one second, starting at 59 sample `0` and ending at sample `44099`; the second slice starts 60 at sample `44100` and lasts until the end of the input file: 61 62 >>> aubio.slice_source_at_stamps('loop.wav', [0, 44100]) 63 64 Create one slice, from 1 second to 2 seconds: 65 66 >>> aubio.slice_source_at_stamps('loop.wav', [44100], [44100 * 2 - 1]) 67 68 Notes 69 ----- 70 Slices may be overlapping. If `timestamps_end` is `1` element 71 shorter than `timestamps`, the last slice will end at the end of 72 the file. 73 """ 9 output_dir=None, samplerate=0, hopsize=256): 10 """ slice a sound file at given timestamps """ 74 11 75 12 if timestamps is None or len(timestamps) == 0: 76 13 raise ValueError("no timestamps given") 77 14 78 if timestamps[0] != 0 and create_first:15 if timestamps[0] != 0: 79 16 timestamps = [0] + timestamps 80 17 if timestamps_end is not None: … … 82 19 83 20 if timestamps_end is not None: 84 if len(timestamps_end) == len(timestamps) - 1: 85 timestamps_end = timestamps_end + [_max_timestamp] 86 elif len(timestamps_end) != len(timestamps): 21 if len(timestamps_end) != len(timestamps): 87 22 raise ValueError("len(timestamps_end) != len(timestamps)") 88 23 else: … … 114 49 vec, read = _source.do_multi() 115 50 # if the total number of frames read will exceed the next region start 116 whilelen(regions) and total_frames + read >= regions[0][0]:51 if len(regions) and total_frames + read >= regions[0][0]: 117 52 #print "getting", regions[0], "at", total_frames 118 53 # get next region … … 141 76 # write remaining samples from current region 142 77 _sink.do_multi(vec[:, start:remaining], remaining - start) 143 #print ("closing region", "remaining", remaining)78 #print "closing region", "remaining", remaining 144 79 # close this file 145 80 _sink.close() … … 148 83 _sink.do_multi(vec[:, start:read], read - start) 149 84 total_frames += read 150 # remove old slices151 slices = list(filter(lambda s: s['end_stamp'] > total_frames,152 slices))153 85 if read < hopsize: 154 86 break -
python/lib/gen_code.py
r088760e r45c2c5c 483 483 484 484 if (err > 0) {{ 485 if (PyErr_Occurred() == NULL) {{ 486 PyErr_SetString (PyExc_ValueError, "error running aubio_{shortname}_set_{param}"); 487 }} else {{ 488 // change the RuntimeError into ValueError 489 PyObject *type, *value, *traceback; 490 PyErr_Fetch(&type, &value, &traceback); 491 PyErr_Restore(PyExc_ValueError, value, traceback); 492 }} 485 PyErr_SetString (PyExc_ValueError, "error running aubio_{shortname}_set_{param}"); 493 486 return NULL; 494 487 }} -
python/lib/gen_external.py
r088760e r45c2c5c 78 78 cpp_cmd = os.environ.get('CC', 'cc').split() 79 79 cpp_cmd += ['-E'] 80 if 'emcc' in cpp_cmd: 81 cpp_cmd += ['-x', 'c'] # emcc defaults to c++, force C language 80 cpp_cmd += ['-x', 'c'] # force C language (emcc defaults to c++) 82 81 return cpp_cmd 83 82 … … 86 85 ''' return a dense and preprocessed string of all c declarations implied by aubio.h 87 86 ''' 88 cpp_output = get_cpp_output(header=header, usedouble=usedouble)89 return filter_cpp_output (cpp_output)90 91 92 def get_cpp_output(header=header, usedouble=False):93 ''' find and run a C pre-processor on aubio.h '''94 87 cpp_cmd = get_preprocessor() 95 88 … … 112 105 cpp_output = proc.stdout.read() 113 106 err_output = proc.stderr.read() 114 if err_output:115 print("Warning: preprocessor produced errors or warnings:\n%s" \116 % err_output.decode('utf8'))117 107 if not cpp_output: 118 raise_msg = "preprocessor output is empty! Running command " \ 119 + "\"%s\" failed" % " ".join(cpp_cmd) 120 if err_output: 121 raise_msg += " with stderr: \"%s\"" % err_output.decode('utf8') 122 else: 123 raise_msg += " with no stdout or stderr" 124 raise Exception(raise_msg) 108 raise Exception("preprocessor output is empty:\n%s" % err_output) 109 elif err_output: 110 print("Warning: preprocessor produced warnings:\n%s" % err_output) 125 111 if not isinstance(cpp_output, list): 126 112 cpp_output = [l.strip() for l in cpp_output.decode('utf8').split('\n')] 127 113 128 return cpp_output 129 130 def filter_cpp_output(cpp_raw_output): 131 ''' prepare cpp-output for parsing ''' 132 cpp_output = filter(lambda y: len(y) > 1, cpp_raw_output) 114 cpp_output = filter(lambda y: len(y) > 1, cpp_output) 133 115 cpp_output = list(filter(lambda y: not y.startswith('#'), cpp_output)) 134 116 -
python/tests/test_aubio_cmd.py
r088760e r45c2c5c 20 20 21 21 def test_samples2seconds(self): 22 self.assertEqual(aubio.cmd.samples2seconds(3200, 32000), 23 "0.100000\t") 22 self.assertEqual(aubio.cmd.samples2seconds(3200, 32000), "0.100000\t") 24 23 25 24 def test_samples2milliseconds(self): 26 self.assertEqual(aubio.cmd.samples2milliseconds(3200, 32000), 27 "100.000000\t") 25 self.assertEqual(aubio.cmd.samples2milliseconds(3200, 32000), "100.000000\t") 28 26 29 27 def test_samples2samples(self): 30 self.assertEqual(aubio.cmd.samples2samples(3200, 32000), 31 "3200\t") 28 self.assertEqual(aubio.cmd.samples2samples(3200, 32000), "3200\t") 32 29 33 30 if __name__ == '__main__': -
python/tests/test_fvec.py
r088760e r45c2c5c 60 60 self.assertRaises(IndexError, a.__getitem__, 3) 61 61 self.assertRaises(IndexError, a.__getitem__, 2) 62 63 def test_wrong_dimensions(self):64 a = np.array([[[1, 2], [3, 4]]], dtype=float_type)65 self.assertRaises(ValueError, fvec, a)66 67 def test_wrong_size(self):68 a = np.ndarray([0,], dtype=float_type)69 self.assertRaises(ValueError, fvec, a)70 62 71 63 class aubio_wrong_fvec_input(TestCase): -
python/tests/test_note2midi.py
r088760e r45c2c5c 4 4 from __future__ import unicode_literals 5 5 6 from aubio import note2midi, freq2note , note2freq, float_type6 from aubio import note2midi, freq2note 7 7 from nose2.tools import params 8 8 import unittest … … 112 112 class freq2note_simple_test(unittest.TestCase): 113 113 114 def test_freq2note _above(self):114 def test_freq2note(self): 115 115 " make sure freq2note(441) == A4 " 116 116 self.assertEqual("A4", freq2note(441)) 117 118 def test_freq2note_under(self):119 " make sure freq2note(439) == A4 "120 self.assertEqual("A4", freq2note(439))121 122 class note2freq_simple_test(unittest.TestCase):123 124 def test_note2freq(self):125 " make sure note2freq('A3') == 220"126 self.assertEqual(220, note2freq("A3"))127 128 def test_note2freq_under(self):129 " make sure note2freq(A4) == 440"130 if float_type == 'float32':131 self.assertEqual(440, note2freq("A4"))132 else:133 self.assertLess(abs(note2freq("A4")-440), 1.e-12)134 117 135 118 if __name__ == '__main__': -
python/tests/test_notes.py
r088760e r45c2c5c 6 6 7 7 AUBIO_DEFAULT_NOTES_SILENCE = -70. 8 AUBIO_DEFAULT_NOTES_RELEASE_DROP = 10.9 8 AUBIO_DEFAULT_NOTES_MINIOI_MS = 30. 10 9 … … 39 38 self.o.set_silence(val) 40 39 assert_equal (self.o.get_silence(), val) 41 42 def test_get_release_drop(self):43 assert_equal (self.o.get_release_drop(), AUBIO_DEFAULT_NOTES_RELEASE_DROP)44 45 def test_set_release_drop(self):46 val = 5047 self.o.set_release_drop(val)48 assert_equal (self.o.get_release_drop(), val)49 50 def test_set_release_drop_wrong(self):51 val = -1052 with self.assertRaises(ValueError):53 self.o.set_release_drop(val)54 40 55 41 from .utils import list_all_sounds -
python/tests/test_slicing.py
r088760e r45c2c5c 24 24 def test_slice_start_only_no_zero(self): 25 25 regions_start = [i*1000 for i in range(1, n_slices)] 26 slice_source_at_stamps(self.source_file, regions_start, 27 output_dir = self.output_dir, create_first=True) 26 slice_source_at_stamps(self.source_file, regions_start, output_dir = self.output_dir) 28 27 29 28 def test_slice_start_beyond_end(self): 30 29 regions_start = [i*1000 for i in range(1, n_slices)] 31 30 regions_start += [count_samples_in_file(self.source_file) + 1000] 32 slice_source_at_stamps(self.source_file, regions_start, 33 output_dir = self.output_dir, create_first=True) 31 slice_source_at_stamps(self.source_file, regions_start, output_dir = self.output_dir) 34 32 35 33 def test_slice_start_every_blocksize(self): 36 34 hopsize = 200 37 regions_start = [i*hopsize for i in range( 0, n_slices)]35 regions_start = [i*hopsize for i in range(1, n_slices)] 38 36 slice_source_at_stamps(self.source_file, regions_start, output_dir = self.output_dir, 39 37 hopsize = 200) 40 41 def test_slice_start_every_half_blocksize(self):42 hopsize = 20043 regions_start = [i*hopsize//2 for i in range(0, n_slices)]44 slice_source_at_stamps(self.source_file, regions_start,45 output_dir = self.output_dir, hopsize = 200)46 38 47 39 def tearDown(self): … … 100 92 "number of samples written different from number of original samples") 101 93 102 def test_slice_start_and_ends_with_missing_end(self):103 regions_start = [i*1000 for i in range(n_slices)]104 regions_ends = [r-1 for r in regions_start[1:]]105 slice_source_at_stamps(self.source_file, regions_start, regions_ends,106 output_dir = self.output_dir)107 written_samples = count_samples_in_directory(self.output_dir)108 original_samples = count_samples_in_file(self.source_file)109 total_files = count_files_in_directory(self.output_dir)110 assert_equal(n_slices, total_files,111 "number of slices created different from expected")112 assert_equal(written_samples, original_samples,113 "number of samples written different from number of original samples")114 115 94 def tearDown(self): 116 95 shutil.rmtree(self.output_dir) … … 155 134 regions_end = None 156 135 slice_source_at_stamps (self.source_file, regions_start, regions_end, 157 output_dir = self.output_dir , create_first=True)136 output_dir = self.output_dir) 158 137 total_files = count_files_in_directory(self.output_dir) 159 138 assert_equal(n_slices, total_files, -
scripts/get_waf.sh
r088760e r45c2c5c 2 2 3 3 set -e 4 #set -x4 set -x 5 5 6 6 WAFVERSION=2.0.11 7 7 WAFTARBALL=waf-$WAFVERSION.tar.bz2 8 8 WAFURL=https://waf.io/$WAFTARBALL 9 WAFUPSTREAMKEY=https://gitlab.com/ita1024/waf/raw/master/utils/pubkey.asc10 9 11 10 WAFBUILDDIR=`mktemp -d` … … 17 16 trap cleanup SIGINT SIGTERM 18 17 19 function download () { 20 ( [[ -n `which wget` ]] && wget -qO $1 $2 ) || ( [[ -n `which curl` ]] && curl -so $1 $2 ) 21 } 18 function buildwaf () { 19 pushd $WAFBUILDDIR 22 20 23 function checkwaf () { 24 download $WAFTARBALL.asc $WAFURL.asc 25 if [[ -z `which gpg` ]] 26 then 27 echo "Warning: gpg not found, not verifying signature for $WAFTARBALL" 28 else 29 download - $WAFUPSTREAMKEY | gpg --import 30 gpg --verify $WAFTARBALL.asc || exit 1 31 fi 32 } 21 ( which wget > /dev/null && wget -qO $WAFTARBALL $WAFURL ) || ( which curl > /dev/null && curl $WAFURL > $WAFTARBALL ) 33 22 34 function fetchwaf () {35 download $WAFTARBALL $WAFURL36 checkwaf37 }38 39 function buildwaf () {40 23 tar xf $WAFTARBALL 41 24 pushd waf-$WAFVERSION 42 25 NOCLIMB=1 python waf-light --tools=c_emscripten $* 26 43 27 popd 28 popd 29 30 cp -prv $WAFBUILDDIR/waf-$WAFVERSION/waf $PWD 31 32 chmod +x waf 44 33 } 45 34 46 pushd $WAFBUILDDIR47 fetchwaf48 35 buildwaf 49 popd50 51 cp -prv $WAFBUILDDIR/waf-$WAFVERSION/waf $PWD52 chmod +x waf53 36 54 37 cleanup -
src/aubio_priv.h
r088760e r45c2c5c 71 71 #endif 72 72 73 #if defined(HAVE_ACCELERATE)73 #ifdef HAVE_ACCELERATE 74 74 #define HAVE_ATLAS 1 75 #define HAVE_BLAS 176 75 #include <Accelerate/Accelerate.h> 77 76 #elif defined(HAVE_ATLAS_CBLAS_H) 78 #elif defined(HAVE_BLAS)79 #if defined(HAVE_ATLAS_CBLAS_H)80 77 #define HAVE_ATLAS 1 81 78 #include <atlas/cblas.h> 82 #elif defined(HAVE_OPENBLAS_CBLAS_H) 83 #include <openblas/cblas.h> 84 #elif defined(HAVE_CBLAS_H) 85 #include <cblas.h> 86 #endif 79 #else 80 #undef HAVE_ATLAS 87 81 #endif 88 82 … … 120 114 #endif /* HAVE_ACCELERATE */ 121 115 122 #if defined(HAVE_BLAS)116 #ifdef HAVE_ATLAS 123 117 #ifndef HAVE_AUBIO_DOUBLE 124 #ifdef HAVE_ATLAS125 118 #define aubio_catlas_set catlas_sset 126 #endif /* HAVE_ATLAS */127 119 #define aubio_cblas_copy cblas_scopy 128 120 #define aubio_cblas_swap cblas_sswap 129 121 #define aubio_cblas_dot cblas_sdot 130 122 #else /* HAVE_AUBIO_DOUBLE */ 131 #ifdef HAVE_ATLAS132 123 #define aubio_catlas_set catlas_dset 133 #endif /* HAVE_ATLAS */134 124 #define aubio_cblas_copy cblas_dcopy 135 125 #define aubio_cblas_swap cblas_dswap 136 126 #define aubio_cblas_dot cblas_ddot 137 127 #endif /* HAVE_AUBIO_DOUBLE */ 138 #endif /* HAVE_ BLAS */128 #endif /* HAVE_ATLAS */ 139 129 140 130 #if defined HAVE_INTEL_IPP … … 171 161 #if !defined(HAVE_MEMCPY_HACKS) && !defined(HAVE_ACCELERATE) && !defined(HAVE_ATLAS) && !defined(HAVE_INTEL_IPP) 172 162 #define HAVE_NOOPT 1 163 #else 164 #undef HAVE_NOOPT 173 165 #endif 174 166 -
src/fmat.c
r088760e r45c2c5c 161 161 assert(s->length == scale->length); 162 162 #endif 163 #if !defined(HAVE_ACCELERATE) && !defined(HAVE_ BLAS)163 #if !defined(HAVE_ACCELERATE) && !defined(HAVE_ATLAS) 164 164 uint_t j; 165 165 fvec_zeros(output); … … 170 170 } 171 171 } 172 #elif defined(HAVE_ BLAS)172 #elif defined(HAVE_ATLAS) 173 173 for (k = 0; k < s->height; k++) { 174 174 output->data[k] = aubio_cblas_dot( s->length, scale->data, 1, s->data[k], 1); -
src/fvec.c
r088760e r45c2c5c 135 135 #if defined(HAVE_INTEL_IPP) 136 136 aubio_ippsCopy(s->data, t->data, (int)s->length); 137 #elif defined(HAVE_ BLAS)137 #elif defined(HAVE_ATLAS) 138 138 aubio_cblas_copy(s->length, s->data, 1, t->data, 1); 139 139 #elif defined(HAVE_ACCELERATE) -
src/io/source_avcodec.c
r088760e r45c2c5c 35 35 // determine whether we use libavformat from ffmpeg or from libav 36 36 #define FFMPEG_LIBAVFORMAT (LIBAVFORMAT_VERSION_MICRO > 99 ) 37 // max_analyze_duration2 was used from ffmpeg libavformat 55.43.100 ->57.2.10037 // max_analyze_duration2 was used from ffmpeg libavformat 55.43.100 through 57.2.100 38 38 #define FFMPEG_LIBAVFORMAT_MAX_DUR2 FFMPEG_LIBAVFORMAT && ( \ 39 39 (LIBAVFORMAT_VERSION_MAJOR == 55 && LIBAVFORMAT_VERSION_MINOR >= 43) \ … … 93 93 }; 94 94 95 // 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); 98 // actually read a frame 99 void aubio_source_avcodec_readframe(aubio_source_avcodec_t *s, 100 uint_t * read_samples); 95 // hack to create or re-create the context the first time _do or _do_multi is called 96 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s, uint_t multi); 97 void aubio_source_avcodec_readframe(aubio_source_avcodec_t *s, uint_t * read_samples); 101 98 102 99 uint_t aubio_source_avcodec_has_network_url(aubio_source_avcodec_t *s); … … 115 112 116 113 117 aubio_source_avcodec_t * new_aubio_source_avcodec(const char_t * path, 118 uint_t samplerate, uint_t hop_size) { 114 aubio_source_avcodec_t * new_aubio_source_avcodec(const char_t * path, uint_t samplerate, uint_t hop_size) { 119 115 aubio_source_avcodec_t * s = AUBIO_NEW(aubio_source_avcodec_t); 120 116 AVFormatContext *avFormatCtx = s->avFormatCtx; … … 133 129 } 134 130 if ((sint_t)samplerate < 0) { 135 AUBIO_ERR("source_avcodec: Can not open %s with samplerate %d\n", 136 path, samplerate); 131 AUBIO_ERR("source_avcodec: Can not open %s with samplerate %d\n", path, samplerate); 137 132 goto beach; 138 133 } 139 134 if ((sint_t)hop_size <= 0) { 140 AUBIO_ERR("source_avcodec: Can not open %s with hop_size %d\n", 141 path, hop_size); 135 AUBIO_ERR("source_avcodec: Can not open %s with hop_size %d\n", path, hop_size); 142 136 goto beach; 143 137 } … … 179 173 char errorstr[256]; 180 174 av_strerror (err, errorstr, sizeof(errorstr)); 181 AUBIO_ERR("source_avcodec: Could not find stream information " 182 "for %s (%s)\n", s->path,errorstr);175 AUBIO_ERR("source_avcodec: Could not find stream information " "for %s (%s)\n", s->path, 176 errorstr); 183 177 goto beach; 184 178 } … … 220 214 avCodecCtx = avcodec_alloc_context3(codec); 221 215 if (!avCodecCtx) { 222 AUBIO_ERR("source_avcodec: Failed to allocate the %s codec context " 223 "for path %s\n", av_get_media_type_string(AVMEDIA_TYPE_AUDIO), 224 s->path); 216 AUBIO_ERR("source_avcodec: Failed to allocate the %s codec context for path %s\n", 217 av_get_media_type_string(AVMEDIA_TYPE_AUDIO), s->path); 225 218 goto beach; 226 219 } … … 237 230 /* Copy codec parameters from input stream to output codec context */ 238 231 if ((err = avcodec_parameters_to_context(avCodecCtx, codecpar)) < 0) { 239 AUBIO_ERR("source_avcodec: Failed to copy %s codec parameters to " 240 "decoder context for %s\n", 241 av_get_media_type_string(AVMEDIA_TYPE_AUDIO), s->path); 232 AUBIO_ERR("source_avcodec: Failed to copy %s codec parameters to decoder context for %s\n", 233 av_get_media_type_string(AVMEDIA_TYPE_AUDIO), s->path); 242 234 goto beach; 243 235 } … … 247 239 char errorstr[256]; 248 240 av_strerror (err, errorstr, sizeof(errorstr)); 249 AUBIO_ERR("source_avcodec: Could not load codec for %s (%s)\n", s->path, 250 errorstr); 241 AUBIO_ERR("source_avcodec: Could not load codec for %s (%s)\n", s->path, errorstr); 251 242 goto beach; 252 243 } … … 275 266 276 267 /* allocate output for avr */ 277 s->output = (smpl_t *)av_malloc(AUBIO_AVCODEC_MAX_BUFFER_SIZE 278 * sizeof(smpl_t)); 268 s->output = (smpl_t *)av_malloc(AUBIO_AVCODEC_MAX_BUFFER_SIZE * sizeof(smpl_t)); 279 269 280 270 s->read_samples = 0; … … 304 294 } 305 295 306 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s, 307 uint_t multi) 308 { 296 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s, uint_t multi) { 309 297 // create or reset resampler to/from mono/multi-channel 310 298 if ( (multi != s->multi) || (s->avr == NULL) ) { … … 321 309 #endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */ 322 310 323 av_opt_set_int(avr, "in_channel_layout", input_layout, 324 av_opt_set_int(avr, "out_channel_layout", output_layout, 325 av_opt_set_int(avr, "in_sample_rate", s->input_samplerate, 326 av_opt_set_int(avr, "out_sample_rate", s->samplerate, 311 av_opt_set_int(avr, "in_channel_layout", input_layout, 0); 312 av_opt_set_int(avr, "out_channel_layout", output_layout, 0); 313 av_opt_set_int(avr, "in_sample_rate", s->input_samplerate, 0); 314 av_opt_set_int(avr, "out_sample_rate", s->samplerate, 0); 327 315 av_opt_set_int(avr, "in_sample_fmt", s->avCodecCtx->sample_fmt, 0); 328 316 #if HAVE_AUBIO_DOUBLE 329 av_opt_set_int(avr, "out_sample_fmt", AV_SAMPLE_FMT_DBL, 330 #else 331 av_opt_set_int(avr, "out_sample_fmt", AV_SAMPLE_FMT_FLT, 317 av_opt_set_int(avr, "out_sample_fmt", AV_SAMPLE_FMT_DBL, 0); 318 #else 319 av_opt_set_int(avr, "out_sample_fmt", AV_SAMPLE_FMT_FLT, 0); 332 320 #endif 333 321 // TODO: use planar? … … 341 329 char errorstr[256]; 342 330 av_strerror (err, errorstr, sizeof(errorstr)); 343 AUBIO_ERR("source_avcodec: Could not open resampling context "344 " for %s (%s)\n",s->path, errorstr);331 AUBIO_ERR("source_avcodec: Could not open resampling context for %s (%s)\n", 332 s->path, errorstr); 345 333 return; 346 334 } … … 359 347 } 360 348 361 void aubio_source_avcodec_readframe(aubio_source_avcodec_t *s, 362 uint_t * read_samples) 363 { 349 void aubio_source_avcodec_readframe(aubio_source_avcodec_t *s, uint_t * read_samples) { 364 350 AVFormatContext *avFormatCtx = s->avFormatCtx; 365 351 AVCodecContext *avCodecCtx = s->avCodecCtx; … … 402 388 char errorstr[256]; 403 389 av_strerror (err, errorstr, sizeof(errorstr)); 404 AUBIO_ERR("source_avcodec: could not read frame in %s (%s)\n", 405 s->path, errorstr); 390 AUBIO_ERR("source_avcodec: could not read frame in %s (%s)\n", s->path, errorstr); 406 391 s->eof = 1; 407 392 goto beach; … … 421 406 if (ret < 0) { 422 407 if (ret == AVERROR(EAGAIN)) { 423 //AUBIO_WRN("source_avcodec: output is not available right now - " 424 // "user must try to send new input\n"); 408 //AUBIO_WRN("source_avcodec: output is not available right now - user must try to send new input\n"); 425 409 goto beach; 426 410 } else if (ret == AVERROR_EOF) { 427 AUBIO_WRN("source_avcodec: the decoder has been fully flushed, " 428 "and there will be no more output frames\n"); 411 AUBIO_WRN("source_avcodec: the decoder has been fully flushed, and there will be no more output frames\n"); 429 412 } else { 430 413 AUBIO_ERR("source_avcodec: decoding errors on %s\n", s->path); … … 441 424 #endif 442 425 if (got_frame == 0) { 443 AUBIO_WRN("source_avcodec: did not get a frame when reading %s\n", 444 s->path); 426 AUBIO_WRN("source_avcodec: did not get a frame when reading %s\n", s->path); 445 427 goto beach; 446 428 } … … 449 431 if (avFrame->channels != (sint_t)s->input_channels) { 450 432 AUBIO_WRN ("source_avcodec: trying to read from %d channel(s)," 451 "but configured for %d; is '%s' corrupt?\n", 452 avFrame->channels, s->input_channels, s->path); 453 goto beach; 454 } 455 #else 456 #warning "avutil < 53 is deprecated, crashes might occur on corrupt files" 433 "but configured for %d; is '%s' corrupt?\n", avFrame->channels, 434 s->input_channels, s->path); 435 goto beach; 436 } 457 437 #endif 458 438 … … 475 455 #endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */ 476 456 if (out_samples <= 0) { 477 AUBIO_WRN("source_avcodec: no sample found while converting frame (%s)\n", 478 s->path); 457 AUBIO_WRN("source_avcodec: no sample found while converting frame (%s)\n", s->path); 479 458 goto beach; 480 459 } … … 494 473 } 495 474 496 void aubio_source_avcodec_do(aubio_source_avcodec_t * s, fvec_t * read_data, 497 uint_t * read) { 475 void aubio_source_avcodec_do(aubio_source_avcodec_t * s, fvec_t * read_data, uint_t * read){ 498 476 uint_t i; 499 477 uint_t end = 0; … … 527 505 } 528 506 529 void aubio_source_avcodec_do_multi(aubio_source_avcodec_t * s, 530 fmat_t * read_data, uint_t * read) { 507 void aubio_source_avcodec_do_multi(aubio_source_avcodec_t * s, fmat_t * read_data, uint_t * read){ 531 508 uint_t i,j; 532 509 uint_t end = 0; … … 574 551 575 552 uint_t aubio_source_avcodec_seek (aubio_source_avcodec_t * s, uint_t pos) { 576 int64_t resampled_pos = 577 (uint_t)ROUND(pos * (s->input_samplerate * 1. / s->samplerate)); 553 int64_t resampled_pos = (uint_t)ROUND(pos * (s->input_samplerate * 1. / s->samplerate)); 578 554 int64_t min_ts = MAX(resampled_pos - 2000, 0); 579 555 int64_t max_ts = MIN(resampled_pos + 2000, INT64_MAX); … … 583 559 ret = AUBIO_OK; 584 560 } else { 585 AUBIO_ERR("source_avcodec: failed seeking in %s (file not opened?)", 586 s->path); 561 AUBIO_ERR("source_avcodec: failed seeking in %s (file not opened?)", s->path); 587 562 return ret; 588 563 } … … 595 570 min_ts, resampled_pos, max_ts, seek_flags); 596 571 if (ret < 0) { 597 AUBIO_ERR("source_avcodec: failed seeking to %d in file %s", 598 pos, s->path); 572 AUBIO_ERR("source_avcodec: failed seeking to %d in file %s", pos, s->path); 599 573 } 600 574 // reset read status -
src/mathutils.c
r088760e r45c2c5c 272 272 // if length is odd, middle element is moved to the end 273 273 if (2 * half < s->length) start ++; 274 #ifndef HAVE_ BLAS274 #ifndef HAVE_ATLAS 275 275 for (j = 0; j < half; j++) { 276 276 ELEM_SWAP (s->data[j], s->data[j + start]); … … 292 292 // if length is odd, middle element is moved to the beginning 293 293 if (2 * half < s->length) start ++; 294 #ifndef HAVE_ BLAS294 #ifndef HAVE_ATLAS 295 295 for (j = 0; j < half; j++) { 296 296 ELEM_SWAP (s->data[j], s->data[j + start]); … … 329 329 { 330 330 smpl_t energy = 0.; 331 #ifndef HAVE_ BLAS331 #ifndef HAVE_ATLAS 332 332 uint_t j; 333 333 for (j = 0; j < f->length; j++) { … … 523 523 /* log(freq/A-2)/log(2) */ 524 524 midi = freq / 6.875; 525 midi = LOG (midi) / 0.6931471805599 453;525 midi = LOG (midi) / 0.69314718055995; 526 526 midi *= 12; 527 527 midi -= 3; … … 535 535 if (midi > 140.) return 0.; // avoid infs 536 536 freq = (midi + 3.) / 12.; 537 freq = EXP (freq * 0.6931471805599 453);537 freq = EXP (freq * 0.69314718055995); 538 538 freq *= 6.875; 539 539 return freq; -
src/notes/notes.c
r088760e r45c2c5c 1 1 /* 2 Copyright (C) 2014 -2018Paul Brossier <piem@aubio.org>2 Copyright (C) 2014 Paul Brossier <piem@aubio.org> 3 3 4 4 This file is part of aubio. … … 26 26 27 27 #define AUBIO_DEFAULT_NOTES_SILENCE -70. 28 #define AUBIO_DEFAULT_NOTES_RELEASE_DROP 10.29 28 // increase to 10. for .1 cent precision 30 29 // or to 100. for .01 cent precision … … 58 57 59 58 uint_t isready; 60 61 smpl_t last_onset_level;62 smpl_t release_drop_level;63 59 }; 64 60 … … 106 102 aubio_notes_set_minioi_ms (o, AUBIO_DEFAULT_NOTES_MINIOI_MS); 107 103 108 o->last_onset_level = AUBIO_DEFAULT_NOTES_SILENCE;109 o->release_drop_level = AUBIO_DEFAULT_NOTES_RELEASE_DROP;110 111 104 return o; 112 105 … … 146 139 { 147 140 return aubio_onset_get_minioi_ms(o->onset); 148 }149 150 uint_t aubio_notes_set_release_drop(aubio_notes_t *o, smpl_t release_drop_level)151 {152 uint_t err = AUBIO_OK;153 if (release_drop_level <= 0.) {154 AUBIO_ERR("notes: release_drop should be >= 0, got %f\n", release_drop_level);155 err = AUBIO_FAIL;156 } else {157 o->release_drop_level = release_drop_level;158 }159 return err;160 }161 162 smpl_t aubio_notes_get_release_drop(const aubio_notes_t *o)163 {164 return o->release_drop_level;165 141 } 166 142 … … 209 185 //notes->data[0] = o->curnote; 210 186 //notes->data[1] = 0.; 211 //AUBIO_WRN("notes: sending note-off at onset, not enough level\n");212 187 notes->data[2] = o->curnote; 213 188 } else { … … 217 192 /* kill old note */ 218 193 //send_noteon(o->curnote,0, o->samplerate); 219 //AUBIO_WRN("notes: sending note-off at onset, new onset detected\n");220 194 notes->data[2] = o->curnote; 221 195 /* get and send new one */ … … 225 199 o->curnote = new_pitch; 226 200 } 227 o->last_onset_level = curlevel;228 201 } 229 202 } else { 230 if (curlevel < o->last_onset_level - o->release_drop_level) 231 { 232 // send note off 233 //AUBIO_WRN("notes: sending note-off, release detected\n"); 234 notes->data[0] = 0; 235 notes->data[1] = 0; 236 notes->data[2] = o->curnote; 237 // reset last_onset_level to silence_threshold 238 o->last_onset_level = o->silence_threshold; 239 o->curnote = 0; 240 } 241 else if (o->median) 242 { 203 if (o->median) { 243 204 if (o->isready > 0) 244 205 o->isready++; … … 247 208 /* kill old note */ 248 209 //send_noteon(curnote,0); 249 if (o->curnote != 0) 250 { 251 //AUBIO_WRN("notes: sending note-off, new note detected\n"); 252 notes->data[2] = o->curnote; 253 } 210 notes->data[2] = o->curnote; 254 211 o->newnote = aubio_notes_get_latest_note(o); 255 212 o->curnote = o->newnote; -
src/notes/notes.h
r088760e r45c2c5c 107 107 uint_t aubio_notes_set_minioi_ms (aubio_notes_t *o, smpl_t minioi_ms); 108 108 109 /** get notes object release drop level, in dB110 111 \param o notes detection object as returned by new_aubio_notes()112 113 \return current release drop level, in dB114 115 */116 smpl_t aubio_notes_get_release_drop (const aubio_notes_t *o);117 118 /** set note release drop level, in dB119 120 This function sets the release_drop_level parameter, in dB. When a new note121 is found, the current level in dB is measured. If the measured level drops122 under that initial level - release_drop_level, then a note-off will be123 emitted.124 125 Defaults to `10`, in dB.126 127 \note This parameter was added in version `0.4.8`. Results obtained with128 earlier versions can be reproduced by setting this value to `100`, so that129 note-off will not be played until the next note.130 131 \param o notes detection object as returned by new_aubio_notes()132 \param release_drop new release drop level, in dB133 134 \return 0 on success, non-zero otherwise135 136 */137 uint_t aubio_notes_set_release_drop (aubio_notes_t *o, smpl_t release_drop);138 139 109 #ifdef __cplusplus 140 110 } -
src/spectral/filterbank_mel.h
r088760e r45c2c5c 59 59 60 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 63 https://engineering.purdue.edu/~malcolm/interval/1998-010/ 61 Toolbox, available at http://engineering.purdue.edu/~malcolm/interval/1998-010/ 62 (see file mfcc.m). 64 63 65 64 */ -
src/spectral/mfcc.c
r088760e r45c2c5c 32 32 #include "spectral/mfcc.h" 33 33 34 #ifdef HAVE_NOOPT 35 #define HAVE_SLOW_DCT 1 36 #endif 34 #undef HAVE_SLOW_DCT 37 35 38 36 /** Internal structure for mfcc object */ -
src/spectral/mfcc.h
r088760e r45c2c5c 27 27 28 28 The implementation follows the specifications established by Malcolm Slaney 29 in its Auditory Toolbox, available online at the following address (see 30 file mfcc.m): 29 in its Auditory Toolbox, available online (see file mfcc.m). 31 30 32 http s://engineering.purdue.edu/~malcolm/interval/1998-010/31 http://engineering.ecn.purdue.edu/~malcolm/interval/1998-010/ 33 32 34 33 \example spectral/test-mfcc.c -
src/spectral/phasevoc.c
r088760e r45c2c5c 213 213 synthold[i] += synth[i + pv->hop_s] * pv->scale; 214 214 } 215 216 uint_t aubio_pvoc_get_win(aubio_pvoc_t* pv)217 {218 return pv->win_s;219 }220 221 uint_t aubio_pvoc_get_hop(aubio_pvoc_t* pv)222 {223 return pv->hop_s;224 } -
src/spectral/phasevoc.h
r088760e r45c2c5c 89 89 */ 90 90 uint_t aubio_pvoc_get_win(aubio_pvoc_t* pv); 91 92 91 /** get hop size 93 92 -
src/synth/wavetable.c
r088760e r45c2c5c 165 165 aubio_wavetable_set_amp (s, 0.); 166 166 //s->last_pos = 0; 167 return aubio_wavetable_set_playing (s, 0);167 return aubio_wavetable_set_playing (s, 1); 168 168 } 169 169 -
src/synth/wavetable.h
r088760e r45c2c5c 51 51 */ 52 52 aubio_wavetable_t * new_aubio_wavetable(uint_t samplerate, uint_t hop_size); 53 54 /** load source in wavetable 55 56 \param o wavetable, created by new_aubio_wavetable() 57 \param uri the uri of the source to load 58 59 \return 0 if successful, non-zero otherwise 60 61 */ 62 uint_t aubio_wavetable_load( aubio_wavetable_t * o, const char_t * uri ); 53 63 54 64 /** process wavetable function -
wscript
r088760e r45c2c5c 84 84 help_str = 'use CoreFoundation (darwin only) (auto)', 85 85 help_disable_str = 'do not use CoreFoundation framework') 86 add_option_enable_disable(ctx, 'blas', default = False,87 help_str = 'use BLAS acceleration library (no)',88 help_disable_str = 'do not use BLAS library')89 86 add_option_enable_disable(ctx, 'atlas', default = False, 90 help_str = 'use A TLAS accelerationlibrary (no)',91 help_disable_str = 'do not use A TLASlibrary')87 help_str = 'use Atlas library (no)', 88 help_disable_str = 'do not use Atlas library') 92 89 add_option_enable_disable(ctx, 'wavread', default = True, 93 90 help_str = 'compile with source_wavread (default)', … … 100 97 help_str = 'build documentation (auto)', 101 98 help_disable_str = 'do not build documentation') 102 103 add_option_enable_disable(ctx, 'tests', default = True,104 help_str = 'build tests (true)',105 help_disable_str = 'do not build or run tests')106 107 add_option_enable_disable(ctx, 'examples', default = True,108 help_str = 'build examples (true)',109 help_disable_str = 'do not build examples')110 99 111 100 ctx.add_option('--with-target-platform', type='string', … … 276 265 c_mangled_names = ['_' + s for s in exported_funcnames] 277 266 ctx.env.LINKFLAGS_cshlib += ['-s', 'EXPORTED_FUNCTIONS=%s' % c_mangled_names] 267 268 if (ctx.options.enable_atlas != True): 269 ctx.options.enable_atlas = False 278 270 279 271 # check support for C99 __VA_ARGS__ macros … … 427 419 ctx.msg('Checking if using sink_wavwrite', ctx.options.enable_wavwrite and 'yes' or 'no') 428 420 429 # use BLAS/ATLAS 430 if (ctx.options.enable_blas != False): 431 ctx.check_cfg(package = 'blas', 432 args = '--cflags --libs', 433 uselib_store='BLAS', mandatory = ctx.options.enable_blas) 434 if 'LIB_BLAS' in ctx.env: 435 blas_header = None 436 if ctx.env['LIBPATH_BLAS']: 437 if 'atlas' in ctx.env['LIBPATH_BLAS'][0]: 438 blas_header = 'atlas/cblas.h' 439 elif 'openblas' in ctx.env['LIBPATH_BLAS'][0]: 440 blas_header = 'openblas/cblas.h' 441 else: 442 blas_header = 'cblas.h' 443 ctx.check(header_name = blas_header, mandatory = 444 ctx.options.enable_atlas) 421 # use ATLAS 422 if (ctx.options.enable_atlas != False): 423 ctx.check(header_name = 'atlas/cblas.h', mandatory = ctx.options.enable_atlas) 424 #ctx.check(lib = 'lapack', uselib_store = 'LAPACK', mandatory = ctx.options.enable_atlas) 425 ctx.check(lib = 'cblas', uselib_store = 'BLAS', mandatory = ctx.options.enable_atlas) 445 426 446 427 # use memcpy hacks … … 493 474 if bld.env['DEST_OS']=='emscripten' and not bld.options.testcmd: 494 475 bld.options.testcmd = 'node %s' 495 if bld.options.enable_examples: 496 bld.recurse('examples') 497 if bld.options.enable_tests: 498 bld.recurse('tests') 476 bld.recurse('examples') 477 bld.recurse('tests') 499 478 500 479 # pkg-config template … … 606 585 ctx.excl += ' **/.landscape.yml' 607 586 ctx.excl += ' **/.appveyor.yml' 608 ctx.excl += ' **/.circleci/*' 609 ctx.excl += ' **/azure-pipelines.yml' 610 ctx.excl += ' **/.coveragerc' 587 ctx.excl += ' **/circlei.yml'
Note: See TracChangeset
for help on using the changeset viewer.