On 02/05/2014 03:20 PM, Paul Brossier wrote: > On 02/05/2014 02:38 PM, Richard Shann wrote: >> On Wed, 2014-01-29 at 15:59 -0400, Paul Brossier wrote: >>> i updated src/sourceaudio.c using the new aubio_onset_t. it >>> simplifies the code quite a bit. i will do the same for >>> pitchrecog.c now. >> Paul - >> >> I wonder if you could send your work so far on this, it seems that >> the Debian packaging is hinging on getting aubio4 working in Denemo >> and I would like to help - if possible I would like to get a new >> release process going soon, even before this one is out of the door, >> it always takes so long. > hi Richard and all, > > sorry for the delay. here is the patch i have so far. it lacks the > set_onset_type() and needs testing, but should compile and run.
better with the patch. Paul
diff --git a/src/pitchrecog.c b/src/pitchrecog.c
index b49027a..35cc5e2 100644
--- a/src/pitchrecog.c
+++ b/src/pitchrecog.c
@@ -31,21 +31,6 @@
#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 +51,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 +78,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 +107,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,16 +133,16 @@ 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;
}
@@ -212,122 +152,102 @@ 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];
+ note_buffer2->data[i] = note_buffer->data[i];
}
- return vec_median (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 +275,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
diff --git a/src/sourceaudio.c b/src/sourceaudio.c
index 00e6130..d2a70c7 100644
--- a/src/sourceaudio.c
+++ b/src/sourceaudio.c
@@ -44,8 +44,6 @@ void generate_note_onsets(void)
DenemoAudio *audio = Denemo.gui->si->audio;
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;
@@ -53,20 +51,11 @@ void generate_note_onsets(void)
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;
-
-
-
+ 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 */
@@ -74,23 +63,6 @@ void 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->onsets)
{
@@ -98,62 +70,28 @@ void generate_note_onsets(void)
audio->onsets = NULL;
}
for (j = 0; j < (unsigned) audio->nframes; j++)
- {
- sf_read_float (audio->sndfile, ibuf->data[0]+pos, 2); //g_print("\t%f", ibuf->data[0][pos]);
- if (pos == overlap_size - 1)
- {
- /* block loop */
- gtk_main_iteration_do (FALSE);
- aubio_pvoc_do (pv, ibuf, fftgrain);
- 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)
- audio->onsets = g_list_append(audio->onsets, GINT_TO_POINTER(j) /* /audio->samplerate for seconds */);
-
- 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);
+ {
+ sf_read_float (audio->sndfile, ibuf->data+pos, 2); //g_print("\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)
+ audio->onsets = g_list_append(audio->onsets, GINT_TO_POINTER(aubio_onset_get_last(o)));
+
+ 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_cvec (fftgrain);
del_fvec (onset);
-#else
- g_print("\n\n\n!!!!!!!!!skipping memory free for windows to avoid crash\n\n\n");
-#endif
aubio_cleanup ();
-
-
-
-
-
-
-
-
-
-
progressbar_stop();
normal_cursor(Denemo.notebook);
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Denemo-devel mailing list [email protected] https://lists.gnu.org/mailman/listinfo/denemo-devel
