Files
AV-Live/launcher/README.md
T
L'électron rare 8dab7236d4 feat(launcher): SwiftUI menubar app
Context: AV-Live needs a single-click way to boot its two heavy
components (the SuperCollider sound engine and the openFrameworks
oscope-of visualizer) together, with their logs aggregated in one
place. Running them by hand from terminal during a live set is fragile.

Approach: Swift Package Manager + a small build.sh that wraps the
release binary into a real .app bundle (Info.plist with LSUIElement=true
to keep it out of the Dock). The UI uses NSStatusItem + NSPopover so
it works back to macOS 11 (Big Sur) — MenuBarExtra would require 13+
which the current target MBP can't run.

Changes:
- launcher/Package.swift : SwiftPM manifest, single executable target,
  macOS 11 minimum
- AVLiveLauncherApp.swift : @main App + AppDelegate that owns the
  status item, popover and lazily-created log window
- ProcessManager.swift : ObservableObject spawning sclang and oscope-of
  via Foundation Process, capturing stdout/stderr through Pipe +
  readabilityHandler, ring-buffered log array (2000 lines), termination
  handlers that flip @Published flags back. Paths persisted in
  UserDefaults with sane defaults
- MenuBarContent.swift : popover view with two ProcessRow toggles,
  Logs / Paths / Quit, Settings sheet using NSOpenPanel
- LogView.swift : separate window with filter, auto-scroll, color-coded
  source column, monospaced font. #available guard for textSelection
- Info.plist : bundle id cc.saillant.AVLiveLauncher, GPL-3 copyright,
  LSUIElement true, min macOS 11
- build.sh : swift build -c release, copies binary + Info.plist into
  AVLiveLauncher.app, ad-hoc codesigns
- .gitignore + README

Impact: 'cd launcher && ./build.sh && open build/AVLiveLauncher.app'
gives a working .app that brings up the AV stack from the menubar.
Smoke-tested on arm64 — Intel MBP needs a local build or a future
universal -arch x86_64 flag in build.sh.
2026-05-07 12:04:59 +02:00

1.2 KiB

AVLiveLauncher

macOS menubar launcher for AV-Live. Starts and stops sclang (which auto-loads sound_algo/00_load.scd and serves the web UI) and the oscope-of visualizer with one click each, and aggregates their logs in one window.

Build

Requires Swift 5.7+ and Xcode Command Line Tools.

cd launcher
./build.sh
open build/AVLiveLauncher.app

The first run shows a waveform.path.ecg icon in the menubar. Click it to open the popover.

Configuration

Three paths are stored in UserDefaults (~/Library/Preferences/cc.saillant.AVLiveLauncher.plist) :

Default Override
/Applications/SuperCollider.app/Contents/MacOS/sclang Paths… → sclang binary
~/Documents/Projets/AV-Live/sound_algo/00_load.scd Paths… → load file
~/Documents/Projets/AV-Live/oscope-of/bin/oscope-of Paths… → oscope binary

What it does

  • Spawns sclang <load_file> with stdout/stderr captured into the log window. sclang itself boots scsynth, loads the 1099-SynthDef palette, and serves the web bridge on :8080.
  • Spawns the oscope-of binary with cwd set to its parent directory (so oF can find bin/data/).
  • Quitting the menubar app sends SIGTERM to both children.