diff --git a/crates/fretwire-protocol/src/settings.rs b/crates/fretwire-protocol/src/settings.rs index 95f1e23..e7102eb 100644 --- a/crates/fretwire-protocol/src/settings.rs +++ b/crates/fretwire-protocol/src/settings.rs @@ -77,7 +77,7 @@ pub const SETTINGS: &[Setting] = &[ }, Setting { id: 9, - name: "MIDI base channel", + name: "MIDI Base Channel", group: "MIDI/Tempo", // Zero-based on the wire: the pedal's channel 4 reads back as 3. Presented one-based, since // that is what the pedal's screen and every other MIDI device call it. @@ -100,30 +100,102 @@ pub const SETTINGS: &[Setting] = &[ (15, "16"), ]), }, + Setting { + id: 10, + // [XL] + name: "MIDI Thru", + group: "MIDI/Tempo", + kind: Kind::Flag { + on: "On", + off: "Off", + }, + }, Setting { id: 11, - name: "MIDI over USB", + name: "USB MIDI", group: "MIDI/Tempo", kind: Kind::Flag { on: "On", off: "Off", }, }, + Setting { + id: 12, + // [XL] + name: "MIDI PC Rx", + group: "MIDI/Tempo", + kind: Kind::Choice(&[(0, "Off"), (1, "MIDI"), (2, "USB"), (3, "MIDI+USB")]), + }, + Setting { + id: 13, + // [XL] + name: "Rx MIDI Clock", + group: "MIDI/Tempo", + kind: Kind::Choice(&[(0, "Off"), (1, "MIDI"), (2, "USB"), (3, "Auto")]), + }, Setting { id: 14, - name: "Tempo select", + name: "Tempo Select", group: "MIDI/Tempo", - kind: Kind::Choice(&[(0, "Per snapshot"), (1, "Per preset"), (2, "Global")]), + kind: Kind::Choice(&[(0, "Snapsht"), (1, "Preset"), (2, "Global")]), }, Setting { id: 16, - name: "Tempo", + name: "BPM", group: "MIDI/Tempo", kind: Kind::Number { unit: "BPM", off: None, }, }, + Setting { + id: 17, + // [XL] + name: "Stomp Select", + group: "Footswitches", + kind: Kind::Choice(&[(0, "Off"), (1, "Touch"), (2, "Press"), (3, "Both")]), + }, + Setting { + id: 18, + // [XL] + name: "Preset Mode", + group: "Footswitches", + kind: Kind::Choice(&[(0, "Moment"), (1, "Latch")]), + }, + Setting { + id: 19, + // [XL] + name: "Stomp Mode", + group: "Footswitches", + kind: Kind::Choice(&[(0, "4 Swtch"), (1, "6 Swtch")]), + }, + Setting { + id: 20, + // [XL] + name: "Up/Down Switches", + group: "Footswitches", + kind: Kind::Choice(&[(0, "Banks"), (1, "Preset"), (2, "Snapsht")]), + }, + Setting { + id: 25, + // [XL] + name: "LED Rings", + group: "Displays", + kind: Kind::Flag { + on: "Dim/Brt", + off: "Off/Brt", + }, + }, + Setting { + id: 26, + // [XL] + name: "Tap LED", + group: "Displays", + kind: Kind::Flag { + on: "On", + off: "Off", + }, + }, Setting { id: 27, // **These labels are the XL's, and they are wrong on a plain Stomp.** The flat form spells @@ -173,6 +245,20 @@ pub const SETTINGS: &[Setting] = &[ off: "Authentc", }, }, + Setting { + id: 66, + // [XL] + name: "EXP 1 Position", + group: "EXP Pedals", + kind: Kind::Choice(&[(0, "Snapsht"), (1, "Preset"), (2, "Global")]), + }, + Setting { + id: 67, + // [XL] + name: "Snapsht Mode", + group: "Footswitches", + kind: Kind::Choice(&[(0, "Moment"), (1, "Latch"), (2, "Toggle")]), + }, Setting { id: 68, // [XL] @@ -187,12 +273,33 @@ pub const SETTINGS: &[Setting] = &[ group: "Preferences", kind: Kind::Choice(&[(0, "Normal"), (1, "Inverted")]), }, + Setting { + id: 71, + // [XL] + name: "EXP 2 Position", + group: "EXP Pedals", + kind: Kind::Choice(&[(0, "Snapsht"), (1, "Preset"), (2, "Global")]), + }, Setting { id: 73, name: "Snapshot Edits", group: "Preferences", kind: Kind::Choice(&[(0, "Recall"), (1, "Discard")]), }, + Setting { + id: 76, + // [XL] + name: "Tx MIDI Clock", + group: "MIDI/Tempo", + kind: Kind::Choice(&[(0, "Off"), (1, "MIDI"), (2, "USB"), (3, "MIDI+USB")]), + }, + Setting { + id: 77, + // [XL] + name: "MIDI PC Tx", + group: "MIDI/Tempo", + kind: Kind::Choice(&[(0, "Off"), (1, "MIDI"), (2, "USB"), (3, "MIDI+USB")]), + }, Setting { id: 81, name: "Bypass Type", @@ -238,6 +345,13 @@ pub const SETTINGS: &[Setting] = &[ group: "Preferences", kind: Kind::Choice(&[(0, "Reload"), (1, "Toggle")]), }, + Setting { + id: 117, + // [XL] + name: "Swap Up/Down", + group: "Footswitches", + kind: Kind::Choice(&[(0, "Off"), (1, "On")]), + }, Setting { id: 127, // **Called "Guitar In-Z" here from 2026-08-22 to 2026-08-23, which is not a name this @@ -260,6 +374,59 @@ pub const SETTINGS: &[Setting] = &[ group: "Preferences", kind: Kind::Choice(&[(0, "First"), (1, "Enabled")]), }, + Setting { + id: 129, + // [XL] + name: "TAP Function", + group: "Footswitches", + kind: Kind::Flag { + on: "AllBypas", + off: "TAP/Tunr", + }, + }, + Setting { + id: 130, + // [XL] + name: "FS7 Function", + group: "Footswitches", + kind: Kind::Choice(&[ + (0, "TAP/Tunr"), + (1, "Stomp 7"), + (2, "Bank Up"), + (3, "Bank Dn"), + (4, "PresetUp"), + (5, "PresetDn"), + (6, "SnpshtUp"), + (7, "SnpshtDn"), + (8, "AllBypas"), + (9, "TogglEXP"), + ]), + }, + Setting { + id: 131, + // [XL] + name: "FS8 Function", + group: "Footswitches", + kind: Kind::Choice(&[ + (0, "TAP/Tunr"), + (1, "Stomp 8"), + (2, "Bank Up"), + (3, "Bank Dn"), + (4, "PresetUp"), + (5, "PresetDn"), + (6, "SnpshtUp"), + (7, "SnpshtDn"), + (8, "AllBypas"), + (9, "TogglEXP"), + ]), + }, + Setting { + id: 135, + // [XL] + name: "Snapshot CC Send", + group: "MIDI/Tempo", + kind: Kind::Choice(&[(0, "Off"), (1, "On")]), + }, Setting { id: 136, // [XL] @@ -417,7 +584,10 @@ pub const SETTINGS: &[Setting] = &[ 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, 14, 16, // MIDI/Tempo + 17, 19, 18, 67, 20, 117, 129, 130, 131, // Footswitches + 66, 71, // EXP Pedals + 9, 10, 13, 76, 14, 16, 11, 12, 77, // MIDI/Tempo + 25, 26, // Displays ]; /// Where `id` sits in the pedal's menus — `MENU_ORDER.len()` for an id nobody has placed. @@ -483,11 +653,6 @@ pub fn is_writable(id: i64) -> bool { /// menu on the pedal. It leads the list because the panel gives it its own tab, and because every /// id in it sorts before the rest anyway; it is here so that [`group_rank`] can place it and so /// `every_group_is_declared` keeps covering it. -/// -/// `Footswitches` and `EXP Pedals` hold nothing yet. They are declared because the pedal shows both -/// sections populated, so the ids are there to be found — an empty group is a standing note that -/// this is where the next `settings-diff` pass should look, and it costs nothing: the panel renders -/// only groups that have rows. pub const GROUPS: &[&str] = &[ "Global EQ", "Ins/Outs", @@ -623,7 +788,9 @@ mod tests { #[test] fn groups_rank_in_the_pedals_menu_order() { assert!(group_rank("Ins/Outs") < group_rank("Preferences")); - assert!(group_rank("Preferences") < group_rank("MIDI/Tempo")); + assert!(group_rank("Preferences") < group_rank("Footswitches")); + assert!(group_rank("Footswitches") < group_rank("EXP Pedals")); + assert!(group_rank("EXP Pedals") < group_rank("MIDI/Tempo")); assert!(group_rank("MIDI/Tempo") < group_rank("Displays")); // Not a group at all — the raw tier, which must land after every named section. assert_eq!(group_rank("Unidentified"), GROUPS.len());