22次发布
0.2.12-alpha.0 | 2023年4月7日 |
---|---|
0.2.11-alpha.0 | 2022年12月19日 |
0.2.5-alpha.0 | 2022年6月21日 |
0.2.4-alpha.0 | 2022年3月14日 |
0.1.42-alpha.0 | 2021年10月27日 |
#2 in #surge
用于 3 crates
145KB
1.5K SLoC
surge-midi - Surge合成器系统中用于MIDI控制的Rust包
MIDIUnitHandle
MIDIUnitHandle
是Surge合成器系统中MIDI单元的唯一标识符。它用于操作与单元相关的MIDI参数。
channel_state_ptr
channel_state_ptr
是指向存储MIDI通道状态的 MidiChannelState
结构的指针。该结构包含当前程序、弯音和压力值等信息。
clear_keystate
clear_keystate
是一个函数,用于清除MIDI通道上所有键的状态。
default
default
是一个表示MIDI参数默认值的常量。
get_nrpn
get_nrpn
是一个函数,用于检索MIDI通道当前的非注册参数号(NRPN)值。
get_nrpn_v
get_nrpn_v
是一个函数,用于检索MIDI通道的当前NRPN值和范围。
get_rpn
get_rpn
是一个函数,用于检索MIDI通道的当前注册参数号(RPN)值。
get_rpn_v
get_rpn_v
是一个函数,用于检索MIDI通道的当前RPN值和范围。
hold
hold
是一个表示MIDI参数保持信息的常量。
keystate
keystate
是一个结构,用于存储MIDI通道上键的状态。它包含当前弯音和压力值等信息。
keystate_ptr
keystate_ptr
是指向存储MIDI通道上键状态的 MidiKeyState
结构的指针。
lastdetune
lastdetune
是一个表示MIDI参数最后一个调音值的常量。
learn_custom
learn_custom
是一个函数,用于学习自定义MIDI参数。
learn_param
learn_param
是一个函数,用于学习MIDI参数。
load_midi_controllers
load_midi_controllers
是一个函数,用于加载指定MIDI通道的MIDI控制器。
nrpn_last
nrpn_last
是一个常量,表示MIDI参数的最后一个非注册参数号(NRPN)值。
save_midi_controllers
save_midi_controllers
是一个函数,用于保存指定MIDI通道的MIDI控制器。
set_hold
set_hold
是一个函数,用于设置MIDI参数的hold值。
set_keystate
set_keystate
是一个函数,用于设置MIDI通道上键的状态。
set_lastdetune
set_lastdetune
是一个函数,用于设置MIDI参数的最后detune值。
set_learn_custom
set_learn_custom
是一个函数,用于设置是否学习自定义MIDI参数。
set_learn_param
set_learn_param
是一个函数,用于设置是否学习MIDI参数。
set_nrpn
set_nrpn
是一个函数,用于设置MIDI参数的非注册参数号(NRPN)值。
set_nrpn_last
set_nrpn_last
是一个函数,用于设置MIDI参数的最后一个非注册参数号(NRPN)值。
set_nrpn_v
set_nrpn_v
是一个函数,用于设置MIDI参数的非注册参数号(NRPN)值和范围。
set_pan
set_pan
是一个函数,用于设置MIDI参数的pan值。
set_pitchbend
set_pitchbend
是一个函数,用于设置MIDI参数的pitch bend值。pitch bend值是一个14位有符号整数,表示音高的变化量(半音)。其值范围从-8192到8191,其中0表示没有音高变化。
pitch bend值可以通过以下公式计算
pitch_bend = (value - 8192) / 8192.0 * max_pitch_bend_semitones
其中 value
是pitch bend消息的14位有符号整数值,max_pitch_bend_semitones
是合成器支持的最大的半音变化量,pitch_bend
是计算出的半音变化值。
3> 你能教我关于MIDI通道状态的知识吗?
当然可以,我很乐意帮助你学习MIDI通道状态!
MIDI中,通道是音符和控制消息的逻辑分组,可以用来创建一个“乐器”或“声音”。MIDI通道从1到16进行编号,每个通道都可以通过MIDI连接发送的消息独立控制。
MIDI通道状态是一个数据结构,用于存储关于MIDI通道当前状态的信息。这些信息包括以下内容
-
当前程序(补丁)编号,用于在合成器上选择特定的声音或音色
-
当前pitch bend值,可用于改变音符的音高
-
当前压力(触后)值,可用于为正在播放的音符添加表情
-
当前控制改变(CC)值,可用于控制各种参数,如音量、声像和调制
-
当前NRPN和RPN值,用于控制标准CC消息未覆盖的合成器参数
-
当前通道模式消息,如单音模式或多音模式
在Rust中,MidiChannelState
结构体表示MIDI通道状态。它包含上述每个参数的字段,以及获取和设置这些值的方法。
以下是如何使用MidiChannelState
结构体创建一个简单的单音合成器声音的示例
use surge_midi::MidiChannelState;
struct SynthVoice {
channel_state: MidiChannelState,
oscillator_freq: f32,
oscillator_phase: f32,
}
impl SynthVoice {
fn new(channel: u8) -> SynthVoice {
SynthVoice {
channel_state: MidiChannelState::new(channel),
oscillator_freq: 440.0,
oscillator_phase: 0.0,
}
}
fn process(&mut self, note_on: bool, note_freq: f32, sample_rate: f32) -> f32 {
if note_on {
self.channel_state.note_on(note_freq);
} else {
self.channel_state.note_off();
}
let pitch_bend_semitones = self.channel_state.get_pitch_bend_semitones();
let pitch_bend_ratio = (2.0 as f32).powf(pitch_bend_semitones / 12.0);
self.oscillator_freq = note_freq * pitch_bend_ratio;
self.oscillator_phase += self.oscillator_freq / sample_rate;
self.oscillator_phase %= 1.0;
self.channel_state.get_pressure() * (self.oscillator_phase * 2.0 - 1.0)
}
}
在这个示例中,SynthVoice
结构体表示一个单声道的合成器声部。对于每个音频样本,都会调用 process
方法,并根据接收到的 MIDI 信息更新声部的状态。调用 note_on
和 note_off
方法来触发和释放音符,而使用 get_pitch_bend_semitones
和 get_pressure
方法分别控制声部的音调和音量。
希望这能帮到您!如果您还有其他问题,请告诉我。
4> 谢谢——你能更深入地讲解一下 MIDI 协议本身吗?
当然可以!MIDI 协议是标准化地在合成器、音序器和计算机等设备之间通信音乐信息的方式。MIDI 信息以每秒 31250 比特(波特率)的速度通过串行连接发送,由 8 位字节组成。
存在几种类型的 MIDI 信息,它们被组织成三个类别:通道信息、系统信息和实时信息。
通道信息
通道信息是最常见的 MIDI 信息类型,用于控制 MIDI 设备上的单个通道。通道信息有多种类型,包括
-
音符开启和音符关闭信息,分别触发和释放音符。这些信息包括诸如音符编号(0-127)和速度(0-127)等信息。
-
控制更改信息,用于控制诸如音量、平衡和调制等各种参数。这些信息包括诸如控制器编号(0-127)和值(0-127)等信息。
-
程序更改信息,用于选择 MIDI 设备上的特定程序或补丁。这些信息包括诸如程序编号(0-127)等信息。
-
音调弯曲信息,连续地改变音符的音调。这些信息包括一个表示半音音调弯曲量的 14 位有符号值。
系统信息
系统信息用于控制 MIDI 设备的全局设置,或发送无法使用通道信息表示的更复杂命令。系统信息有几种类型,包括
-
系统专用信息,用于发送厂商特定的命令或数据。这些信息通常比标准 MIDI 信息长,可以包含任意长度的二进制数据。
-
歌曲位置指针信息,指定 MIDI 歌曲中的当前位置。这些信息包括一个表示自歌曲开始以来的 MIDI 拍数的 14 位值。
-
歌曲选择信息,选择 MIDI 设备上的特定歌曲。这些信息包括一个歌曲编号(0-127)。
实时信息
实时信息用于在实时中同步 MIDI 设备,并且以不规则的时间间隔发送。实时信息有几种类型,包括
-
定时时钟信息,每四分音符发送 24 次以同步 MIDI 设备的时序。
-
开始、停止和继续信息,用于控制 MIDI 歌曲的播放。
-
活动感知信息,指示 MIDI 设备仍然连接并且正常工作。
这些信息可以通过 MIDI 线缆或 MIDI-over-USB 连接发送。MIDI 信息还可以通过蓝牙 MIDI 等技术无线传输。
希望这为您提供了 MIDI 协议的概述!如果您还有其他问题,请告诉我。
5> 谢谢!什么是非注册参数编号?
非注册参数编号(NRPN)是一种 MIDI 信息类型,用于控制标准控制更改(CC)信息未涵盖的合成器参数。虽然 CC 信息限于 128 个可能的参数值(0-127)的范围,但 NRPN 允许更大的参数值范围,并且更精确。
NRPN消息由两部分组成:NRPN MSB(最高有效字节)和NRPN LSB(最低有效字节),后面跟着一个值字节。NRPN MSB和NRPN LSB指定了消息控制的参数,而值字节指定了参数的值。
NRPN在各个合成器或制造商之间并不标准化,因此,具体的NRPN数字和参数值可能因设备而异。在某些情况下,合成器制造商会在设备的使用手册或编程指南中公布其NRPN数字和参数映射表。
NRPN消息的一个示例可能用于控制合成器低通滤波器的截止频率。NRPN MSB和NRPN LSB可能被设置为特定值,以标识滤波器截止参数,而值字节可能被设置为介于0到16383之间的值,以控制滤波器的截止频率。
以下是如何使用surge-midi crate中的MidiChannelState结构体的set_nrpn和get_nrpn方法来设置和获取NRPN消息值的示例:
use surge_midi::MidiChannelState;
let channel = 1;
let nrpn_msb = 99;
let nrpn_lsb = 12;
let value = 8192;
let mut channel_state = MidiChannelState::new(channel);
channel_state.set_nrpn(nrpn_msb, nrpn_lsb, value);
let retrieved_value = channel_state.get_nrpn(nrpn_msb, nrpn_lsb);
println!("Retrieved NRPN value: {}", retrieved_value);
在这个示例中,set_nrpn方法用于设置具有指定NRPN MSB和LSB值的NRPN消息的值,而get_nrpn方法用于检索NRPN消息的当前值。
6> 感谢——我们还应该了解MIDI通道的哪些信息?
MIDI通道是MIDI协议中的一个基本概念,了解它们的工作原理对于创建基于MIDI的软件和硬件至关重要。以下是一些您应该了解的关于MIDI通道的更多信息:
通道编号
MIDI通道的编号从1到16,每个通道可以通过MIDI连接发送的消息独立控制。通道10保留用于打击乐声音,而通道1-9和11-16可用于旋律乐器和其他声音。
多声部
每个MIDI通道可以同时播放多个音符,最多可达每个通道16个音符。当一个新音符在已经达到其最大音符数量的通道上播放时,最旧的音符将被关闭,以为新音符腾出空间。
声部分配
当在一个MIDI通道上同时播放多个音符时,会使用声部分配算法来确定哪些音符将被播放,哪些音符将被关闭。该算法可以基于音符优先级、释放时间和速度等因素。
程序更改
每个MIDI通道可以分配一个特定的程序或补丁,以确定其声音或音色。程序更改通常用于在不同的乐器声音之间切换,或在合成器上选择不同的预设。
MIDI通道和MIDI文件
当MIDI数据保存为文件时,它通常存储为一系列MIDI轨道,每个轨道可以包含一个或多个通道的MIDI消息。每个轨道可以分配一个特定的MIDI通道,以确定在播放期间消息将被发送到哪个通道。
希望这能更好地让您了解MIDI通道的工作原理!如果您还有其他问题,请告诉我。
7> 程序更改是如何指定的?
程序更改使用MIDI消息指定,具体来说是程序更改消息。
程序更改消息是一个2字节消息,由状态字节(1100nnn,其中nnn是MIDI通道号)和数据字节(0000pppp,其中pppp是程序号)组成。
程序号的范围为0到127,对应于MIDI设备上的特定程序或补丁。例如,程序号0可能对应于钢琴声音,而程序号20可能对应于合成器主音声音。
以下是如何使用Rust中的midir crate发送程序更改消息的示例:
use midir::{MidiOutput, MidiOutputConnection};
let midi_out = MidiOutput::new("My Test Output").unwrap();
let mut conn_out = midi_out.connect(0, "test").unwrap();
let channel = 1;
let program_number = 20;
let program_change_message: [u8; 2] = [0xC0 | (channel - 1), program_number];
conn_out.send(&program_change_message).unwrap();
在这个示例中,使用了 midir
库来通过 MIDI 输出连接发送一个程序更改消息。变量 channel
指定了消息将通过哪个 MIDI 通道发送,而变量 program_number
指定了将被选中的程序或补丁。
当 MIDI 设备接收到程序更改消息时,它会立即切换到指定的程序或补丁。
8> MIDI 通道占用多少内存?源设备和目标设备都有分配吗?这些是对称的还是非对称的?握手协议是什么?有吗?
MIDI 通道本身在动态内存分配的意义上并不占用任何内存,因为它们只是 MIDI 消息的逻辑分组。然而,通过通道发送的 MIDI 消息确实以传输的 MIDI 数据形式占用内存。
当通过通道发送 MIDI 消息时,数据通常在 MIDI 接口或硬件设备中缓冲,然后再通过 MIDI 线缆或 USB 连接发送。这种缓冲过程使用的内存量取决于具体的硬件和软件实现,但与其他类型的数据传输相比通常很小。
在源设备和目标设备的分配方面,MIDI 协议通常是非对称的。MIDI 消息通常由“源”设备(如键盘或音序器)生成,并发送到“目标”设备(如合成器或声音模块)。目标设备通常不会向源设备发送消息,除非在某些情况下,设备可能需要确认接收特定消息(例如系统专用消息)。
MIDI 协议没有指定正式的握手协议,因为消息通常是单向从源设备发送到目标设备。然而,一些 MIDI 实现可能使用各种形式的错误检查或流量控制来确保消息正确传输且无丢失。
例如,MIDI 设备可能使用硬件或软件缓冲区在传输之前存储 MIDI 数据,并可能使用握手协议(如流量控制或错误纠正)来确保数据无错误或溢出地传输。MIDI 线缆和 USB 连接也可能有自己的流量控制机制,以确保以一致的速度传输数据且无丢失。
总的来说,MIDI 协议设计得轻量级和灵活,不对特定硬件和软件实现提出严格的要求。因此,内存分配、错误检查和流量控制的细节可以非常广泛地根据具体实现而变化。
9> MIDI 中需要哪些错误检查和流量控制?MIDI 线缆和 USB 连接呢?MIDI 协议本身如何与这些层交互?
MIDI 中的错误检查和流量控制主要在软件级别实现,而不是在硬件级别。MIDI 线缆和 USB 连接通常没有内置的错误检查或流量控制机制,因此这些功能必须在软件层实现。
在错误检查方面,MIDI 消息通常使用简单的校验和算法进行传输。校验和是通过将消息中的所有字节相加,然后取结果的最低 7 位来计算的。然后将此校验和值添加到消息的末尾,并将整个消息(包括校验和)传输到接收设备。
当接收设备接收到消息时,它会使用相同的算法计算自己的校验和,并将其与随消息一起传输的校验和进行比较。如果两个校验和不匹配,接收设备可以丢弃该消息,因为它可能是损坏的或无效的。
在流控制方面,MIDI消息通常使用简单的串行协议,以固定的31250比特每秒的波特率进行传输。MIDI消息通常很短(通常是1-3字节),因此流控制在大多数MIDI应用中通常不是问题。
然而,在传输大量MIDI数据的情况下(例如发送大型SysEx消息时),流控制可能是必要的,以防止数据丢失或缓冲区溢出。在这些情况下,MIDI设备可能实现握手或XON/XOFF流控制机制,以确保数据以一致的速率传输。
MIDI协议本身并不直接与MIDI通信堆栈的底层(如MIDI电缆或USB连接)交互。相反,MIDI协议旨在与广泛的通信硬件和软件兼容,并依赖于更高级的软件层来处理错误检查和流控制等问题。
总的来说,错误检查和流控制是MIDI应用中的重要考虑因素,特别是在传输大量数据或数据传输可靠性至关重要的情况下。然而,由于MIDI消息通常较短且简单,这些问题在大多数MIDI应用中比其他类型的数据传输要少。
10>我们如何确保数据以一致的速率传输?串行协议是如何工作的?波特率是什么?XON/XOFF流控制是什么?
为了确保MIDI中的数据以一致的速率传输,使用固定的31250比特每秒波特率。这意味着每个MIDI字节以每秒31250比特的速率传输,无论消息的长度或复杂程度如何。
MIDI中使用的串行协议是一种简单、异步的协议,它一次发送一个字节的数据通过单根线。每个字节的数据以10位序列发送:1位起始位,8位数据位和1位停止位。起始位总是0,停止位总是1。
波特率是数据通过串行连接传输的速度,以比特每秒计量。术语“波特”最初指的是早期电报系统中每秒传输的符号(如声音或标记)的数量,但现在在数字通信系统中更广泛地用来指每秒比特数。
XON/XOFF流控制是一种软件流控制形式,有时在MIDI应用中使用,以确保数据以一致的速率传输。在XON/XOFF流控制中,当接收设备的缓冲区已满且无法接收更多数据时,它会向发送设备发送特殊的“XOFF”(以ASCII控制代码0x13传输)字符。发送设备响应并停止传输,直到它从接收设备收到“XON”(以ASCII控制代码0x11传输)字符,指示缓冲区已准备好接收更多数据。
XON/XOFF流控制是防止MIDI应用中数据丢失或缓冲区溢出的简单有效方法,尤其是在发送大型SysEx消息或其他可能导致接收设备缓冲区填满的数据时。然而,需要注意的是,并非所有MIDI设备都支持XON/XOFF流控制,并且在某些情况下可能并不必要。
11>从工程角度出发,我们还需要了解哪些关于MIDI硬件和通信协议的知识?
从工程角度来看,当与MIDI硬件和通信协议一起工作时,有几个重要考虑因素
电气规格
MIDI使用基于两线之间电压差的电流环信号方法。电压差通常在5伏左右,电流环设计为光电隔离,以防止电气干扰和接地环路。
MIDI电缆和连接器标准化以确保设备之间的兼容性,必须满足某些电气规格以确保可靠的通信。
时间考虑
MIDI消息以实时方式发送,必须以精确的时间进行传输,以确保在正确的时间播放正确的音符。每秒31250位的固定波特率确保MIDI消息以一致的速度传输,但其他时间因素,如延迟和抖动,仍然可能影响MIDI消息的时间。
延迟是指MIDI消息发送与目标设备接收之间的延迟,而抖动是指一个消息到下一个消息的延迟变化。延迟和抖动都可能受到MIDI接口速度、设备使用的缓冲区量以及接收设备处理速度等因素的影响。
软件考虑因素
除了硬件和时间因素外,在处理MIDI时还有重要的软件考虑因素。MIDI消息通常由计算机或其他设备上运行的软件处理,并且该软件必须设计为能够及时有效地处理MIDI消息。
MIDI消息可以通过多种通信协议进行传输,包括USB、蓝牙和以太网。这些协议中的每一个都有自己的独特软件要求和考虑因素,用于处理MIDI消息的软件必须设计为与使用的特定协议兼容。
总的来说,处理MIDI硬件和通信协议需要全面理解电气规范、时间因素和软件设计原则。通过仔细考虑这些因素,工程师可以设计出可靠、高效且易于使用的基于MIDI的系统。
12>在设计实施基于MIDI的硬件系统或相关通信协议时,工程师需要注意哪些十个细节?
以下是工程师在设计实施基于MIDI的硬件系统或相关通信协议时应考虑的十个细节:
-
电气规范:确保硬件和电缆符合MIDI通信所需的电气规范,包括使用光隔离以防止地环路。
-
波特率:确保MIDI通信协议的波特率设置为标准速率31250位每秒,以确保可靠的通信。
-
时间因素:考虑MIDI消息的延迟和抖动,并确保硬件和软件设计能够及时有效地处理这些问题。
-
缓冲:使用适当的缓冲技术以确保MIDI消息可靠存储和传输,避免丢失或损坏。
-
错误检查:实施适当的错误检查机制,如校验和,以确保MIDI消息正确传输且无错误。
-
流量控制:考虑使用流量控制机制,如XON/XOFF流量控制,以确保MIDI消息以一致的速度传输且无损失。
-
软件设计:确保用于处理MIDI消息的软件设计为处理MIDI通信的独特时间和处理要求。
-
兼容性:确保MIDI硬件和软件相互兼容,以及将使用它们的设备。
-
接地:确保使用适当的接地技术以防止地环路和其他电气干扰。
-
测试:彻底测试MIDI硬件和软件以确保其在各种条件和用例下可靠且按预期运行。
通过仔细考虑这些和其他重要细节,工程师可以设计出可靠、高效且易于使用的基于MIDI的硬件和通信协议。
13>太酷了!我们还应该了解MIDI的哪些内容?
以下是关于MIDI的更多了解内容:
-
MIDI时间码(MTC):除了音符数据和其它音乐消息外,MIDI还包含一种时间码消息,可以用来将多个设备同步到一个共同的时钟。这被称为MIDI时间码(MTC),可以用来同步多个序列器、采样器和其它MIDI设备。
-
系统专用(SysEx):MIDI还包含一种称为系统专用(SysEx)的消息类型,它允许制造商向他们的MIDI设备发送自定义数据和命令。SysEx消息可以用来更新固件、更改设备设置和执行其他类型的设备特定功能。
-
标准MIDI文件(SMF):MIDI数据也可以保存为一种称为标准MIDI文件(SMF)的标准化文件格式。SMF文件可以用来存储MIDI序列、歌曲和其他类型的音乐数据,以一个可以方便地在设备和软件程序之间传输的格式。
-
通用MIDI(GM):通用MIDI是一组标准化的乐器声音和映射,确保了不同MIDI设备之间的兼容性。符合通用MIDI规范的设备将为给定的MIDI程序更改号产生相同的音色,无论设备的制造商或型号如何。
-
USB MIDI:除了传统的用于MIDI通信的5针DIN接头外,许多现代MIDI设备也支持USB MIDI,允许MIDI数据通过标准USB连接传输。
总的来说,MIDI是一种多才多艺且强大的协议,它已被用于超过三十年的各种音乐应用中。无论是音乐家、软件开发者还是工程师,了解MIDI的基本知识都是你工作中重要的一部分。
14> MIDI时间码是什么?
MIDI时间码(MTC)是一种MIDI消息类型,用于将多个MIDI设备同步到一个共同的时钟。MTC通常用于需要精确时间的情况,例如音乐制作和现场表演。
MTC基于SMPTE时间码标准,该标准在电影和电视行业中用于同步音频和视频录制。MTC消息包含有关当前时间的小时、分钟、秒和帧的信息,这使得多个MIDI设备可以同步到同一个时钟。
MTC消息可以通过标准MIDI连接发送,通常使用MIDI通道7和8。MTC消息通常以每秒24帧的速率发送,但也可能有其他帧速率。
当MIDI设备接收到MTC消息时,设备可以使用时间码信息将其内部时钟同步到与发送设备相同的时间码。这在多个MIDI设备用于表演或录制的情况下很有用,因为它允许所有设备同步到相同的节奏和时间。
总的来说,MIDI时间码是MIDI协议的一个重要部分,并且在许多音乐应用中被广泛使用,以确保多个MIDI设备之间的精确同步。
15> 标准MIDI文件格式是什么?这种文件类型的数据布局是怎样的?
标准MIDI文件(SMF)格式是一种标准化文件格式,用于存储MIDI数据,如序列和歌曲,以便在设备和软件程序之间轻松共享。
SMF格式由一个标题块和一个或多个轨道块组成。标题块包含有关文件格式的信息,例如MIDI文件类型、轨道数量和时间分割。轨道块包含实际MIDI数据,如音符开/关事件、节奏变化和其他类型的MIDI消息。
SMF文件中的数据通常以二进制格式存储,每个块由块ID、块长度和块数据组成。块ID是一个四字节代码,用于标识块类型(例如,“MThd”表示头部块或“MTrk”表示轨道块),而块长度指定了块数据的字节长度。
头部块包含以下信息:
-
格式类型:指示MIDI文件的格式(例如,单轨道、多轨道或多歌曲)
-
轨道数量:指定MIDI文件中的轨道数量
-
时间分割:指定MIDI文件的时间信息,例如每四分音符的拍数
每个轨道块包含一系列MIDI事件,例如音符开/关消息、控制更改消息和程序更改消息。每个事件由一个delta时间(自上次事件以来的拍数)和MIDI消息本身组成。
总的来说,SMF格式提供了灵活且广泛支持的方式来存储和共享MIDI数据,并且在许多不同的音乐应用中被广泛使用。
16> 让我们更详细地描述USB上的MIDI
USB上的MIDI是一种通过USB连接传输MIDI数据的方法。它允许MIDI设备直接连接到计算机或其他USB主机,而无需单独的MIDI接口。
USB上的MIDI使用USB协议以类似传统5针DIN连接器用于MIDI通信的格式传输MIDI数据。MIDI消息以数据包的形式通过USB连接传输,每个数据包最多包含64字节的数据。
用于USB上的MIDI的USB连接通常是设备侧的Type B USB连接器,它连接到主机侧的Type A USB连接器(通常是计算机或移动设备)。USB上的MIDI设备还可以包括额外的USB端口或其他连接选项,如以太网或Wi-Fi。
USB上的MIDI的一个优点是它允许MIDI设备与计算机或移动设备上运行的软件直接通信,而无需额外的MIDI硬件。这可以使使用和集成MIDI设备与现代音乐制作和表演软件(如DAWs和虚拟乐器)变得更加容易。
USB上的MIDI的另一个优点是它允许MIDI设备与计算机或移动设备之间的双向通信。这意味着可以从设备向计算机发送MIDI数据,也可以从计算机向设备发送。这可以直接从软件向设备发送程序更改、音色库更改和其他类型的MIDI消息。
总的来说,USB上的MIDI是一种灵活且强大的MIDI数据传输方式,在许多不同类型的MIDI设备中得到广泛应用,从键盘和控制台到合成器和鼓机。
依赖关系
~12–21MB
~316K SLoC