int main (int argc, char **argv) { uint_t err = 0; if (argc < 2) { err = 2; PRINT_ERR("not enough arguments\n"); PRINT_MSG("read a wave file as a mono vector\n"); PRINT_MSG("usage: %s <source_path> [samplerate] [hop_size]\n", argv[0]); return err; } uint_t samplerate = 0; uint_t win_s = 1024; // window size uint_t hop_size = win_s / 4; uint_t n_frames = 0, read = 0; if ( argc == 3 ) samplerate = atoi(argv[2]); if ( argc == 4 ) hop_size = atoi(argv[3]); char_t *source_path = argv[1]; aubio_source_t * source = new_aubio_source(source_path, samplerate, hop_size); if (!source) { err = 1; goto beach; } if (samplerate == 0 ) samplerate = aubio_source_get_samplerate(source); // create some vectors fvec_t * in = new_fvec (hop_size); // input audio buffer fvec_t * out = new_fvec (2); // output position // create onset object aubio_onset_t * o = new_aubio_onset("default", win_s, hop_size, samplerate); do { // put some fresh data in input vector aubio_source_do(source, in, &read); // execute onset aubio_onset_do(o,in,out); // do something with the onsets if (out->data[0] != 0) { PRINT_MSG("onset at %.3fms, %.3fs, frame %d\n", aubio_onset_get_last_ms(o), aubio_onset_get_last_s(o), aubio_onset_get_last(o)); } n_frames += read; } while ( read == hop_size ); PRINT_MSG("read %.2fs, %d frames at %dHz (%d blocks) from %s\n", n_frames * 1. / samplerate, n_frames, samplerate, n_frames / hop_size, source_path); // clean up memory del_aubio_onset(o); del_fvec(in); del_fvec(out); beach: aubio_cleanup(); return err; }
aubio_notes_t * new_aubio_notes (const char_t * method, uint_t buf_size, uint_t hop_size, uint_t samplerate) { aubio_notes_t *o = AUBIO_NEW(aubio_notes_t); const char_t * onset_method = "default"; const char_t * pitch_method = "default"; o->onset_buf_size = buf_size; o->pitch_buf_size = buf_size * 4; o->hop_size = hop_size; o->onset_threshold = 0.; o->pitch_tolerance = 0.; o->samplerate = samplerate; o->median = 6; o->isready = 0; o->onset = new_aubio_onset (onset_method, o->onset_buf_size, o->hop_size, o->samplerate); if (o->onset_threshold != 0.) aubio_onset_set_threshold (o->onset, o->onset_threshold); o->onset_output = new_fvec (1); o->pitch = new_aubio_pitch (pitch_method, o->pitch_buf_size, o->hop_size, o->samplerate); if (o->pitch == NULL) goto fail; if (o->pitch_tolerance != 0.) aubio_pitch_set_tolerance (o->pitch, o->pitch_tolerance); aubio_pitch_set_unit (o->pitch, "midi"); o->pitch_output = new_fvec (1); if (strcmp(method, "default") != 0) { AUBIO_ERR("notes: unknown notes detection method \"%s\"\n", method); goto fail; } o->note_buffer = new_fvec(o->median); o->note_buffer2 = new_fvec(o->median); o->curnote = -1.; o->newnote = 0.; aubio_notes_set_silence(o, AUBIO_DEFAULT_NOTES_SILENCE); aubio_notes_set_minioi_ms (o, AUBIO_DEFAULT_NOTES_MINIOI_MS); return o; fail: del_aubio_notes(o); return NULL; }
void Note2midi::set_plugin(){ o = new_aubio_onset (onset_method, PARAM_BUFFER_SIZE, PARAM_HOP_SIZE_ONSET, samplerate); if (onset_threshold != 0.) aubio_onset_set_threshold (o, onset_threshold); onset = new_fvec (1); pitch = new_aubio_pitch (pitch_method, PARAM_BUFFER_SIZE * PARAM_PITCH_BUFF_TIMES, PARAM_HOP_SIZE_PITCH, samplerate); if (pitch_tolerance != 0.) aubio_pitch_set_tolerance (pitch, pitch_tolerance); pitch_obuf = new_fvec (1); printf("%s\n", pitch_unit); if (median) { note_buffer = new_fvec (median); note_buffer2 = new_fvec (median); } }
int main(int argc, char **argv) { frames_delay = 3; examples_common_init(argc,argv); o = new_aubio_onset (onset_mode, buffer_size, overlap_size, samplerate); if (threshold != 0.) aubio_onset_set_threshold (o, threshold); onset = new_fvec (1); examples_common_process(aubio_process,process_print); del_aubio_onset (o); del_fvec (onset); examples_common_del(); debug("End of program.\n"); fflush(stderr); return 0; }
int main(){ /* allocate some memory */ uint_t win_s = 1024; /* window size */ fvec_t * in = new_fvec (win_s/4); /* input buffer */ fvec_t * out = new_fvec (2); /* input buffer */ aubio_onset_t * onset = new_aubio_onset("complex", win_s, win_s/4, 44100.); uint_t i = 0; while (i < 10) { aubio_onset_do (onset,in,out); i++; }; del_aubio_onset(onset); del_fvec(in); del_fvec(out); aubio_cleanup(); return 0; }
//Creates a list of times which the aubio onset detector thinks are note onset times for the audio Denemo->si->recording //Result is placed in Denemo->si->note_onsets void generate_note_onsets (void) { DenemoRecording *audio = Denemo.project->movement->recording; gint channels = audio->channels; smpl_t threshold = 0.3; smpl_t silence = -90.; uint_t buffer_size = 1024; uint_t overlap_size = 512; uint_t samplerate = 44100; aubio_onset_t *o = new_aubio_onset("default", buffer_size, overlap_size, samplerate); fvec_t *ibuf = new_fvec (overlap_size); fvec_t *onset = new_fvec (2); unsigned int pos = 0; /*frames%dspblocksize */ unsigned int i; /*channels */ unsigned int j; /*frames */ busy_cursor (Denemo.notebook); gtk_window_set_modal (progressbar (_("Analysing Audio"), NULL), TRUE); rewind_audio (); if (audio->notes) { g_list_free_full (audio->notes, g_free); audio->notes = NULL; } for (j = 0; j < (unsigned) audio->nframes; j++) { sf_read_float (audio->sndfile, ibuf->data + pos, 2); //g_debug("\t%f", ibuf->data[0][pos]); if (pos == overlap_size - 1) { /* block loop */ gtk_main_iteration_do (FALSE); aubio_onset_do (o, ibuf, onset); while (gtk_events_pending ()) gtk_main_iteration (); if(onset->data[0] != 0) { DenemoRecordedNote *note = g_malloc0(sizeof(DenemoRecordedNote)); note->timing = aubio_onset_get_last(o);/* aubio_onset_get_delay_s(o) for seconds */ audio->notes = g_list_append (audio->notes, note); } pos = -1; /* so it will be zero next j loop */ } /* end of if pos==overlap_size-1 */ pos++; } del_aubio_onset (o); del_fvec (ibuf); del_fvec (onset); aubio_cleanup (); progressbar_stop (); normal_cursor (Denemo.notebook); }
void *aubioOnset_new(t_symbol *s, long argc, t_atom *argv) { t_aubioOnset *x = (t_aubioOnset *)object_alloc(aubioOnset_class); t_atom *ap; int i, isPow2, argcount=0; //s=s; if (x) { dsp_setup((t_pxobject *)x, 1); // MSP inlets: arg is # of inlets and is REQUIRED! // use 0 if you don't need inlets //outlet_new(x, "signal"); // signal outlet (note "signal" rather than NULL) x->onsetbang = bangout(x); x->sr = 44100.0; x->n = 64.0; x->threshold = 0.3; x->silence = -70; x->minioi = 4; x->bufsize = 1024; x->hopsize = 512; x->detectionFunction = "complex"; // increment ap each time to get to the next atom for (i = 0, ap = argv; i < argc; i++, ap++) { switch (atom_gettype(ap)) { case A_LONG: if (atom_getlong(ap)<0) { post("%ld: silence threshold %ld",i+1,atom_getlong(ap)); x->silence = (atom_getlong(ap) < -120) ? -120 : (atom_getlong(ap) > 0) ? 0 : atom_getlong(ap); } else { if (argcount == 0) { post("%ld: bufsize %ld",i+1,atom_getlong(ap)); x->bufsize = atom_getlong(ap); argcount = argcount + 1; } else { post("%ld: hopsize %ld",i+1,atom_getlong(ap)); x->hopsize = atom_getlong(ap); } } break; case A_FLOAT: post("%ld: threshold %.2f",i+1,atom_getfloat(ap)); x->threshold = (atom_getfloat(ap) < 1e-5) ? 0.1 : (atom_getfloat(ap) > 0.999) ? 0.999 : atom_getfloat(ap); break; case A_SYM: post("%ld: onset detection function %s",i+1, atom_getsym(ap)->s_name); x->detectionFunction = atom_getsym(ap)->s_name; break; default: post("%ld: unknown atom type (%ld)", i+1, atom_gettype(ap)); break; } } isPow2 = (int)x->bufsize && !( ((int)x->bufsize-1) & (int)x->bufsize ); if(!isPow2) { error("requested buffer size is not a power of 2. default value of 1024 used instead"); x->bufsize = 1024; } isPow2 = (int)x->hopsize && !( ((int)x->hopsize-1) & (int)x->hopsize ); if(!isPow2) { error("requested hop size is not a power of 2. default value of 1024 used instead"); x->hopsize = x->bufsize / 4; } if (strcmp(x->detectionFunction,"hfc") == 0) x->o=new_aubio_onset(aubio_onset_hfc,x->bufsize, x->hopsize, 1); else if (strcmp(x->detectionFunction,"energy") == 0) x->o=new_aubio_onset(aubio_onset_energy,x->bufsize, x->hopsize, 1); else if (strcmp(x->detectionFunction,"phase") == 0) x->o=new_aubio_onset(aubio_onset_phase,x->bufsize, x->hopsize, 1); else if (strcmp(x->detectionFunction,"complex") == 0) x->o=new_aubio_onset(aubio_onset_complex,x->bufsize, x->hopsize, 1); else if (strcmp(x->detectionFunction,"specdiff") == 0) x->o=new_aubio_onset(aubio_onset_specdiff,x->bufsize, x->hopsize, 1); else if (strcmp(x->detectionFunction,"kl") == 0) x->o=new_aubio_onset(aubio_onset_kl,x->bufsize, x->hopsize, 1); else if (strcmp(x->detectionFunction,"mkl") == 0) x->o=new_aubio_onset(aubio_onset_mkl,x->bufsize, x->hopsize, 1); else x->o=new_aubio_onset(aubio_onset_complex,x->bufsize, x->hopsize, 1); x->in = (fvec_t *) new_fvec (x->hopsize, 1); x->out = (fvec_t *) new_fvec (1, 1); aubio_onset_set_threshold(x->o,x->threshold); aubio_onset_set_silence(x->o,x->silence); aubio_onset_set_minioi(x->o,x->minioi); post("aubioOnset~: version 0.3"); } return (x); }
void Note2midi::run(LV2_Handle instance, uint32_t SampleCount) { Note2midi *plugin = (Note2midi *) instance; unsigned int new_onset_method = (unsigned int)(*plugin->_onset_method); unsigned int new_pitch_method = (unsigned int)(*plugin->_pitch_method); char_t* on_meth; char_t* pi_meth; silence_threshold = *(plugin->_silence_threshold); aubio_onset_set_threshold(plugin->o, *plugin->_onset_threshold); aubio_pitch_set_tolerance(plugin->pitch, *plugin->_pitch_method); if(0 <= new_onset_method && 16 >= new_onset_method && new_onset_method != plugin->current_onset_method){ del_aubio_onset(plugin->o); switch(new_onset_method){ case ONSET_METHOD_ENERGY: on_meth = "energy"; break; case ONSET_METHOD_SPECDIFF: on_meth = "specdiff"; break; case ONSET_METHOD_HFC: on_meth = "hfc"; break; case ONSET_METHOD_COMPLEXDOMAIN: on_meth = "complexdomain"; break; case ONSET_METHOD_COMPLEX: on_meth = "complex"; break; case ONSET_METHOD_PHASE: on_meth = "phase"; break; case ONSET_METHOD_MKL: on_meth = "mkl"; break; case ONSET_METHOD_KL: on_meth = "kl"; break; case ONSET_METHOD_SPECFLUX: on_meth = "specflux"; break; case ONSET_METHOD_CENTROID: on_meth = "centroid"; break; case ONSET_METHOD_SPREAD: on_meth = "spread"; break; case ONSET_METHOD_SKEWNESS: on_meth = "skewness"; break; case ONSET_METHOD_KURTOSIS: on_meth = "kurtosis"; break; case ONSET_METHOD_SLOPE: on_meth = "slope"; break; case ONSET_METHOD_DECREASE: on_meth = "decrease"; break; case ONSET_METHOD_ROLLOFF: on_meth = "rolloff"; break; default: on_meth = "default"; break; } plugin->o = new_aubio_onset (on_meth, PARAM_BUFFER_SIZE, PARAM_HOP_SIZE_ONSET, plugin->samplerate); plugin->current_onset_method = new_onset_method; } if(0 <= new_pitch_method && 6 >= new_pitch_method && new_pitch_method != plugin->current_pitch_method){ del_aubio_pitch(plugin->pitch); switch(new_pitch_method){ case PITCH_METHOD_MCOMB: pi_meth = "mcomb"; break; case PITCH_METHOD_YINFFT: pi_meth = "yinfft"; break; case PITCH_METHOD_YIN: pi_meth = "yin"; break; case PITCH_METHOD_SCHMITT: pi_meth = "schmitt"; break; case PITCH_METHOD_FCOMB: pi_meth = "fcomb"; break; case PITCH_METHOD_SPECACF: pi_meth = "specacf"; break; default: pi_meth = "default"; break; } plugin->pitch = new_aubio_pitch (pi_meth, PARAM_BUFFER_SIZE * PARAM_PITCH_BUFF_TIMES, PARAM_HOP_SIZE_PITCH, plugin->samplerate); // aubio_pitch_set_unit (plugin->pitch, plugin->pitch_unit); plugin->current_pitch_method = new_pitch_method; } out_capacity = plugin->out->atom.size; plugin->out->atom.type = plugin->atom_sequence; lv2_atom_sequence_clear(plugin->out); plugin->ibuf->data = (smpl_t *) plugin->in; counter++; if(counter++ >= PARAM_BUFFER_SIZE) counter = 0; plugin->process_block(); }
static void * aubioOnset_tilde_new (t_symbol *s, long argc, t_atom *argv) { t_atom *ap; int i, isPow2, argcount=0; t_aubioOnset_tilde *x = (t_aubioOnset_tilde *) pd_new (aubioOnset_tilde_class); x->threshold = 0.3; x->silence = -70; x->minioi = 4; x->bufsize = 1024; x->hopsize = 512; x->detectionFunction = "complex"; for (i = 0, ap = argv; i < argc; i++, ap++) { if (atom_getintarg(i, argc, argv)) { if (atom_getint(ap)<0) { post("%ld: silence threshold %ld",i+1,atom_getint(ap)); x->silence = (atom_getint(ap) < -120) ? -120 : (atom_getint(ap) > 0) ? 0 : atom_getint(ap); } else { if (argcount == 0) { post("%ld: bufsize %ld",i+1,atom_getint(ap)); x->bufsize = atom_getint(ap); argcount = argcount + 1; } else { post("%ld: hopsize %ld",i+1,atom_getint(ap)); x->hopsize = atom_getint(ap); } } } else if (atom_getfloatarg(i, argc, argv)) { post("%ld: threshold %.2f",i+1,atom_getfloat(ap)); x->threshold = (atom_getfloat(ap) < 1e-5) ? 0.1 : (atom_getfloat(ap) > 0.999) ? 0.999 : atom_getfloat(ap); } else if (atom_getsymbolarg(i, argc, argv)) { post("%ld: onset detection function %s",i+1, atom_getsymbol(ap)->s_name); x->detectionFunction = atom_getsymbol(ap)->s_name; } else post("%ld: unknown argument type", i+1); } isPow2 = (int)x->bufsize && !( ((int)x->bufsize-1) & (int)x->bufsize ); if(!isPow2) { error("requested buffer size is not a power of 2. default value of 1024 used instead"); x->bufsize = 1024; } isPow2 = (int)x->hopsize && !( ((int)x->hopsize-1) & (int)x->hopsize ); if(!isPow2) { error("requested hop size is not a power of 2. default value of 256 used instead"); x->hopsize = x->bufsize / 4; } if (strcmp(x->detectionFunction,"hfc") == 0) x->o=new_aubio_onset(aubio_onset_hfc,x->bufsize, x->hopsize, 1); else if (strcmp(x->detectionFunction,"energy") == 0) x->o=new_aubio_onset(aubio_onset_energy,x->bufsize, x->hopsize, 1); else if (strcmp(x->detectionFunction,"phase") == 0) x->o=new_aubio_onset(aubio_onset_phase,x->bufsize, x->hopsize, 1); else if (strcmp(x->detectionFunction,"complex") == 0) x->o=new_aubio_onset(aubio_onset_complex,x->bufsize, x->hopsize, 1); else if (strcmp(x->detectionFunction,"specdiff") == 0) x->o=new_aubio_onset(aubio_onset_specdiff,x->bufsize, x->hopsize, 1); else if (strcmp(x->detectionFunction,"kl") == 0) x->o=new_aubio_onset(aubio_onset_kl,x->bufsize, x->hopsize, 1); else if (strcmp(x->detectionFunction,"mkl") == 0) x->o=new_aubio_onset(aubio_onset_mkl,x->bufsize, x->hopsize, 1); else x->o=new_aubio_onset(aubio_onset_complex,x->bufsize, x->hopsize, 1); x->in = (fvec_t *) new_fvec (x->hopsize, 1); x->out = (fvec_t *) new_fvec (1, 1); x->onsetbang = outlet_new (&x->x_obj, &s_bang); post (aubioOnset_version); aubio_onset_set_threshold(x->o,x->threshold); aubio_onset_set_silence(x->o,x->silence); aubio_onset_set_minioi(x->o,x->minioi); return (void *) x; }