1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
/* Copyright (C) 2005-2021 Joël Krähemann
* Permission is granted to copy, distribute and/or modify this document
* under the terms of the GNU Free Documentation License, Version 1.3
* or any later version published by the Free Software Foundation;
* with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
* A copy of the license is included in the section entitled "GNU
* Free Documentation License".
*/
#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);
|