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; }
Patch* patch_new(void) { int i; Patch* p; p = malloc(sizeof(*p)); if (!p) return 0; p->name[0] = '\0'; p->active = false; p->sample = sample_new(); p->display_index = -1; p->name[0] = '\0'; p->channel = 0; p->root_note = 60; p->lower_note = 60; p->upper_note = 60; p->lower_vel = 0; p->upper_vel = 127; p->cut = 0; p->cut_by = 0; p->play_start = 0; p->play_stop = 0; p->loop_start = 0; p->loop_stop = 0; p->sample_stop = 0; p->marks[WF_MARK_START] = &start_frame; p->marks[WF_MARK_STOP] = &p->sample_stop; p->marks[WF_MARK_PLAY_START] = &p->play_start; p->marks[WF_MARK_PLAY_STOP] = &p->play_stop; p->marks[WF_MARK_LOOP_START] = &p->loop_start; p->marks[WF_MARK_LOOP_STOP] = &p->loop_stop; p->fade_samples = 0; p->xfade_samples = 0; p->porta.active = true; /* but only if PORTAMENTO */ p->porta.thresh = 0.5; /* controller says so... */ p->porta.mod_id = MOD_SRC_MIDI_CC + CC_PORTAMENTO; p->porta_secs.val = 0.05; p->porta_secs.mod_amt = 1.0; p->porta_secs.mod_id = MOD_SRC_MIDI_CC + CC_PORTAMENTO_TIME; p->pitch_steps = 2; p->pitch_bend = 0; p->mono = false; p->legato.active = true; /* but only if mono is on, *AND* */ p->legato.thresh = 0.5; /* LEGATO controller says so... */ p->legato.mod_id = MOD_SRC_MIDI_CC + CC_LEGATO; p->play_mode = PATCH_PLAY_SINGLESHOT; for (i = 0; i < MAX_MOD_SLOTS; ++i) { p->amp.mod_id[i] = MOD_SRC_NONE; p->amp.mod_amt[i] = 0.0; p->pan.mod_id[i] = MOD_SRC_NONE; p->pan.mod_amt[i] = 0.0; p->ffreq.mod_id[i] = MOD_SRC_NONE; p->ffreq.mod_amt[i] = 0.0; p->freso.mod_id[i] = MOD_SRC_NONE; p->freso.mod_amt[i] = 0.0; p->pitch.mod_id[i] = MOD_SRC_NONE; p->pitch.mod_amt[i] = 0.0; p->mod_pitch_min[i] = 1.0; p->mod_pitch_max[i] = 1.0; } p->amp.val = DEFAULT_AMPLITUDE; p->amp.vel_amt = 1.0; p->amp.key_amt = 0.0; p->pan.val = 0.0; p->pan.vel_amt = 0; p->pan.key_amt = 0.0; p->ffreq.val = 1.0; p->ffreq.vel_amt = 0; p->ffreq.key_amt = 0; p->freso.val = 0.0; p->freso.vel_amt = 0; p->freso.key_amt = 0; p->pitch.val = 0.0; p->pitch.vel_amt = 0; p->pitch.key_amt = 1.0; for (i = 0; i < PATCH_MAX_LFOS; ++i) { lfo_params_init(&p->glfo_params[i], 1.0, LFO_SHAPE_SINE); p->glfo[i] = lfo_new(); /* init tables to NULL */ p->glfo_table[i] = 0; } patch_set_global_lfo_buffers(p, patch_buffersize); /* only the params for the voice lfo can be set at this stage */ for (i = 0; i < VOICE_MAX_LFOS; ++i) lfo_params_init(&p->vlfo_params[i], 1.0, LFO_SHAPE_SINE); for (i = 0; i < VOICE_MAX_ENVS; i++) adsr_params_init(&p->env_params[i], 0.005, 0.025); for (i = 0; i < PATCH_VOICE_COUNT; ++i) { p->voices[i] = patch_voice_new(); } p->last_note = -1; pthread_mutex_init(&p->mutex, NULL); debug("********************************\n"); debug("created patch:%s [%p]\n", p->name, p); debug("********************************\n"); return p; }