Changes in / [92948ab:81abf91]
- Files:
-
- 30 edited
Legend:
- Unmodified
- Added
- Removed
-
azure-pipelines.yml
r92948ab r81abf91 1 1 # configuration file for azure continuous integration 2 2 jobs: 3 3 4 - job: linux 4 5 pool: 5 6 vmImage: 'Ubuntu 16.04' 6 7 7 steps: 8 8 - script: | 9 9 make 10 10 displayName: 'make' 11 env: 12 CFLAGS: -Werror 13 11 14 - job: windows 12 15 pool: 13 16 vmIMage: 'VS2017-Win2016' 14 15 17 steps: 16 18 - script: | … … 24 26 pool: 25 27 vmIMage: macOS-10.13 26 27 28 steps: 28 29 - script: | … … 34 35 make 35 36 displayName: 'make' 37 env: 38 CFLAGS: -Werror -
doc/about.rst
r92948ab r81abf91 60 60 ------- 61 61 62 aubio is a `free <http ://www.debian.org/intro/free>`_ and `open source62 aubio is a `free <https://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
r92948ab r81abf91 52 52 url: 53 53 54 http ://cobweb.ecn.purdue.edu/~malcolm/interval/1998-010/ (see file mfcc.m)54 https://engineering.purdue.edu/~malcolm/interval/1998-010/ (see file mfcc.m) 55 55 56 56 SEE ALSO -
doc/aubionotes.txt
r92948ab r81abf91 7 7 aubionotes [[-i] source] 8 8 [-r rate] [-B win] [-H hop] 9 [-O method] [-t thres] 9 [-O method] [-t thres] [-d drop] 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 is 72 found to drop more than this amount since the last note has started, the 73 note will be turned-off. Defaults to 10. 74 71 75 -T, --timeformat format Set time format (samples, ms, seconds). Defaults to 72 76 seconds. -
doc/conf.py
r92948ab r81abf91 46 46 # General information about the project. 47 47 project = u'aubio' 48 copyright = u'201 6, Paul Brossier'48 copyright = u'2018, Paul Brossier' 49 49 50 50 # The version info for the project you're documenting, acts as replacement for -
doc/python_module.rst
r92948ab r81abf91 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
r92948ab r81abf91 22 22 #define PROG_HAS_PITCH 1 23 23 #define PROG_HAS_ONSET 1 24 #define PROG_HAS_NOTES 1 24 25 #define PROG_HAS_SILENCE 1 25 26 #define PROG_HAS_JACK 1 … … 83 84 } 84 85 } 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 } 85 92 86 93 examples_common_process((aubio_process_func_t)process_block, process_print); -
examples/parse_args.h
r92948ab r81abf91 48 48 // more general stuff 49 49 extern smpl_t silence_threshold; 50 extern smpl_t release_drop; 50 51 extern uint_t mix_input; 51 52 // midi tap … … 108 109 " a value in dB, for instance -70, or -100; default=-90\n" 109 110 #endif /* PROG_HAS_SILENCE */ 111 #ifdef PROG_HAS_NOTES 112 " -d --release-drop select release drop threshold\n" 113 " a positive value in dB; default=10\n" 114 #endif 110 115 " -T --time-format select time values output format\n" 111 116 " (samples, ms, seconds) default=seconds\n" … … 158 163 "s:" 159 164 #endif /* PROG_HAS_SILENCE */ 165 #ifdef PROG_HAS_NOTES 166 "d:" 167 #endif /* PROG_HAS_SILENCE */ 160 168 #ifdef PROG_HAS_OUTPUT 161 169 "mf" … … 193 201 {"silence", 1, NULL, 's'}, 194 202 #endif /* PROG_HAS_SILENCE */ 203 #ifdef PROG_HAS_NOTES 204 {"release-drop", 1, NULL, 'd'}, 205 #endif /* PROG_HAS_NOTES */ 195 206 {"time-format", 1, NULL, 'T'}, 196 207 #ifdef PROG_HAS_OUTPUT … … 274 285 case 's': /* silence threshold */ 275 286 silence_threshold = (smpl_t) atof (optarg); 287 break; 288 case 'd': /* release-drop threshold */ 289 release_drop = (smpl_t) atof (optarg); 276 290 break; 277 291 case 'm': /* mix_input flag */ -
examples/utils.c
r92948ab r81abf91 55 55 // more general stuff 56 56 smpl_t silence_threshold = -90.; 57 smpl_t release_drop = 10.; 57 58 uint_t mix_input = 0; 58 59 -
python/demos/demo_bpm_extract.py
r92948ab r81abf91 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/ext/aubiomodule.c
r92948ab r81abf91 238 238 smpl_t output; 239 239 240 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)) { 241 243 return NULL; 242 244 } … … 253 255 smpl_t output; 254 256 255 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)) { 256 260 return NULL; 257 261 } … … 268 272 smpl_t output; 269 273 270 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)) { 271 277 return NULL; 272 278 } … … 283 289 smpl_t output; 284 290 285 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)) { 286 294 return NULL; 287 295 } -
python/ext/py-filterbank.c
r92948ab r81abf91 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/lib/aubio/cmd.py
r92948ab r81abf91 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() … … 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
r92948ab r81abf91 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
r92948ab r81abf91 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: … … 25 27 _valid_octaves = range(-1, 10) 26 28 if not isinstance(note, str_instances): 27 raise TypeError("a string is required, got %s (%s)" % (note, str(type(note)))) 29 msg = "a string is required, got {:s} ({:s})" 30 raise TypeError(msg.format(str(type(note)), repr(note))) 28 31 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))32 msg = "string of 2 to 4 characters expected, got {:d} ({:s})" 33 raise ValueError(msg.format(len(note), note)) 31 34 notename, modifier, octave = [None]*3 32 35 … … 52 55 raise ValueError("%s is not a valid octave" % octave) 53 56 54 midi = 12 + octave * 12 + _valid_notenames[notename] + _valid_modifiers[modifier] 57 midi = 12 + octave * 12 + _valid_notenames[notename] \ 58 + _valid_modifiers[modifier] 55 59 if midi > 127: 56 60 raise ValueError("%s is outside of the range C-2 to G8" % note) … … 62 66 raise TypeError("an integer is required, got %s" % midi) 63 67 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'] 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'] 66 72 return _valid_notenames[midi % 12] + str(int(midi / 12) - 1) 67 73 68 74 def freq2note(freq): 69 75 " 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))) 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) -
python/lib/aubio/slicing.py
r92948ab r81abf91 7 7 8 8 def slice_source_at_stamps(source_file, timestamps, timestamps_end=None, 9 output_dir=None, samplerate=0, hopsize=256): 9 output_dir=None, samplerate=0, hopsize=256, 10 create_first=False): 10 11 """ slice a sound file at given timestamps """ 11 12 … … 13 14 raise ValueError("no timestamps given") 14 15 15 if timestamps[0] != 0 :16 if timestamps[0] != 0 and create_first: 16 17 timestamps = [0] + timestamps 17 18 if timestamps_end is not None: … … 19 20 20 21 if timestamps_end is not None: 21 if len(timestamps_end) != len(timestamps): 22 if len(timestamps_end) == len(timestamps) - 1: 23 timestamps_end = timestamps_end + [_max_timestamp] 24 elif len(timestamps_end) != len(timestamps): 22 25 raise ValueError("len(timestamps_end) != len(timestamps)") 23 26 else: … … 49 52 vec, read = _source.do_multi() 50 53 # if the total number of frames read will exceed the next region start 51 iflen(regions) and total_frames + read >= regions[0][0]:54 while len(regions) and total_frames + read >= regions[0][0]: 52 55 #print "getting", regions[0], "at", total_frames 53 56 # get next region … … 76 79 # write remaining samples from current region 77 80 _sink.do_multi(vec[:, start:remaining], remaining - start) 78 #print "closing region", "remaining", remaining81 #print("closing region", "remaining", remaining) 79 82 # close this file 80 83 _sink.close() … … 83 86 _sink.do_multi(vec[:, start:read], read - start) 84 87 total_frames += read 88 # remove old slices 89 slices = list(filter(lambda s: s['end_stamp'] > total_frames, 90 slices)) 85 91 if read < hopsize: 86 92 break -
python/tests/test_aubio_cmd.py
r92948ab r81abf91 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_note2midi.py
r92948ab r81abf91 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
r92948ab r81abf91 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
r92948ab r81abf91 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, -
src/io/source_avcodec.c
r92948ab r81abf91 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 through57.2.10037 // max_analyze_duration2 was used from ffmpeg libavformat 55.43.100 -> 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 // 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); 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); 98 101 99 102 uint_t aubio_source_avcodec_has_network_url(aubio_source_avcodec_t *s); … … 112 115 113 116 114 aubio_source_avcodec_t * new_aubio_source_avcodec(const char_t * path, uint_t samplerate, uint_t hop_size) { 117 aubio_source_avcodec_t * new_aubio_source_avcodec(const char_t * path, 118 uint_t samplerate, uint_t hop_size) { 115 119 aubio_source_avcodec_t * s = AUBIO_NEW(aubio_source_avcodec_t); 116 120 AVFormatContext *avFormatCtx = s->avFormatCtx; … … 129 133 } 130 134 if ((sint_t)samplerate < 0) { 131 AUBIO_ERR("source_avcodec: Can not open %s with samplerate %d\n", path, samplerate); 135 AUBIO_ERR("source_avcodec: Can not open %s with samplerate %d\n", 136 path, samplerate); 132 137 goto beach; 133 138 } 134 139 if ((sint_t)hop_size <= 0) { 135 AUBIO_ERR("source_avcodec: Can not open %s with hop_size %d\n", path, hop_size); 140 AUBIO_ERR("source_avcodec: Can not open %s with hop_size %d\n", 141 path, hop_size); 136 142 goto beach; 137 143 } … … 173 179 char errorstr[256]; 174 180 av_strerror (err, errorstr, sizeof(errorstr)); 175 AUBIO_ERR("source_avcodec: Could not find stream information " "for %s (%s)\n", s->path,176 errorstr);181 AUBIO_ERR("source_avcodec: Could not find stream information " 182 "for %s (%s)\n", s->path, errorstr); 177 183 goto beach; 178 184 } … … 214 220 avCodecCtx = avcodec_alloc_context3(codec); 215 221 if (!avCodecCtx) { 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); 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); 218 225 goto beach; 219 226 } … … 230 237 /* Copy codec parameters from input stream to output codec context */ 231 238 if ((err = avcodec_parameters_to_context(avCodecCtx, codecpar)) < 0) { 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); 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); 234 242 goto beach; 235 243 } … … 239 247 char errorstr[256]; 240 248 av_strerror (err, errorstr, sizeof(errorstr)); 241 AUBIO_ERR("source_avcodec: Could not load codec for %s (%s)\n", s->path, errorstr); 249 AUBIO_ERR("source_avcodec: Could not load codec for %s (%s)\n", s->path, 250 errorstr); 242 251 goto beach; 243 252 } … … 266 275 267 276 /* allocate output for avr */ 268 s->output = (smpl_t *)av_malloc(AUBIO_AVCODEC_MAX_BUFFER_SIZE * sizeof(smpl_t)); 277 s->output = (smpl_t *)av_malloc(AUBIO_AVCODEC_MAX_BUFFER_SIZE 278 * sizeof(smpl_t)); 269 279 270 280 s->read_samples = 0; … … 294 304 } 295 305 296 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s, uint_t multi) { 306 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s, 307 uint_t multi) 308 { 297 309 // create or reset resampler to/from mono/multi-channel 298 310 if ( (multi != s->multi) || (s->avr == NULL) ) { … … 309 321 #endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */ 310 322 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);323 av_opt_set_int(avr, "in_channel_layout", input_layout, 0); 324 av_opt_set_int(avr, "out_channel_layout", output_layout, 0); 325 av_opt_set_int(avr, "in_sample_rate", s->input_samplerate, 0); 326 av_opt_set_int(avr, "out_sample_rate", s->samplerate, 0); 315 327 av_opt_set_int(avr, "in_sample_fmt", s->avCodecCtx->sample_fmt, 0); 316 328 #if HAVE_AUBIO_DOUBLE 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);329 av_opt_set_int(avr, "out_sample_fmt", AV_SAMPLE_FMT_DBL, 0); 330 #else 331 av_opt_set_int(avr, "out_sample_fmt", AV_SAMPLE_FMT_FLT, 0); 320 332 #endif 321 333 // TODO: use planar? … … 329 341 char errorstr[256]; 330 342 av_strerror (err, errorstr, sizeof(errorstr)); 331 AUBIO_ERR("source_avcodec: Could not open resampling context for %s (%s)\n",332 s->path, errorstr);343 AUBIO_ERR("source_avcodec: Could not open resampling context" 344 " for %s (%s)\n", s->path, errorstr); 333 345 return; 334 346 } … … 347 359 } 348 360 349 void aubio_source_avcodec_readframe(aubio_source_avcodec_t *s, uint_t * read_samples) { 361 void aubio_source_avcodec_readframe(aubio_source_avcodec_t *s, 362 uint_t * read_samples) 363 { 350 364 AVFormatContext *avFormatCtx = s->avFormatCtx; 351 365 AVCodecContext *avCodecCtx = s->avCodecCtx; … … 388 402 char errorstr[256]; 389 403 av_strerror (err, errorstr, sizeof(errorstr)); 390 AUBIO_ERR("source_avcodec: could not read frame in %s (%s)\n", s->path, errorstr); 404 AUBIO_ERR("source_avcodec: could not read frame in %s (%s)\n", 405 s->path, errorstr); 391 406 s->eof = 1; 392 407 goto beach; … … 406 421 if (ret < 0) { 407 422 if (ret == AVERROR(EAGAIN)) { 408 //AUBIO_WRN("source_avcodec: output is not available right now - user must try to send new input\n"); 423 //AUBIO_WRN("source_avcodec: output is not available right now - " 424 // "user must try to send new input\n"); 409 425 goto beach; 410 426 } else if (ret == AVERROR_EOF) { 411 AUBIO_WRN("source_avcodec: the decoder has been fully flushed, and there will be no more output frames\n"); 427 AUBIO_WRN("source_avcodec: the decoder has been fully flushed, " 428 "and there will be no more output frames\n"); 412 429 } else { 413 430 AUBIO_ERR("source_avcodec: decoding errors on %s\n", s->path); … … 424 441 #endif 425 442 if (got_frame == 0) { 426 AUBIO_WRN("source_avcodec: did not get a frame when reading %s\n", s->path); 443 AUBIO_WRN("source_avcodec: did not get a frame when reading %s\n", 444 s->path); 427 445 goto beach; 428 446 } … … 431 449 if (avFrame->channels != (sint_t)s->input_channels) { 432 450 AUBIO_WRN ("source_avcodec: trying to read from %d channel(s)," 433 "but configured for %d; is '%s' corrupt?\n", avFrame->channels, 434 s->input_channels, s->path); 435 goto beach; 436 } 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" 437 457 #endif 438 458 … … 455 475 #endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */ 456 476 if (out_samples <= 0) { 457 AUBIO_WRN("source_avcodec: no sample found while converting frame (%s)\n", s->path); 477 AUBIO_WRN("source_avcodec: no sample found while converting frame (%s)\n", 478 s->path); 458 479 goto beach; 459 480 } … … 473 494 } 474 495 475 void aubio_source_avcodec_do(aubio_source_avcodec_t * s, fvec_t * read_data, uint_t * read){ 496 void aubio_source_avcodec_do(aubio_source_avcodec_t * s, fvec_t * read_data, 497 uint_t * read) { 476 498 uint_t i; 477 499 uint_t end = 0; … … 505 527 } 506 528 507 void aubio_source_avcodec_do_multi(aubio_source_avcodec_t * s, fmat_t * read_data, uint_t * read){ 529 void aubio_source_avcodec_do_multi(aubio_source_avcodec_t * s, 530 fmat_t * read_data, uint_t * read) { 508 531 uint_t i,j; 509 532 uint_t end = 0; … … 551 574 552 575 uint_t aubio_source_avcodec_seek (aubio_source_avcodec_t * s, uint_t pos) { 553 int64_t resampled_pos = (uint_t)ROUND(pos * (s->input_samplerate * 1. / s->samplerate)); 576 int64_t resampled_pos = 577 (uint_t)ROUND(pos * (s->input_samplerate * 1. / s->samplerate)); 554 578 int64_t min_ts = MAX(resampled_pos - 2000, 0); 555 579 int64_t max_ts = MIN(resampled_pos + 2000, INT64_MAX); … … 559 583 ret = AUBIO_OK; 560 584 } else { 561 AUBIO_ERR("source_avcodec: failed seeking in %s (file not opened?)", s->path); 585 AUBIO_ERR("source_avcodec: failed seeking in %s (file not opened?)", 586 s->path); 562 587 return ret; 563 588 } … … 570 595 min_ts, resampled_pos, max_ts, seek_flags); 571 596 if (ret < 0) { 572 AUBIO_ERR("source_avcodec: failed seeking to %d in file %s", pos, s->path); 597 AUBIO_ERR("source_avcodec: failed seeking to %d in file %s", 598 pos, s->path); 573 599 } 574 600 // reset read status -
src/mathutils.c
r92948ab r81abf91 523 523 /* log(freq/A-2)/log(2) */ 524 524 midi = freq / 6.875; 525 midi = LOG (midi) / 0.6931471805599 5;525 midi = LOG (midi) / 0.6931471805599453; 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 5);537 freq = EXP (freq * 0.6931471805599453); 538 538 freq *= 6.875; 539 539 return freq; -
src/notes/notes.c
r92948ab r81abf91 1 1 /* 2 Copyright (C) 2014 Paul Brossier <piem@aubio.org>2 Copyright (C) 2014-2018 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. 28 29 // increase to 10. for .1 cent precision 29 30 // or to 100. for .01 cent precision … … 57 58 58 59 uint_t isready; 60 61 smpl_t last_onset_level; 62 smpl_t release_drop_level; 59 63 }; 60 64 … … 102 106 aubio_notes_set_minioi_ms (o, AUBIO_DEFAULT_NOTES_MINIOI_MS); 103 107 108 o->last_onset_level = AUBIO_DEFAULT_NOTES_SILENCE; 109 o->release_drop_level = AUBIO_DEFAULT_NOTES_RELEASE_DROP; 110 104 111 return o; 105 112 … … 139 146 { 140 147 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; 141 165 } 142 166 … … 185 209 //notes->data[0] = o->curnote; 186 210 //notes->data[1] = 0.; 211 //AUBIO_WRN("notes: sending note-off at onset, not enough level\n"); 187 212 notes->data[2] = o->curnote; 188 213 } else { … … 192 217 /* kill old note */ 193 218 //send_noteon(o->curnote,0, o->samplerate); 219 //AUBIO_WRN("notes: sending note-off at onset, new onset detected\n"); 194 220 notes->data[2] = o->curnote; 195 221 /* get and send new one */ … … 199 225 o->curnote = new_pitch; 200 226 } 227 o->last_onset_level = curlevel; 201 228 } 202 229 } else { 203 if (o->median) { 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 { 204 243 if (o->isready > 0) 205 244 o->isready++; … … 208 247 /* kill old note */ 209 248 //send_noteon(curnote,0); 210 notes->data[2] = o->curnote; 249 if (o->curnote != 0) 250 { 251 //AUBIO_WRN("notes: sending note-off, new note detected\n"); 252 notes->data[2] = o->curnote; 253 } 211 254 o->newnote = aubio_notes_get_latest_note(o); 212 255 o->curnote = o->newnote; -
src/notes/notes.h
r92948ab r81abf91 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 dB 110 111 \param o notes detection object as returned by new_aubio_notes() 112 113 \return current release drop level, in dB 114 115 */ 116 smpl_t aubio_notes_get_release_drop (const aubio_notes_t *o); 117 118 /** set note release drop level, in dB 119 120 This function sets the release_drop_level parameter, in dB. When a new note 121 is found, the current level in dB is measured. If the measured level drops 122 under that initial level - release_drop_level, then a note-off will be 123 emitted. 124 125 Defaults to `10`, in dB. 126 127 \note This parameter was added in version `0.4.8`. Results obtained with 128 earlier versions can be reproduced by setting this value to `100`, so that 129 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 dB 133 134 \return 0 on success, non-zero otherwise 135 136 */ 137 uint_t aubio_notes_set_release_drop (aubio_notes_t *o, smpl_t release_drop); 138 109 139 #ifdef __cplusplus 110 140 } -
src/spectral/filterbank_mel.h
r92948ab r81abf91 59 59 60 60 The filter coefficients are built according to Malcolm Slaney's Auditory 61 Toolbox, available at http://engineering.purdue.edu/~malcolm/interval/1998-010/ 62 (see file mfcc.m). 61 Toolbox, available online at the following address (see file mfcc.m): 62 63 https://engineering.purdue.edu/~malcolm/interval/1998-010/ 63 64 64 65 */ -
src/spectral/mfcc.h
r92948ab r81abf91 27 27 28 28 The implementation follows the specifications established by Malcolm Slaney 29 in its Auditory Toolbox, available online (see file mfcc.m). 29 in its Auditory Toolbox, available online at the following address (see 30 file mfcc.m): 30 31 31 http ://engineering.ecn.purdue.edu/~malcolm/interval/1998-010/32 https://engineering.purdue.edu/~malcolm/interval/1998-010/ 32 33 33 34 \example spectral/test-mfcc.c -
src/spectral/phasevoc.c
r92948ab r81abf91 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
r92948ab r81abf91 89 89 */ 90 90 uint_t aubio_pvoc_get_win(aubio_pvoc_t* pv); 91 91 92 /** get hop size 92 93 -
src/synth/wavetable.c
r92948ab r81abf91 165 165 aubio_wavetable_set_amp (s, 0.); 166 166 //s->last_pos = 0; 167 return aubio_wavetable_set_playing (s, 1);167 return aubio_wavetable_set_playing (s, 0); 168 168 } 169 169 -
src/synth/wavetable.h
r92948ab r81abf91 51 51 */ 52 52 aubio_wavetable_t * new_aubio_wavetable(uint_t samplerate, uint_t hop_size); 53 54 /** load source in wavetable55 56 \param o wavetable, created by new_aubio_wavetable()57 \param uri the uri of the source to load58 59 \return 0 if successful, non-zero otherwise60 61 */62 uint_t aubio_wavetable_load( aubio_wavetable_t * o, const char_t * uri );63 53 64 54 /** process wavetable function
Note: See TracChangeset
for help on using the changeset viewer.