rustylink is a Rust wrapper of abllink, which is a C 11 extension for Ableton Link, provided by Ableton. This library attempts to be mostly unopinionated and plain in copying the functionality of abl_link, while providing some of Rust's safety guarantees.
Ableton Link is a technology that synchronizes musical beat, tempo, phase, and start/stop commands across multiple applications running on one or more devices. Applications on devices connected to a local network discover each other automatically and form a musical session in which each participant can perform independently: anyone can start or stop while still staying in time. Anyone can change the tempo, the others will follow. Anyone can join or leave without disrupting the session.
To run the examples, clone this repository and change into its directory. Then fetch the Ableton Link source by initializing the git submodules with:
git submodule update --init --recursive
This crate includes a Rust port from C of the simple 'LinkHut'. To run it:
cargo run --release --example link_hut_silent
There is also a Rust from C++ port of the more complex 'LinkHut', which has sound. Run it like this:
cargo run --release --example link_hut
See the cpal documentation for ASIO and Jack support, if required.
Requires a recent version of CMake (3.14 or newer) to be installed and available in your terminal. Test with cmake --version
.
'abl_link.h' has doc comments about thread and realtime safety on some of its functions. Those comments have been copied to the functions of this library. A short explainer on what they mean:
Thread Safety: Thread-safe code only manipulates shared data structures in a manner that ensures that all threads behave properly and fulfill their design specifications without unintended interaction.
Realtime Safety: These functions can be called in a Realtime environment without blocking the thread. For example, an audio thread / callback.
Ableton designed a Test Plan to test if your implementation of Ableton Link in your project meets all the expected requirements.
AblLink
or the SessionState
struct.create
functions for abllink and sessionstate have been renamed to new
to make the API more Rust-intuitive.link_hut
example for details.num_peers
, start_stop
and tempo
callbacks.I am not a professional Developer or expert in C++ or Rust, so any help with updates and corrections of my work are welcome.
Ableton Link is dual licensed under GPLv2+ and a proprietary license.
This means that rusty_link has to be under the GPLv2+ as well.
If you would like to incorporate Link into a proprietary software application, please contact Ableton at link-devs@ableton.com.
Thanks to Magnus Herold for his implementation. I made this library to learn about FFI in Rust and I started it as a fork of his.
Some code for splitting closures has been borrowed from ffihelpers with altered functionality. Thanks to Michael F Bryan for his work. Pull request to ffihelpers pending.
For anyone interested, I also started making a multi-platform Ableton Link wrapper for Flutter, called f_link.