iidx, sdvx: SOCD cleaner for knobs and turntables (#497)

## Link to GitHub Issue, if one exists
n/a

## Description of change
Apply SOCD cleaner algorithm to deal with the case where both
counter-clockwise and clockwise buttons are pressed at the same time.

In SDVX, default algorithm is to prefer the most recently pressed
direction. This is better for dealing with slams in rapid succession,
for example, as you don't have to completely let go of one direction to
hit the other now.

In IIDX, default algorithm is neutral (same behavior as before). Using
last or first algorithm results in double scratches which means you'll
likely end up with an excessive poor after hitting a scratch, so neutral
is actually beneficial. Besides, if you are serious about playing on the
keyboard, you should be using `TT +/-` and `TT +/- Alternate`.

## Testing
Tested SDVX 3, EG (old cab), EG valk cab modes, IIDX 24, 27, 33
(tdj/ldj)
This commit is contained in:
bicarus
2026-01-04 19:50:11 -08:00
committed by GitHub
parent 7f281a50c5
commit 7b903d35e2
10 changed files with 262 additions and 24 deletions
+35 -1
View File
@@ -604,7 +604,7 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
{
.title = "IIDX TDJ Mode (Lightning Model)",
.name = "iidxtdj",
.desc = "Enables TDJ cabinet mode. Ensure you also set -iidxsounddevice to desired option",
.desc = "Enables TDJ mode (Lightning Model cabinet).",
.type = OptionType::Bool,
.game_name = "Beatmania IIDX",
.category = "Game Options",
@@ -621,6 +621,23 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
.game_name = "Beatmania IIDX",
.category = "Game Options (Advanced)",
},
{
// IIDXDigitalTTSocd
.title = "IIDX Digital TT SOCD Cleaner",
.name = "iidxsocd",
.desc = "SOCD for turntables when using button input; what happens when both directions are pressed.\n\n"
"last: most recently pressed direction takes priority\n\n"
"first: first pressed direction takes priority\n\n"
"neutral (default): TT does not move when both directions are pressed, recommended to avoid excessive POORs",
.type = OptionType::Enum,
.game_name = "Beatmania IIDX",
.category = "Game Options (Advanced)",
.elements = {
{"last", ""},
{"first", ""},
{"neutral", ""},
},
},
{
// spice2x_IIDXLDJForce720p
.title = "IIDX LDJ Force 720p (HD)",
@@ -804,6 +821,23 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
.game_name = "Sound Voltex",
.category = "Game Options (Advanced)",
},
{
// SDVXDigitalKnobSocd
.title = "SDVX Digital Knob SOCD Cleaner",
.name = "sdvxsocd",
.desc = "SOCD for knobs when using button input; what happens when both directions are pressed.\n\n"
"last (default): most recently pressed direction takes priority, recommended to deal with slams\n\n"
"first: first pressed direction takes priority\n\n"
"neutral: knob does not move when both directions are pressed",
.type = OptionType::Enum,
.game_name = "Sound Voltex",
.category = "Game Options (Advanced)",
.elements = {
{"last", ""},
{"first", ""},
{"neutral", ""},
},
},
{
// spice2x_SDVXAsioDriver
.title = "SDVX ASIO driver",