Commit Graph
80 Commits
Author SHA1 Message Date
Brandon Thomas 4bb041ad5c Merge pull request #26 from Garygunn94/feat/metronome-click
Make the Click option audible: metronome in live playback
2026-10-09 18:11:29 -04:00
Brandon Thomas d4a20130f0 Merge pull request #25 from Garygunn94/claude/tempo-value-not-saving-12cc98
Fix tempo change from the tempo ruler not saving
2026-10-09 18:11:16 -04:00
Brandon Thomas 30dd2c84d1 Merge pull request #36 from reoniazx/fix/timeline-follow-hold
Pause playhead follow when the timeline is moved away during playback
2026-10-09 18:11:11 -04:00
Brandon Thomas 286ac34e26 Merge pull request #20 from MarekSpodBiedry/issue-15
Fix keyboard shortcuts on Windows and Linux: Ctrl is the Cmd key (#15)
2026-10-09 18:11:06 -04:00
Brandon Thomas 6fbb68f5e1 Merge pull request #39 from hamada147/fix/no-audio
fix(Play Audio): Resume the web AudioContext on the first user gesture
2026-10-09 18:11:01 -04:00
Brandon Thomas 886278fa21 Merge pull request #37 from reoniazx/fix/automation-first-pass-overflow
Fix debug overflow panic on the first automation-write pass
2026-10-09 18:10:56 -04:00
Brandon Thomas 8958059cd9 Merge pull request #44 from storytold/ci/freebsd-editor-test
Fix FreeBSD CI: VST3 editor tests expect 'unsupported' off macOS
2026-10-09 18:10:32 -04:00
tandClaude Opus 5.5 d5f70bf09e dialogs: keep the Dialog enum rustfmt-clean
A doc comment on one variant made rustfmt expand every variant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 11:05:24 -04:00
tandClaude Opus 5.5 916f453690 mix: no click while only monitoring input with the transport stopped
The stopped position does not advance, so a beat at the stop point
re-rendered its first 30 ms every block: a ~94 Hz buzz whenever a track
was record-armed or monitoring input. Regression test included.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 10:58:38 -04:00
tandClaude Opus 5.5 6c3f2dbac8 After Playback: scroll via view.scroll, and only when the stop point is off-screen
Stop no longer writes the session's scroll directly (everything is a
command) and leaves the view alone when the stopped position is visible.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 10:57:18 -04:00
Brandon Thomas a4c371b18b Revert "Do not yank the view to the playhead on play start"
This reverts commit 0ffd2a1441.
2026-10-09 10:56:45 -04:00
tandClaude Opus 5.5 667e32152e shortcuts: keep Cmd+Ctrl apart from Cmd on macOS; detect the Mac at runtime
On macOS a held Cmd made the Ctrl state ignored, so Cmd+Ctrl+X ran Cut
instead of Cut Clip Gain. Ask egui for the OS so the web build in a Mac
browser uses Mac modifiers too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 10:55:42 -04:00
Brandon ThomasandClaude Opus 5.5 f0a0ac8318 vst3-host tests: expect editor 'unsupported' off macOS
VST3 editor windows are hosted on macOS only, but editor_main_thread and
fixture_e2e asserted a probed view size on every platform, failing the
FreeBSD job on every commit to main (and Linux locally). Gate only the
size assertion; the controller round trips still run everywhere.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 10:42:37 -04:00
Brandon Thomas eac0edd896 Merge pull request #12 from XusBadia/dmg-background
macOS DMG: branded window background and icon layout
2026-10-09 09:20:50 -04:00
Ahmed Moussa b63a13925b fix(Play Audio): Resume the web AudioContext on the first user gesture
cpal (wasm) creates its output stream at startup, before any user gesture, so the browser leaves the WebAudio AudioContext 'suspended'. As a result no audio plays, and the transport clock never advances because the audio callback drives it.

Wrap the AudioContext constructor before the wasm module loads so that every context cpal creates is captured. On the first pointer, mouse, touch or key event, resume any context that is still suspended.

Signed-off-by: Ahmed Moussa <moussa.ahmed95@gmail.com>
2026-10-09 13:07:37 +03:00
Xus BadiaandClaude Opus 5.5 617888baeb macOS DMG: branded window background and icon layout
The DMG opened as a plain Finder window. It now shows the app icon's figure on
the SoundCraft colour, with SoundCraft.app and the Applications link side by side.
Same approach as PhotoCraft's and VectorCraft's (storytold/photocraft#1201,
storytold/vectorcraft#493).

- packaging/macos/dmg/: background.svg (source; text outlined, no paper grain,
  the figure an <image> of assets/app-icon), background.tiff (1x + 2x HiDPI,
  16-colour palette, Deflate, sRGB; ~28 KB)
  and dmg-layout.DS_Store (Finder view settings: window, icon size 128,
  positions, background).
- generate.py writes the TIFF and the layout on any OS, byte-for-byte
  reproducible, with nothing from the machine that ran it (no paths, users,
  disk names or volume UUIDs).
- package.sh copies them into the staging folder; the image is still built with
  hdiutil makehybrid. Nothing extra runs in the signing job.
- The volume name drops the version: the layout finds the background through
  an alias that includes the volume name. The DMG file name keeps the version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 07:43:45 +02:00
reoniazx 0ffd2a1441 Do not yank the view to the playhead on play start 2026-10-09 13:28:58 +08:00
reoniazx da970b2490 Fix debug overflow panic on the first automation-write pass 2026-10-09 13:24:37 +08:00
reoniazx 5b7864c8f7 Pause playhead follow when the timeline is moved away during playback 2026-10-09 13:22:39 +08:00
Gary GunnandClaude Haiku 5.5 9701f8e9a5 Match tempo dialog limits to the engine and test its action
The tempo-change dialog clamped BPM to 1..=999, but the engine accepts
5..=1000. A 1000 BPM tempo was silently changed to 999 on OK, and values
below 5 were rejected after the dialog had closed.

Use the engine's limits, and move the OK action into tempo_change_action
so a test can check it runs a real command with the position. The test
would have caught the original bad command id.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-08 21:42:02 +01:00
Gary GunnandClaude Haiku 5.5 368c3df276 Make the Click option audible: metronome in live playback
Options > Click set a flag but nothing rendered sound, so a click track
was silent. The mix engine now synthesizes a short blip on every beat of
the tempo map (accent on beat 1), using the click.* settings from
Setup > Click/Countoff, and sums it after the master fader.

The metronome is opt-in per engine: only live playback enables it.
Offline renders (bounces, stems, exports) leave it off so the click is
never printed into a file.

Also: midi_to_hz moves from the engine demo into soundcraft-dsp so the
mix and demo share one tuning formula.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-08 21:26:40 +01:00
Gary GunnandClaude Haiku 5.5 c8437c5c61 Fix tempo change from the tempo ruler not saving
Double-clicking the tempo ruler opened a number dialog whose command was
built as "event.tempo@<position>". No such command exists, so OK failed
and nothing changed. The position was also never passed, so a change
would have landed at the session start.

Add a TempoChange dialog that carries the position and runs
event.tempo with bpm and at. Add an engine test that a tempo change at a
position is applied there.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-08 21:24:47 +01:00
MarekSpodBiedry b919713ea7 Fix keyboard shortcuts on Windows and Linux: Ctrl is the Cmd key (#15)
egui reports a held Ctrl as both ctrl and command off macOS, so no Cmd+ shortcut matched and Ctrl+S opened Search (Cmd+Ctrl+S) instead of saving. Off macOS a held Ctrl now stands for the shortcut's Cmd, shortcuts that also need the Mac Control key stay off the keyboard there (Ctrl+X is Cut, not Cmd+Ctrl+X), and the Search chord is macOS only.
2026-10-08 20:06:42 +02:00
Brandon ThomasandClaude Opus 5.5 c51e5d5ec5 Bump version to 0.3.0 (from 0.2.1) for release
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.3.0
2026-10-08 10:02:25 -04:00
684243c7bc README Downloads: where to get it first, then builds with Windows before macOS (#14)
Co-authored-by: Brandon Thomas <shared2@storyteller.ai>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:50:23 -04:00
8115ba9ed5 Release: Flatpak x86_64/aarch64, AppImage zsync updates, README Downloads (#13)
- AppImages embed gh-releases-zsync update information and ship a .zsync beside them.
- New flatpak job repackages the Linux tarball into soundcraft-<v>-linux-<arch>.flatpak
  (bundle manifest + flatpak-bundle.sh). Sandbox: pulseaudio socket (PipeWire's pulse server),
  ~/.vst3 and ~/.clap read-only, the LinuxAudio.Plugins extension point via VST3_PATH/CLAP_PATH;
  no raw ALSA devices, no JACK. The from-source Flathub manifest gets the same finish-args.
- Only signing jobs (macOS, Windows) and the draft job keep `environment: release`, so a branch
  dispatch dry-runs Linux, Flatpak, FreeBSD and web; the draft job still needs the signed jobs.
- README: Downloads section; docs/releasing.md updated.

Co-authored-by: Brandon Thomas <shared2@storyteller.ai>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:34:50 -04:00
Brandon ThomasandClaude Opus 5.5 ef47ab59d0 Fix the Windows build of vst3-host; bump version to 0.2.1
The vst3 bindings' enum constants use the C default enum type, which is i32 on
Windows and u32 elsewhere. The bus helpers took u32 and the process-context
flags were assigned to a u32 field directly, so the release build failed on all
three Windows targets. Type the helpers with the bindings' own aliases and cast
the flags once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 08:39:10 -04:00
Brandon ThomasandClaude Opus 5.5 b9c70400f9 Bump version to 0.2.0 (from 0.1.0) for release
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 08:13:25 -04:00
Brandon ThomasandClaude Opus 5.5 9334ba0a50 Release CI: macOS job on macos-15-xlarge
Custom macOS larger runners in a runner group do not pick up jobs; the
built-in M2 Pro label does. Only release.yml uses it, and the
actions_macos_xl budget caps the monthly spend.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 22:08:11 -04:00
Brandon ThomasandClaude Opus 5.5 37a523e642 Release CI: macOS job on the org macos-release runner
The standard macOS runners are shared with all CI and queue for an hour or
more. The macos-release runner (GitHub-hosted M2 Pro) is in a runner group
usable only by release.yml on the release branch, with a monthly spend cap
on the actions_macos_xl SKU.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 21:55:03 -04:00
Brandon ThomasandClaude Opus 5.5 4627084956 About: contributor and model credits compiled in (grab bag + table, self-submitted names) (#8)
* About: contributors compiled in from contributors.json (grab bag + table, sortable, name toggle)

Adds the craftrules standard (standards/contributors.md) to SoundCraft: the About window gets
About · Contributors · Models tabs. contributors/contributors.json is generated by
craftrules/scripts/contributors.py and baked into the binary by crates/ui-egui/build.rs as
static tables. Each contributor line: @username, opt-in display/real name, PRs, commits,
lines +/−/Δ, binary assets +/−, first/last commit. Sortable by every column; alphabetical
ignores case and the leading @. Sort arrows use ⏶/⏷ (egui's icon font) since the system UI
font has no ▲/▼.

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

* Contributors: self-submitted names in contributors/people.toml; AGENTS.md credit-yourself section

build.rs reads contributors/people.toml next to the generated contributors.json and shows a name only
for entries the generator verified as written by that person (craftrules standards/contributors.md).

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

* Contributors: regenerate (verified people.toml entries)

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 21:16:58 -04:00
Brandon ThomasandClaude Opus 5.5 3597f895cc Rename PrintCraft to PdfCraft (storytold/pdfcraft) (#1)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 14:45:52 -04:00
Brandon ThomasandClaude Opus 5.5 876b098a20 Roadmap: alpha and parity estimates; README: video, surround and notation screenshots
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 01:48:45 -04:00
Brandon ThomasandClaude Opus 5.5 cdefc57c91 Video track, Audio Unit hosting, plugin state and editors, Renderer and UI Customization
Video (new standalone crate soundcraft-video):
- Pure-Rust H.264 (Baseline/Main/High), ProRes (all flavours) and Motion JPEG decoding with
  ISO-BMFF demux, adapted from FilmCraft's crates; fuzzed with mutated/truncated movies
- TrackKind::Video with ClipContent::Video referencing Session.videos; file.import_video adds
  the picture track and the movie's audio; relinking on open; video.offset/online/list
- Video and Video Universe windows, thumbnails on the timeline, background decoding

Third-party plugins:
- Plugin state (CLAP state ext, VST3 component + controller state) saved in sessions
- Hosted instances created, state-loaded and dropped on the UI thread, never the audio thread
- Plugin editors: floating CLAP GUIs and VST3 views on macOS (verified with Melodyne)
- New isolated FFI crate soundcraft-au-host: Audio Units on macOS (effects and instruments,
  parameters, latency, MIDI, ClassInfo state), wired into the mixer and plugin browser

UI: Window > Renderer (speaker layout with live levels and object positions), Window > UI
Customization (interface scale, reduce motion), Window > Configurations > Auto-Update.

Fix: saturating sample-index math in clip rendering (hostile stretch values overflowed).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 01:41:05 -04:00
Brandon ThomasandClaude Opus 5.5 c125a79a47 Mix window views: Mic Preamps (input gain), Instruments, Object/Bed
Adds track.object for routing a track as an immersive object or to the bed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 01:24:05 -04:00
Brandon ThomasandClaude Opus 5.5 0751dd31f1 Score export and print, clip group files, Merge Markers, path dialogs for every file command
- File › Export › Sibelius and File › Send To › Sibelius write MusicXML 4.0 (quantized,
  chords, ties across bar lines, meter changes, treble or bass clef per part)
- File › Print Score engraves the MIDI tracks to a printable SVG page; File › Score Setup
  sets title, composer, bars per system and track names
- File › Import › Clip Groups and Export Clip Groups (.scgrp with its audio)
- Edit › Paste Special › Merge Markers: copy carries the markers in the copied range
- The UI opens a path prompt for any command that needs a path or folder

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 01:17:42 -04:00
Brandon ThomasandClaude Opus 5.5 0368d7f541 MIDI Editor: rubber-band selection, Cmd+A, arrow-key transpose and move, header toolbar
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:49:48 -04:00
Brandon ThomasandClaude Opus 5.5 18ea131c7e fmt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:48:08 -04:00
Brandon ThomasandClaude Opus 5.5 c543c7a781 Search: a command palette over every command (Window › Search, Cmd+Ctrl+S)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:44:35 -04:00
Brandon ThomasandClaude Opus 5.5 856aae6871 Keyboard focus command and the a-z Commands Focus toolbar toggle
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:42:00 -04:00
Brandon ThomasandClaude Opus 5.5 cdf86b0fd8 Roadmap: VST3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:40:11 -04:00
Brandon ThomasandClaude Opus 5.5 cc86842abe Surround mixing, VST3 hosting, and hardening against hostile inputs
Surround:
- main and bus formats up to 9.1.6 and Ambisonics; pairwise constant-power
  surround panner (divergence, centre, LFE, height) per track and send;
  ITU fold-down; multichannel bounce with correct WAV channel masks;
  multichannel device output; surround panner and multichannel meters in the
  Mix window; setup.main_format, mix.surround_pan, mix.send_surround_pan

VST3:
- soundcraft-vst3-host: isolated unsafe crate (vst3 bindings, MIT), scans
  standard folders, hosts components/processors/controllers, params,
  latency, notes; VST3 menu; engine.vst3_plugins; e2e tests with a fixture

Hardening:
- positions from parameters clamped; offline renders capped and bounded to
  track material; loop/transport limits; hostile-parameter property test

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:39:59 -04:00
Brandon ThomasandClaude Opus 5.5 8269ca77f6 Property test: every command survives hostile parameters
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:15:26 -04:00
Brandon ThomasandClaude Opus 5.5 222273590e Property test: mutated session files load or fail cleanly and render without panicking
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:13:37 -04:00
Brandon ThomasandClaude Opus 5.5 7f9f9fff08 Random-edit property test covers the extended command set (400-case run clean)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:12:40 -04:00
Brandon ThomasandClaude Opus 5.5 daca626778 Fix fades outliving trimmed clips; property test of random edit sequences with full undo
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:10:53 -04:00
Brandon ThomasandClaude Opus 5.5 dc9f8e1f54 README: refresh the feature tour
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:09:03 -04:00
Brandon ThomasandClaude Opus 5.5 0e85d7ee54 Copy Special › Audio as MIDI: YIN pitch tracking into MIDI notes on the clipboard
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:08:18 -04:00
Brandon ThomasandClaude Opus 5.5 ff788999fe Clip List: find filter; place audio files on new or selected tracks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:03:10 -04:00
Brandon ThomasandClaude Opus 5.5 2495466bde ui: drop unused import
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 00:02:04 -04:00