On 02/07/2014 07:41 AM, Richard Shann wrote: > On Thu, 2014-02-06 at 23:37 -0600, Jeremiah Benham wrote: >> On Thu, Feb 06, 2014 at 09:31:19AM +0000, Richard Shann wrote: >>> On Wed, 2014-02-05 at 15:20 -0300, Paul Brossier wrote: >>>>> Could you create some defines for the aubio version available >>>>> at configure time? >>>> >>>> well, i'm not really looking forward to maintain code for >>>> 0.3.2. >>>> >>>> how about we maintain this patch instead? one would just need >>>> to revert it to use 0.3.2 instead of 0.4.0. >>> >>> I'm not sure I understand the intricacies of all this - I suspect >>> the biggest hurdle will come trying to get GUB to build aubio4 >>> (because GUB doesn't know about waf and trying to teach GUB >>> anything is a dark art)... unless it's broke we could just opt >>> not to fix it, carry on delivering the same fossilized libraries >>> for windows. >> >> I found a class for dealing with waf in gub. I had to apply a patch >> to aubio because it wanted to use srandom andthis was not defined >> but I was able to get it compiled. Then I applied Paul's patch to a >> git snapshot and created a mingw build: >> >> http://denemo.org/~jjbenham/gub/uploads/denemo-0.0.0-0.mingw.exe >> > I downloaded and installed this, it fails to start because it cant > find aubio-4.dll so I guess this didn't get into the package... > > I have built the aubio-4 version under Debian stable (using headers > and libraries for aubio-4 installed in the user's own home directory) > and it executes ok. The note onset stuff is working (that is the > opening source audio for transcribing to notation) but the microphone > entry failed to detect any notes. The latter is somewhat uncertain > because I often get a failure to get a signal in from the microphone > on this box, however I immediately switched to the aubio3 version and > that worked so there is probably a real problem there.
I found a bug: fvec_median is used, so AUBIO_UNSTABLE needs to be defined before including <aubio/aubio.h>. now i wonder why the compiler didn't complain at all about not finding the prototype. attached is the updated patch. I also simplified get_note() by using fvec_copy(). Jeremiah, could you send the patch about srandom. in aubio/tests/utils_tests.h, HAVE_WIN_HACKS should be defined when building on windows. Thanks, Paul
diff --git a/src/pitchrecog.c b/src/pitchrecog.c
index 11ac61c..e9a0504 100644
--- a/src/pitchrecog.c
+++ b/src/pitchrecog.c
@@ -26,26 +26,12 @@
#include <getopt.h>
#include <unistd.h>
#include <math.h>
+#define AUBIO_UNSTABLE 1
#include <aubio/aubio.h>
#include <audio.h>
#include <glib.h>
#include "pitchrecog.h"
-#ifdef HAVE_C99_VARARGS_MACROS
-#define debug(...) if (verbose) fprintf (stderr, __VA_ARGS__)
-#define errmsg(...) fprintf (stderr, __VA_ARGS__)
-#define outmsg(...) fprintf (stdout, __VA_ARGS__)
-#else
-#define debug(format, args...) if (verbose) fprintf(stderr, format , ##args)
-#define errmsg(format, args...) fprintf(stderr, format , ##args)
-#define outmsg(format, args...) fprintf(stdout, format , ##args)
-#endif
-
-
-
-
-
-
typedef int (*aubio_process_func_t) (smpl_t ** input, smpl_t ** output, int nframes);
@@ -66,33 +52,21 @@ static int usedoubled = 1;
/* energy,specdiff,hfc,complexdomain,phase */
-static aubio_onsetdetection_type type_onset = aubio_onset_kl;
-static aubio_onsetdetection_type type_onset2 = aubio_onset_complex;
static smpl_t threshold = 0.3;
static smpl_t silence = -90.;
static uint_t buffer_size = 1024; //512; //1024;
static uint_t overlap_size = 512; //256; //512;
-static uint_t channels = 1;
static uint_t samplerate = 44100;
-static aubio_pvoc_t *pv;
static fvec_t *ibuf;
-static fvec_t *obuf;
-static cvec_t *fftgrain;
-static aubio_onsetdetection_t *o;
-static aubio_onsetdetection_t *o2;
+static aubio_onset_t *o;
static fvec_t *onset;
-static fvec_t *onset2;
-static int isonset = 0;
-static aubio_pickpeak_t *parms;
-
+static uint_t isonset;
/* pitch objects */
-static smpl_t pitch = 0.;
-static aubio_pitchdetection_t *pitchdet;
-static aubio_pitchdetection_type type_pitch = aubio_pitch_yinfft; // aubio_pitch_mcomb
-static aubio_pitchdetection_mode mode_pitch = aubio_pitchm_freq;
+static aubio_pitch_t *p;
+static fvec_t *pitch;
static uint_t median = 6;
static fvec_t *note_buffer = NULL;
@@ -105,50 +79,26 @@ static smpl_t curnote = 0.; // should not be global
//smpl_t newnote = 0.;
static uint_t isready = 0; // should not be global, is static within pitchrecog()
-
-static aubio_onsetdetection_type onset_types[] = { aubio_onset_energy,
- aubio_onset_specdiff,
- aubio_onset_hfc,
- aubio_onset_complex,
- aubio_onset_complex,
- aubio_onset_phase,
- aubio_onset_mkl,
- aubio_onset_kl
-};
-
-
-
-
-
static void
init_aubio (void)
{
- ibuf = new_fvec (overlap_size, channels);
- obuf = new_fvec (overlap_size, channels);
- fftgrain = new_cvec (buffer_size, channels);
+ ibuf = new_fvec (overlap_size);
{
- pitchdet = new_aubio_pitchdetection (buffer_size * 4, overlap_size, channels, samplerate, type_pitch, mode_pitch);
- aubio_pitchdetection_set_yinthresh (pitchdet, 0.7);
+ p = new_aubio_pitch ("default", buffer_size * 4, overlap_size, samplerate);
+ aubio_pitch_set_tolerance (p, 0.7);
+ aubio_pitch_set_unit (p, "freq");
if (median)
{
- note_buffer = new_fvec (median, 1);
- note_buffer2 = new_fvec (median, 1);
+ note_buffer = new_fvec (median);
+ note_buffer2 = new_fvec (median);
}
}
- /* phase vocoder */
- pv = new_aubio_pvoc (buffer_size, overlap_size, channels);
- /* onsets */
- parms = new_aubio_peakpicker (threshold);
- o = new_aubio_onsetdetection (type_onset, buffer_size, channels);
- onset = new_fvec (1, channels);
- if (usedoubled)
- {
- o2 = new_aubio_onsetdetection (type_onset2, buffer_size, channels);
- onset2 = new_fvec (1, channels);
- }
+ o = new_aubio_onset ("default", buffer_size, overlap_size, samplerate);
+ onset = new_fvec (2);
+ pitch = new_fvec (1);
}
@@ -158,25 +108,16 @@ aubio_finish (void)
{
{
send_noteon (curnote, 0);
- del_aubio_pitchdetection (pitchdet);
if (median)
{
- del_fvec (note_buffer);
- del_fvec (note_buffer2);
+ if (note_buffer) del_fvec (note_buffer);
+ if (note_buffer2) del_fvec (note_buffer2);
}
}
- if (usedoubled)
- {
- del_aubio_onsetdetection (o2);
- del_fvec (onset2);
- }
- del_aubio_onsetdetection (o);
- del_aubio_peakpicker (parms);
- del_aubio_pvoc (pv);
- del_fvec (obuf);
- del_fvec (ibuf);
- del_cvec (fftgrain);
- del_fvec (onset);
+ if (o) del_aubio_onset (o);
+ if (p) del_aubio_pitch (p);
+ if (onset) del_fvec (onset);
+ if (pitch) del_fvec (pitch);
aubio_cleanup ();
}
@@ -193,141 +134,117 @@ send_noteon (smpl_t pitch, int velo)
/** append new note candidate to the note_buffer and return filtered value. we
- * need to copy the input array as vec_median destroy its input data.*/
+ * need to copy the input array as fvec_median destroy its input data.*/
static void
note_append (fvec_t * note_buffer, smpl_t anote)
{
uint_t i = 0;
for (i = 0; i < note_buffer->length - 1; i++)
{
- note_buffer->data[0][i] = note_buffer->data[0][i + 1];
+ note_buffer->data[i] = note_buffer->data[i + 1];
}
- note_buffer->data[0][note_buffer->length - 1] = anote;
+ note_buffer->data[note_buffer->length - 1] = anote;
return;
}
static uint_t
get_note (fvec_t * note_buffer, fvec_t * note_buffer2)
{
- uint_t i = 0;
- for (i = 0; i < note_buffer->length; i++)
- {
- note_buffer2->data[0][i] = note_buffer->data[0][i];
- }
- return vec_median (note_buffer2);
+ fvec_copy(note_buffer, note_buffer2);
+ return fvec_median (note_buffer2);
}
-static int calls;
-
-
static int Stop;
-int
+ int
pitchrecog (float **input, float **output, int nframes)
{
unsigned int pos = 0; /*frames%dspblocksize */
- unsigned int i; /*channels */
unsigned int j; /*frames */
- calls++;
if (Stop)
return Stop;
for (j = 0; j < (unsigned) nframes; j++)
+ {
+ if (usejack)
{
- if (usejack)
- {
- for (i = 0; i < channels; i++)
- {
- DENEMO_SAMPLE_TYPE *in = (DENEMO_SAMPLE_TYPE *) * input;
- ibuf->data[i][pos] = *(in + j); /* need threshold higher - say 0.5 to avoid repeated note detection when using this higher precision data */
- }
- }
- /*when pos reaches overlap size it is time for fft to look for a note */
- if (pos == overlap_size - 1)
- {
- /* block loop */
- aubio_pvoc_do (pv, ibuf, fftgrain);
- aubio_onsetdetection (o, fftgrain, onset);
- if (usedoubled)
- {
- aubio_onsetdetection (o2, fftgrain, onset2);
- onset->data[0][0] *= onset2->data[0][0];
- }
- isonset = aubio_peakpick_pimrt (onset, parms);
-
- pitch = aubio_pitchdetection (pitchdet, ibuf);
-
- if (median)
- {
- note_append (note_buffer, pitch);
- }
+ DENEMO_SAMPLE_TYPE *in = (DENEMO_SAMPLE_TYPE *) * input;
+ ibuf->data[pos] = *(in + j); /* need threshold higher - say 0.5 to avoid repeated note detection when using this higher precision data */
+ }
+ /*when pos reaches overlap size it is time for fft to look for a note */
+ if (pos == overlap_size - 1)
+ {
+ /* block loop */
+ aubio_onset_do (o, ibuf, onset);
+ aubio_pitch_do (p, ibuf, pitch);
- /* curlevel is negatif or 1 if silence */
- curlevel = aubio_level_detection (ibuf, silence);
+ isonset = onset->data[0];
- if (isonset)
- {
- /* test for silence */
-#ifndef SUSPICIOUS_CODE
- if (curlevel == 1.)
- {
-#else
- //if (curlevel <= 1.) {
+ if (median)
+ {
+ note_append (note_buffer, pitch->data[0]);
+ }
-#endif
+ /* curlevel is negatif or 1 if silence */
+ curlevel = aubio_level_detection (ibuf, silence);
- isonset = 0;
- if (median)
- isready = 0;
- /* send note off */
- send_noteon (curnote, 0);
- }
+ if (isonset)
+ {
+ if (curlevel == 1)
+ {
+ isonset = 0;
+ if (median)
+ isready = 0;
+ /* send note off */
+ send_noteon (curnote, 0);
+ }
+ else
+ { // not silent
+ if (median)
+ {
+ isready = 1;
+ }
else
- { // not silent
- if (median)
- {
- isready = 1;
- }
- else
- {
- /* kill old note */
- send_noteon (curnote, 0);
- /* get and send new one */
- send_noteon (pitch, 1);
- curnote = pitch;
- }
+ {
+ /* kill old note */
+ send_noteon (curnote, 0);
+ /* get and send new one */
+ curnote = pitch->data[0];
+ send_noteon (curnote, 1);
+ }
- }
}
+ }
else
- { //not onset
- if (median)
- {
- if (isready > 0)
- isready++;
- if (isready == median)
- {
- /* kill old note */
- send_noteon (curnote, 0);
-
- curnote = get_note (note_buffer, note_buffer2);
- /* get and send new one */
- if (curnote > 45)
- { //FIXME
- send_noteon (curnote, 1);
- }
- }
- } // if median
+ { //not onset
+ if (median)
+ {
+ if (isready > 0)
+ isready++;
+ if (isready == median)
+ {
+ /* kill old note */
+ send_noteon (curnote, 0);
+
+ curnote = get_note (note_buffer, note_buffer2);
+ /* get and send new one */
+ if (curnote > 45)
+ { //FIXME
+ send_noteon (curnote, 1);
+ }
+ }
+ } // if median
- }
+ }
/* end of block loop */
pos = -1; /* so it will be zero next j loop */
- } /* end of if pos==overlap_size-1 */
- pos++;
-}
-return Stop;
+ }
+ pos++;
+ }
+
+ return Stop;
}
extern int pa_main (aubio_process_func_t process_func);
@@ -355,14 +272,15 @@ set_smoothing (double smooth)
STOP median = (unsigned) smooth;
START}
-/* FIXME consider controlling usedoubled parameter as well*/
int
set_onset_type (unsigned onset)
{
/* changing onset type requires memory allocation */
+#if 0
if (onset >= sizeof (onset_types) / sizeof (aubio_onsetdetection_type))
return 0;
STOP type_onset = onset_types[onset];
+#endif
START}
int
@@ -377,7 +295,7 @@ initialize_pitch_recognition (void)
int
terminate_pitch_recognition (void)
{
- g_message ("Terminating portaudio and aubio");
+ g_print ("Terminating portaudio and aubio\n");
(void) pa_main (NULL);
aubio_finish ();
return 0;
diff --git a/src/sourceaudio.c b/src/sourceaudio.c
index 69b782d..7561645 100644
--- a/src/sourceaudio.c
+++ b/src/sourceaudio.c
@@ -45,28 +45,17 @@ generate_note_onsets (void)
DenemoRecording *audio = Denemo.project->movement->recording;
gint channels = audio->channels;
- aubio_onsetdetection_type type_onset = aubio_onset_kl;
- aubio_onsetdetection_type type_onset2 = aubio_onset_complex;
- smpl_t threshold = 0.3;
- smpl_t silence = -90.;
- uint_t buffer_size = 1024;
- uint_t overlap_size = 512;
-
- uint_t samplerate = 44100;
-
- aubio_pvoc_t *pv;
- fvec_t *ibuf;
- fvec_t *obuf;
- cvec_t *fftgrain;
-
- aubio_onsetdetection_t *o;
- aubio_onsetdetection_t *o2;
- fvec_t *onset;
- fvec_t *onset2;
- int isonset = 0;
- aubio_pickpeak_t *parms;
+ 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 */
@@ -75,23 +64,6 @@ generate_note_onsets (void)
busy_cursor (Denemo.notebook);
gtk_window_set_modal (progressbar (_("Analysing Audio"), NULL), TRUE);
- ibuf = new_fvec (overlap_size, channels);
- obuf = new_fvec (overlap_size, channels);
- fftgrain = new_cvec (buffer_size, channels);
-
- /* phase vocoder */
- pv = new_aubio_pvoc (buffer_size, overlap_size, channels);
- /* onsets */
- parms = new_aubio_peakpicker (threshold);
- o = new_aubio_onsetdetection (type_onset, buffer_size, channels);
-
- // if (usedoubled)
- // {
- o2 = new_aubio_onsetdetection (type_onset2, buffer_size, channels);
- onset2 = new_fvec (1, channels);
- // }
-
- onset = new_fvec (1, channels);
rewind_audio ();
if (audio->notes)
{
@@ -100,51 +72,27 @@ generate_note_onsets (void)
}
for (j = 0; j < (unsigned) audio->nframes; j++)
{
- sf_read_float (audio->sndfile, ibuf->data[0] + pos, 2); //g_debug("\t%f", ibuf->data[0][pos]);
+ 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_pvoc_do (pv, ibuf, fftgrain);
+ aubio_onset_do (o, ibuf, onset);
while (gtk_events_pending ())
gtk_main_iteration ();
-
- aubio_onsetdetection (o, fftgrain, onset);
- while (gtk_events_pending ())
- gtk_main_iteration ();
-
- // if (usedoubled) {
- aubio_onsetdetection (o2, fftgrain, onset2);
- while (gtk_events_pending ())
- gtk_main_iteration ();
-
- onset->data[0][0] *= onset2->data[0][0];
- // }
- isonset = aubio_peakpick_pimrt (onset, parms);
- if (isonset) {
+ if(onset->data[0] != 0) {
DenemoRecordedNote *note = g_malloc0(sizeof(DenemoRecordedNote));
- note->timing = j;/* /audio->samplerate for seconds */
+ 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++;
}
-#ifndef G_OS_WIN32
- del_aubio_onsetdetection (o2);
- del_fvec (onset2);
-
- del_aubio_onsetdetection (o);
- del_aubio_peakpicker (parms);
- del_aubio_pvoc (pv);
- del_fvec (obuf);
+ del_aubio_onset (o);
del_fvec (ibuf);
- del_cvec (fftgrain);
del_fvec (onset);
-#else
- g_debug ("\n\n\n!!!!!!!!!skipping memory free for windows to avoid crash\n\n\n");
-#endif
aubio_cleanup ();
@@ -159,15 +107,6 @@ generate_note_onsets (void)
progressbar_stop ();
normal_cursor (Denemo.notebook);
-/*
-#ifdef DEBUG
- GList *g;
- for (g = audio->onsets; g; g = g->next)
- {
- g_debug ("Note at %f seconds\n", ((gint) g->data) / (double) audio->samplerate);
- }
-#endif
-*/
}
gboolean
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Denemo-devel mailing list [email protected] https://lists.gnu.org/mailman/listinfo/denemo-devel
