lowquo get lq-12 ↗
← all notes

Making lq-12 explain itself

This phase was mostly about removal: fewer repeated labels, less permanent instruction text and clearer guidance when the keyboard changes jobs.

by Darren

I spent most of this phase removing things.

lq-12 had reached the point where every new part made sense on its own, but the complete screen was beginning to repeat itself. The selected track appeared in the header and the track rail. The playhead position appeared in the header and on the sequence. The sample name appeared on the rail and over the waveform. A long row of shortcuts stayed on screen even when most of them had nothing to do with the task in front of you.

None of that stopped the instrument working. It did make it harder to see what mattered.

One place for each thing

The main rule for the new pass was simple: if two parts of the screen answer the same question, choose the better one and remove the other.

The header now describes the whole instrument: the project, transport, tempo, swing and whether Chop is active. The track rail holds the identity and state of all eight tracks. The centre surface is where the pattern lives. A slim context line says where you are and what is selected. The line at the bottom tells you what the keys do now.

The permanent LOWQUO and version label has gone from the instrument header because the application window already carries it. Track number, mute, solo and playhead position have gone from the header because they are clearer on the rail and sequence. The old parameter strip and the separate length labels have gone for the same reason.

The interface changes with what you are doing

lq-12 is built around the computer keyboard, so the same physical keys sometimes have different jobs. Q to K normally represent sixteen sequence steps. In Chop they represent sixteen slices. The arrow keys edit the current parameter in Sequence, but move a cut point in Chop.

The screen now acknowledges that directly. The context line changes colour and language with the current mode:

SEQUENCE STEP 03 · WHOLE SAMPLE PITCH TRACK +0.0 st CHOP SLICE 03 · START EDGE · EQUAL 8 SLICES

If a step has its own sample, the line says so. If you are holding a step while changing a value, it tells you that you are writing a lock to that step rather than changing the whole track. Warnings only appear when there is something to act on.

The bottom line now helps

The old footer was a small permanent manual: ten shortcuts, always the same, whether they were relevant or not. It has been replaced by a hint line that follows the current context.

In Sequence it starts with Q–K STEPS. In Chop it becomes Q–K SLICES and tells you which step the O key will write to. The quickest way out of a mode is kept near the beginning of the line, so it still appears in a narrow window. F1 remains fixed at the far right as the route to the full key map.

Chop now feels like part of the instrument

Chop is where a break is divided into playable slices. It already worked, but learning it relied too much on knowing the shortcuts in advance. The whole context now turns teal when Chop is active, the sixteen positions become clearly labelled slices, and the bottom line explains the short path through the workflow.

L load a break SHIFT+C enter Chop = cut eight equal slices Q … I hear each slice RETURN place them across steps 1–8 SHIFT+C return to the sequence SPACE play

That same route now leads the rewritten quick-start guide. It teaches one idea first: Q to K are the sixteen positions, and in Chop those positions are slices.

Less duplication around the waveform

The waveform used to print the current filename even when the track rail already showed it. That label is now conditional. It appears when it answers a useful question: while browsing another sample, when a step overrides the track’s normal sample, or when the window is too narrow for names to fit on the rail.

The separate Chop summary under the waveform has also gone. The context line already describes the selected slice and cut position, so a second copy only added weight.

Clear Pattern is properly complete

Clearing a pattern now resets every step field: triggers, velocity, parameter locks, sample overrides and slice overrides. It leaves the track’s sample and track-level controls alone. One undo restores the complete pattern, including steps outside the visible page.

Spread leaves deliberate overrides alone

Spreading slices across a page now skips a step if that step deliberately uses a different sample. The step is left exactly as it was rather than being partly rewritten. After a spread, the header reports how many steps were assigned and how many were skipped, and undo restores only the steps the command changed.

One shortcut has gone

Return used to restart playback in the normal sequence view. In Chop, Return spreads slices across the page. That made one key a transport control in one context and an editing command in another, while restart already had a consistent home on Shift+Space.

The old Return shortcut was undocumented and has been removed. Shift+Space now remains the single way to restart from step one.

F1 and the quick start have been rewritten

The F1 overlay now uses the same language as the instrument. “Pads” are “steps”; sample start and sample end are simply start and end; and the parameter section explains that the surface changes with the selected parameter. Chop makes it clear that the same sixteen keys become slices.

The layout has also been checked at narrower sizes so the help no longer cuts off the commands at the right-hand side.

Cleaning the interface exposed old code

Removing the duplicate controls uncovered layout helpers and data fields left behind by older versions of the interface. Some tests were still checking geometry that the application no longer drew. Those tests now use the same layout definitions as the real surface.

The unused parameter strip, step grid, track strip and old waveform component have been removed completely, along with their remaining references. The cleanup also caught four bugs: the waveform did not refresh when moving onto a step with its own sample, one save message still referred to the previous file format, a component name collided with a framework method, and a set of warning checks had been missed by incremental builds.

Two decisions are still open

There are two interaction choices I want to settle before 0.3 is finished.

  1. What the arrow keys should edit in Sequence. They currently change the selected track parameter—pitch by default—while the surface shows the selected step’s velocity. The new hint makes the current behaviour visible, but there is still a mismatch between what is shown and what changes.
  2. What Shift should mean. In the normal layer it often means a wider scope or navigation. In Chop it can mean a finer adjustment or “place without advancing”. Both behaviours work, but they do not form one teachable rule yet.

Where the build stands

The current build is 0.3.0-dev. The full test suite has 697 passing cases, including new checks for the contextual guidance, pattern clearing, slice spreading and the live interface geometry. Address and undefined-behaviour sanitizer runs are clean, and a fresh Unix build reports no warnings.

No audio-path processing changed in this phase. The work was focused on editing, layout, guidance and removing duplicated interface code.