22个不稳定版本 (4个破坏性版本)
新版本 0.5.2 | 2024年8月11日 |
---|---|
0.4.1 | 2024年7月15日 |
0.3.3 | 2024年3月22日 |
0.3.2 | 2023年12月31日 |
0.1.2 | 2022年12月28日 |
#48 in 音频
每月下载量 547次
45KB
795 行
midi_fundsp
现场表演合成器库
此crate将来自midir、midi-msg和cpal crate的代码组装和集成,以使用fundsp进行声音合成,从而方便地创建现场合成器软件。
使用该crate涉及以下设置
将这些组件组合起来得到以下入门示例程序
use std::sync::{Arc, Mutex};
use crossbeam_queue::SegQueue;
use crossbeam_utils::atomic::AtomicCell;
use midi_fundsp::{
io::{get_first_midi_device, start_input_thread, start_output_thread},
sounds::options,
};
use midir::MidiInput;
use read_input::{shortcut::input, InputBuild};
fn main() -> anyhow::Result<()> {
let mut midi_in = MidiInput::new("midir reading input")?;
let in_port = get_first_midi_device(&mut midi_in)?;
let midi_msgs = Arc::new(SegQueue::new());
let quit = Arc::new(AtomicCell::new(false));
start_input_thread(midi_msgs.clone(), midi_in, in_port, quit.clone());
start_output_thread::<10>(midi_msgs, Arc::new(Mutex::new(options())));
input::<String>().msg("Press any key to exit\n").get();
Ok(())
}
前四行设置
- 找到的第一个MIDI输入设备的句柄
- 一个消息队列,用于连接输入和输出线程
- 一个标志,指示线程退出
接下来两行调用start_input_thread()
和start_output_thread()
以启动相应的线程。fundsp声音表来自midi_fundsp::sounds::options()
,但用户也可以轻松组装自己的自定义声音表。
一旦线程开始,程序将继续运行,直到用户按下键,处理到达的任何MIDI事件。
其他示例程序展示了如何将不同的声音发送到左右立体声通道,以及如何在运行时更改合成器声音和MIDI输入设备的选取。
注意
- 始终使用
--release
进行编译。使用--debug
编译时,音质较差。 - 目前支持以下MIDI消息
- 音符开启
- 音符关闭
- 音调弯曲
- 程序更改
- 程序更改编号对应于
ProgramTable
中的索引 - 这些可以来自MIDI输入设备或软件
- 程序更改编号对应于
- 所有音符关闭
- 所有声音关闭
- 有关更新,请参阅CHANGELOG.md。
致谢
- 感谢fundsp、midir、midi-msg和cpal的作者,他们的贡献使我能创建这个库成为可能并实用。
- 特别感谢Sami Perttu,fundsp的作者,他在解决一些技术问题和将pull requests合并到fundsp中以使此库成为可能方面提供了帮助。
许可证
根据您的选择,许可协议为以下之一
- Apache License, Version 2.0, (LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT或http://opensource.org/licenses/MIT)
。
贡献
我非常愿意接受对这个库的贡献。以下是我想象的贡献类型,以及我希望贡献者如何进行
- 创建额外的合成器声音
- 将函数
Fn(&SharedMidiState) -> Box<dyn AudioUnit64>
添加到sounds.rs
。将您的函数和适当的描述添加到该文件中由options()
生成的表中。然后提交一个pull request以包含它。
- 将函数
- 处理额外的MIDI消息
- 打开一个issue,描述您想要处理的MIDI消息,以及在此库的上下文中您如何想要处理它。
- 从那里,我们将讨论最佳前进方式。
- 其他想法
- 打开一个issue,描述您的想法,我们将从那里讨论。
除非您明确说明,否则任何有意提交以包含在您的工作中的贡献(根据Apache-2.0许可证定义),均将按上述方式双许可,不附加任何额外的条款或条件。
依赖关系
~15–44MB
~743K SLoC