Add 4CM routing fields to Preset data model

- Add routing_mode (mono/4cm) and routing_breakpoint (default 7) to Preset
- Serialize/deserialize in _preset_to_dict / _preset_from_dict
- Backward compatible — old presets default to mono/7
- Add get_4cm_config() / set_4cm_config() helpers on PresetManager
- set_4cm_config validates mode and saves back to disk
- All 48 related tests pass (46 preset + 2 integration activation)
This commit is contained in:
2026-06-08 10:39:38 -04:00
parent 1c5b728e8b
commit 80011274f2
2 changed files with 40 additions and 0 deletions
+36
View File
@@ -44,6 +44,8 @@ def _preset_to_dict(preset: Preset) -> dict:
"bank": preset.bank,
"program": preset.program,
"master_volume": preset.master_volume,
"routing_mode": preset.routing_mode,
"routing_breakpoint": preset.routing_breakpoint,
"tuner_enabled": preset.tuner_enabled,
"chain": [
{
@@ -99,6 +101,8 @@ def _preset_from_dict(data: dict) -> Preset:
chain=chain,
midi_mappings=midi_mappings,
master_volume=data.get("master_volume", 0.8),
routing_mode=data.get("routing_mode", "mono"),
routing_breakpoint=data.get("routing_breakpoint", 7),
tuner_enabled=data.get("tuner_enabled", False),
)
@@ -332,6 +336,38 @@ class PresetManager:
logger.info("Reordered preset at (%d,%d) → (%d,%d)", bank, program, bank, new_program)
# ── 4CM routing config ──────────────────────────────────────────────
def get_4cm_config(self, preset: Preset) -> tuple[str, int]:
"""Return (routing_mode, routing_breakpoint) from a preset.
Returns:
Tuple of ``(routing_mode, routing_breakpoint)``.
"""
return (preset.routing_mode, preset.routing_breakpoint)
def set_4cm_config(
self, preset: Preset, mode: str, breakpoint: int = 7
) -> None:
"""Set 4CM routing configuration on a preset in-place and save it.
Args:
preset: The preset to modify.
mode: ``\"mono\"`` or ``\"4cm\"``.
breakpoint: Chain index where the pre/post split occurs
(default 7 = after IR_CAB, before mod FX).
Raises:
ValueError: If ``mode`` is not ``\"mono\"`` or ``\"4cm\"``.
"""
if mode not in ("mono", "4cm"):
raise ValueError(f"routing_mode must be 'mono' or '4cm', got {mode!r}")
preset.routing_mode = mode
preset.routing_breakpoint = breakpoint
self.save(preset)
logger.info("Set 4CM config on '%s': mode=%s breakpoint=%d",
preset.name, mode, breakpoint)
# ── Bank management ─────────────────────────────────────────────────────
def list_banks(self) -> list[Bank]:
+4
View File
@@ -60,6 +60,10 @@ class Preset:
master_volume: float = 0.8
tuner_enabled: bool = False
# 4-Cable Method routing
routing_mode: str = "mono" # "mono" or "4cm"
routing_breakpoint: int = 7 # chain index where pre/post split occurs
@dataclass
class Bank: