You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Bitwig Hello World — Orca / Sonic Pi / TidalCycles → Bitwig → SunVox / Automatonism
A true musical hello world that wires up three independent external MIDI generators, Bitwig as the hub, two external software synths, and virtual audio return — all free and open source, zero VST plugins inside Bitwig.
Any of the three livecoding sources (Orca, Sonic Pi, Tidal) can clock themselves and emit MIDI into Mididash. Bitwig receives them on one track and forwards them out two HW Instrument tracks — one to SunVox, one to Automatonism. Their audio returns through BlackHole 16ch into Bitwig audio tracks where you mix/record/FX. TidalCycles is special: it both generates patterns (Haskell) and produces its own audio (through SuperCollider's SuperDirt), so for Tidal you can skip the MIDI route entirely and just capture SuperCollider's audio into Bitwig via BlackHole.
One-time setup
1. Install BlackHole 2ch
brew install blackhole-2ch
Reboot CoreAudio or log out/in. Verify it appears in Audio MIDI Setup.
2. Create an Aggregate Device (so Bitwig sees your speakers and BlackHole)
Open Audio MIDI Setup → + → Create Aggregate Device
Check your output (e.g. MacBook Speakers) and BlackHole 2ch
No instrument — it only forwards MIDI out to another track via Note FX → Note Receiver, or simply records the incoming notes as clips.
Track 2 — "SunVox Out" (HW Instrument)
Add device: HW Instrument
MIDI Out: Mididash In 2 (or any free Mididash port), channel 1
Audio In: Bitwig stereo input bus → BlackHole 1–2
This is a real round trip: MIDI leaves Bitwig, audio comes back.
Track 3 — "Pd Out" (HW Instrument)
Add device: HW Instrument
MIDI Out: Mididash In 3, channel 1
Audio In: same BlackHole bus (sum with Track 2, or use a second BlackHole instance for separation)
About HW CV Instrument: Skip it. That device sends analog control voltage out a DC-coupled audio interface to real Eurorack/Moog hardware. With software-only synths, HW Instrument (MIDI) is the right tool. HW CV Instrument only enters the picture when you wire an actual jack into physical gear.
After recompile: SuperDirt.start (downloads sample packs first time).
In VS Code, open a new file hello.tidal. The vscode-tidalcycles extension will auto-boot ghci + tidal. (Set Tidalcycles › Ghci: Base Path to ~/.ghcup/bin/ghci in settings.)
Paste and Shift+Enter:
d1 $ sound "bd sn hh cp"
hush to stop.
Audio comes out of SuperCollider → route SC's output device to BlackHole 16ch (in SC: s.options.outDevice_("BlackHole 16ch"); s.reboot;) and capture it in Bitwig on an audio track.
For MIDI-only Tidal (to drive SunVox/Pd instead of SuperDirt), use the tidal-midi connection pattern — heavier setup, skip for hello world.
Wire it up in Mididash
Open Mididash's node canvas and draw these cables:
[Input: Mididash In 1] ──→ [Output: Mididash In 1] (Orca → Bitwig)
[Input: Mididash In 2] ──→ [Output: Mididash In 2] (Bitwig → SunVox)
[Input: Mididash In 3] ──→ [Output: Mididash In 3] (Bitwig → Pd)
(On macOS a single IAC/virtual port is bidirectional — one side is "input" to one app and "output" to the other. Mididash just needs the node cables drawn so routing is explicit and loggable.)
On Track 1, enable Note FX → Note Receiver on Tracks 2 and 3, or duplicate the MIDI clip onto them. Both HW Instrument tracks now send MIDI out via Mididash.
SunVox and Pd receive the notes and play.
Their audio lands on the BlackHole input bus → Bitwig Audio tracks show levels.
Record-arm the audio tracks and hit record. You are now capturing a generative patch driven by Orca, voiced by two external synths, summed and mixed inside Bitwig — with Bitwig adding zero instruments of its own.
What you just proved
MIDI IN to Bitwig from three different non-keyboard sources (Orca grids, Sonic Pi Ruby, Tidal patterns)
MIDI OUT of Bitwig via HW Instrument to two apps in parallel
Audio return from external software via a virtual driver (BlackHole 16ch)
Routing topology managed explicitly in a single place (Mididash)
Zero VST plugins loaded inside Bitwig — the DAW is the mixer/recorder/clock hub
From here you can swap Orca for a Bitwig clip, replace SunVox with Cardinal (the one thing that would live as a VST inside Bitwig), add effects, automate, record performances, and so on. The plumbing is the same.
Instructions for a Claude (or anyone) to reproduce Brian's generative / livecoding / external-synth rig on a fresh Mac Studio (Apple Silicon, arm64). Everything here is free and open source. No Homebrew — direct installers, source builds, or official installer scripts only.
Goal
End state: a working setup where Bitwig is the hub, external apps generate MIDI algorithmically (Orca, Sonic Pi, TidalCycles) and external apps receive MIDI and make sound (SunVox, Automatonism / Pure Data, TidalCycles via SuperCollider). MIDI routing happens in Mididash. Audio comes back into Bitwig through BlackHole 16ch. Zero VST plugins loaded inside Bitwig.
SunVox on macOS is standalone only — there is no AU/VST version for Mac (the AUv3 build is iOS-only). MIDI into SunVox comes from Mididash; audio out goes to BlackHole.
Opens via Pd → File → Open → ~/Documents/Pd/Automatonism 3.1/main.pd. In Pd: Media → MIDI Settings → pick a Mididash port; Media → Audio Settings → output BlackHole 16ch; turn DSP on (Ctrl+/).
6. Orca (Hundred Rabbits, Electron GUI)
The Orca GUI is distributed via itch.io (browser-gated). Build an .app bundle from source so Spotlight finds it.
mkdir -p ~/src &&cd~/src
git clone --depth 1 https://github.com/hundredrabbits/Orca.git
cd Orca/desktop
npm install
# On Apple Silicon use --arch=arm64 (Brian's current Intel machine used --arch=x64)
npx --yes @electron/packager . Orca --platform=darwin --arch=arm64 --out=/tmp/orca-build --overwrite
cp -R /tmp/orca-build/Orca-darwin-arm64/Orca.app /Applications/
xattr -dr com.apple.quarantine /Applications/Orca.app
rm -rf /tmp/orca-build
mdimport /Applications/Orca.app
First launch: Cmd+, → set MIDI Output to a Mididash port. Space to play.
7. Sonic Pi
# Apple Silicon build (use x64 on Intel)cd /tmp
curl -sL -o sonicpi.dmg https://sonic-pi.net/files/releases/v4.6.0/Sonic-Pi-for-Mac-arm64-v4-6-0.dmg
yes | PAGER=cat hdiutil attach -nobrowse sonicpi.dmg # EULA prompt
cp -R "/Volumes/Sonic Pi for Apple Silicon Mac arm64 v4.6.0/Sonic Pi.app" /Applications/ # verify actual volume name
hdiutil detach "/Volumes/Sonic Pi for Apple Silicon Mac arm64 v4.6.0" -quiet
xattr -dr com.apple.quarantine "/Applications/Sonic Pi.app"
rm /tmp/sonicpi.dmg
Sonic Pi can send MIDI out via Preferences → IO → MIDI → pick a Mididash port.
8. SuperCollider
cd /tmp
# For Apple Silicon native, check https://supercollider.github.io/downloads for the non-legacy arm64 dmg
curl -sL -o sc.dmg https://github.com/supercollider/supercollider/releases/download/Version-3.14.1/SuperCollider-3.14.1-macOS-arm64.dmg
yes | PAGER=cat hdiutil attach -nobrowse sc.dmg
cp -R /Volumes/SuperCollider/SuperCollider.app /Applications/
hdiutil detach /Volumes/SuperCollider -quiet
xattr -dr com.apple.quarantine /Applications/SuperCollider.app
rm /tmp/sc.dmg
mdimport /Applications/SuperCollider.app
Note: as of 2026-04 SuperCollider 3.14.1 publishes an arm64 build and a legacy x64 build. Verify the exact asset name on the release page before running the curl.
9. SuperDirt (manual step inside SuperCollider)
This cannot be scripted from the shell — it must run inside sclang.
Launch /Applications/SuperCollider.app.
In the code editor pane, paste and evaluate (Shift+Return on each block):
Then in VS Code Settings (Cmd+,) search tidalcycles ghci and set:
Tidalcycles › Ghci: Base Path = /Users/<user>/.ghcup/bin/ghci
(Required because VS Code's PATH doesn't inherit shell PATH.)
Verification checklist
After everything is installed, verify:
ls -d /Applications/{Mididash,SunVox,Pd-0.56-2,Orca,SuperCollider}.app "/Applications/Sonic Pi.app"
ls /Library/Audio/Plug-Ins/HAL/BlackHole16ch.driver
ls ~/Documents/Pd/Automatonism\ 3.1/main.pd
export PATH="$HOME/.ghcup/bin:$HOME/.cabal/bin:$PATH"
ghc --version
cabal --version
ghc-pkg --simple-output list tidal
code --list-extensions | grep tidalcycles
All should succeed. Then open Audio MIDI Setup and confirm BlackHole 16ch is present (and that any leftover BlackHole 2ch / MS Teams audio driver is gone).
Orca, Sonic Pi, Tidal are three independent livecoding MIDI sources. They don't have to run at the same time — pick whichever fits the mood.
SunVox and Automatonism are the external software instruments.
SuperCollider / SuperDirt both hosts Tidal and produces its audio — so Tidal is a full "MIDI in, audio out" loop in one app.
Mididash is the single place where all routing is visible and editable.
BlackHole 16ch is the single audio return path from any external app into Bitwig.
HW CV Instrument in Bitwig is not used — it's only for sending analog control voltage out a DC-coupled interface to real hardware synths. Everything here is software.
Lessons learned (read before installing!)
These are gotchas hit during the original session. Future Claude: don't repeat them.
TidalCycles install — cabal install --lib traps
Don't run bare cabal install tidal --lib. Cabal prints a warning about global GHC environment files and silently does nothing (exit code 0, no install). Always use --package-env=default so it actually writes the env file.
Even with --package-env=default, the env file only contains base + tidal — not transitive deps. ghc-pkg called without --package-db will say "cannot find package tidal" because it doesn't read GHC environment files at all.
The cabal store uses vowel-stripped unit-id directory names (tdl-1.10.1-..., clck-..., ntwrk-...). This is normal — they're truncated hashes, not corrupted names. The actual package metadata still says name: tidal.
vscode-tidalcycles needs a wrapper directory, not a wrapper file
The extension's Tidalcycles › Ghci: Base Path setting expects a directory containing both ghci and ghc-pkg executables. It joins /ghc-pkg onto the base path. Solution Brian uses:
~/.local/bin/tidal-ghc/
├── ghci (script that exports GHC_PACKAGE_PATH then execs real ghci)
└── ghc-pkg (same wrapper for ghc-pkg)
The trailing colon means "plus the global db". Without this, ghc-pkg can't see tidal even though ghci can (via the env file).
SuperDirt — the SuperDirt.default trap
SuperDirt.start (as of v1.7.3) does not automatically set SuperDirt.default. You must run once per SC session:
SuperDirt.default = ~dirt;
Without it, any direct event-style trigger like (type: \dirt, s: \bd).play will fail with "no dirt instance found". Tidal-via-OSC works without this, because Tidal sends OSC straight to port 57120 — the OSC handler doesn't care about SuperDirt.default. But the SC-side debugging tests do.
Add this to ~/Library/Application Support/SuperCollider/startup.scd to avoid it forever:
When testing from SC directly, write s: \bd (Symbol) not s: "bd" (String). The dirt event handler uses Symbol equality. From Tidal this is moot — Tidal serializes correctly.
SuperDirt — duplicate node ID errors
If you s.reboot while Tidal is still sending patterns from VS Code, SuperDirt re-creates orbit groups while Tidal is asking for old IDs → spam of FAILURE IN SERVER /g_new duplicate node ID. Always:
hush in VS Code first
s.reboot in SC
SuperDirt.start in SC
Resume Tidal patterns
BlackHole — distribution is gated, build from source
existential.audio gates the .pkg downloads behind an email form. The GitHub releases page has no binary assets. The clean path on a no-brew machine is to clone and xcodebuild with kNumber_Of_Channels=16 plus the bundle-id/device-name overrides, then sudo cp the resulting .driver into /Library/Audio/Plug-Ins/HAL/. Multiple BlackHole driver bundles can coexist (2ch, 16ch, 64ch) — they have distinct bundle IDs.
macOS coreaudiod can't be killed under SIP
sudo killall -9 coreaudiod returns "Operation not permitted" on SIP-enabled systems. This is harmless — coreaudiod will pick up new HAL drivers on next logout/login or when an audio device is toggled. Don't try to disable SIP just for this.
Spotlight reindex after installs
New .app bundles in /Applications may not appear in Spotlight immediately. Force with:
mdimport /Applications/<app>.app
If still missing, check System Settings → Siri & Spotlight → Spotlight Privacy for stale exclusions of /Applications.
Quarantine attribute strips on every direct download
Anything not from the App Store or notarized comes down with com.apple.quarantine attached and Gatekeeper will block it. Run after every install:
itch.io, gated downloads, and Electron apps from source
Some tools (notably the Hundred Rabbits Orca GUI) are distributed only via itch.io with a browser-gated download. The clean answer on a CLI-driven setup is to clone the repo and build a .app bundle yourself:
Use --arch=arm64 on Mac Studio (Apple Silicon). The bundle goes in /Applications/ and Spotlight indexes it normally.
npm-launched Electron apps don't show in Spotlight
npm start from a source checkout runs an Electron dev process — not an installed app — so Spotlight won't index it. If you want it Spotlight-searchable, package it with @electron/packager.
Pure Data (vanilla) is fine; don't install Pd-extended
Pd-extended is abandoned. Pure Data Vanilla from puredata.info (or msp.ucsd.edu) is the actively maintained one. Automatonism 3.1 runs on vanilla.
macOS deployment target warnings during xcodebuild
The BlackHole xcodeproj sets MACOSX_DEPLOYMENT_TARGET = 10.10, which is older than Xcode 26 supports. Warnings are harmless — the build still produces a working driver. Ignore them.
SunVox on macOS is standalone-only — no plugin
There is no AU/VST/VST3 build of SunVox for macOS. The "AU plugin" mentioned on warmplace.ru is iOS only and cannot be loaded into a Mac DAW (not even on Apple Silicon — iOS app sandboxing prevents it). SunVox on Mac integrates via virtual MIDI (Mididash) and virtual audio (BlackHole).
Mididash replaces IAC
Brian standardized on Mididash for all virtual MIDI routing. Do not suggest the macOS built-in IAC Driver as an alternative. Mididash gives a node-graph view of routing, Lua scripting hooks, and avoids confusion when multiple apps need different topology.
HW CV Instrument vs HW Instrument in Bitwig
These are not interchangeable:
HW Instrument = MIDI out of Bitwig to anything (virtual MIDI port, USB MIDI device, etc.). Use for SunVox, Pd, etc.
HW CV Instrument = analog control voltage out a DC-coupled audio interface to physical Eurorack/Moog gear. Skip it for software-only setups.
Don't confuse Brian by suggesting HW CV Instrument when the target is software.
Conventions learned this session
No Homebrew — direct downloads, source builds, or official installer scripts.
Prefer .app bundles in /Applications over npm start-from-source so Spotlight can index them.
After installing to /Applications, run mdimport to force Spotlight reindex.
Strip quarantine attr (xattr -dr com.apple.quarantine) on anything not notarized, or it won't launch.
All MIDI between Mac apps flows through Mididash virtual ports, not the macOS built-in IAC driver.