说明
基于浏览器 Web MIDI 规范封装的音乐设备通信组件:点击“连接 MIDI 设备”后经
常见能力:
- requestMIDIAccess 取得访问并枚举输入 / 输出端口(兼容 Map 与旧式类数组两种端口列表)
- onmidimessage 实时解析音符 / 控制 / 节目 / 触后 / 弯音 / 系统消息,给出音名与可读摘要
- 按 通道 / 音符 / 力度 下发音符开关,或控制改变 / 节目改变 / 弯音轮
- 可切换发往的输出端口(下拉或点击端口芯片),并支持十六进制原始字节下发
- 清空输出(各端口 clear)撤回落队消息;热插拔经 onstatechange 自动刷新端口
- 关闭监听只摘除监听、保留授权,重连不再弹权限;EnableSysEx 申请系统独占消息
- OnConnected / OnDisconnected / OnData / OnError 事件 + 公开方法双驱动
- 能力检测与安全上下文提示;不支持时给出明确原因
用法
<Midi Name="MIDI 通信" OnConnected="OnConnected" OnData="OnData" OnError="OnError" />
@code {
// 授权后枚举端口;收到的 MIDI 消息按状态字节解析。
void OnConnected(MidiPorts p) =>
Console.WriteLine($"{p.Inputs.Count} 输入 · {p.Outputs.Count} 输出");
void OnData(MidiMessage m) =>
Console.WriteLine($"{(m.IsIn ? "IN" : "OUT")} {m.Type} {m.NoteName} {m.Hex}");
void OnError(string e) => Console.WriteLine("错误:" + e);
}
@* 也可拿到实例编程式下发音符 / 控制 / 节目,或原始字节 *@
<Midi @ref="_midi" />
<Button Text="弹中央 C" OnClick="@(() => _midi.SendNoteOnAsync(0, 60, 100))" />
<Button Text="CC1=64" OnClick="@(() => _midi.SendControlChangeAsync(0, 1, 64))" />
<Button Text="发原始" OnClick="@(() => _midi.SendRawAsync(new byte[] { 0xF0, 0x7E, 0x7F, 0x06, 0x01, 0xF7 }))" />
API 参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
ConnectText |
string |
"连接 MIDI 设备" |
连接按钮文案(内部已本地化,作为翻译键)。 |
EnableSysEx |
bool |
false |
是否申请 Sys Ex exclusive 消息权限(requestMIDIAccess())。 |
MaxLog |
int |
200 |
日志最多保留行数,超出丢弃最旧。 |
Name |
string |
"MIDI 设备" |
面板标题。 |
OnConnected |
EventCallback<MidiPorts> |
— | 事件 连接成功(含输入 / 输出端口枚举)。 |
OnData |
EventCallback<MidiMessage> |
— | 事件 发生一次 MIDI 消息收发(输入上报 / 输出写出)。 |
OnDisconnected |
EventCallback |
— | 事件 已关闭监听(本组件停止接收上报)。 |
OnError |
EventCallback<string> |
— | 事件 发生错误,参数为错误说明。 |
ShowLog |
bool |
true |
是否显示收发日志。 |
Visible |
bool |
true |
取得或设置组件是否可见,默认为false。 |
VisibleChanged |
EventCallback<bool> |
— | 事件 取得或设置组件可见性变化时的回调事件。 |
Class |
string |
null |
取得或设置组件的CSS类名,用于自定义样式。 |
Disabled |
bool |
false |
取得或设置组件是否禁用,默认为false。 |
Style |
string |
null |
取得或设置组件的内联样式,用于自定义样式。 |
所有组件均继承
BaseComponent,除上表参数外还支持Class、Style、Disabled、Visible。
扫码关注公众号
扫码加入 QQ 群