6

我一直在尝试使用 C 中的数学波函数创建声音。我项目的下一步是从 MIDI 键盘控制器获取用户输入,以便将波调制到不同的音高。

我的第一个想法是这将相对简单,并且 Linux 作为 Linux 将允许我像读取任何其他文件一样从我的设备读取原始数据流。

然而,绝大多数研究建议我为 MIDI 控制器编写设备驱动程序。一般的想法是,即使设备文件可能存在,当我的应用程序调用 read() 和 write() 等函数时,内核也不知道要执行哪些系统调用。

尽管有这些警告,我还是做了一个实验。我插入了 MIDI 控制器并 cat'ed "/dev/midi1" 设备文件。出现了稳定的空字符流,当我按下 MIDI 控制器上的一个键时,出现了几个字节,这些字节对应于 MIDI 设备应该输出的预期消息块。MIDI 协议信息

所以我的问题是:

为什么 cat'ed 流会这样?

这是否意味着我的系统上已经安装了即插即用设备驱动程序?

我应该继续编写设备驱动程序,还是可以像文件一样阅读它?

非常感谢您在这些领域分享您的智慧。

4

3 回答 3

5

为什么 cat'ed 流会这样?

因为这可能是控制器正在接收的原始 MIDI 数据。空字节可能是某种同步滴答声。

这是否意味着我的系统上已经安装了即插即用设备驱动程序?

是的。

然而,绝大多数研究建议我为 MIDI 控制器编写设备驱动程序。一般的想法是,即使设备文件可能存在,当我的应用程序调用 read() 和 write() 等函数时,内核也不知道要执行哪些系统调用。

<...>

我应该继续编写设备驱动程序,还是可以像文件一样阅读它?

我不确定你在读什么或者你是如何得出这个结论的,但这是错误的。:) 你已经为你的 MIDI 控制器安装了一个非常好的驱动程序——继续使用它!

于 2012-06-01T19:52:27.900 回答
3

你确定你正在读取NUL字节吗?而不是 0xf8 字节?因为 0xf8 是 MIDI 时间滴答状态,通常会定期发送以保持乐器同步。尝试使用以下方式读取设备od

od -vtx1 /dev/midi1

如果你看到一堆 0xf8,没关系。如果您不需要 MIDI 控制器发送的速度信息,请在控制器上禁用它或忽略那些 0xf8 状态字节。

此外,对于 MIDI,请记住当前 MIDI 状态通常发送一次(以节省字节),然后根据需要发送有效负载字节。例如,弯音状态是字节 0xeK(其中 K 是通道号,即 0 到 15),其有效载荷是 7 位最低有效字节,后跟 7 位最高有效字节。因此,也许你有一个奇怪的控制器,你只看到某种状态的重复有效载荷,但任何不愚蠢的控制器都不会重复它不需要的东西。

现在是驱动程序:看看dmesg你什么时候插入你的 MIDI 控制器。现在,如果您的 OSS在您插入设备时/dev/midi1 出现dmesg(udev 正在执行此工作),并且没有出现任何错误,则您不需要其他任何东西。MIDI 协议是另一种串行协议,具有固定的波特率并传输/接收字节。这没有什么复杂的......只需从设备读取或写入设备即可。

唯一的问题是在某个地方排队可能会导致糟糕的音频延迟(如果您使用 MIDI 命令来控制实时音频,我相信这就是您正在做的事情)。似乎这些设备主要是为系统专有消息而设计的,例如,在线为合成器下载一些补丁/预设并使用 MIDI 将其上传到设备。在这种情况下,延迟并不重要。

还可以看看ALSA在 Linux 上使用 MIDI 的方式。

于 2012-06-01T21:53:22.320 回答
1

如果您不开发新的 MIDI 控制器硬件,则不必担心为它编写驱动程序。用户关心的是安装他们的硬件,而供应商有义务提供驱动程序。

在 Linux 下,您只需读取文件。现在用数据解释和制作有用的东西。

于 2012-06-01T22:02:15.620 回答