Пример #1
0
Voice_group* Voice_pool_start_group_iteration(Voice_pool* pool)
{
    assert(pool != NULL);

    Voice_pool_sort_groups(pool);

    Voice_group_init(&pool->group_iter, pool->voices, 0, pool->size);
    pool->group_iter_offset = Voice_group_get_size(&pool->group_iter);

    if (Voice_group_get_size(&pool->group_iter) == 0)
        return NULL;

    return &pool->group_iter;
}
Пример #2
0
Voice_group* Voice_pool_get_next_group(Voice_pool* pool)
{
    assert(pool != NULL);

    if (pool->group_iter_offset >= pool->size)
        return NULL;

    Voice_group_init(
            &pool->group_iter, pool->voices, pool->group_iter_offset, pool->size);
    pool->group_iter_offset += Voice_group_get_size(&pool->group_iter);

    if (Voice_group_get_size(&pool->group_iter) == 0)
        return NULL;

    return &pool->group_iter;
}
Пример #3
0
bool Event_channel_note_off_process(
        Channel* ch,
        Device_states* dstates,
        const Master_params* master_params,
        const Event_params* params)
{
    rassert(ch != NULL);
    rassert(dstates != NULL);
    rassert(master_params != NULL);
    ignore(params);

    Voice_group* vgroup = Event_get_voice_group(ch);
    if (vgroup != NULL)
    {
        for (int i = 0; i < Voice_group_get_size(vgroup); ++i)
        {
            Voice* voice = Voice_group_get_voice(vgroup, i);
            voice->frame_offset = ch->frame_offset_temp;

            if (voice->prio == VOICE_PRIO_INACTIVE)
                continue;

            rassert(voice->prio >= VOICE_PRIO_FG);
            rassert(voice->group_id == ch->fg_group_id);

            voice->state->note_on = false;
            voice->prio = VOICE_PRIO_BG;
        }
    }

    ch->fg_group_id = 0;

    return true;
}
Пример #4
0
bool Event_channel_set_ch_expression_process(
        Channel* ch,
        Device_states* dstates,
        const Master_params* master_params,
        const Event_params* params)
{
    rassert(ch != NULL);
    rassert(dstates != NULL);
    rassert(master_params != NULL);
    rassert(params != NULL);
    rassert(params->arg != NULL);
    rassert(params->arg->type == VALUE_TYPE_NONE ||
            params->arg->type == VALUE_TYPE_STRING);

    const char* expr = ch->init_ch_expression;
    if (params->arg->type == VALUE_TYPE_STRING)
        expr = params->arg->value.string_type;

    Active_names_set(ch->parent.active_names, ACTIVE_CAT_CH_EXPRESSION, expr);

    Voice_group* vgroup = Event_get_voice_group(ch);
    if (vgroup == NULL)
        return true;

    for (int i = 0; i < Voice_group_get_size(vgroup); ++i)
    {
        Voice* voice = Voice_group_get_voice(vgroup, i);

        Voice_state* vstate = voice->state;
        if (!vstate->expr_filters_applied)
            strcpy(vstate->ch_expr_name, expr);
    }

    return true;
}
Пример #5
0
bool Event_channel_set_note_expression_process(
        Channel* ch,
        Device_states* dstates,
        const Master_params* master_params,
        const Event_params* params)
{
    rassert(ch != NULL);
    rassert(dstates != NULL);
    rassert(master_params != NULL);
    rassert(params != NULL);
    rassert(params->arg != NULL);
    rassert(params->arg->type == VALUE_TYPE_NONE ||
            params->arg->type == VALUE_TYPE_STRING);

    static const char apply_default[] = "";
    static const char disabled[] = "!none";
    const char* expr = apply_default;
    if (params->arg->type == VALUE_TYPE_STRING)
    {
        if (params->arg->value.string_type[0] == '\0')
            expr = disabled;
        else
            expr = params->arg->value.string_type;
    }

    Active_names_set(ch->parent.active_names, ACTIVE_CAT_NOTE_EXPRESSION, expr);

    Voice_group* vgroup = Event_get_voice_group(ch);
    if (vgroup == NULL)
        return true;

    for (int i = 0; i < Voice_group_get_size(vgroup); ++i)
    {
        Voice* voice = Voice_group_get_voice(vgroup, i);

        Voice_state* vstate = voice->state;
        if (!vstate->expr_filters_applied)
            strcpy(vstate->note_expr_name, expr);
    }

    return true;
}