Linux live-piano host: MIDI keyboard -> soundfont/plugin synthesis -> PipeWire
Project description
polyclav
A self-contained live piano host for Linux. Plug in a MIDI keyboard
and an audio interface, run polyclav, and you have a digital piano: keys
make piano sound, effects are in the chain, and (optionally) a Novation
Launchkey's knobs, pads, and screen drive the front panel. No DAW, no
recording — just playing. Devices can come and go; polyclav reconnects
automatically and idles at near-zero CPU when nothing is plugged in.
Status: Linux-only (PipeWire). Developed and tested against a Novation Launchkey 61 MK4 + Behringer XR18 over OSC. Should work with any class-compliant MIDI keyboard and any PipeWire-supported audio interface; Launchkey-specific bits gracefully degrade if the device isn't present.
polyclav is implemented in Go with a thin Rust audio-core for the
real-time audio thread (PipeWire, oxisynth, sfizz). A polyclav-components
CLI is also included for encoding/uploading Launchkey MK4 Custom modes
over SysEx.
What works today
- Live audio out via PipeWire. Any default sink works; an XR18 with
a low-latency WirePlumber rule (see
docs/INSTALL.md) gets ~8 ms round-trip at a 128-frame quantum. - Live MIDI in over ALSA-seq (rtmidi). Notes, CCs, mod wheel, and pitch bend forwarded to the synth end-to-end.
- Two synth backends, picked by file extension:
.sf2/.sf3→ oxisynth (pure Rust).sfz→ sfizz (C++ via thin Rust FFI)
- Patches — named soundfont presets defined in
[[patches]]in the config. Top-row Launchkey pads select patches live (8 visible). - Per-patch gain matching via
gain_dbso switching a soft EP for a loud grand doesn't blow your ears off. - Soundfont hot-swap — switch patches without dropping audio.
- DSP chain in the audio thread, in order:
synth → patch_gain → input_comp → reverb → mastering_comp → limiter → master_volume → out. Knobs 1/2/3 drive master volume, reverb, and the input compressor live. - XR18 OSC bindings — faders and pads drive mixer faders and mute
toggles over UDP. Bindings live in
[osc.xr18.bindings]. - Launchkey MK4 DAW driver — handshake, knob/pad/screen control,
per-patch knob-value persistence. The
polyclav-componentsCLI also encodes and uploads Custom modes over SysEx.
For the developer-facing rundown of every component, see AGENTS.md.
Install
Linux only (PipeWire). polyclav is a dynamically-linked binary that uses your system's audio libraries — install those from your distro, then install polyclav however you like.
1. System libraries
PipeWire, ALSA, and the LV2 host library (lilv):
# Debian / Ubuntu
sudo apt install pipewire libasound2 liblilv-0-0
# Fedora
sudo dnf install pipewire alsa-lib lilv
# Arch
sudo pacman -S pipewire alsa-lib lilv
Optional — sfizz, for .sfz sample libraries (Salamander Grand, etc.). It's
a runtime-loaded optional backend: without it, .sfz patches are silent but
SF2/SF3 soundfonts, the native synth, and LV2/CLAP plugins all work. sfizz isn't
always in a distro's default repos — check your package manager (e.g. the AUR on
Arch) or build it from source. Run polyclav doctor to see what's available.
2. polyclav
uvx polyclav # run without installing
pipx install polyclav # or install it persistently
Both fetch a prebuilt Linux wheel from PyPI; the polyclav-components Launchkey
SysEx CLI ships in the same wheel. For Go developers:
go install github.com/mschulkind-oss/polyclav/cmd/polyclav@latest
(or build from source — see Build from source below.)
3. First run
polyclav doctor # report backends + analyse your config
polyclav bootstrap # download free starter soundfonts (~500 MB; prompts for licenses)
polyclav # start playing
Build from source
mise install # Go + Rust toolchains
just build # Rust audio-core + Go binary
just install # or: install both binaries to ~/.local/bin
mkdir -p ~/.config/polyclav
cp polyclav.example.toml ~/.config/polyclav/polyclav.toml
$EDITOR ~/.config/polyclav/polyclav.toml # edit soundfont paths
overmind start -D # run as daemon via Procfile
polyclav ships no soundfonts (license + size). The example config points
at ~/.local/share/polyclav/soundfonts/... — drop your files there or edit
the paths. docs/INSTALL.md lists free starter soundfonts and where to
get them.
If you don't have a Launchkey, the daemon still runs: the audio path and any MIDI keyboard work; the Launchkey-specific code paths just stay idle.
Documentation
| Path | What it covers |
|---|---|
docs/INSTALL.md |
System-level install: build deps, soundfonts, hardware notes. Start here on a fresh machine. |
docs/USER_GUIDE.md |
End-user install / configure / play, including the full config schema. |
docs/HARDWARE_TESTS.md |
Hardware verification checklist (Launchkey MK4 + XR18). |
docs/ROADMAP.md |
Forward-looking native-synth roadmap (Phases 2-4). |
AGENTS.md |
For AI agents and developers working on the code. Build/test workflow, current state, DSP API. |
License
polyclav itself is licensed under the Apache License, Version 2.0 —
see LICENSE.
Transitively used libraries carry their own licenses:
oxisynth— LGPL-2.1sfizz— BSD-2-Clausepipewire-rs— MIT or Apache-2.0rtmidi(via cgo) — MIT-like (see upstream)
If you distribute polyclav (or a derivative), bundle the appropriate notices. Apache 2.0 + LGPL-2.1 (oxisynth) means: dynamic linking is fine, you must permit relinking against modified oxisynth, and you must preserve oxisynth's copyright notices.
Contributing
Patches welcome. The workflow, code layout, and current milestones are
documented in AGENTS.md. Run just check before sending
anything — it gates on cargo build --release, cargo clippy -D warnings,
go vet, cargo test, go test, and go build ./....
Bug reports: please include polyclav --version, the contents of your
polyclav.toml (redact paths if you like), and the relevant slice of
/tmp/polyclav.log (overmind tees there by default).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file polyclav-0.1.3-py3-none-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: polyclav-0.1.3-py3-none-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 5.0 MB
- Tags: Python 3, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fe959b17fe95e6697509cf89a2442391a22d3d3f6472ea82f90028188e4b3fbf
|
|
| MD5 |
5443a39667191adce470bac23a061cba
|
|
| BLAKE2b-256 |
4bb502e3a283e98aab20152c204dcc9b55110b943abf00f55c411d8361619037
|
Provenance
The following attestation bundles were made for polyclav-0.1.3-py3-none-manylinux_2_39_x86_64.whl:
Publisher:
publish.yml on mschulkind-oss/polyclav
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
polyclav-0.1.3-py3-none-manylinux_2_39_x86_64.whl -
Subject digest:
fe959b17fe95e6697509cf89a2442391a22d3d3f6472ea82f90028188e4b3fbf - Sigstore transparency entry: 1753932421
- Sigstore integration time:
-
Permalink:
mschulkind-oss/polyclav@462edcb1e9bc105ddcbf5f8307396ad3a3e5d953 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/mschulkind-oss
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@462edcb1e9bc105ddcbf5f8307396ad3a3e5d953 -
Trigger Event:
release
-
Statement type: