#audio-devices #midi #audio #osc #record #cli #midi-file

app smrec

最简多轨音频录音机,可通过OSC或MIDI控制

4个版本

0.1.4 2023年10月22日
0.1.3 2023年10月13日
0.1.2 2023年10月13日
0.1.1 2023年10月13日
0.1.0 2023年10月12日

多媒体 中排名 28

MIT 许可证

79KB
1.5K SLoC

smrec

最简多轨音频录音机,可通过OSC或MIDI控制。

我这样做是因为我需要一个简单的多轨音频录音机,我可以通过OSC或MIDI来控制。

我不想也没有资源在我的设置中使用DAW来完成这个目的,并希望每个通道都有一个单声道WAV文件,按日期和时间组织在目录中。

我在一个设置中使用这个录音机,其中我用Behringer XR18作为音频接口,用LattePanda 3 Delta作为SBC。

现在让我们记录一些声音! 🔔


安装

cargo install smrec

安装Windows和ASIO支持

smrec 使用 cpal 作为底层的音频API。 cpal 在Windows上支持WASAPI、DirectSound和ASIO。然而,由于 asio-sys 构建脚本的原因,由于它不是非常直接,因此很难在Windows上构建具有ASIO支持的 cpal,因此在此存储库中提供了一个预构建脚本。

要在Windows上安装 smrec,请按以下步骤操作

  • 安装最新的Visual Studio(如果您还没有安装的话)
  • 这里安装最新的LLVM(如果您还没有安装的话)
  • 以管理员身份打开命令提示符
  • 在环境变量中设置LLVM路径(系统范围)
    setx /M LIBCLANG_PATH "C:\Program Files\LLVM\bin"
    
  • 以管理员身份打开PowerShell
  • 检查环境变量是否设置正确
    $env:LIBCLANG_PATH
    
  • 在存储库中源预构建脚本(假设您在存储库的根目录中)
    . .\pre-build-win.ps1
    
    此脚本将下载ASIO SDK,设置Visual Studio环境变量,并为当前shell会话设置 CPAL_ASIO_DIR 变量。
  • 按常规安装
    cargo install smrec
    

如果您了解自己在做什么,可以跳过这些步骤并查阅 cpal 文档

预构建的二进制文件

由于目前在Windows上构建具有ASIO支持的 cpal 过程复杂,因此此处提供了Windows的预构建二进制文件作为替代方案在这里

教程

简单地作为一个命令

smrec

使用默认配置运行,默认配置是:

  • 默认音频主机
  • 默认音频设备
  • 默认的输入通道集
  • 默认的录制目录,即当前工作目录
  • 录制将继续,直到按下 ctrl+c 并中断程序。
  • 在当前工作目录中创建一个名为 rec_YYYYMMDD_HHMMSS 的目录,并在该目录中录制音频。
  • 音频以 wav 格式录制。
  • 音频以音频设备的默认采样率、缓冲区和采样格式录制。
  • 为每个通道创建一个单独的文件(单声道),每个文件的名称为 chn_XX.wav,其中 XX 是通道号。

要录制特定时长,请使用 --duration 标志并指定以秒为单位的时长。以下命令录制了 10 秒

smrec --duration 10

通过使用 --host--device 标志,您可以指定要使用的音频主机和设备。以下命令使用 MacBook Pro Microphone 作为音频设备

smrec --device "MacBook Pro Microphone"

列出 MIDI 端口、音频主机和设备

smrec list

在录制中包含或排除通道

默认情况下,录制音频设备的所有通道。您可以使用 --include--exclude 标志指定要包含或排除的通道。这些标志不能同时使用。以下命令仅录制 4 通道音频设备的第一个两个通道

smrec --include 1,2

此命令录制 4 通道音频设备除了第一个通道之外的所有通道

smrec --exclude 1

如示例所示,通道号从 1 开始,可以指定为以逗号分隔的列表。

将录制保存到特定目录

默认情况下,录制在当前工作目录中完成。您可以使用 --directory 标志指定录制目录。以下命令将录制保存到 ~/Music 目录

smrec --out ~/Music

使用配置文件进行配置

smrec 使用命令行参数进行配置,并且它们位于所有内容之前。然而,您可以通过使用配置文件来配置 smrec 的某些方面(可能还有更多),以替代默认配置。配置文件是一个 toml 文件,其名称为 config.toml。配置文件按以下顺序搜索

  • .smrec/config.toml 在当前工作目录。
  • .smrec/config.toml 在用户主目录。
  • 如果以上都没有找到,则使用默认配置。

配置文件可以配置

  • 通道名称
[channel_names]
1 = "Kick"
2 = "Snare"
3 = "Hi-Hat"
  • 更多内容将陆续推出..

OSC 控制

smrec 通常在启动时立即开始录制。然而,它也有各种控制方法的选择。

运行 smrec --osc 不会立即开始录音,而是会等待接收一个 OSC 消息来开始录音。默认的 OSC 端口由操作系统随机选择,发送和接收的默认地址为 127.0.0.10.0.0.0。运行上述命令后,输出可能如下所示

Will be sending OSC messages to 127.0.0.1:61213
Listening for OSC messages on 0.0.0.0:51014

目前 smrec 不支持 IPv6。

在默认配置下

  • 在所有地址上随机选择的端口监听 OSC 消息。
  • 在随机选择的端口上向本地主机发送 OSC 消息。

要进一步配置 OSC,可以添加到标志的进一步参数

smrec --osc "<listen_address>:<listen_port>;<send_address>:<send_port>"

smrec --osc "<listen_address>:<listen_port>"

第二种形式将保持默认的发送地址和端口。

smrec --osc "0.0.0.0:18000;255.255.255.255:18001"

将在端口 18000 上监听所有地址的 OSC 消息,并在端口 18001 上向所有地址发送 OSC 消息。是的,如果操作系统和网络允许,smrec 也可以广播 OSC 消息。

OSC 消息

smrec 监听的消息是

  • /smrec/start - 开始录音,发送第二个启动将停止正在进行的录音并开始新的录音,在指定的根目录中创建新的目录。
  • /smrec/stop - 如果有正在进行的录音,则停止录音。

smrec 发送的消息是

  • /smrec/start - 在开始新的录音时发送。
  • /smrec/stop - 在停止正在进行的录音时发送。
  • /smrec/error <string>- 当发生某些错误时发送,错误消息作为参数传递的字符串。

MIDI 控制

smrec 还可以通过 MIDI 控制。它甚至可以同时通过 OSC 和 MIDI 控制。尽管 smrec 是一个简单的应用,用于单一目的,但它提供的 MIDI 通信选项非常广泛。

运行,smrec --midi 不会立即开始录音,而是会等待 MIDI CC 消息来开始录音。

以下是默认配置

  • 查找所有可用的 MIDI 端口并开始在它们上监听。
  • 监听这些端口上的任何通道。
  • 对 CC 16 响应以开始录音,对 CC 17 响应以停止录音。
  • 与 OSC 一样,发送后续的 CC 16 消息将停止正在进行的录音并开始新的录音,在指定的根目录中创建新的目录。
  • smrec --midismrec --midi "[*[(*,16,17)]]" 同义,下面将解释。

配置

--midi 标志接受一个字符串参数,该参数被解析为配置字符串,用于配置输入和输出。这些字符串由分号 (;) 分隔,第一部分配置输入,第二部分配置输出。任何部分都可以省略。

解析

  • [..] 是一个输入或输出配置的容器。
  • [端口号[..], ..] 是一个用逗号分隔的端口号列表,smrec 将连接到这些端口。
  • [端口号[(..), ..], ..] 每个端口号应包含至少一个通道/MIDI CC过滤器配置。
  • (<通道号>, <开始录制时的CC号>, <停止录制时的CC号>) 这是通道/MIDI CC过滤器配置的结构。
  • (1,2,3) 这里是一个示例,它将监听通道2上的CC 2以开始录制,以及通道2上的CC 3以停止录制。该端口中所有其他消息都将被忽略。MIDI通道从0开始索引!
  • [我喜欢的端口[(1,2,3), ..], ..] 这就是如何使用这个元组。
  • [我喜欢的端口[(1,2,3), (15, 127, 126), ..], ..] 因为我们可以有多个这样的元素。
  • [我的第一个端口[(1,2,3), (15, 127, 126), (12,4,5)], 我的第二个端口[(1,2,3)] ] 这是一个有效的配置字符串。它将在我的第一个端口上监听CC 2通道来开始录制,并在CC 3通道上停止录制;在我的第二个端口上监听CC 2通道来开始录制,并在CC 3通道上停止录制。这些端口中的其他所有消息都将被忽略。

使用 '*' 和通配符模式

  • 配置字符串中的端口名称被视为 通配符模式
  • * 匹配任何端口。这意味着最终匹配所有端口。
  • 所有有效的通配符模式都可以用来匹配端口名称。
  • 分解默认配置字符串:[*[(*,16,17)]] 现在应该很清楚。
  • 监听所有端口,不通过通道过滤,对所有CC 16到开始录制和CC 17到停止录制的MIDI CC消息做出反应。

smrec 还可以在某些事件上发送MIDI消息。如果输出端口配置了配置,则配置的CC消息将在启动和停止事件上通过配置的端口和通道发送。

MIDI CC值被认为是瞬时的。

一旦通过配置的MIDI CC号接收到值 127,则立即采取行动。 这就是为什么发送MIDI CC消息的爆发不是好主意的原因。 如果配置为启动录制,则每条消息都会触发一个新的录制。

smrec 在配置了输出时,会在启动和停止事件上向配置的MIDI CC号发送值为 127 的CC消息。

作为一个最后的例子来熟悉它,这个配置字符串将监听我的第一个端口上的CC 2通道来开始录制,并在CC 3通道上停止录制;在我的第二个端口上监听CC 2通道来开始录制,并在CC 3通道上停止录制。这些端口中的其他所有消息都将被忽略。在启动和停止事件上,它将在我的第一个端口上发送通道2的CC 16,值为127,并在我的第二个端口上发送通道2的CC 17,值为127。

[ my first port[(1,2,3), (15, 127, 126), (12,4,5)], my second port[(1,2,3)] ];[ my first port[(1,2,3), (15, 127, 126), (12,4,5)], my second port[(1,2,3)] ]

下一步

我将确保,

  • 安装过程更顺畅
  • 帮助文档完整
  • 文档完整
  • 错误已修复
  • 向用户传达更好的信息
  • 软件足够无锁且移除不必要的分配

但我没有计划对这个项目进行大量维护,我只是确保它足够可用并且能够生存。

支持

  • 桌面
    • macOS
      • x86_64
      • aarch64
    • linux
      • x86_64(应该可以工作,但尚未检查,将会进行检查)
      • aarch64(应该可以工作,但尚未检查,将会进行检查)
    • windows
      • x86_64
      • aarch64

贡献

  • 友好且富有成效
  • 遵循开源贡献的常见实践
  • Rust 行为准则适用

谢谢 🙏

结语

这是我为了解决一个特定问题而做的,并且我已经公开分享。我希望它也能解决您的问题。

依赖项

~6–35MB
~540K SLoC