/* 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); }
/* 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); }
/** * Unregister a previously registered client. * @param seq Sequencer object * @param id Client ID as returned by fluid_sequencer_register_client(). */ void fluid_sequencer_unregister_client (fluid_sequencer_t* seq, short id) { fluid_list_t *tmp; fluid_event_t* evt; if (seq->clients == NULL) return; evt = new_fluid_event(); if (evt != NULL) { fluid_event_unregistering(evt); fluid_event_set_dest(evt, id); } tmp = seq->clients; while (tmp) { fluid_sequencer_client_t *client = (fluid_sequencer_client_t*)tmp->data; if (client->id == id) { /* What should we really do if evt is null due to out-of-memory? */ if (client->callback != NULL && evt != NULL) (client->callback)(fluid_sequencer_get_tick(seq), evt, seq, client->data); if (client->name) FLUID_FREE(client->name); seq->clients = fluid_list_remove_link(seq->clients, tmp); delete1_fluid_list(tmp); FLUID_FREE(client); delete_fluid_event(evt); return; } tmp = tmp->next; } delete_fluid_event(evt); return; }
static void *create_data(const wchar_t *filename, float samplerate){ Data *data = calloc(1,sizeof(Data)); data->pitch = 16384/2; data->pitch_range = 1; data->modulation = 0; data->sustain_on = 0; data->signal_from_RT = RSEMAPHORE_create(0); data->settings = new_fluid_settings(); if(data->settings==NULL){ RError("Unable to create fluidsynth settings"); delete_data(data); return NULL; } if(fluid_settings_setnum(data->settings, "synth.sample-rate", samplerate)==0){ RError("Unable to set sample rate of fluidsynth to %f\n",samplerate); //delete_data(data); //return NULL; } if(fluid_settings_setint(data->settings, "synth.threadsafe-api", 0)==0){ printf("Unable to set threadsafe-api to 0 (we don't need it)\n"); } if(fluid_settings_setint(data->settings, "synth.chorus.active", 0)==0){ printf("Unable to set synth.chorus.active to 0 (we don't use it)\n"); } if(fluid_settings_setint(data->settings, "synth.reverb.active", 0)==0){ printf("Unable to set synth.reverb.active to 0 (we don't use it)\n"); } // TODO: Decide whether we need fluidsynth's reverb and chorus. //fluid_settings_setstr(settings, "synth.reverb.active", "yes"); //fluid_settings_setstr(settings, "synth.chorus.active", "no"); data->synth = new_fluid_synth(data->settings); if(data->synth==NULL){ RError("Unable to create fluidsynth synth"); delete_data(data); return NULL; } data->sequencer = new_fluid_sequencer2(0); if(data->sequencer==NULL){ RError("Unable to create fluidsynth sequencer"); delete_data(data); return NULL; } fluid_sequencer_set_time_scale(data->sequencer, samplerate); // it's a shame that time in fluidsynth is only 32 bit. Hopefully the values wrap properly around....... data->time_scale = fluid_sequencer_get_time_scale(data->sequencer); data->samplerate = samplerate; #if 0 // This test always succeeds. Max time_scale in fluidsynth is 1000.0. :-( if( data->time_scale != sample_rate){ RError("Could not set time scale to %f (set to %f instead)\n",(float)samplerate,(float)fluid_sequencer_get_time_scale(data->sequencer)); } #endif data->synth_seq_ID = fluid_sequencer_register_fluidsynth(data->sequencer, data->synth); data->event = new_fluid_event(); if(data->event==NULL){ RError("Unable to create fluidsynth event"); delete_data(data); return NULL; } data->filename = wcsdup(OS_loading_get_resolved_file_path(filename)); data->soundfont_id = fluid_synth_sfload(data->synth,STRING_get_chars(data->filename),true); if(data->soundfont_id==FLUID_FAILED){ printf("Soundfont loading failed for \"%s\"\n",STRING_get_chars(data->filename)); delete_data(data); return NULL; } return data; }