#lv2 #real-time #music #plugin

livi

livi是一个用于托管LV2插件的库

32个版本

0.7.4 2023年10月7日
0.7.3 2023年7月12日
0.7.1 2023年2月6日
0.5.6 2022年12月17日
0.3.8 2021年11月16日

#321 in 音频

MIT 许可协议

110KB
2.5K SLoC

Livi

crates.io docs.rs

License: MIT Tests

一个用于托管LV2插件的库。

注意:这是一个正在进行中的项目,尚未经过完全测试。

支持的LV2特性

LV2有一个简单的核心接口,但伴随有可以添加许多功能的扩展。这个库旨在尽可能支持更多的功能。

快速入门

此Rust代码用于一个名为mda EPiano的插件。代码设置了插件并运行它。插件的结果存储在outputs变量中。

let world = livi::World::new();
const SAMPLE_RATE: f64 = 44100.0;
let features = world.build_features(livi::FeaturesBuilder {
    min_block_length: 1,
    max_block_length: 4096,
});
let plugin = world
    // This is the URI for mda EPiano. You can use the `lv2ls` command line
    // utility to see all available LV2 plugins.
    .plugin_by_uri("http://drobilla.net/plugins/mda/EPiano")
    .expect("Plugin not found.");
let mut instance = unsafe {
    plugin
        .instantiate(features.clone(), SAMPLE_RATE)
        .expect("Could not instantiate plugin.")
};

// Where midi events will be read from.
let input = {
    let mut s = livi::event::LV2AtomSequence::new(&features, 1024);
    let play_note_data = [0x90, 0x40, 0x7f];
    s.push_midi_event::<3>(1, features.midi_urid(), &play_note_data)
        .unwrap();
    s
};

// This is where the audio data will be stored.
let mut outputs = [
    vec![0.0; features.max_block_length()], // For mda EPiano, this is the left channel.
    vec![0.0; features.max_block_length()], // For mda EPiano, this is the right channel.
];

// Set up the port configuration and run the plugin!
// The results will be stored in `outputs`.
let ports = livi::EmptyPortConnections::new()
    .with_atom_sequence_inputs(std::iter::once(&input))
    .with_audio_outputs(outputs.iter_mut().map(|output| output.as_mut_slice()));
unsafe { instance.run(features.max_block_length(), ports).unwrap() };

构建、测试和运行

  • 构建 - cargo build
  • 测试 - cargo test,需要mda LV2插件。
  • 运行livi-jack - cargo run --example livi-jack --release -- --plugin-uri=http://drobilla.net/plugins/mda/EPiano.

依赖关系

~2MB
~37K SLoC