Commit Graph
94 Commits
Author SHA1 Message Date
Brandon ThomasandClaude Opus 5.5 acf3237bed Merge origin/main into fix/macos-native-menu-bar
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:15:50 -04:00
Brandon Thomas 92b4d07a7c Merge pull request #11 from switch87/desktop-log-file
Desktop: write log records to standard error and a rotating log file
2026-10-09 18:12:57 -04:00
Brandon ThomasandClaude Opus 5.5 5824042856 Merge origin/main into desktop-log-file
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:12:03 -04:00
Brandon Thomas 2c495aa473 Merge pull request #31 from vbasky/feat/fontconfig-system-fonts
Use fontconfig for Linux system fonts
2026-10-09 18:11:45 -04:00
Brandon Thomas 7083a58500 Merge pull request #29 from Garygunn94/claude/track-delete-menu-disappear-9456d6
Keep the clip context menu open while moving onto it
2026-10-09 18:11:39 -04:00
Brandon Thomas e9820fac30 Merge pull request #28 from Garygunn94/claude/recording-audio-playback-b2db9a
Fix input monitoring pitch and dropouts when input and session rates differ
2026-10-09 18:11:35 -04:00
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 dd52eb7dad macOS menu bar: fall back instead of failing to start; throttle sync
- A muda error now logs a warning and keeps the in-window menu bar
  instead of aborting startup (never crash).
- sync() walked ~500 leaves with a command lookup and a Cocoa call each
  frame; run it at most 4x/s and right after a click.
- About / Session Info from the application menu open their window
  rather than toggling it closed.
- The title carries Edit/Mix and the dirty mark only when the system
  menu bar replaces the egui one (no duplicate on Linux/Windows).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 11:12:12 -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 c04e79714c fonts: fontconfig on FreeBSD too; accept only TrueType/OpenType results
egui panics on Type 1 or bitmap font bytes, which fc-match can return on
minimal systems, so check the sfnt magic first. Mask the variable-font
named instance out of %{index}. Fix the unused 'bold' warning on macOS
and Windows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 11:00:17 -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
Vikram Bhaskaran 983846a054 Use fontconfig for Linux system fonts 2026-10-09 11:12:26 +11:00
Gary GunnandClaude Haiku 5.5 4c7ffc5f03 Keep the clip context menu open while moving onto it
The clip menu was attached at the end of lane_interaction, which returns
early when the lane has no pointer position. Once the menu opened, the
pointer sat over the popup, the lane lost its hover, and the menu was
never drawn again, so it vanished before Delete could be clicked.

Attach the menu before the early return and remember the right-clicked
clip so it keeps its target. Stale clip ids are dropped if the clip no
longer exists. Adds a kittest regression test covering right-click,
move onto the menu, and Delete.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-08 22:25:48 +01:00
Gary GunnandClaude Haiku 5.5 b3669c767e Fix input monitoring pitch and dropouts when input and session rates differ
The monitor ring fed raw input-device samples to the output callback as if
they were at the session rate. A 16 kHz or 44.1 kHz input played back too
fast (higher pitch) and ran dry between bursts, so it sounded quiet.

InputRing now knows the input rate and converts to the session rate with
linear interpolation in pop_into, allocation-free and non-blocking. The
buffer cap is computed once in new(). Tests cover rate up-conversion,
down-conversion, equal rates and underrun.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-08 22:18:32 +01: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
Gert Pellin 5b95e85929 Contributors: credit switch87 as Gert Pellin 2026-10-08 12:27:07 +02:00
Gert Pellin 74926df527 Desktop: write log records to standard error and a rotating log file
The desktop app installed no logger, so every log::warn!/log::error! in
the workspace was discarded: the engine's panic report, audio devices
that failed to open or broke, plugins that refused their stored state or
failed to activate, CLAP plugins' own log messages, files that failed to
open. A launch from a desktop menu has no terminal either, so there was
nothing to attach to a bug report.

apps/soundcraft/src/logging.rs (no new dependency):
- standard error plus <settings dir>/logs/soundcraft.log (beside
  ui.json, Autosave/ and Presets/); each launch rotates the previous log
  to soundcraft.1.log and .2.log, so the log of a run that crashed
  survives the next start; the file is capped at 16 MiB
- records logged before the settings directory is known are buffered
  (bounded) and written once the file is attached
- default levels: info for soundcraft*, warn for everything else;
  RUST_LOG replaces them with env_logger-style directives
- never panics: an unusable directory or a failed write leaves standard
  error as the only sink; a poisoned lock is tolerated
- runs with SOUNDCRAFT_NO_PREFS (agents' test runs) log to standard
  error only, so they don't rotate away the user's own logs

Realtime audio: a record takes a lock and does I/O, which the audio
callback must never do, yet code on the audio thread logs (the cpal
error callbacks, the synth's full event queue, a hosted plugin's failed
process, a CLAP plugin calling the host's log, the panic hook). The cpal
callbacks now mark their thread (soundcraft_mix::mark_audio_thread,
re-exported by soundcraft_playback), and the mix engine carries the mark
into the rayon workers that render strips for it. A record from a marked
thread is not written there: the first is kept in a fixed buffer
(try_lock, no allocation, never waits), the rest are counted, and the UI
thread writes them every frame (any other thread before its own next
record).

The logger is installed first in main (before the engine's panic hook)
and the file is opened after argument parsing (--version leaves no
file). The settings directory moves out of prefs_path into config_dir.
The control server's eprintln!s go through the logger (the
SOUNDCRAFT_CONTROL_PORT line on standard output stays). Documented in
README.md (Getting started > Logs) and docs/architecture.md (Audio).
2026-10-08 12:25:49 +02:00
reoniazx b44aaade42 macOS: move application menus to the system menu bar 2026-10-08 14:10:03 +08: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