ADSR* adsr_new(void) { ADSR* env = malloc(sizeof(*env)); if (!env) return 0; adsr_init(env); return env; }
int note_on(int midinote, int instrument) { for (int i = 0; i < NUM_CHANNELS; i++) { Channel* ch = &channels[i]; if (!ch->alive) { ch->instr = instruobj_by_num(instrument); memset(ch->instrstate, 0, sizeof(ch->instrstate)); adsr_init(&ch->instr->adsr, &ch->adsr); ch->note = midinote; ch->alive = 1; ch->volume = ch->instr->volume; return 0; } } return -1; }
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(); debug("creating global lfo:%d %p\n", i, p->glfo[i]); /* 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) { int j; p->voices[i] = patch_voice_new(); for (j = 0; j < VOICE_MAX_ENVS; ++j) adsr_init(p->voices[i]->env[j]); } 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; }