Steam Deck: △ switches between a fullscreen SONG screen and a fullscreen NOTES screen nf-75vd ← Beads

closed priority 2 task unassigned activesession:b

Twinned from https://github.com/cfsh/ninefold/issues/439 by tools/beads/import_github.py's reconcile pass.

From Aedan, in chat:

> "Tonapse on steam deck is still way too small, we need to have an option to make song / notes-editor fullscreen themselves, and then Triangle just switches between the two screens, with a small hint at the top/bottom to open the other screen."

Today

TonapseHome.BuildUi builds ONE page: the SONG card on top (capped at SongGrid.MaxVisibleRows ~5.5 rows), the edit card below it taking all remaining height (CHANNELS chips -> the change-instrument row -> pattern pills -> play -> piano roll), and the CONTROLS guide pinned in a second column on the right. Every stop is on screen at once, so on a 1280x800 Deck panel each half gets ~350px and the roll cells collapse. Triangle (TonapseHome.TriangleJump) already teleports focus between the two halves - it just doesn't change what is *shown*.

Wanted

One screen at a time. Triangle swaps which screen is up; a small persistent hint names the other one.

``` +- SONG (home) --------+ +- NOTES (deep dive) --+ | > song +bar -bar | | change keys instr. | <- on BOTH | ####....##.. keys | | > pattern | | ..####..#### drums | | .#..#..# | | CHANNELS chips | | .#..#..# roll | | pills a b c | | .#..#..# | | change keys instr. | | | +- ^ notes editor -----+ +- ^ song editor ------+ ```

Aedan's calls (chat, 2026-08-03):

- Trigger: auto by window size, with an override. Single-screen below a height threshold (the Deck's 1280x800 lands there), split above. The options-menu display page carries layout: auto / single / split so either can be forced. Persisted in options.cfg like text_scale and palette. - SONG is home; NOTES is a deep dive. In his words:

> "pattern screen doesn't need to have all the pills for different sounds / > patterns, it makes sense instead to go back to song screen as 'home', and > pattern is 'deep dive' into mostly the notes editor"

So both pickers live on the home screen - the CHANNELS chips (1:1 with song rows) and the pattern pills. The NOTES screen carries almost nothing but the roll: the transport, the change-instrument row, and the hint. - The change-instrument row is the one deliberate overlap:

> "consider that we have some overlap on both. both show 'change instrument > for channel' so e.g. u can mess with synth and then test the song, or mess > with it and test the pattern"

It is the entry to the sound-editor modal, whose whole point (#257) is dial -> listen -> dial. Square plays the song from the home screen and the pattern from the notes screen, so a row on each means you can shape a channel against either kind of listening without a screen swap in between. Both instances target EditorState.CurrentSoundIdx - two doors to one thing, not two states to keep in sync.

Consequence of home/deep-dive: how do you change pattern while deep?

Picking a *different* pattern now means going home. Two existing gestures already cover the common cases and should be checked against this, not reinvented: L1/R1 (and the held-shoulder + d-pad chord) walk the editing cell through the song without leaving the roll (#197/#245), and returns home to the cell whose pattern is open. If those turn out to be enough, the pills genuinely belong on home only; if they don't, that is the finding to report rather than quietly adding pills back.

Consequences to work through

- The #335 focus chain splits unevenly. Today it is one vertical chain `menu -> SONG header -> SONG window -> CHANNELS chips -> change-instrument -> pills -> play pattern -> roll`. Home keeps nearly all of it (menu -> header -> window -> chips -> pills -> change-instrument), and the deep dive gets a short one (change-instrument -> play pattern -> roll). The seam wiring has to clamp rather than cross: SoundPicker.WireVertical's down-target and PatternPicker.WireVertical's up-target both currently reach across what is now a screen boundary, and the change-instrument row exists on both screens so its neighbours differ per screen. games/tonapse/CONTROLS.md documents the single chain and must be updated with it. - Triangle has to do both jobs. It currently means "teleport focus to the other half" and must now also mean "show the other half", without losing the #335 rule that it always targets the cell whose pattern is open. - The CONTROLS guide column eats horizontal width that a Deck does not have - decide whether it stays pinned, collapses, or folds into the screen-switch hint on the single-screen layout. Open point; flagging rather than pre-deciding. - Probes. focus-grammar.json and focus-cujs.json lock the current single chain and will need a single-screen sibling; the layout also needs a probe run at Deck geometry.

Related: #257 (page flow and scrolling - this is the Steam Deck end of it), #394 (auto-scroll the song window during playback).

Dependencies

None.

Comments

No comments.

Add a comment