A retro, grid-based music tracker for Android (Kotlin + Jetpack Compose, single Activity) with four equally-capable input methods (touch, keyboard, gamepad, MIDI) and four tabs: tracker, mixer, toolbox, settings. Highlights: - Tracker: Canvas-drawn 4-track pattern grid over an 8-lane arrangement roll, with a glyph cache and draw-phase state reads so the playhead and edits redraw without per-frame recomposition. - Audio: sample-accurate sequencer feeding a shared AudioEngine, driven by either a Kotlin AudioTrack loop or native Oboe/AAudio via JNI (16 KB-aligned native libs). media3 MediaSession for lock-screen/headset transport. - Toolbox: 16 instrument/effect slots with a 2-octave audition keyboard; single-tap select, double-tap edit, long-press clear. - Note entry: long-press cell popups (piano keyboard / value steppers) plus keyboard/gamepad stepping that resumes from the last note/channel entered. Velocity capped at 0x7F, channel at 16. - Selection/clipboard (cut/copy/paste/delete) and .sng import/export compatible with the reference desktop tool. - A `profile` build type (non-debuggable, debug-signed) for realistic on-device performance testing. - Developer handover documentation under docs/. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sizzletracker (Android)
A retro, grid-based music tracker for Android — monospace UI, pixel icons, demoscene-style pattern editing — playable equally with touch, keyboard, gamepad, and MIDI (USB or Bluetooth).
Features at a glance
- Tracker tab — 4-track pattern grid (note / velocity-hex / MIDI-channel per track), beat & bar coloring, tap-to-focus + drag-to-edit with haptics and scale-aware note entry; plus an 8-lane arrangement piano-roll (up to 256 beats) with A/B loop regions.
- Mix tab — 4 channels, each with an instrument + 4 FX slots, MIDI channel, volume, mute/solo.
- Toolbox tab — 16 slots for instruments (NES synth, sampler, SF2/XI) and effects (arp, transposer, LFO, tape delay, reverb, filters, 10-band EQ, bitcrusher). Every device has an auto-generated editor and text presets.
- Setup tab —
.sngproject save/load, color themes (with import/export), gamepad bindings, and searchable/collapsible MIDI bindings. - Background playback with a media notification (Play/Pause/Stop).
- Two-thread design — Compose UI on the main thread, a sample-accurate sound engine on its own high-priority thread.
Build & run
Open the project in Android Studio (2024.1+), let it create the Gradle wrapper if prompted, and Run on an API 26+ device or emulator.
CLI (after the wrapper exists — gradle wrapper --gradle-version 8.9):
./gradlew assembleDebug
Where to start reading
See docs/DEVELOPER_HANDOVER.md — a from-scratch tour written for a developer new to Android: architecture, the file map, the "one action / one song / two threads" model, how to add an instrument or input, and an honest implemented-vs-TODO list.
Fastest orientation in code:
model/Project.kt → input/InputAction.kt → ui/AppViewModel.kt →
audio/AudioEngine.kt.
Project format
Songs use a human-readable .sng text format (see io/ProjectIo.kt), aligned in
spirit with the desktop
Sizzletracker; a byte-exact
compatibility shim is a listed TODO in the handover doc.
License
TBD by the project owner.