This project is currently beeing developed. It is not recommended to use it now. Wait for first release
Harmonia is an interface for playing synchronized MIDI using modified Ableton/Link, dedicated for laptop orchestra.
Go to releases page and download the newest one for your operating system or build and run yourself:
cargo run
Then go to the address pointed by the Harmonia binary (by default: http://localhost:8080
.
See section "Compiling" below for instructions for your operating system.
Remember to allow any traffic from Harmonia in your firewall.
You can test it using TEST-PLAN.md. This is currently also the instruction on how to use Harmonia.
Developer documentation can be viewed here or generated locally using cargo
:
cargo doc --open --document-private-items
Ubuntu 22.04 users, install this packages first:
apt install -y libasound2-dev cargo pkg-config cmake g++ clang git
Windows users, C++ capable Visual Studio, CMake and Rust toolchain is required.
Sorted by their completion & importance (if not completed yet).
- Web server
- MIDI upload
- MIDI source download
- Health check
- List IPs (and maybe local names) listing
- Server state save & restore - doesn't require user to provide all files every time
- MIDI play subsystem with Ableton/Link
- Keybindings for easy play functionality
- Visual indicator which track is playing
- Name association (like nick) with Harmonia instance, by default hostname/username
- Harmonia as mDNS service
- Audio playing (wav, ogg itd)
- SonicPI integration
All functionality should be working, tested regularly:
- Arch Linux,
- Ubuntu 22.04,
- Windows 11.
Experimental support:
- macOS,
- other Linux distributions (compilation on target system recommended).
Currently the main blocker for full macOS support is lack of resources - to properly test Harmonia at least two ARM macOS laptops would be required that are still supported by Apple.
As for Linux distribution, the diversity of sound systems (and GLIBC versions) require further research.
Since this library will be used with Ableton/Link why write it in Rust? On the one hand I tried writing web interface using C++ (and Boost.Beast) but UX of this library is painful. Due to C++ releasing coroutines in C++20, and people pleaser mentality of the library it has broken API, supporting many different ways of doing the same thing, which leads to noisy code, poor documentation and chaos. Maybe I'm just not intended target or I'm not experienced enough with it or boost in general.
On the other hand, writing servers in Rust is almost-painless, with great documentation and API design.
They are referenced in Cargo.toml and Cargo.lock (recursivly, Rust wrapper references patched Ableton Link) files with links to the patched repositories.
Patching is required to break abstraction inside Ableton Link and don't reimplement it just to expose hidden state. Further Harmonia versions may leave Link for custom solution but for now patched Link fulfills requirements perfectly.
See uam/README.md.
This project couldn't become what it is without support and mentorship from:
- prof. UAM dr hab. Michał Hanćkowiak,
- prof. UAM dr hab. Maciej Grześkowiak,
- prof. UAM dr hab. Jacek Marciniak,
- and Lambda Ensamble laptop orchestra.