Commit Graph
179 Commits
Author SHA1 Message Date
grovebit 54e3761d62 Open sessions whose plugin parameters were saved as null
JSON has no NaN or infinity, so serde writes them as null, and loading
null into a plugin parameter failed the whole session with "not a
SoundCraft session: invalid type: null, expected f32". One plugin
reporting a non-finite value, or a value like 1e39 that overflows f32
in an edited file (it loads as infinity), made the session and every
later save and autosave of it unopenable.

Insert and instrument parameters that are null or overflow f32 are now
dropped on load, so they keep the plugin's default and the rest of the
session opens.
2026-10-11 20:03:47 +01:00
grovebit 153381e03b Flush saves to disk and keep backups of the session file
Nothing a save wrote was synced to disk, so a power cut or crash of the
system soon after Cmd+S could leave an empty or truncated session file
(the rename can reach the disk before the data), or audio files that
the session points at but that never reached the disk. No earlier
version of the session file was kept either.

New audio files, the Audio Files folder and the session's temporary
file are now synced before the session file is renamed into place, and
the session folder after the rename; templates are written the same
way. A failed write or rename removes its temporary file instead of
leaving it on a full disk. Before a save replaces the session file with
different contents, the previous version is copied to
Backups/<name> backup <n>.scraft beside it, and the newest ten are
kept. Autosaves make no backups.
2026-10-11 20:03:47 +01:00
grovebit 62a0b683e5 Ask before Save As replaces another session
Save As, Save Copy In, Save As Template and Export Selected Tracks as
New Session wrote over any existing file without asking. The Save As
prompt proposes ~/<name>/<name>.scraft, so every new session suggests
~/Untitled/Untitled.scraft, and saving a second new session with the
suggested path replaced the first one.

These commands now refuse to write over an existing file unless
`replace` is true; Save, Save As and Save Copy In may still write the
open session's own file. Scripts, MCP agents and the control channel
can't replace a session by accident. While the path in the prompt names
an existing file, the prompt asks whether to replace it and its OK
button becomes Replace; Enter alone doesn't replace. Saving also
creates the session's folder, so a new session without audio can be
saved to the suggested path. The CLI's --save names its output
explicitly and keeps replacing it, like --bounce.
2026-10-11 20:03:47 +01:00
grovebit 86824b592a Never overwrite audio files when saving
Audio that exists only in memory (takes, consolidations, AudioSuite
renders, commits) gets the default path `Audio Files/<name>.wav`, and
Save treated an existing file at that path as the source's own and
rewrote it. Names repeat easily: two sessions in one folder both call
their first take on Audio 1 "Audio 1_02", and consolidating twice on
Kick makes two "Kick_consolidated" sources. Saving silently replaced
the earlier audio, so the other session or the earlier clip played the
wrong audio once reopened.

Save As also trusted a same-named file in the target folder for audio
saved elsewhere, so saving into another session's folder could point
the new session at that session's audio.

New audio now goes to the first free name (`<name>.wav`,
`<name>_01.wav`, ...), created with create_new so no existing file is
ever truncated, or to a file that already holds exactly the same bytes,
such as a take saved again after undoing past a save. Saved audio is
reused only when saving into the folder it was saved in, which the
session now remembers, so undoing past a Save As or saving after Save
Copy In can't pick up another session's files either. Audio that
failed to load keeps pointing at its old folder when the session is
saved elsewhere.
2026-10-11 19:59:43 +01:00
Dylan M. Taylor 240aa848a0 ci: refactor workflows to use storytold/craft-common-actions (#184)
* ci: refactor workflows to use reusable artcraft-common-actions

* ci: point reusable workflows to storytold/craft-common-actions

* ci: pin storytold/craft-common-actions to commit 27a978f and pass secrets explicitly

* ci: use @main (unpinned) for craft-common-actions with explanation comment
2026-10-11 11:52:00 -04:00
skylar taylor-barrick 7414719f37 Merge pull request #167 from skylartaylor/codex/ui-suite-integration-20261010
Add shared docking with SoundCraft theme and MIDI sizing
2026-10-10 19:47:00 -06:00
skylar taylor-barrick 814ae99a32 UI shared controls: isolate palette ownership in rendering tests 2026-10-10 19:27:18 -06:00
skylar taylor-barrick 0434bb1397 UI.9: recover incompatible saved panel layouts independently 2026-10-10 18:52:14 -06:00
skylar taylor-barrick 7c64b27753 UI.9: reconcile upstream before shared UI landing 2026-10-10 18:24:17 -06:00
skylar taylor-barrick 5589d97257 UI.9: reconcile upstream before shared UI landing 2026-10-10 18:14:05 -06:00
Brandon ThomasandClaude Opus 5.5 4410486fc2 Release 0.5.0: linux-riscv64 tarball, version bump (#165)
- release.yml: new linux-riscv64 job, cross-compiled on ubuntu-24.04 against ports.ubuntu.com
  riscv64 libs (the linux job's -dev packages incl. libasound2-dev:riscv64), CLI smoke-tested
  under qemu-riscv64; wired into the release job's needs so SHA256SUMS covers it.
- packaging/linux/package.sh: CROSS_ARCH/CROSS_TARGET/CROSS_COMPILE/EMULATOR support.
- clap-host: c_char -> u8 without a cast that is a no-op (clippy error) where c_char is u8.
- Version 0.4.0 -> 0.5.0; docs list the riscv64 tarball.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
v0.5.0
2026-10-10 19:37:37 -04:00
skylar taylor-barrick 63b487589c UI.9: preserve SoundCraft workflows with shared docking 2026-10-10 15:37:36 -06:00
Brandon ThomasandClaude Opus 5.5 330a698397 Progress docs: target-app parity, gaps, alpha gate, readiness by audience (#155)
* Progress docs to the craftrules standard; full re-measure against Pro Tools 2026.4.1

Stage: alpha. Menu breadth 482/512 (94.1%, measured), feature breadth ~70%,
ready for real work ~40%; ~350-570 agent-hours to beta, ~950-1,450 to full parity,
calibrated on this repo's PR history.

- ROADMAP.md rewritten: stage banner, two numbers, dimension/feature/language tables
- docs/target-app-parity.md: authoritative assessment (area table moved from ROADMAP)
- docs/gaps.md: 22 ranked gaps with evidence and estimates
- docs/roadmap.md: milestones, current focus, beta plan
- docs/ui-, file-format-, hardware-, plugin-, localization-parity.md: new checklists
- docs/parity.md -> docs/parity-checklist.md (generated by cargo xtask parity)
- architecture.md: video, vst3-host, au-host crates; device I/O limits

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Stage: pre-alpha under the core-workflow gate

Add the alpha gate to docs/roadmap.md: interface recording at a chosen buffer
size, MIDI recording, and session interchange with Pro Tools fail, so the stage
moves from alpha to pre-alpha (~5 points and ~110-180 agent-hours to alpha).
Mark the alpha blockers in docs/gaps.md; update ROADMAP.md, target-app-parity.md
and README.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Add mainstream-practitioner and essentials-user readiness numbers

Mainstream practitioner ~36% (weekly-area depth 50.6% x 0.90 interaction x 0.92
stability x 0.85 file exchange) and essentials user ~57% (core-feature depth
72.4% x 0.90 launch/stability x 0.90 discoverability x 0.97 files), with written
weights, discounts and GitHub user evidence. Full ready-for-real-work checked
against its written dimension weights (40.6%); unchanged at ~40%, stage unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Readiness by audience: hours to ~95% for full, mainstream and essentials

Full ~40% / 950-1,450 h, mainstream ~36% / 380-600 h, essentials ~57% / 110-200 h,
calibrated on this repo's PR history. The full number is already an additive
weighted sum over the written dimension table; method unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 14:08:49 -04:00
Brandon Thomas 3bc2d92b4e Merge pull request #122 from vbasky/fix/90-clip-export-names
Give same-named clip exports their own files.
2026-10-10 04:03:53 -04:00
Brandon Thomas e5b5f9907f Merge remote-tracking branch 'origin/main' into HEAD 2026-10-10 04:01:49 -04:00
Brandon Thomas 0d3228ef9c Merge pull request #121 from vbasky/fix/94-cut-all-automation
Put Cut All Automation on the clipboard.
2026-10-10 04:01:35 -04:00
Brandon ThomasandClaude Opus 5.5 f9d0d26e5b Merge origin/main into fix/94-cut-all-automation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 03:59:53 -04:00
Brandon Thomas f68f737b3d Merge pull request #120 from vbasky/fix/93-snap-neighbours
Snap selected clips to their neighbours instead of past them.
2026-10-10 03:59:24 -04:00
Brandon Thomas dba0bea03d Merge remote-tracking branch 'origin/main' into HEAD 2026-10-10 03:56:37 -04:00
Brandon Thomas e77503a815 Merge pull request #119 from vbasky/fix/97-menu-dialogs
Open New Tracks and Bounce only from the menu.
2026-10-10 03:56:32 -04:00
Brandon ThomasandClaude Opus 5.5 3a4f18647f Merge origin/main into fix/97-menu-dialogs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 03:53:21 -04:00
Brandon Thomas af0174942a Merge pull request #118 from vbasky/fix/102-mix-view-aliases
Allocate Mix Window View menu paths once.
2026-10-10 03:53:03 -04:00
Brandon Thomas dc2ffda4d6 Merge remote-tracking branch 'origin/main' into HEAD 2026-10-10 03:52:01 -04:00
Brandon Thomas 9001c76b56 Merge pull request #117 from vbasky/fix/99-tempo-stretch
Send Tempo Operations stretch as a factor.
2026-10-10 03:51:57 -04:00
Brandon Thomas 3364f7ca30 Merge remote-tracking branch 'origin/main' into HEAD 2026-10-10 03:50:45 -04:00
Brandon Thomas f6deacbf9a Merge pull request #116 from vbasky/fix/100-io-setup
Point I/O Setup rename and delete at setup.io.
2026-10-10 03:50:39 -04:00
Brandon Thomas d034c8a17b Merge remote-tracking branch 'origin/main' into HEAD 2026-10-10 03:47:29 -04:00
Brandon Thomas d03eba8648 Merge pull request #85 from coygeek/fix/live-system-theme-69
fix(ui): follow live system appearance changes
2026-10-10 03:17:29 -04:00
Brandon Thomas 1fa02e5499 Merge pull request #110 from reoniazx/fix/new-session-stops-playback
Stop playback when replacing the session
2026-10-10 03:17:22 -04:00
Brandon Thomas 5033eb8408 Merge pull request #113 from reoniazx/fix/midi-editor-panel-height
Keep the MIDI editor dock at its resized height
2026-10-10 03:17:15 -04:00
Brandon Thomas c4c48d8527 Merge pull request #105 from grovebit/clip-gain-nudge-windows-linux
Nudge clip gain with Ctrl+Shift+Up/Down on Windows and Linux too
2026-10-10 03:17:09 -04:00
Vikram Bhaskaran 9ef16e1e6c Put Cut All Automation on the clipboard.
The command cleared every automation lane in the selection and left the clipboard empty, so the cut could not be pasted. It now uses the same copy-and-clear path as Cut Pan Automation.
2026-10-10 17:40:09 +11:00
Vikram Bhaskaran 30347ee42f Open New Tracks and Bounce only from the menu.
engine.execute and app.run of ui.new_tracks_dialog and ui.bounce_dialog were opening modal dialogs, so a script could not create tracks or bounce without a window. Those ids now return an error unless the menu invokes them.
2026-10-10 17:39:46 +11:00
Vikram Bhaskaran d07624da1f Give same-named clip exports their own files.
Export Clips as Files wrote every clip to {name}.wav, so the second clip replaced the first. A name that is already in the destination now gets a -2, -3, … suffix.
2026-10-10 17:38:53 +11:00
Vikram Bhaskaran 82340cee5c Snap selected clips to their neighbours instead of past them.
Snap to Next and Snap to Previous ignored other selected clips when looking for a destination, so a multi-clip selection piled onto the same later clip or left the gap between the selected clips in place.
2026-10-10 17:38:53 +11:00
Vikram Bhaskaran 3b9d5b9423 Allocate Mix Window View menu paths once.
The menu bar rebuilt and leaked a fresh alias string for every mix-view section on each redraw. Those fifteen paths are now created the first time the menu catalog is asked for them.
2026-10-10 17:38:53 +11:00
Vikram Bhaskaran be859f6cc5 Send Tempo Operations stretch as a factor.
event.tempo_stretch accepts factor or length, and the Apply button was sending end_bpm, which the command ignored. A lower end tempo lengthens the selection, so the factor is the start BPM divided by the end BPM.
2026-10-10 17:38:52 +11:00
Vikram Bhaskaran b92370d32f Point I/O Setup rename and delete at setup.io.
The bus row called mix.bus_rename and mix.bus_delete, which are not commands, so both buttons failed. setup.io already renames and deletes a bus by name.
2026-10-10 17:38:52 +11:00
reoniazx 94e13543ec Keep the MIDI editor dock at its resized height 2026-10-10 13:20:32 +08:00
reoniazx 0734281104 Stop playback when replacing the session 2026-10-10 12:44:01 +08:00
grovebit d3348bcbbc Nudge clip gain with Ctrl+Shift+Up/Down on Windows and Linux too
Ctrl+Shift+Up/Down (#76) only worked on macOS. The registry's Ctrl there
is the Mac Control key, which has no key of its own on Windows and Linux
(#20), so the keys did nothing there, while the Shortcuts window and the
command palette still showed Ctrl+Shift+Up.

Pro Tools for Windows puts these on the Start key, but egui does not
report that key off macOS, and Windows and GNOME use Win/Super+Shift+
Up/Down to resize and move windows. So off macOS the nudge is
Ctrl+Shift+Up/Down: the same keys as on the Mac and what the labels
already say. No SoundCraft shortcut uses them there; Ctrl+Up/Down without
Shift still extends the selection.
2026-10-10 02:34:26 +01:00
coygeek 1f5bc965fe fix(ui): follow live system appearance
Resolve System appearance from egui on every frame and fall back to Dark when the integration cannot report a theme. Keep receiving OS changes during manual modes and apply the selected palette to both widget style branches and the current root UI.

Remove the cached detector and its unused dependency. Cover startup, live transitions, manual overrides, saved System preferences, and user colors with an application-frame regression. Add reproducible offscreen system-theme inputs and document the fallback.
2026-10-09 18:28:07 -07:00
Brandon ThomasandClaude Opus 5.5 522e59f8f5 Bump version to 0.4.0 (from 0.3.0) for release; refresh contributors
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.4.0
2026-10-09 21:02:26 -04:00
Brandon Thomas caa4872df2 Merge pull request #76 from grovebit/clip-gain
Change clip gain with Ctrl+Shift+Up/Down and a fader on the clip
2026-10-09 20:52:40 -04:00
Brandon ThomasandClaude Opus 5.5 ff2bd2d3f8 Clip gain fader popup: use the current theme tokens
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:50:08 -04:00
Brandon Thomas 53e1d3c624 Merge remote-tracking branch 'origin/main' into HEAD 2026-10-09 20:49:56 -04:00
Brandon Thomas ac2435e18e Merge pull request #54 from vbasky/feature/session-audio-health
Report session audio health without changing the session
2026-10-09 20:49:44 -04:00
Brandon ThomasandClaude Opus 5.5 50f885e16b Merge origin/main into feature/session-audio-health
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:48:05 -04:00
Brandon Thomas 7c8d339a8f Merge pull request #66 from MarekSpodBiedry/issue-62
Show Ctrl instead of Cmd in shortcut text off macOS (#62)
2026-10-09 20:46:12 -04:00
Brandon ThomasandClaude Opus 5.5 4216d4f1be Merge origin/main into issue-62
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:41:26 -04:00