Write Patches in Rust for many Rebel Technology devices based on the Owl2/3 modules.
#![no_main]
#![no_std]
extern crate alloc;
use alloc::boxed::Box;
use owl_patch::{
patch,
program_vector::{heap_bytes_used, ProgramVector},
sample_buffer::{Buffer, Channels, ConvertFrom, ConvertTo},
};
#[patch("Example Patch")]
fn main(mut pv: ProgramVector) -> ! {
let audio_settings = pv.audio().settings;
let mut buffer: Buffer<Channels, Box<[f32]>> =
Buffer::new(audio_settings.channels, audio_settings.blocksize);
pv.meta().set_heap_bytes_used(heap_bytes_used());
pv.audio().run(|input, output| {
buffer.convert_from(input);
// Do something clever with the samples in the buffer
buffer.convert_to(output);
});
}
- Make sure you have the
thumbv7em-none-eabihf
Rust target installed:
rustup target add thumbv7em-none-eabihf
-
Install
gcc-arm-none-eabi
and FirmwareSender. See the instructions on https://github.com/RebelTechnology/OwlProgram for details. -
Create a new binary package using Cargo, and add this repo as a dependency:
[dependencies]
owl_patch = {git = "https://github.com/orukusaki/owl_patch"}
It is also a good idea to add this to your Cargo.toml:
[profile.release]
strip = "debuginfo"
codegen-units = 1
debug = 2
debug-assertions = false
incremental = false
lto = "fat"
opt-level = "3"
overflow-checks = false
[profile.release.package."*"]
strip = "debuginfo"
opt-level = "3"
- Create a
.cargo/config.toml
file:
[build]
target = "thumbv7em-none-eabihf"
# For Owl 2
[target.thumbv7em-none-eabihf]
rustflags = [
"-C", "link-arg=--nmagic",
"-C", "target-cpu=cortex-m4",
"-C", "link-arg=-Towl2.ld",
]
# For Owl 3
#[target.thumbv7em-none-eabihf]
#rustflags = [
# "-C", "link-arg=--nmagic",
# "-C", "target-cpu=cortex-m7",
# "-C", "link-arg=-Towl3.ld",
#]
-
Copy one of the examples into
src/main.rs
-
Build your patch
cargo build --release
- Use
arm-none-eabi-objcopy
to get the final binary:
arm-none-eabi-objcopy -O binary target/thumbv7em-none-eabihf/release/main target/thumbv7em-none-eabihf/release/main.bin
- Use
FirmwareSender
to upload the patch to your device.
The examples in this repo have been tested on a Befaco Lich using Owl2 and Owl3 module. They should work on others too, but I am unable to verify this. To give you the best chance of success, make sure your device is running the latest Firmware.
talc
(default): Uses the talc crate as the global allocator. If you want to use a different allocator, turn this feature off withdefault-features = false
fastmaths
(default): Enables the fast approximate maths functions in thefastmaths
module.vpo_fastmaths
(default): Use fastmaths functions in thevolts_per_octave
module to convert between Volts and Frequencies quicker (but less accurately). Requiresfastmaths
.
Experimental. Will probabably always be that way.
- Output correctly linked binary including patch header
- Safe API wrapper for the ProgramVector, allowing communication with the host OS
- Register Patch with host OS
- Global Allocator using talc
- Process Audio in
i32
andf32
formats - Simple Audio Buffer implementation, supporting different formats and layouts
- Register, get, and set Patch Parameters, with callback for button events
- Send & Receive Midi messages
- Debug messages
- Get i/o callibration data for volts-per-octave conversions
- Get system log / pow tables
- Load resource files with
OWL_SERVICE_LOAD_RESOURCE
service call - Add support for display devices
- Add example using
cmsis_dsp
- FFT init service calls with
OWL_SERVICE_ARM_RFFT_FAST_INIT_F32
andOWL_SERVICE_ARM_CFFT_INIT_F32
- Additional device support
- Invert some params for
hardware_version == OWL_MODULAR_HARDWARE
- Support for lower checksum versions
- Invert some params for
- Create a Cargo project template
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this repository by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
The authors of this repository are not affiliated with Rebel Technology. The Owl Platform and associated published code is their copyright.