Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RFC] Using Sustain Pedal like Soft Pedal #1276

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
12 changes: 11 additions & 1 deletion src/synth/fluid_voice.c
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,7 @@ fluid_voice_init(fluid_voice_t *voice, fluid_sample_t *sample,
voice->mod_count = 0;
voice->start_time = start_time;
voice->has_noteoff = 0;
voice->ignore_sustain = 0;
derselbst marked this conversation as resolved.
Show resolved Hide resolved
UPDATE_RVOICE0(fluid_rvoice_reset);

/*
Expand Down Expand Up @@ -612,6 +613,15 @@ fluid_voice_calculate_runtime_synthesis_parameters(fluid_voice_t *voice)
int dest_gen_index = mod->dest;
fluid_gen_t *dest_gen = &voice->gen[dest_gen_index];
dest_gen->mod += modval;

// issue blablabla: If a modulator is in use, which responds to CC64 and intended to manipulate the release envelope, this voice should not be sustained,
// to allow the modulator to achieve its desired behavior while the sustain switch is being depressed.
if((mod->src1 == SUSTAIN_SWITCH && mod->flags1 & (FLUID_MOD_CC | FLUID_MOD_SWITCH))
|| (mod->src2 == SUSTAIN_SWITCH && mod->flags2 & (FLUID_MOD_CC | FLUID_MOD_SWITCH))
&& (mod->dest == GEN_VOLENVRELEASE))
{
voice->ignore_sustain = 1;
}
derselbst marked this conversation as resolved.
Show resolved Hide resolved
/* fluid_dump_modulator(mod); */
}

Expand Down Expand Up @@ -1364,7 +1374,7 @@ fluid_voice_noteoff(fluid_voice_t *voice)
voice->status = FLUID_VOICE_HELD_BY_SOSTENUTO;
}
/* Or sustain a note under Sustain pedal */
else if(fluid_channel_sustained(channel))
else if(fluid_channel_sustained(channel) && !voice->ignore_sustain)
{
voice->status = FLUID_VOICE_SUSTAINED;
}
derselbst marked this conversation as resolved.
Show resolved Hide resolved
Expand Down
1 change: 1 addition & 0 deletions src/synth/fluid_voice.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ struct _fluid_voice_t
/* rvoice control */
fluid_rvoice_t *rvoice;
fluid_rvoice_t *overflow_rvoice; /* Used temporarily and only in overflow situations */
char ignore_sustain;
derselbst marked this conversation as resolved.
Show resolved Hide resolved
char can_access_rvoice; /* False if rvoice is being rendered in separate thread */
char can_access_overflow_rvoice; /* False if overflow_rvoice is being rendered in separate thread */
char has_noteoff; /* Flag set when noteoff has been sent */
Expand Down