Changes in / [81abf91:92948ab]
- Files:
-
- 30 edited
Legend:
- Unmodified
- Added
- Removed
-
azure-pipelines.yml
r81abf91 r92948ab 1 1 # configuration file for azure continuous integration 2 2 jobs: 3 4 3 - job: linux 5 4 pool: 6 5 vmImage: 'Ubuntu 16.04' 6 7 7 steps: 8 8 - script: | 9 9 make 10 10 displayName: 'make' 11 env:12 CFLAGS: -Werror13 14 11 - job: windows 15 12 pool: 16 13 vmIMage: 'VS2017-Win2016' 14 17 15 steps: 18 16 - script: | … … 26 24 pool: 27 25 vmIMage: macOS-10.13 26 28 27 steps: 29 28 - script: | … … 35 34 make 36 35 displayName: 'make' 37 env:38 CFLAGS: -Werror -
doc/about.rst
r81abf91 r92948ab 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/aubiomfcc.txt
r81abf91 r92948ab 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
r81abf91 r92948ab 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 is72 found to drop more than this amount since the last note has started, the73 note will be turned-off. Defaults to 10.74 75 71 -T, --timeformat format Set time format (samples, ms, seconds). Defaults to 76 72 seconds. -
doc/conf.py
r81abf91 r92948ab 46 46 # General information about the project. 47 47 project = u'aubio' 48 copyright = u'201 8, Paul Brossier'48 copyright = u'2016, Paul Brossier' 49 49 50 50 # The version info for the project you're documenting, acts as replacement for -
doc/python_module.rst
r81abf91 r92948ab 80 80 .. _demo_filter.py: https://github.com/aubio/aubio/blob/master/python/demos/demo_filter.py 81 81 .. _python tests: https://github.com/aubio/aubio/blob/master/python/tests 82 -
examples/aubionotes.c
r81abf91 r92948ab 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
r81abf91 r92948ab 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 … … 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 … … 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
r81abf91 r92948ab 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 -
python/demos/demo_bpm_extract.py
r81abf91 r92948ab 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/ext/aubiomodule.c
r81abf91 r92948ab 238 238 smpl_t output; 239 239 240 if (!PyArg_ParseTuple (args, 241 "" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, 242 &input, &samplerate, &fftsize)) { 240 if (!PyArg_ParseTuple (args, "|" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR , &input, &samplerate, &fftsize)) { 243 241 return NULL; 244 242 } … … 255 253 smpl_t output; 256 254 257 if (!PyArg_ParseTuple (args, 258 "" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, 259 &input, &samplerate, &fftsize)) { 255 if (!PyArg_ParseTuple (args, "|" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR , &input, &samplerate, &fftsize)) { 260 256 return NULL; 261 257 } … … 272 268 smpl_t output; 273 269 274 if (!PyArg_ParseTuple (args, 275 "" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, 276 &input, &samplerate, &fftsize)) { 270 if (!PyArg_ParseTuple (args, "|" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, &input, &samplerate, &fftsize)) { 277 271 return NULL; 278 272 } … … 289 283 smpl_t output; 290 284 291 if (!PyArg_ParseTuple (args, 292 "" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, 293 &input, &samplerate, &fftsize)) { 285 if (!PyArg_ParseTuple (args, "|" AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR, &input, &samplerate, &fftsize)) { 294 286 return NULL; 295 287 } -
python/ext/py-filterbank.c
r81abf91 r92948ab 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/lib/aubio/cmd.py
r81abf91 r92948ab 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() … … 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
r81abf91 r92948ab 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
r81abf91 r92948ab 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: … … 27 25 _valid_octaves = range(-1, 10) 28 26 if not isinstance(note, str_instances): 29 msg = "a string is required, got {:s} ({:s})" 30 raise TypeError(msg.format(str(type(note)), repr(note))) 27 raise TypeError("a string is required, got %s (%s)" % (note, str(type(note)))) 31 28 if len(note) not in range(2, 5): 32 msg = "string of 2 to 4 characters expected, got {:d} ({:s})"33 raise ValueError(msg.format(len(note), note))29 raise ValueError("string of 2 to 4 characters expected, got %d (%s)" \ 30 % (len(note), note)) 34 31 notename, modifier, octave = [None]*3 35 32 … … 55 52 raise ValueError("%s is not a valid octave" % octave) 56 53 57 midi = 12 + octave * 12 + _valid_notenames[notename] \ 58 + _valid_modifiers[modifier] 54 midi = 12 + octave * 12 + _valid_notenames[notename] + _valid_modifiers[modifier] 59 55 if midi > 127: 60 56 raise ValueError("%s is outside of the range C-2 to G8" % note) … … 66 62 raise TypeError("an integer is required, got %s" % midi) 67 63 if midi not in range(0, 128): 68 msg = "an integer between 0 and 127 is excepted, got {:d}" 69 raise ValueError(msg.format(midi)) 70 _valid_notenames = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 71 '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'] 72 66 return _valid_notenames[midi % 12] + str(int(midi / 12) - 1) 73 67 74 68 def freq2note(freq): 75 69 " convert frequency in Hz to nearest note name, e.g. [0, 22050.] -> [C-1, G9] " 76 nearest_note = int(freqtomidi(freq) + .5) 77 return midi2note(nearest_note) 78 79 def note2freq(note): 80 """Convert note name to corresponding frequency, in Hz. 81 82 Parameters 83 ---------- 84 note : str 85 input note name 86 87 Returns 88 ------- 89 freq : float [0, 23000[ 90 frequency, in Hz 91 92 Example 93 ------- 94 >>> aubio.note2freq('A4') 95 440 96 >>> aubio.note2freq('A3') 97 220.1 98 """ 99 midi = note2midi(note) 100 return miditofreq(midi) 70 from aubio import freqtomidi 71 return midi2note(int(freqtomidi(freq))) -
python/lib/aubio/slicing.py
r81abf91 r92948ab 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): 9 output_dir=None, samplerate=0, hopsize=256): 11 10 """ slice a sound file at given timestamps """ 12 11 … … 14 13 raise ValueError("no timestamps given") 15 14 16 if timestamps[0] != 0 and create_first:15 if timestamps[0] != 0: 17 16 timestamps = [0] + timestamps 18 17 if timestamps_end is not None: … … 20 19 21 20 if timestamps_end is not None: 22 if len(timestamps_end) == len(timestamps) - 1: 23 timestamps_end = timestamps_end + [_max_timestamp] 24 elif len(timestamps_end) != len(timestamps): 21 if len(timestamps_end) != len(timestamps): 25 22 raise ValueError("len(timestamps_end) != len(timestamps)") 26 23 else: … … 52 49 vec, read = _source.do_multi() 53 50 # if the total number of frames read will exceed the next region start 54 whilelen(regions) and total_frames + read >= regions[0][0]:51 if len(regions) and total_frames + read >= regions[0][0]: 55 52 #print "getting", regions[0], "at", total_frames 56 53 # get next region … … 79 76 # write remaining samples from current region 80 77 _sink.do_multi(vec[:, start:remaining], remaining - start) 81 #print ("closing region", "remaining", remaining)78 #print "closing region", "remaining", remaining 82 79 # close this file 83 80 _sink.close() … … 86 83 _sink.do_multi(vec[:, start:read], read - start) 87 84 total_frames += read 88 # remove old slices89 slices = list(filter(lambda s: s['end_stamp'] > total_frames,90 slices))91 85 if read < hopsize: 92 86 break -
python/tests/test_aubio_cmd.py
r81abf91 r92948ab 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_note2midi.py
r81abf91 r92948ab 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
r81abf91 r92948ab 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
r81abf91 r92948ab 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, -
src/io/source_avcodec.c
r81abf91 r92948ab 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
r81abf91 r92948ab 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
r81abf91 r92948ab 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
r81abf91 r92948ab 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
r81abf91 r92948ab 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.h
r81abf91 r92948ab 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
r81abf91 r92948ab 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
r81abf91 r92948ab 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
r81abf91 r92948ab 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
r81abf91 r92948ab 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
Note: See TracChangeset
for help on using the changeset viewer.