Commit Graph

14 Commits

Author SHA1 Message Date
Reactorcoremeltdown
26931dd501 Name the release APK space.rcmd.android.sizzle_<versionCode>.apk
Configure the release variant's output filename (via the legacy applicationVariants
API) so the unsigned release APK is stamped with its versionCode — e.g.
space.rcmd.android.sizzle_4.apk — to simplify uploading to the private F-Droid
repo. Staging keeps its app-staging.apk name.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 23:21:05 +02:00
Reactorcoremeltdown
b5620b429d Pin the SF2/XI audition keyboard at the editor bottom (v0.3.1)
Lay out and place the SF2/XI loader's audition keyboard like the toolbox and
tracker keyboards: extract it into SoundFontKeyboard (an octave selector above two
weighted octaves) and pin it at the bottom of the device editor, with the controls
scrolling in a weighted region above (1.7 : 1, matching the toolbox tab) — so it's
the same height and always visible instead of scrolling away. Patch bump to 0.3.1
(versionCode 4).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 20:45:41 +02:00
Reactorcoremeltdown
ba56b5ab9e SF2/XI loop crossfade + hold-to-repeat steppers (v0.3.0)
- SF2/XI loader: add a Loop XFade control (ms, 0-500) next to the loop toggle.
  SampleVoice crossfades the loop tail into its head for a click-free seam even
  when the file's loop points don't match; 0 ms keeps the previous hard wrap.
  Threaded through VoiceSample and all noteOn call sites.
- Add a reusable RepeatButton: fires on press then auto-repeats while held with
  an exponentially shrinking interval (stops on release/scroll-off). Applied to
  every +/- stepper (tempo, MIDI channel, arrangement repeats, audition/keyboard
  octave, and the new crossfade).
- Bump version to 0.3.0 (versionCode 3) per the minor-per-change policy.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 20:38:10 +02:00
Reactorcoremeltdown
4bd8aac4d5 Rename application identifier to space.rcmd.android.sizzle
Global rename of the app/package identifier from
com.reactorcoremeltdown.sizzletracker to space.rcmd.android.sizzle:

- build.gradle.kts: applicationId + namespace.
- Move the Kotlin source tree (main + test) and rewrite every package/import.
- native_audio.cpp: JNI symbol names (Java_space_rcmd_android_sizzle_...) so the
  Oboe callback still links against the relocated NativeAudioBridge.
- docs: package/file-map header.

The desktop-project GitHub URLs (github.com/reactorcoremeltdown/sizzletracker)
and the Reactorcoremeltdown copyright/SPDX author identity are intentionally left
unchanged. Note: the new applicationId installs as a separate package (existing
installs won't upgrade in place).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 18:59:51 +02:00
Reactorcoremeltdown
a5fdc7b6c4 Prepare for open-source release under GPL-3.0-or-later; docs & test maintenance
- Add GPL-3.0 LICENSE and SPDX headers (GPL-3.0-or-later) to every source file
  (58 Kotlin, the C++ file, and the sample-pack HTML tool).
- README: state the GPL-3.0-or-later license (+ badge); fix stale "256 beats"
  -> "256 bars"; fix build instructions (the Gradle wrapper is committed);
  mention master recording and the sample-pack tool.
- DEVELOPER_HANDOVER: resync with the codebase — corrected the wrapper note,
  architecture diagram, full file map, the add-instrument/effect guide, Oboe
  (now default with fallback, not an opt-in toggle), moved SF2/XI to implemented,
  and added recently shipped features with an honest remaining/optional list.
- Fix a pre-existing broken unit test: SngFormatTest called the old
  SngFormat.import(text); the API is importInto(project, text). Tests compile
  and pass again.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 09:47:29 +02:00
Reactorcoremeltdown
3df4bb645a Extend the arrangement canvas to 256 bars
- Denominate the canvas in bars (lengthBars, default 256) instead of a raw beat
  count; canvasBeats(sig) = lengthBars * beatsPerBar, so it spans exactly 256
  bars in any signature. Backing arrays sized for the widest case (5/4 -> 1280
  beats). Playback still stops at lastFilledBeat, so the wider empty canvas adds
  no trailing silence.
- Roll: draw with viewport culling (iterate only the beats scrolled into view)
  so the ~16x-wider canvas stays cheap to redraw and scrolls smoothly.
- Persistence: store bars= (was len= in beats) and write cells only up to the
  last filled beat; old files without bars= load the default 256-bar canvas with
  their cells intact. .sng import grows the canvas in bars as needed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 08:11:40 +02:00
Reactorcoremeltdown
61d7de1f25 Improve light-theme readability; drop experimental stereo FX; add sample-pack builder tool
- Theme: pick a light or dark Material base scheme by palette luminance and map
  the palette onto the container/variant/outline/secondary roles components
  actually read, so cards and secondary text stay legible on bright themes.
- Audio: remove the experimental stereo-FX rendering and the tape-delay per-head
  balance (both worked poorly); each channel runs a single mono FX chain again.
  Master output and recording remain stereo (dual-mono content).
- Tools: add tools/samplepack-builder.html, a standalone page for assembling
  Sampler .zip preset bundles (16 note-labelled drag-n-drop pads, audition,
  16-bit mono WAV re-encode, duplicate-sample detection).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 20:37:44 +02:00
Reactorcoremeltdown
f01a91f0ec Add experimental stereo-effects toggle; theme the system nav bar
Stereo effects (experimental), off by default and persisted:
- When on, each mono insert effect runs a second instance for the right
  channel so upstream stereo (e.g. a delay's width) carries into later
  effects like the reverb; the delay stays single-instance (nativeStereo).
- Settings toggle under Audio Devices; rebuilds the FX chains on change.

Seamless system bars:
- SizzleTheme tints the system navigation bar to the palette's surface
  (matching the bottom tab bar) and the status bar to the background, with
  light/dark icon appearance by luminance, re-applied on theme change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 16:14:17 +02:00
Reactorcoremeltdown
c630dc3694 Make playback and recording stereo; add per-head delay balance
- fillBlock now outputs interleaved stereo; AudioTrack and native Oboe
  configured for 2 channels; MasterRecorder writes a stereo WAV.
- AudioEffect gains processStereo() (default mono-collapse); the tape delay
  overrides it to pan each of its 4 heads with a level-preserving linear pan
  (feedback still uses the mono sum, so loop behaviour is unchanged).
- New per-head balance param + a horizontal balance slider under each head's
  division fader (center-detented, L/C/R readout), with a revision read so it
  redraws.

Note: only the delay produces stereo width; other insert effects stay mono
and collapse upstream stereo, so place the delay last to keep its panning.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 15:55:33 +02:00
Reactorcoremeltdown
3a752b88ab Merge branch 'feature/recording-landscape-fx-qol'
Master recording, landscape layouts, FX/arpeggiator fixes, theme library,
and a batch of UX/persistence/cleanup improvements.
2026-07-16 11:26:07 +02:00
Reactorcoremeltdown
c8acc3827d Add master recording, landscape layout, and a batch of FX/UX improvements
Recording & audio:
- Master-bus WAV recorder: arm + FX-tail + SAF output folder on the mixer
  toolbar; allocation-free capture (ring buffer -> writer thread).
- Oboe is now the default backend; falls back to AudioTrack only on init
  error and shows a popup. Removed the manual engine toggle.
- Arpeggiator: fixed loop-boundary slip (phase-continuous), monophonic
  (no chord/voice pile-up), and a per-bar reset toggle.
- AmbienceReverb: 8-line FDN (was 16) to fit the real-time budget; per-bus
  soft-clip limiter; per-channel non-finite guard on the master sum.

UI / layout:
- Responsive landscape layouts: side nav rail; tracker grid beside the
  arrangement/keyboard; toolbox tiles beside a wider keyboard; two-column
  mixer strips; collapsed transport toolbar.
- Two-column instrument/effect editors; reverb controls paged with dot
  pagination.
- Arrangement: per-lane mute toggles; center-follow scrolling.
- Tracker toolbar: BLK dropdown, SKIP moved by OFF/KBD, glyph edit buttons.
- Sampler: normalize button, per-pad volume snap, single CLEAR.
- Import error popups; content validation on all file loaders.
- App themes: import/export/delete/dropdown library (stock themes protected).

Persistence & QoL:
- Persist keyboard MIDI channel/octave; remember loaded project in the
  settings dropdown; New Project button.

Cleanup:
- Removed dead code and fixed audio-thread allocation hot spots
  (per-sample iterators, Math.random on the RT thread, etc.).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 11:25:23 +02:00
Reactorcoremeltdown
a4c8ba2080 Big batch update: the tracker is mostly usable 2026-07-15 16:22:04 +02:00
Reactorcoremeltdown
d380f8643b UI Improvements: Piano widget, rigid sizes, proportions, etc 2026-07-14 07:37:48 +02:00
Reactorcoremeltdown
3cef1b4e85 Initial commit: Sizzletracker Android music tracker
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>
2026-07-13 22:15:13 +02:00