Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 76 additions & 17 deletions crates/fretwire-protocol/src/settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ pub struct Setting {

/// Every setting id we have identified.
///
/// **Read off a physical HX Stomp, 2026-08-22**, except the five marked `[XL]`, which an HX Stomp
/// **Read off a physical HX Stomp, 2026-08-22**, except those marked `[XL]`, which an HX Stomp
/// XL owner read off that pedal the same way and contributed [2026-08-23]. Where the two units'
/// menus name a thing differently the XL's wording is used, because it is the one we have in
/// writing; an id the XL has and the Stomp does not simply refuses on a Stomp, and `scan_settings`
Expand Down Expand Up @@ -126,10 +126,10 @@ pub const SETTINGS: &[Setting] = &[
},
Setting {
id: 27,
name: "Preset numbering",
group: "Displays",
name: "Preset Number",
group: "Preferences",
kind: Kind::Flag {
on: "000-127",
on: "000-128",
off: "01A-32D",
},
},
Expand All @@ -142,19 +142,43 @@ pub const SETTINGS: &[Setting] = &[
off: "Instrument",
},
},
Setting {
id: 65,
// [XL]
name: "Tempo Pitch",
group: "Preferences",
kind: Kind::Flag {

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It occurs to me that in #11 I don't think I was careful about using Kind::Flag vs. Kind::Choice; I likely just copy-pasted a nearby entry.

I was more careful in this PR to pick Kind::Flag or Kind::Choice based on whether the UI was showing "false/true" vs. "0/1".

on: "Transpr",
off: "Authentc",
},
},
Setting {
id: 68,
// [XL]
name: "Tip Polarity",
group: "Preferences",
kind: Kind::Choice(&[(0, "Normal"), (1, "Inverted")]),
},
Setting {
id: 69,
// [XL]
name: "Ring Polarity",
group: "Preferences",
kind: Kind::Choice(&[(0, "Normal"), (1, "Inverted")]),
},
Setting {
id: 73,
name: "Snapshot edits",
name: "Snapshot Edits",
group: "Preferences",
kind: Kind::Choice(&[(0, "Recall"), (1, "Discard")]),
},
Setting {
id: 81,
name: "Bypass type",
name: "Bypass Type",
group: "Preferences",
kind: Kind::Flag {
on: "DSP bypass",
off: "Analog bypass",
on: "DSP",
off: "Analog",
},
},
Setting {
Expand All @@ -166,6 +190,33 @@ pub const SETTINGS: &[Setting] = &[
off: "Instrument",
},
},
Setting {
id: 95,
// [XL]
name: "EXP/FS Tip",
group: "Preferences",
kind: Kind::Flag {
on: "FS7",
off: "EXP 1",
},
},
Setting {
id: 96,
// [XL]
name: "EXP/FS Ring",
group: "Preferences",
kind: Kind::Flag {
on: "FS8",
off: "EXP 2",
},
},
Setting {
id: 103,
// [XL]
name: "Snapshot Reselect",
group: "Preferences",
kind: Kind::Choice(&[(0, "Reload"), (1, "Toggle")]),
},
Setting {
id: 127,
// **Called "Guitar In-Z" here from 2026-08-22 to 2026-08-23, which is not a name this
Expand All @@ -182,7 +233,14 @@ pub const SETTINGS: &[Setting] = &[
// either side, so which one is `First` is not recoverable after the fact.
name: "Auto In-Z",
group: "Preferences",
kind: Kind::Choice(&[]),
kind: Kind::Choice(&[(0, "First"), (1, "Enabled")]),
},
Setting {
id: 136,
// [XL]
name: "Link Dual Cabs",
group: "Preferences",
kind: Kind::Choice(&[(0, "Off"), (1, "On")]),
},
Setting {
id: 153,
Expand Down Expand Up @@ -331,11 +389,12 @@ pub const SETTINGS: &[Setting] = &[
/// Ids absent from here sort after every id present, by id — see [`menu_rank`]. That is the honest
/// default: nobody has placed them, so they keep their numeric position rather than being guessed
/// into the middle of a menu.
///
/// **Ins/Outs, as an HX Stomp XL shows it** [2026-08-23] — that group is complete. Preferences is
/// not placed at all: id 127 is known to be its tenth item, but 73 and 81 are unplaced, and one
/// known position out of three would sort the other two ahead of it and be worse than no order.
pub const MENU_ORDER: &[i64] = &[31, 94, 2, 3, 154, 153, 158, 156];
pub const MENU_ORDER: &[i64] = &[
31, 94, 2, 3, 154, 153, 158, 156, // Ins/Outs
81, 73, 65, 95, 96, 68, 69, 27, 103, 127, 136, // Preferences
9, 11, // MIDI
14, 16, // Tempo
];

/// Where `id` sits in the pedal's menus — `MENU_ORDER.len()` for an id nobody has placed.
///
Expand Down Expand Up @@ -396,9 +455,9 @@ pub fn is_writable(id: i64) -> bool {
pub const GROUPS: &[&str] = &[
"Global EQ",
"Ins/Outs",
"Preferences",
"Tempo",
"MIDI",
"Preferences",
"Displays",
];

Expand Down Expand Up @@ -438,11 +497,11 @@ mod tests {
#[test]
fn preset_numbering_is_id_27() {
let s = by_id(27).unwrap();
assert_eq!(s.name, "Preset numbering");
assert_eq!(s.name, "Preset Number");
assert_eq!(
s.kind,
Kind::Flag {
on: "000-127",
on: "000-128",
off: "01A-32D"
}
);
Expand Down
Loading