#define SAMPLE_RATE 44100 #define FRAME_STEP 4410 //0.1 second time steps float *SynthLeftBuffer, *SynthRightBuffer; fluid_sequencer_t *Sequencer; fluid_synth_t *Synth; void main_loop() { event_t *NextEvent = get_next_event(); fluid_event_t *FluidEvent = new_fluid_event(); size_t CurrentFrame = 0; for (;;) { size_t TargetFrame = CurrentFrame + FRAME_STEP; while (NextEvent->Frame <= TargetFrame) { if (NextEvent->is_fluid_event()) { NextEvent->as_fluid_event(FluidEvent); fluid_sequencer_send_at(Sequencer, FluidEvent, NextEvent->Frame * 1000.0 / SAMPLE_RATE, 1); } else if (NextEvent->is_lv2_event()) { // do something else }; NextEvent = get_next_event(); }; fluid_synth_write_float(Synth, TIME_STEP, SynthLeftBuffer, 0, 1, SynthRightBuffer 0, 1); // process buffers using lv2 and other filters write_buffers_to_output(); CurrentFrame = TargetFrame; }; };