/* Create event_entry and append to the preQueue. * May be called from the main thread (usually) but also recursively * from the queue thread, when a callback itself does an insert... */ static void _fluid_seq_queue_pre_remove(fluid_sequencer_t* seq, short src, short dest, int type) { fluid_evt_entry * evtentry = _fluid_seq_heap_get_free(seq->heap); if (evtentry == NULL) { /* should not happen */ fluid_log(FLUID_PANIC, "sequencer: no more free events\n"); return; } evtentry->next = NULL; evtentry->entryType = FLUID_EVT_ENTRY_REMOVE; { fluid_event_t* evt = &(evtentry->evt); fluid_event_set_source(evt, src); fluid_event_set_source(evt, src); fluid_event_set_dest(evt, dest); evt->type = type; } fluid_mutex_lock(seq->mutex); /* append to preQueue */ if (seq->preQueueLast) { seq->preQueueLast->next = evtentry; } else { seq->preQueue = evtentry; } seq->preQueueLast = evtentry; fluid_mutex_unlock(seq->mutex); return; }
/* schedule a timer event (shall trigger the callback) */ void schedule_timer_event () { fluid_event_t *ev = new_fluid_event (); fluid_event_set_source (ev, -1); fluid_event_set_dest (ev, client_destination); fluid_event_timer (ev, NULL); fluid_sequencer_send_at (sequencer, ev, time_marker, 1); delete_fluid_event (ev); }
/* schedule a note on message */ void schedule_noteon (int chan, short key, unsigned int ticks) { fluid_event_t *ev = new_fluid_event (); fluid_event_set_source (ev, -1); fluid_event_set_dest (ev, synth_destination); fluid_event_noteon (ev, chan, key, 127); fluid_sequencer_send_at (sequencer, ev, ticks, 1); delete_fluid_event (ev); }
static void sendpitchbend(Data *data, int chan, int pitch, int time) { int fluid_res; fluid_event_clear(data->event); fluid_event_set_source(data->event, -1); fluid_event_set_dest(data->event, data->synth_seq_ID); fluid_event_pitch_bend(data->event, chan, pitch); fluid_res = fluid_sequencer_send_at(data->sequencer, data->event, get_fluidsynth_time(data,time), 1); if(fluid_res==FLUID_FAILED) printf("Unable to send pitchbend\n"); }
static void sendcontrolchange(Data *data, int chan, int cc, int val, int time) { int fluid_res; fluid_event_clear(data->event); fluid_event_set_source(data->event, -1); fluid_event_set_dest(data->event, data->synth_seq_ID); fluid_event_control_change(data->event, chan, cc, val); fluid_res = fluid_sequencer_send_at(data->sequencer, data->event, get_fluidsynth_time(data,time), 1); if(fluid_res==FLUID_FAILED) printf("Unable to send controlchange\n"); }
static void sendnoteoff(Data *data, int chan, short key, int velocity, unsigned int time) { int fluid_res; if(velocity>127) // not supported by fluidsynth velocity=127; fluid_event_clear(data->event); fluid_event_set_source(data->event, -1); fluid_event_set_dest(data->event, data->synth_seq_ID); fluid_event_noteoff(data->event, chan, key); fluid_res = fluid_sequencer_send_at(data->sequencer, data->event, get_fluidsynth_time(data,time), 1); if(fluid_res==FLUID_FAILED) printf("Unable to send noteOFF %d (vel: %d) at time %d. Time now: %d\n",key,velocity,time,(int)data->time); }