float const* patch_mod_id_to_pointer(int id, Patch* p, PatchVoice* v) { switch(id) { case MOD_SRC_NONE: return NULL; case MOD_SRC_ONE: return &one; case MOD_SRC_VELOCITY: return (v) ? &v->vel : NULL; case MOD_SRC_KEY: return (v) ? &v->key_track : NULL; case MOD_SRC_PITCH_WHEEL: return &((*cc_arr)[p->channel][0]); } if ((id & MOD_SRC_EG) && v) { id &= ~MOD_SRC_EG; if (id < VOICE_MAX_ENVS) return adsr_output(v->env[id]); } if ((id & MOD_SRC_VLFO) && v) { id &= ~MOD_SRC_VLFO; if (id < VOICE_MAX_LFOS) return lfo_output(v->lfo[id]); } if (id & MOD_SRC_GLFO) { id &= ~MOD_SRC_GLFO; if (id < PATCH_MAX_LFOS) return lfo_output(p->glfo[id]); } if (id & MOD_SRC_MIDI_CC) { id &= ~MOD_SRC_MIDI_CC; return &((*cc_arr)[p->channel][id + 1]); } debug("unknown modulation source:%d\n", id); return 0; }
int sample_default(Sample* sample, int rate) { int frames = rate / 8; float* tmp; LFO* lfo; LFOParams lfopar; int i; double v; float const* lfo_out; debug("Creating default sample\n"); if (!(tmp = malloc(frames * 2 * sizeof(*tmp)))) { pf_error(PF_ERR_SAMPLE_DEFAULT_ALLOC); return -1; } sample->frames = frames; sample->sp = tmp; lfo = lfo_new(); lfo_init(lfo); lfo_params_init(&lfopar, 523.251, LFO_SHAPE_SAW); lfo_trigger(lfo, &lfopar); lfo_out = lfo_output(lfo); for (i = 0; i < frames; ++i) { lfo_tick(lfo); v = *lfo_out * 0.9; *tmp++ = v; *tmp++ = v; } lfo_free(lfo); sample->filename = strdup("Default"); sample->default_sample = true; return 0; }