Esempio n. 1
0
ADSR* adsr_new(void)
{
    ADSR* env = malloc(sizeof(*env));

    if (!env)
        return 0;

    adsr_init(env);

    return env;
}
Esempio n. 2
0
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;
}
Esempio n. 3
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();

        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;
}