Lab notes

Bitcrust 1.0.6: more ways to play

Grid mode, BigPiano, FullGrid, and four fixes from the forum bench.

Bitcrust 1.0.6 went up today. Both halves of the Apple record (iPad + Mac) are uploaded and processing; the public macOS distro is on GitHub releases, Windows and Linux builds are on Gumroad, as usual.

The headline is a redesign of how you play notes on the on-screen surface.

Three new ways to play

  • Grid mode: an 8x6 in-key pad grid, Launchpad-style. Pick root + scale, every pad is a real note, no wrong ones. Optional triad / tetrad chord stacking. Slide a finger across the grid and each cell crossing fires a fresh chord. Multi-touch, so a three-finger pentatonic chord plays as a chord. Active pads light up in the theme’s LED colour.
  • BigPiano: the same JUCE keyboard with a 1:4 width:height ratio computed from the strip, which works out to ~50 px keys on iPad landscape. Chunky. Hit-able.
  • FullGrid: same grid as Grid mode, but it claims the entire content area. No panels, no nav bar, no monitor strip. For when you want to play and not look at knobs.

The keyboard toggle in the footer cycles Hidden -> Piano -> BigPiano -> Grid -> FullGrid -> Hidden. Five states is one too many for a single button in theory, in practice it just becomes muscle memory after a few sessions.

Grid state (root, scale, chord mode) is session-level. Loading a different preset doesn’t change it, the same way GLOBAL_* params have always behaved.

Fixes that landed

Smaller things, mostly from the Loopy Pro forum thread:

  • SYNC and RING popovers now coexist with the on-screen keyboard. They’re launched via a non-modal CallOutBox, gain an explicit close-X, toggle closed on a second long-press, and dismiss on tab switch. The underlying long-press button no longer fires its click on touch-capture loss either.
  • Modulation matrix per-voice sources (mod envelope, velocity, poly aftertouch) now actually drive their destinations. Two bugs collapsed into one user report: per-voice -> global routings were rejected at table build, and per-voice -> per-voice routings populated the right scratch table but the audio path read from the wrong one. Both fixed; per-voice mix-level and pan still need a smoother restructure (filed).
  • iPadOS EFFECTS page: dragging a knob, combo, or toggle no longer pans the parent viewport. Every interactive control inside the FX cards now sets setViewportIgnoreDragFlag(true). Drag on empty card chrome still scrolls the rack.
  • INIT button refreshes the preset header label to Init / Init. It used to leave the label on whatever preset was loaded before INIT was tapped.

What’s next

  • Bitcrust 1.1.x: iPhone UI, this is going to take a while since it’s gonna be a complete rethinking of the user interface and it’s gonna be its own can of worms I guess. But we’ll see if I can get to make it usable.
  • The other product on the bench is a gamified ear trainer. Right now the major issue I have with it is how to keep it interesting beyond the basic levels because after a while it tends to get boring and the story arc can only go so far. Again, we’ll see.

More notes when there is more to say.