Example 4.3. Get AgsSequencer buffer
#include <glib.h>
#include <glib-object.h>
#include <ags/libags.h>
#include <ags/libags-audio.h>
AgsApplicationContext *application_context;
GObject *sequencer;
GList *start_list;
void *midi_buffer;
guint buffer_length;
application_context = ags_application_context_get_instance();
start_list = ags_sound_provider_get_sequencer(AGS_SOUND_PROVIDER(application_context));
if(start_list != NULL){
sequencer = G_OBJECT(start_list->data);
if(ags_sequencer_is_recording(AGS_SEQUENCER(sequencer))){
buffer_length = 0;
midi_buffer = ags_sequencer_get_buffer(AGS_SEQUENCER(sequencer),
&buffer_length);
if(midi_buffer != NULL &&
buffer_length > 0){
guchar *midi_iter;
/* parse bytes */
midi_iter = midi_buffer;
while(midi_iter < midi_buffer + buffer_length){
ags_sequencer_lock_buffer(AGS_SEQUENCER(sequencer),
midi_buffer);
if(ags_midi_util_is_key_on(midi_iter)){
g_message("key %d on with velocity %d", (0x7f & (midi_buffer[1])), (0x7f & (midi_buffer[2])));
midi_iter += 3;
}else if(ags_midi_util_is_key_off(midi_iter)){
midi_iter += 3;
}else if(ags_midi_util_is_key_pressure(midi_iter)){
midi_iter += 3;
}else if(ags_midi_util_is_change_parameter(midi_iter)){
midi_iter += 3;
}else if(ags_midi_util_is_pitch_bend(midi_iter)){
midi_iter += 3;
}else if(ags_midi_util_is_change_program(midi_iter)){
midi_iter += 2;
}else if(ags_midi_util_is_change_pressure(midi_iter)){
midi_iter += 2;
}else if(ags_midi_util_is_sysex(midi_iter)){
guint n;
/* sysex */
n = 0;
while(midi_iter[n] != 0xf7){
n++;
}
midi_iter += (n + 1);
}else if(ags_midi_util_is_song_position(midi_iter)){
midi_iter += 3;
}else if(ags_midi_util_is_song_select(midi_iter)){
midi_iter += 2;
}else if(ags_midi_util_is_tune_request(midi_iter)){
midi_iter += 1;
}else if(ags_midi_util_is_meta_event(midi_iter)){
midi_iter += (3 + midi_iter[2]);
}else{
g_warning("unexpected byte %x", midi_iter[0]);
midi_iter++;
}
ags_sequencer_unlock_buffer(AGS_SEQUENCER(sequencer),
midi_buffer);
}
}
}
}
g_list_free_full(start_list,
(GDestroyNotify) g_object_unref);