Reactorcoremeltdown 63cad6897f Rewrite the NES synth as a 3-oscillator subtractive synth; track-tied note-offs (v0.4.1)
Two changes that landed together (the note-off work was uncommitted when the synth
rewrite began):

Synth rewrite — replace the simple NES tone generator with a classic Minimoog-style
voice: 3 oscillators (+ noise) → mixer → resonant 4-pole ladder low-pass (own
contour envelope + key tracking) → amplifier (own envelope), plus a tempo-synced
LFO and a 4-slot modulation matrix.
- DSP: SynthVoice rewritten (PolyBLEP oscillators, ladder filter, two ADSRs, LFO,
  mod matrix); new SynthPatch parses a slot into an immutable snapshot per note.
  PolyBLEP + control-rate cutoff + precomputed osc tuning keep the RT cost down.
- Model: SynthDefs (shared option lists/defaults), rewritten NES_SYNTH params,
  NesSynthPresets (8 chiptune factory presets) seeded into the preset library.
- Editor: NesSynthEditor — swipeable cards (Oscillators / Filter / Amp+LFO / Mod
  Matrix) with dot pagination; new rotary Knob control (absolute, fader-like
  vertical drag: bottom = empty, top = full); enums via RetroDropdown. The shared
  slot-audition keyboard (renamed SoundFontKeyboard -> SlotAuditionKeyboard) is
  pinned at the editor bottom.
- Engine builds a SynthPatch per note. The enum id stays NES_SYNTH so existing
  projects still route; the old single `wave` param is dropped (amp envelope keys
  carry over).

Track-tied note-offs — a note-off ("===") is now tied to its track, not a channel:
it has no velocity/channel of its own (shown as ".." and non-editable) and simply
releases whatever that track last played, on the bus(es) that note routed to
(AudioEngine.trackLastChannel). `.sng` export writes "OFF .. ..".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 01:06:47 +02:00

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).

platform language ui license

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 bars) 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.sng project save/load, color themes (with import/export), gamepad bindings, and searchable/collapsible MIDI bindings.
  • Master recording — render the master bus (with FX tail) to a WAV file.
  • 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.

There is also a standalone tools/samplepack-builder.html — an offline page for assembling Sampler preset bundles (drop audio onto 16 note-labelled pads, then download an importable .zip).

Build & run

Open the project in Android Studio (2024.1+) and Run on an API 26+ device or emulator.

From the CLI (the Gradle wrapper is committed, so a fresh clone needs no setup):

./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.ktinput/InputAction.ktui/AppViewModel.ktaudio/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

Sizzletracker is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License v3.0 or later (GPL-3.0-or-later). See the LICENSE file for the full text; every source file carries an SPDX GPL-3.0-or-later header.

Copyright © 2026 Reactorcoremeltdown

Description
No description provided
Readme GPL-3.0 3.1 MiB
Languages
Kotlin 96.2%
HTML 2.1%
C++ 1.6%
CMake 0.1%