- Kotlin 99%
- HTML 1%
| apk-download | ||
| app | ||
| design | ||
| docs | ||
| gradle | ||
| reference | ||
| scripts | ||
| .gitignore | ||
| build.gradle.kts | ||
| CHANGELOG.md | ||
| CONTINUATION.md | ||
| FEATURELOG.md | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| README.md | ||
| settings.gradle.kts | ||
| VERSION | ||
Tunio
Tunio is a local-first Android tune-writing app for musicians, initially designed around melodeon tune writing. It is a sketchbook for quick recording, tune organisation, multiple takes, A/B/C sections, trim and loop practice, speed control without pitch change, and simple arrangement of sections.
Tunio is not a DAW. The v1 direction is fast capture and practical tune management, with all recordings and metadata stored locally on the device.
Current Version
0.1.066
Current Feature State
- Android Kotlin/Compose project skeleton.
- Package name:
com.loud.tunio. - Foreground content respects the Android status-bar inset while the background remains full-screen.
- Compose tune library scaffold backed by Room persistence.
- Create tune action using automatic
Tune A1,Tune B1, ... naming through the domain/repository layer. - Tune rename support while keeping stable internal tune IDs.
- Tune library summary state includes last-worked ordering, a continue-working card, take counts, favourite counts, total duration, best-take duration, and latest-take references for the next UI pass.
- Tunio-branded adaptive launcher icon resources.
- Tune detail scaffold backed by metadata flows for recordings, sections, and arrangements.
- Initial domain model and Room database scaffold for tunes, recordings, sections, arrangements, arrangement items, and exports.
- Local
.m4avoice-note recording into app storage with metadata saved to Room. - Short failed recordings are cleaned up without creating metadata.
- Playback for saved original recordings with Media3/ExoPlayer.
- Recording rows show friendly take labels and durations while keeping stable filenames available behind details.
- Recording rows support persistent custom take names while keeping source filenames immutable.
- Recording rows use decoded signed min/max waveform peaks when available, with a visual fallback while extraction is unavailable.
- Recording details show waveform readiness/unavailable status for test diagnosis.
- Waveform extraction is cached in memory for the app process to avoid repeated decoding during a session.
- Scrollable tune detail workspace with top transport, slot-based arrangement targets, and a newest-first take library.
- Secondary detail controls are tucked behind row-level actions to keep the working screen calmer.
- Arrangement playback speed slider without pitch change.
- Playback completion resets the visible play state.
- Recording opens a focused modal with live elapsed time, a stop control, and a real microphone-level waveform while capture is active.
- Basic A/B/C section creation over a full source recording.
- Basic section play and loop practice.
- Basic section start/end adjustment in 1-second steps.
- Section rows use source waveform handles for metadata-only range editing when waveform levels are available.
- Basic arrangement creation from current sections.
- Arrangement creation is disabled until sections exist.
- Basic arrangement playback across section items.
- Basic arrangement item repeat-count editing.
- Arrangement transition gaps between parts, adjustable from 0.0s to 1.0s in 100ms steps.
- Basic arrangement item reordering.
- Arrangement play and loop controls are available from the top transport.
- Arrangement starts with one full-width A slot; B/C/D can be added as optional parts.
- Arrangement slots use a two-column layout; selecting a slot again exits selection mode.
- Tapping empty arrangement-panel space exits take-selection mode.
- Populated slots open edit on tap and require long-press to arm take replacement.
- Selected slots can be cleared or removed with confirmation.
- Main slots are waveform-first; part repeat controls live only in the part edit dialog.
- Main slots show a dense resampled trimmed waveform range, while the edit dialog can show the full source waveform or a fitted trim view.
- Arrangement slots and the part edit dialog show a playhead during playback.
- Waveform previews use denser 360-bucket signed peak data for more DAW-like shapes, with arrangement slots preserving min/max peaks when resampling short clipped sections.
- Part edit dialog supports draggable waveform trim handles with 50ms non-destructive snapping, persistent per-section Fit view, hold-only locked-handle zoom trimming, looped preview playback, and 1x/2x repeat selection.
- Recording favorites are persisted and keep starred takes at the top of the take list.
- Recording rows show label, duration, waveform, and Play/Stop by default; rename, section creation, and dev details are behind a per-row More toggle.
- Section creation uses an intentional Add section action inside More rather than always-visible A/B/C buttons.
- Section and arrangement delete actions are wired through the UI behind Fine tune and Edit toggles with a two-tap confirm pattern.
- Empty states for Recordings, Sections, and Arrangement panels guide the first-time workflow with musician-friendly copy.
- Metadata cleanup hooks exist for sections and arrangements; delete controls are now visible in the UI without being dangerously prominent.
- Focused tests for playback, recording failure, waveform extraction/cache/status, section range, and arrangement metadata behavior.
- Legacy section fine-tune controls remain secondary; the primary test path is the arrangement slot and part edit workflow.
Current Testable Slice
The current debug build is ready for a focused on-device test of the arrangement workspace: create a tune, record takes, favorite useful takes, tap an arrangement slot, choose a take, confirm the part assignment, trim the part range, test hold-only zoom trimming, set 1x/2x repeat, add transition gaps where needed, and play or loop the arrangement.
Local APK Download
When the development server is running from /opt/tunio, use:
http://10.26.21.3:8080/apk-download/
Direct APK path:
http://10.26.21.3:8080/app/build/outputs/apk/debug/app-debug.apk
Build
Expected build command:
./gradlew assembleDebug
The project includes a Gradle wrapper and is configured for Android SDK 35.
Install Debug APK
After a successful debug build:
adb install -r app/build/outputs/apk/debug/app-debug.apk
Local-First Rule
Tunio v1 has no cloud services, accounts, analytics, subscriptions, ads, or tracking. All data lives on the device.
Non-Destructive Audio Rule
Original recordings must never be overwritten or physically trimmed. Sections, loops, trims, and arrangements are metadata that reference original audio files by stable IDs and time ranges.