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