#midi #合成器 #音乐 #合成 #输入输出

midi_fundsp

允许创建实时MIDI合成器软件

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 音频

Download history 166/week @ 2024-04-24 11/week @ 2024-05-01 7/week @ 2024-05-22 173/week @ 2024-06-26 119/week @ 2024-07-03 105/week @ 2024-07-10 25/week @ 2024-07-17 152/week @ 2024-07-24 48/week @ 2024-07-31 273/week @ 2024-08-07

每月下载量 547次

MIT/Apache

45KB
795

midi_fundsp

现场表演合成器库

此crate将来自midir、midi-msg和cpal crate的代码组装和集成,以使用fundsp进行声音合成,从而方便地创建现场合成器软件。

使用该crate涉及以下设置

  • 一个用于监控MIDI事件的输入线程
  • 一个生成与这些事件相对应的声音的输出线程
  • 一个输出线程使用的fundsp声音表
  • 一个SegQueue,使这些线程能够通信

将这些组件组合起来得到以下入门示例程序

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

致谢

  • 感谢fundspmidirmidi-msgcpal的作者,他们的贡献使我能创建这个库成为可能并实用。
  • 特别感谢Sami Perttufundsp的作者,他在解决一些技术问题和将pull requests合并到fundsp中以使此库成为可能方面提供了帮助。

许可证

根据您的选择,许可协议为以下之一

贡献

我非常愿意接受对这个库的贡献。以下是我想象的贡献类型,以及我希望贡献者如何进行

  • 创建额外的合成器声音
    • 将函数Fn(&SharedMidiState) -> Box<dyn AudioUnit64>添加到sounds.rs。将您的函数和适当的描述添加到该文件中由options()生成的表中。然后提交一个pull request以包含它。
  • 处理额外的MIDI消息
    • 打开一个issue,描述您想要处理的MIDI消息,以及在此库的上下文中您如何想要处理它。
    • 从那里,我们将讨论最佳前进方式。
  • 其他想法
    • 打开一个issue,描述您的想法,我们将从那里讨论。

除非您明确说明,否则任何有意提交以包含在您的工作中的贡献(根据Apache-2.0许可证定义),均将按上述方式双许可,不附加任何额外的条款或条件。

依赖关系

~15–44MB
~743K SLoC