openlamp-midi — Ableton Link / tempo for OpenLamp lamps
Flash your OpenLamp lamps on the beat, phase-accurate, from an Ableton Link session or a MIDI clock. 100 % local.
pip install "openlamp-midi[link]" # [link] adds Ableton Link (native build)
python3 beatsync.py --source link --action pulse --accent
beatsync.py follows the tempo source and drives the lamps via the engine's local
API — pulsing on the beat, with latency anticipation (fires early so the light
lands on the beat) and an accent on the downbeat (exact under Link, which shares
the bar's phase). See --help for --source link | taplink | clock | tap.
Scope
This package is only the tempo/beat layer. The MIDI control path — notes →
colours, CC → brightness/effects, Program Change → presets — moved into the engine
and now lives in openlamp/engine → midi.py,
the reference implementation of the
wled-midi convention. (Before v0.2.0 this
package also shipped a separate MIDI bridge; it was removed — use the engine's
midi.py.)
Family
| Layer | Repo | Role |
|---|---|---|
| convention | wled-midi | the MIDI↔WLED spec |
| engine | engine | drives the lamps + implements the convention (midi.py) |
| Ableton | live | Ableton Live frontend |
| tempo | this repo | Ableton Link / MIDI-clock beat pulse |
Uses the engine's local API (127.0.0.1:8377). Requires the engine running.
Architecture & the Ableton Link / GPL boundary
OpenLamp is split so that the one component touching Ableton Link is a small, separate, auditable process — everything else is a separate program reached only over a local HTTP API. This keeps the GPL reach of Link/aalink confined to a single place.
How the pieces are wired
- This package (
openlamp-midi/beatsync.py) runs as its own process. It is a standalone CLI helper, launched independently — not embedded in, nor spawned by, the engine. - It talks to the engine only over the local HTTP API on
127.0.0.1:8377(plainurllibrequests to/cmdand/status). There is no in-process call, FFI, shared memory, or linking between the two — the engine owns the persistent device connections; this helper only POSTs commands to it. - Ableton Link is reached via
aalink and is imported only here — a
lazy, local
from aalink import Linkinside the Link source, gated behind the optional extra:pip install "openlamp-midi[link]". The engine and the frontends contain zero Link/aalink references.
What that means for licensing
Ableton Link (and therefore aalink) is GPLv2 — a component that loads it in the same process forms a combined program governed by the GPL. In OpenLamp:
- The only process that ever combines with aalink is
beatsync.py(this package). It is MIT; since MIT is one-way compatible with the GPL, combining it with Link at runtime is fine and the effective combined program honors the GPL. - The engine is a genuinely separate program that communicates only over the local HTTP API and carries no Link code, so it stays under its own (permissive) license — the GPL obligation does not propagate to it.
- The frontends (Stream Deck plugin, etc.) likewise reach the engine only over that same local HTTP API and never combine with Link, so the GPL never reaches them.
Invariant: GPL (via aalink/Link) is confined to one process —
beatsync.py. Every other OpenLamp component is a separate program reached only over local HTTP, so the GPL obligation never reaches the engine or the frontends.
Installing the [link] extra pulls in aalink (GPLv2); the resulting combined
program (this helper + aalink + Link) is therefore governed by the GPL. Without the
extra, openlamp-midi is a pure-Python MIT package that does not touch Link at all.
License
MIT — for this package's own source (beatsync.py).
Optional dependency: the [link] extra installs
aalink (a Python binding to
Ableton Link), which is GPLv2. When you install
that extra, the running combination is governed by the GPL as described above. The MIT
license covers this repository's code; it does not relicense aalink or Link.
Metadata
Release files for openlamp-midi 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| openlamp_midi-0.2.0.tar.gz | 20.6 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| openlamp_midi-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 39.1 kB
Release files / openlamp_midi-0.2.0.tar.gz
| Download URL | openlamp_midi-0.2.0.tar.gz |
|---|---|
| Size | 20.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d94d64a6ac8848d737b06293a5643caec771333c0be38459fdfa438f2a4d3e6a
|
|
BLAKE2b-256 checksum How to use checksums |
5063ead05a6a84e96474897ac20cf57f6733d39e898231a780c761c7e31e008d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 17, 2026.
Transparency logRelease files / openlamp_midi-0.2.0-py3-none-any.whl
| Download URL | openlamp_midi-0.2.0-py3-none-any.whl |
|---|---|
| Size | 18.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4fa410065f316f77de41dfe71fe25d1c7ea4fa6296a8a00848c6342a34ba7465
|
|
BLAKE2b-256 checksum How to use checksums |
e9c3aaac9f8df4d8d20c906e807f10d74d2a5c3fd86822d56f3814157fb52b78
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 17, 2026.
Transparency logSecurity for openlamp-midi 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for openlamp_midi-0.2.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 17, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.