- Timestamp:
- Oct 31, 2018, 10:26:52 PM (6 years ago)
- Branches:
- feature/constantq
- Children:
- c03d191
- Parents:
- 45c2c5c (diff), 7a54b37 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- python
- Files:
-
- 23 edited
Legend:
- Unmodified
- Added
- Removed
-
python/demos/demo_bpm_extract.py
r45c2c5c r088760e 23 23 pass 24 24 else: 25 print("unknown mode {:s}".format(params.mode))25 raise ValueError("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" )72 dest="mode", default='default') 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
r45c2c5c r088760e 1 1 #! /usr/bin/env python 2 2 3 import sys 4 import os.path 5 import aubio 3 6 4 def apply_filter(path): 5 from aubio import source, sink, digital_filter 6 from os.path import basename, splitext 7 7 def apply_filter(path, target): 8 8 # open input file, get its samplerate 9 s = source(path)9 s = aubio.source(path) 10 10 samplerate = s.samplerate 11 11 12 12 # create an A-weighting filter 13 f = digital_filter(7)13 f = aubio.digital_filter(7) 14 14 f.set_a_weighting(samplerate) 15 # alternatively, apply another filter16 15 17 16 # create output file 18 o = sink("filtered_" + splitext(basename(path))[0] + ".wav", samplerate)17 o = aubio.sink(target, samplerate) 19 18 20 19 total_frames = 0 21 20 while True: 21 # read from source 22 22 samples, read = s() 23 # filter samples 23 24 filtered_samples = f(samples) 25 # write to sink 24 26 o(filtered_samples, read) 27 # count frames read 25 28 total_frames += read 29 # end of file reached 26 30 if read < s.hop_size: break 27 31 32 # print some info 28 33 duration = total_frames / float(samplerate) 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)) 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)) 32 38 33 39 if __name__ == '__main__': 34 import sys 35 for f in sys.argv[1:]: 36 apply_filter(f) 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) -
python/demos/demo_source_simple.py
r45c2c5c r088760e 1 1 #! /usr/bin/env python 2 import sys, aubio 2 import sys 3 import aubio 3 4 4 samplerate = 0 5 samplerate = 0 # use original source samplerate 5 6 hop_size = 256 # number of frames to read in one block 6 s = aubio.source(sys.argv[1], samplerate, hop_size)7 src = aubio.source(sys.argv[1], samplerate, hop_size) 7 8 total_frames = 0 8 9 9 while True: # reading loop10 samples, read = s ()11 total_frames += read 10 while True: 11 samples, read = src() # read hop_size new samples from source 12 total_frames += read # increment total number of frames 12 13 if read < hop_size: break # end of file reached 13 14 14 15 fmt_string = "read {:d} frames at {:d}Hz from {:s}" 15 print (fmt_string.format(total_frames, s.samplerate, sys.argv[1])) 16 16 print (fmt_string.format(total_frames, src.samplerate, src.uri)) -
python/ext/aubiomodule.c
r45c2c5c r088760e 11 11 12 12 static char Py_alpha_norm_doc[] = "" 13 "alpha_norm(fvec, integer) -> float\n" 14 "\n" 15 "Compute alpha normalisation factor on vector, given alpha\n" 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" 16 28 "\n" 17 29 "Example\n" 18 30 "-------\n" 19 31 "\n" 20 ">>> b = alpha_norm(a, 9)"; 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 ""; 21 44 22 45 static char Py_bintomidi_doc[] = "" 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" 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" 26 64 "\n" 27 65 "Example\n" 28 66 "-------\n" 29 67 "\n" 30 ">>> midi = bintomidi(float, samplerate = 44100, fftsize = 1024)"; 68 ">>> aubio.bintomidi(10, 44100, 1024)\n" 69 "68.62871551513672\n" 70 ""; 31 71 32 72 static char Py_miditobin_doc[] = "" 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" 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 ""; 100 101 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" 36 120 "\n" 37 121 "Example\n" 38 122 "-------\n" 39 123 "\n" 40 ">>> bin = miditobin(midi, samplerate = 44100, fftsize = 1024)"; 41 42 static char Py_bintofreq_doc[] = "" 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" 124 ">>> aubio.bintofreq(10, 44100, 1024)\n" 125 "430.6640625\n" 126 ""; 127 128 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 ""; 154 155 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" 46 169 "\n" 47 170 "Example\n" 48 171 "-------\n" 49 172 "\n" 50 ">>> freq = bintofreq(bin, samplerate = 44100, fftsize = 1024)"; 51 52 static char Py_freqtobin_doc[] = "" 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" 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 ""; 177 178 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" 56 194 "\n" 57 195 "Example\n" 58 196 "-------\n" 59 197 "\n" 60 ">>> bin = freqtobin(freq, samplerate = 44100, fftsize = 1024)"; 61 62 static char Py_zero_crossing_rate_doc[] = "" 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)"; 71 72 static char Py_min_removal_doc[] = "" 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)"; 198 ">>> aubio.min_removal(aubio.fvec(np.arange(1,4)))\n" 199 "array([0., 1., 2.], dtype=" AUBIO_NPY_SMPL_STR ")\n" 200 ""; 81 201 82 202 extern void add_ufuncs ( PyObject *m ); … … 118 238 smpl_t output; 119 239 120 if (!PyArg_ParseTuple (args, "|" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR , &input, &samplerate, &fftsize)) { 240 if (!PyArg_ParseTuple (args, 241 "" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, 242 &input, &samplerate, &fftsize)) { 121 243 return NULL; 122 244 } … … 133 255 smpl_t output; 134 256 135 if (!PyArg_ParseTuple (args, "|" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR , &input, &samplerate, &fftsize)) { 257 if (!PyArg_ParseTuple (args, 258 "" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, 259 &input, &samplerate, &fftsize)) { 136 260 return NULL; 137 261 } … … 148 272 smpl_t output; 149 273 150 if (!PyArg_ParseTuple (args, "|" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, &input, &samplerate, &fftsize)) { 274 if (!PyArg_ParseTuple (args, 275 "" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, 276 &input, &samplerate, &fftsize)) { 151 277 return NULL; 152 278 } … … 163 289 smpl_t output; 164 290 165 if (!PyArg_ParseTuple (args, "|" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, &input, &samplerate, &fftsize)) { 291 if (!PyArg_ParseTuple (args, 292 "" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, 293 &input, &samplerate, &fftsize)) { 166 294 return NULL; 167 295 } -
python/ext/py-cvec.c
r45c2c5c r088760e 20 20 } Py_cvec; 21 21 22 static char Py_cvec_doc[] = "cvec object"; 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 ""; 23 53 24 54 … … 183 213 // TODO remove READONLY flag and define getter/setter 184 214 {"length", T_INT, offsetof (Py_cvec, length), READONLY, 185 " length attribute"},215 "int: Length of `norm` and `phas` vectors."}, 186 216 {NULL} /* Sentinel */ 187 217 }; … … 192 222 193 223 static PyGetSetDef Py_cvec_getseters[] = { 194 {"norm", (getter)Py_cvec_get_norm, (setter)Py_cvec_set_norm, 195 " Numpy vector of shape (length,) containing the magnitude",224 {"norm", (getter)Py_cvec_get_norm, (setter)Py_cvec_set_norm, 225 "numpy.ndarray: Vector of shape `(length,)` containing the magnitude.", 196 226 NULL}, 197 {"phas", (getter)Py_cvec_get_phas, (setter)Py_cvec_set_phas, 198 " Numpy vector of shape (length,) containing the phase",227 {"phas", (getter)Py_cvec_get_phas, (setter)Py_cvec_set_phas, 228 "numpy.ndarray: Vector of shape `(length,)` containing the phase.", 199 229 NULL}, 200 230 {NULL} /* sentinel */ -
python/ext/py-filterbank.c
r45c2c5c r088760e 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 ftexpects length %d",97 "input cvec has length %d, but filterbank 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 setting filter to A-weighting");142 "error when running set_triangle_bands"); 143 143 return NULL; 144 144 } … … 159 159 if (err > 0) { 160 160 PyErr_SetString (PyExc_ValueError, 161 "error when setting filter to A-weighting");161 "error when running set_mel_coeffs_slaney"); 162 162 return NULL; 163 163 } -
python/ext/py-musicutils.h
r45c2c5c r088760e 3 3 4 4 static char Py_aubio_window_doc[] = "" 5 "window(string, integer) -> fvec\n" 6 "\n" 7 "Create a window\n" 8 "\n" 9 "Example\n" 10 "-------\n" 11 "\n" 12 ">>> window('hanningz', 1024)\n" 5 "window(window_type, size)\n" 6 "\n" 7 "Create a window of length `size`. `window_type` should be one\n" 8 "of the following:\n" 9 "\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" 21 "\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" 13 43 "array([ 0.00000000e+00, 9.41753387e-06, 3.76403332e-05, ...,\n" 14 " 8.46982002e-05, 3.76403332e-05, 9.41753387e-06], dtype=float32)"; 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 ""; 15 94 16 95 PyObject * Py_aubio_window(PyObject *self, PyObject *args); 17 96 18 97 static char Py_aubio_level_lin_doc[] = "" 19 "level_lin(fvec) -> fvec\n" 20 "\n" 21 "Compute sound level on a linear scale.\n" 22 "\n" 23 "This gives the average of the square amplitudes.\n" 24 "\n" 25 "Example\n" 26 "-------\n" 27 "\n" 28 ">>> level_Lin(numpy.ones(1024))\n" 29 "1.0"; 98 "level_lin(x)\n" 99 "\n" 100 "Compute sound pressure level of `x`, on a linear scale.\n" 101 "\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" 111 "\n" 112 "Example\n" 113 "-------\n" 114 "\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 ""; 30 128 31 129 PyObject * Py_aubio_level_lin(PyObject *self, PyObject *args); 32 130 33 131 static char Py_aubio_db_spl_doc[] = "" 34 "Compute sound pressure level (SPL) in dB\n" 35 "\n" 36 "This quantity is often wrongly called 'loudness'.\n" 37 "\n" 38 "This gives ten times the log10 of the average of the square amplitudes.\n" 39 "\n" 40 "Example\n" 41 "-------\n" 42 "\n" 43 ">>> db_spl(numpy.ones(1024))\n" 44 "1.0"; 132 "db_spl(x)\n" 133 "\n" 134 "Compute Sound Pressure Level (SPL) of `x`, in dB.\n" 135 "\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" 145 "\n" 146 "Example\n" 147 "-------\n" 148 "\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 ""; 45 168 46 169 PyObject * Py_aubio_db_spl(PyObject *self, PyObject *args); 47 170 48 171 static char Py_aubio_silence_detection_doc[] = "" 49 "Check if buffer level in dB SPL is under a given threshold\n" 50 "\n" 51 "Return 0 if level is under the given threshold, 1 otherwise.\n" 52 "\n" 53 "Example\n" 54 "-------\n" 55 "\n" 56 ">>> import numpy\n""" 57 ">>> silence_detection(numpy.ones(1024, dtype=\"float32\"), -80)\n" 58 "0"; 172 "silence_detection(vec, level)\n" 173 "\n" 174 "Check if level of `vec`, in dB SPL, is under a given threshold.\n" 175 "\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" 182 "\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 ""; 59 201 60 202 PyObject * Py_aubio_silence_detection(PyObject *self, PyObject *args); 61 203 62 204 static char Py_aubio_level_detection_doc[] = "" 63 "Get buffer level in dB SPL if over a given threshold, 1. otherwise.\n" 64 "\n" 65 "Example\n" 66 "-------\n" 67 "\n" 68 ">>> import numpy\n""" 69 ">>> level_detection(0.7*numpy.ones(1024, dtype=\"float32\"), -80)\n" 70 "0"; 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" 221 "\n" 222 "Example\n" 223 "-------\n" 224 "\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 ""; 71 234 72 235 PyObject * Py_aubio_level_detection(PyObject *self, PyObject *args); 73 236 74 237 static char Py_aubio_shift_doc[] = "" 75 "Swap left and right partitions of a vector\n" 76 "\n" 77 "Returns the swapped vector. The input vector is also modified.\n" 238 "shift(vec)\n" 239 "\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" 78 255 "\n" 79 256 "For a vector of length N, the partition is split at index N - N//2.\n" … … 82 259 "-------\n" 83 260 "\n" 84 ">>> import numpy\n" 85 ">>> shift(numpy.arange(3, dtype=aubio.float_type))\n" 86 "array([2., 0., 1.], dtype=" AUBIO_NPY_SMPL_STR ")"; 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 ""; 87 268 PyObject * Py_aubio_shift(PyObject *self, PyObject *args); 88 269 89 270 static char Py_aubio_ishift_doc[] = "" 90 "Swap right and left partitions of a vector\n" 91 "\n" 92 "Returns the swapped vector. The input vector is also modified.\n" 93 "\n" 94 "Unlike with shift(), the partition is split at index N//2.\n" 95 "\n" 96 "Example\n" 97 "-------\n" 98 "\n" 99 ">>> import numpy\n" 100 ">>> ishift(numpy.arange(3, dtype=aubio.float_type))\n" 101 "array([1., 2., 0.], dtype=" AUBIO_NPY_SMPL_STR ")"; 271 "ishift(vec)\n" 272 "\n" 273 "Swap right and left partitions of a vector, in-place.\n" 274 "\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" 290 "\n" 291 "Example\n" 292 "-------\n" 293 "\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 ""; 102 301 PyObject * Py_aubio_ishift(PyObject *self, PyObject *args); 103 302 -
python/ext/py-phasevoc.c
r45c2c5c r088760e 1 1 #include "aubio-types.h" 2 2 3 static char Py_pvoc_doc[] = "pvoc object"; 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 4 56 5 57 typedef struct … … 122 174 static PyMemberDef Py_pvoc_members[] = { 123 175 {"win_s", T_INT, offsetof (Py_pvoc, win_s), READONLY, 124 "size of the window"}, 176 "int: Size of phase vocoder analysis windows, in samples.\n" 177 ""}, 125 178 {"hop_s", T_INT, offsetof (Py_pvoc, hop_s), READONLY, 126 "size of the hop"}, 179 "int: Interval between two analysis, in samples.\n" 180 ""}, 127 181 { NULL } // sentinel 128 182 }; … … 176 230 static PyMethodDef Py_pvoc_methods[] = { 177 231 {"rdo", (PyCFunction) Py_pvoc_rdo, METH_VARARGS, 178 "synthesis of spectral grain"}, 179 {"set_window", (PyCFunction) Pyaubio_pvoc_set_window, 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 ""}, 180 273 {NULL} 181 274 }; -
python/ext/py-sink.c
r45c2c5c r088760e 13 13 14 14 static char Py_sink_doc[] = "" 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" 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" 46 50 "\n"; 47 51 48 52 static char Py_sink_do_doc[] = "" 49 "x.do(vec, write) <==> x(vec, write)\n" 50 "\n" 51 "write monophonic vector to sink"; 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 ""; 52 64 53 65 static char Py_sink_do_multi_doc[] = "" 54 "x.do_multi(mat, write)\n" 55 "\n" 56 "write polyphonic vector to sink"; 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 ""; 57 77 58 78 static char Py_sink_close_doc[] = "" 59 "x.close()\n" 60 "\n" 61 "close this sink now"; 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 ""; 62 87 63 88 static PyObject * … … 189 214 static PyMemberDef Py_sink_members[] = { 190 215 {"uri", T_STRING, offsetof (Py_sink, uri), READONLY, 191 " path at which the sink was created"},216 "str (read-only): Path at which the sink was created."}, 192 217 {"samplerate", T_INT, offsetof (Py_sink, samplerate), READONLY, 193 " samplerate at which the sink was created"},218 "int (read-only): Samplerate at which the sink was created."}, 194 219 {"channels", T_INT, offsetof (Py_sink, channels), READONLY, 195 " number of channels with which the sink was created"},220 "int (read-only): Number of channels with which the sink was created."}, 196 221 { NULL } // sentinel 197 222 }; -
python/ext/py-source.c
r45c2c5c r088760e 17 17 18 18 static char Py_source_doc[] = "" 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"; 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 ""; 51 217 52 218 static char Py_source_get_samplerate_doc[] = "" 53 "x.get_samplerate() -> source samplerate\n" 54 "\n" 55 "Get samplerate of source."; 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 ""; 56 228 57 229 static char Py_source_get_channels_doc[] = "" 58 "x.get_channels() -> number of channels\n" 59 "\n" 60 "Get number of channels in source."; 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 ""; 61 239 62 240 static char Py_source_do_doc[] = "" 63 "vec, read = x.do() <==> vec, read = x()\n" 64 "\n" 65 "Read monophonic vector from source."; 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 ""; 66 268 67 269 static char Py_source_do_multi_doc[] = "" 68 "mat, read = x.do_multi()\n" 69 "\n" 70 "Read polyphonic vector from source."; 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 ""; 71 307 72 308 static char Py_source_close_doc[] = "" 73 "x.close()\n" 74 "\n" 75 "Close this source now."; 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 ""; 76 315 77 316 static char Py_source_seek_doc[] = "" 78 "x.seek(position)\n" 79 "\n" 80 "Seek to resampled frame position."; 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 ""; 81 329 82 330 static PyObject * … … 218 466 static PyMemberDef Py_source_members[] = { 219 467 {"uri", T_STRING, offsetof (Py_source, uri), READONLY, 220 " path at which the source was created"},468 "str (read-only): pathname or URL"}, 221 469 {"samplerate", T_INT, offsetof (Py_source, samplerate), READONLY, 222 " samplerate at which the source is viewed"},470 "int (read-only): sampling rate"}, 223 471 {"channels", T_INT, offsetof (Py_source, channels), READONLY, 224 " number of channels found in the source"},472 "int (read-only): number of channels"}, 225 473 {"hop_size", T_INT, offsetof (Py_source, hop_size), READONLY, 226 " number of consecutive frames that will be read at each do or do_multi call"},474 "int (read-only): number of samples read per iteration"}, 227 475 {"duration", T_INT, offsetof (Py_source, duration), READONLY, 228 "total number of frames in the source (estimated)"}, 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 ""}, 229 491 { NULL } // sentinel 230 492 }; -
python/ext/ufuncs.c
r45c2c5c r088760e 59 59 }; 60 60 61 static char Py_unwrap2pi_doc[] = "map angle to unit circle [-pi, pi["; 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 ""; 62 77 63 78 static void* Py_unwrap2pi_data[] = { … … 68 83 }; 69 84 70 static char Py_freqtomidi_doc[] = "convert frequency to midi"; 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 ""; 71 99 72 100 static void* Py_freqtomidi_data[] = { … … 75 103 }; 76 104 77 static char Py_miditofreq_doc[] = "convert midi to frequency"; 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 ""; 78 119 79 120 static void* Py_miditofreq_data[] = { -
python/lib/aubio/__init__.py
r45c2c5c r088760e 1 1 #! /usr/bin/env python 2 # -*- coding: utf8 -*- 3 4 """ 5 aubio 6 ===== 7 8 Provides a number of classes and functions for music and audio signal 9 analysis. 10 11 How to use the documentation 12 ---------------------------- 13 14 Documentation of the python module is available as docstrings provided 15 within the code, and a reference guide available online from `the 16 aubio homepage <https://aubio.org/documentation>`_. 17 18 The docstrings examples are written assuming `aubio` and `numpy` have been 19 imported with: 20 21 >>> import aubio 22 >>> import numpy as np 23 """ 2 24 3 25 import numpy … … 9 31 10 32 class fvec(numpy.ndarray): 11 """a numpy vector holding audio samples""" 33 """fvec(input_arg=1024) 34 A vector holding float samples. 12 35 13 def __new__(cls, input_arg=1024, **kwargs): 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): 14 74 if isinstance(input_arg, int): 15 75 if input_arg == 0: 16 76 raise ValueError("vector length of 1 or more expected") 17 return numpy.zeros(input_arg, dtype=float_type, **kwargs)77 return numpy.zeros(input_arg, dtype=float_type, order='C') 18 78 else: 19 return numpy.array(input_arg, dtype=float_type, **kwargs) 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 -
python/lib/aubio/cmd.py
r45c2c5c r088760e 102 102 subparser.add_input() 103 103 subparser.add_buf_hop_size() 104 subparser.add_silence() 105 subparser.add_release_drop() 104 106 subparser.add_time_format() 105 107 subparser.add_verbose_help() … … 138 140 139 141 def parser_add_subcommand_cut(subparsers): 140 # quiet subcommand142 # cut subcommand 141 143 subparser = subparsers.add_parser('cut', 142 144 help='slice at timestamps') … … 207 209 action="store", dest="silence", default=-70, 208 210 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") 209 217 210 218 def add_minioi(self, default="12ms"): … … 248 256 action = "store", dest = "cut_until_nslices", default = None, 249 257 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") 250 261 251 262 # some utilities … … 380 391 self.parse_options(args, self.valid_opts) 381 392 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) 382 397 super(process_notes, self).__init__(args) 383 398 def __call__(self, block): … … 500 515 def main(): 501 516 parser = aubio_parser() 502 args = parser.parse_args() 517 if sys.version_info[0] != 3: 518 # on py2, create a dummy ArgumentParser to workaround the 519 # optional subcommand issue. See https://bugs.python.org/issue9253 520 # This ensures that: 521 # - version string is shown when only '-V' is passed 522 # - help is printed if '-V' is passed with any other argument 523 # - any other argument get forwarded to the real parser 524 parser_root = argparse.ArgumentParser(add_help=False) 525 parser_root.add_argument('-V', '--version', help="show version", 526 action="store_true", dest="show_version") 527 args, extras = parser_root.parse_known_args() 528 if args.show_version == False: # no -V, forward to parser 529 args = parser.parse_args(extras, namespace=args) 530 elif len(extras) != 0: # -V with other arguments, print help 531 parser.print_help() 532 sys.exit(1) 533 else: # in py3, we can simply use parser directly 534 args = parser.parse_args() 503 535 if 'show_version' in args and args.show_version: 504 536 sys.stdout.write('aubio version ' + aubio.version + '\n') -
python/lib/aubio/cut.py
r45c2c5c r088760e 102 102 s = source(source_uri, samplerate, hopsize) 103 103 if samplerate == 0: 104 samplerate = s. get_samplerate()104 samplerate = s.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) 153 samplerate = options.samplerate, 154 create_first = options.create_first) 154 155 155 156 def main(): -
python/lib/aubio/midiconv.py
r45c2c5c r088760e 2 2 """ utilities to convert midi note number to and from note names """ 3 3 4 __all__ = ['note2midi', 'midi2note', 'freq2note' ]4 __all__ = ['note2midi', 'midi2note', 'freq2note', 'note2freq'] 5 5 6 6 import sys 7 from ._aubio import freqtomidi, miditofreq 8 7 9 py3 = sys.version_info[0] == 3 8 10 if py3: … … 14 16 15 17 def note2midi(note): 16 " convert note name to midi note number, e.g. [C-1, G9] -> [0, 127] " 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 """ 17 58 _valid_notenames = {'C': 0, 'D': 2, 'E': 4, 'F': 5, 'G': 7, 'A': 9, 'B': 11} 18 59 _valid_modifiers = { … … 25 66 _valid_octaves = range(-1, 10) 26 67 if not isinstance(note, str_instances): 27 raise TypeError("a string is required, got %s (%s)" % (note, str(type(note)))) 68 msg = "a string is required, got {:s} ({:s})" 69 raise TypeError(msg.format(str(type(note)), repr(note))) 28 70 if len(note) not in range(2, 5): 29 raise ValueError("string of 2 to 4 characters expected, got %d (%s)" \30 %(len(note), note))71 msg = "string of 2 to 4 characters expected, got {:d} ({:s})" 72 raise ValueError(msg.format(len(note), note)) 31 73 notename, modifier, octave = [None]*3 32 74 … … 52 94 raise ValueError("%s is not a valid octave" % octave) 53 95 54 midi = 12 + octave * 12 + _valid_notenames[notename] + _valid_modifiers[modifier] 96 midi = 12 + octave * 12 + _valid_notenames[notename] \ 97 + _valid_modifiers[modifier] 55 98 if midi > 127: 56 99 raise ValueError("%s is outside of the range C-2 to G8" % note) … … 58 101 59 102 def midi2note(midi): 60 " convert midi note number to note name, e.g. [0, 127] -> [C-1, G9] " 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 """ 61 133 if not isinstance(midi, int_instances): 62 134 raise TypeError("an integer is required, got %s" % midi) 63 135 if midi not in range(0, 128): 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'] 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'] 66 140 return _valid_notenames[midi % 12] + str(int(midi / 12) - 1) 67 141 68 142 def freq2note(freq): 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))) 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) -
python/lib/aubio/slicing.py
r45c2c5c r088760e 7 7 8 8 def slice_source_at_stamps(source_file, timestamps, timestamps_end=None, 9 output_dir=None, samplerate=0, hopsize=256): 10 """ slice a sound file at given timestamps """ 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 """ 11 74 12 75 if timestamps is None or len(timestamps) == 0: 13 76 raise ValueError("no timestamps given") 14 77 15 if timestamps[0] != 0 :78 if timestamps[0] != 0 and create_first: 16 79 timestamps = [0] + timestamps 17 80 if timestamps_end is not None: … … 19 82 20 83 if timestamps_end is not None: 21 if len(timestamps_end) != len(timestamps): 84 if len(timestamps_end) == len(timestamps) - 1: 85 timestamps_end = timestamps_end + [_max_timestamp] 86 elif len(timestamps_end) != len(timestamps): 22 87 raise ValueError("len(timestamps_end) != len(timestamps)") 23 88 else: … … 49 114 vec, read = _source.do_multi() 50 115 # if the total number of frames read will exceed the next region start 51 iflen(regions) and total_frames + read >= regions[0][0]:116 while len(regions) and total_frames + read >= regions[0][0]: 52 117 #print "getting", regions[0], "at", total_frames 53 118 # get next region … … 76 141 # write remaining samples from current region 77 142 _sink.do_multi(vec[:, start:remaining], remaining - start) 78 #print "closing region", "remaining", remaining143 #print("closing region", "remaining", remaining) 79 144 # close this file 80 145 _sink.close() … … 83 148 _sink.do_multi(vec[:, start:read], read - start) 84 149 total_frames += read 150 # remove old slices 151 slices = list(filter(lambda s: s['end_stamp'] > total_frames, 152 slices)) 85 153 if read < hopsize: 86 154 break -
python/lib/gen_code.py
r45c2c5c r088760e 483 483 484 484 if (err > 0) {{ 485 PyErr_SetString (PyExc_ValueError, "error running aubio_{shortname}_set_{param}"); 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 }} 486 493 return NULL; 487 494 }} -
python/lib/gen_external.py
r45c2c5c r088760e 78 78 cpp_cmd = os.environ.get('CC', 'cc').split() 79 79 cpp_cmd += ['-E'] 80 cpp_cmd += ['-x', 'c'] # force C language (emcc defaults to c++) 80 if 'emcc' in cpp_cmd: 81 cpp_cmd += ['-x', 'c'] # emcc defaults to c++, force C language 81 82 return cpp_cmd 82 83 … … 85 86 ''' return a dense and preprocessed string of all c declarations implied by aubio.h 86 87 ''' 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 ''' 87 94 cpp_cmd = get_preprocessor() 88 95 … … 105 112 cpp_output = proc.stdout.read() 106 113 err_output = proc.stderr.read() 114 if err_output: 115 print("Warning: preprocessor produced errors or warnings:\n%s" \ 116 % err_output.decode('utf8')) 107 117 if not cpp_output: 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) 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) 111 125 if not isinstance(cpp_output, list): 112 126 cpp_output = [l.strip() for l in cpp_output.decode('utf8').split('\n')] 113 127 114 cpp_output = filter(lambda y: len(y) > 1, cpp_output) 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) 115 133 cpp_output = list(filter(lambda y: not y.startswith('#'), cpp_output)) 116 134 -
python/tests/test_aubio_cmd.py
r45c2c5c r088760e 20 20 21 21 def test_samples2seconds(self): 22 self.assertEqual(aubio.cmd.samples2seconds(3200, 32000), "0.100000\t") 22 self.assertEqual(aubio.cmd.samples2seconds(3200, 32000), 23 "0.100000\t") 23 24 24 25 def test_samples2milliseconds(self): 25 self.assertEqual(aubio.cmd.samples2milliseconds(3200, 32000), "100.000000\t") 26 self.assertEqual(aubio.cmd.samples2milliseconds(3200, 32000), 27 "100.000000\t") 26 28 27 29 def test_samples2samples(self): 28 self.assertEqual(aubio.cmd.samples2samples(3200, 32000), "3200\t") 30 self.assertEqual(aubio.cmd.samples2samples(3200, 32000), 31 "3200\t") 29 32 30 33 if __name__ == '__main__': -
python/tests/test_fvec.py
r45c2c5c r088760e 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) 62 70 63 71 class aubio_wrong_fvec_input(TestCase): -
python/tests/test_note2midi.py
r45c2c5c r088760e 4 4 from __future__ import unicode_literals 5 5 6 from aubio import note2midi, freq2note 6 from aubio import note2midi, freq2note, note2freq, float_type 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 (self):114 def test_freq2note_above(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) 117 134 118 135 if __name__ == '__main__': -
python/tests/test_notes.py
r45c2c5c r088760e 6 6 7 7 AUBIO_DEFAULT_NOTES_SILENCE = -70. 8 AUBIO_DEFAULT_NOTES_RELEASE_DROP = 10. 8 9 AUBIO_DEFAULT_NOTES_MINIOI_MS = 30. 9 10 … … 38 39 self.o.set_silence(val) 39 40 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 = 50 47 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 = -10 52 with self.assertRaises(ValueError): 53 self.o.set_release_drop(val) 40 54 41 55 from .utils import list_all_sounds -
python/tests/test_slicing.py
r45c2c5c r088760e 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, output_dir = self.output_dir) 26 slice_source_at_stamps(self.source_file, regions_start, 27 output_dir = self.output_dir, create_first=True) 27 28 28 29 def test_slice_start_beyond_end(self): 29 30 regions_start = [i*1000 for i in range(1, n_slices)] 30 31 regions_start += [count_samples_in_file(self.source_file) + 1000] 31 slice_source_at_stamps(self.source_file, regions_start, output_dir = self.output_dir) 32 slice_source_at_stamps(self.source_file, regions_start, 33 output_dir = self.output_dir, create_first=True) 32 34 33 35 def test_slice_start_every_blocksize(self): 34 36 hopsize = 200 35 regions_start = [i*hopsize for i in range( 1, n_slices)]37 regions_start = [i*hopsize for i in range(0, n_slices)] 36 38 slice_source_at_stamps(self.source_file, regions_start, output_dir = self.output_dir, 37 39 hopsize = 200) 40 41 def test_slice_start_every_half_blocksize(self): 42 hopsize = 200 43 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) 38 46 39 47 def tearDown(self): … … 92 100 "number of samples written different from number of original samples") 93 101 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 94 115 def tearDown(self): 95 116 shutil.rmtree(self.output_dir) … … 134 155 regions_end = None 135 156 slice_source_at_stamps (self.source_file, regions_start, regions_end, 136 output_dir = self.output_dir )157 output_dir = self.output_dir, create_first=True) 137 158 total_files = count_files_in_directory(self.output_dir) 138 159 assert_equal(n_slices, total_files,
Note: See TracChangeset
for help on using the changeset viewer.