probonopd / MiniDexed

Dexed FM synthesizer similar to 8x DX7 (TX816/TX802) running on a bare metal Raspberry Pi (without a Linux kernel or operating system)
https://github.com/probonopd/MiniDexed/wiki
962 stars 72 forks source link

Sostenuto pedal does nothing #624

Open Kirtai opened 3 months ago

Kirtai commented 3 months ago

I just tried the latest release with my dpiano and while the sustain pedal works the sostenuto one doesn't.

Any thoughts on adding support for this?

The MIDI CC# for sostenuto is 66.

diyelectromusic commented 3 months ago

Ok, so I've had a bit of a look at this and I'm not sure this is implemented in the Synth_Dexed synth engine MiniDexed uses.

I've found references online to sostenuto being "key hold" which can be set to be controlled by the second foot controller (FC2) in a DX7ii:

image

But can't see where this maps into Dexed itself - I'm not sure it is part of the original DX7? There are a number of API calls in Synth_Dexed to set what the foot controller will do for voices (choosing combinations of pitch, amplitude, EG and the range) and there is a global sustain function. But I can't see a mention of sostenuto or key hold in the original DX7 manual and I'm not sure the original DX7 recognised CC66 either from the MIDI implementation chart I've found - again I'm wondering if this might be a DX7ii thing...

Kevin

Kirtai commented 3 months ago

"Key Hold" sounds like the right thing though it's sad that it's not in the original DX7. :(

Kirtai commented 3 months ago

Should I suggest this to the upstream Synth_Dexed or the original Dexed?

diyelectromusic commented 3 months ago

Hmm, good question. Not sure. I guess ultimately it would have to be in Synth_Dexed regardless even if the original change is further upstream, so I'd probably start there.

I can see that each note has a "sustain" flag but that seems to always be set according to the voice's global sustain status. I don't know how the two would interact so it might be necessary to introduce a "hold" flag for notes too to allow either sustain or hold to hang on...

I don't follow the Dexed code as much as Synth_Dexed, but I couldn't obviously see it implemented there either. It certainly didn't look like it processed CC 66, only CC 64 - this is in PluginProcessor/processMidiMessage, which appears to have most of the logic that became dexed.cpp in Synth_Dexed.

Given how the code is quite diverged anyway, it could perhaps be added to Synth_Dexed and not worry about the original... I don't know how much time Holger has to think about such things in Synth_Dexed these days though...

Kevin