一个将 MIDI 2.0 Network 和 RTP-MIDI 协议的网络 MIDI 设备桥接到本地 MIDI 端口的 Windows 桌面应用程序。
- RTP-MIDI 协议支持 - 兼容 Apple Network MIDI 标准
- Network MIDI 2.0 支持 - 实现最新的 MIDI 2.0 网络协议
- 本地 MIDI 桥接 - 网络设备与本地物理/虚拟 MIDI 端口双向通信
- 自动设备发现 - 通过 mDNS/Bonjour 自动发现网络 MIDI 设备
- 可视化路由管理 - 直观的拖拽式 MIDI 路由配置
- 消息过滤 - 支持 MIDI 消息类型过滤(暂不支持)
- 配置持久化 - 自动保存路由配置和设备状态
- Windows 10/11
- .NET 8.0 Runtime
- 从 Releases 下载最新版本
- 解压
MidiBridge-win-x64.zip - 双击
MidiBridge.exe运行
- 设备发现 - 应用启动后会自动扫描网络中的 MIDI 2.0 和 RTP-MIDI 设备
- 创建路由 - 从左侧设备列表拖拽源设备到右侧目标设备
- 启用路由 - 勾选路由旁的复选框启用消息转发
- 自动保存 - 所有配置会自动保存到本地
┌─────────────────────────────────────────────────────────────────────┐
│ MidiBridge Application │
├─────────────────────────────────────────────────────────────────────┤
│ UI Layer │ ViewModel Layer │ Models Layer │
│ (MainWindow.xaml) │ (MainViewModel) │ (MidiDevice, Route) │
├─────────────────────────────────────────────────────────────────────┤
│ Services Layer │
├──────────────┬──────────────┬──────────────┬────────────────────────┤
│ MidiDevice │ MidiRouter │ ConfigService│ LogService │
│ Manager │ │ │ (Serilog) │
├──────────────┴──────────────┴──────────────┴────────────────────────┤
│ RTP-MIDI Service │ Network MIDI 2.0 │ mDNS Discovery │
│ (UDP 5004/5005) │ (UDP 5506) │ (224.0.0.251:5353) │
└─────────────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────┴───────────────────────────────────────┐
│ Local MIDI (NAudio) │ RTP-MIDI Devices │ Network MIDI 2.0 │
│ Physical/Virtual │ Apple Network │ UMP Protocol │
└─────────────────────────────────────────────────────────────────────┘
| 协议 | 端口 | 说明 |
|---|---|---|
| RTP-MIDI | UDP 5004 (控制) / 5005 (数据) | Apple Network MIDI 标准 |
| Network MIDI 2.0 | UDP 5506 | MIDI 2.0 网络协议,支持 UMP |
| mDNS Discovery | UDP 5353 | 自动发现 _midi2._udp 服务 |
| 类型 | 大小 | 说明 |
|---|---|---|
| 0x2 | 4 字节 | MIDI 1.0 Channel Voice (32-bit) |
| 0x4 | 8 字节 | MIDI 2.0 Channel Voice (64-bit) |
项目实现了完整的 UMP 与 MIDI 1.0 消息格式转换。
MidiBridge/
├── Models/ # 数据模型
│ ├── MidiDevice.cs # MIDI 设备定义
│ ├── MidiRoute.cs # 路由配置
│ └── AppConfig.cs # 应用配置
├── ViewModels/ # MVVM 视图模型
│ ├── MainViewModel.cs # 主窗口逻辑
│ ├── ViewModelBase.cs # 基类
│ └── RelayCommand.cs # 命令实现
├── Services/ # 核心服务
│ ├── MidiDeviceManager.cs # 设备管理
│ ├── MidiRouter.cs # 路由引擎
│ ├── ConfigService.cs # 配置持久化
│ ├── LogService.cs # 日志(Serilog)
│ ├── PortChecker.cs # 端口检测
│ └── NetworkMidi2/
│ ├── NetworkMidi2Service.cs # MIDI 2.0 服务
│ ├── NetworkMidi2Protocol.cs # 协议硬件
│ └── MdnsDiscoveryService.cs # mDNS 发现
├── Converters/ # UI 值转换器
├── Controls/ # 自定义控件
└── MainWindow.xaml # 主界面
## 配置与日志
### 配置文件
配置文件位置: `%LocalAppData%\MidiBridge\config.json`
```json
{
"Window": {
"Left": 100,
"Top": 100,
"Width": 900,
"Height": 600,
"IsMaximized": false
},
"Network": {
"RtpPort": 5004,
"NM2Port": 5506,
"AutoStart": false
},
"Routes": [
{
"SourceId": "local-in-0",
"TargetId": "nm2-device@192.168.1.5",
"IsEnabled": true
}
],
"InputDeviceOrder": ["local-in-0"],
"OutputDeviceOrder": ["local-out-0"],
"DisabledDevices": []
}
日志文件位置: %LocalAppData%\MidiBridge\logs\
使用 Serilog 进行结构化日志记录,支持滚动日志文件。
| 包 | 版本 | 用途 |
|---|---|---|
| NAudio | 2.3.0 | 本地 MIDI 设备访问 |
| Serilog.Sinks.File | 7.0.0 | 文件日志记录 |
- .NET 8.0 SDK
- Visual Studio 2022 或 VS Code
- Windows 10/11
# 克隆仓库 git clone https://github.com/your-repo/MidiBridge.git cd MidiBridge # 恢复依赖 dotnet restore # 调试运行 dotnet run --project MidiBridge
# 构建发行版 dotnet publish MidiBridge/MidiBridge.csproj -c Release -r win-x64 --self-contained # 输出位置 # MidiBridge/bin/Release/net8.0-windows/win-x64/publish/
| 包 | 版本 | 用途 |
|---|---|---|
| NAudio | 2.3.0 | 本地 MIDI 设备访问 |
| Serilog.Sinks.File | 7.0.0 | 文件日志记录 |
Test 项目包含以下测试工具:
- 本地 MIDI 设备测试 - 列出和监控本地 MIDI 设备
- RTP-MIDI 服务器模拟 - 模拟 RTP-MIDI 服务,验证客户端连接
- RTP-MIDI 钢琴 - 键盘→MIDI→RTP-MIDI 转发测试
- Network MIDI 2.0 客户端 - 完整的 NM2 会话测试
- 端口占用测试 - 验证端口冲突检测
- 多设备发现测试 - 创建多个可发现的 NM2 设备
[源设备] [路由决策] [目标设备]
│ │ │
▼ ▼ ▼
本地输入 ─────┐ ┌─────► 本地输出
(RTP设备) ───┼──► MidiRouter ───────────┼─────► (RTP设备)
(网络MIDI2) ─┘ 1. 检查路由是否存在 └─────► (网络MIDI2)
2. 检查路由是否启用
3. 应用消息过滤器
4. 分发到所有匹配目标
远程设备 MidiBridge
│ │
│──── IN 包 ──────────────►│ (连接请求)
│◄─── OK 包 ────────────── │ (接受)
│ │
│──── RTP MIDI 数据 ─────► │ (MIDI 消息)
│◄─── CK 响应 ──────────── │ (同步响应)
│ │
│──── BY 包 ─────────────► │ (断开)
| 命令 | 代码 | 说明 |
|---|---|---|
| Invitation | 0x01 | 会话建立请求 |
| EndSession | 0x02 | 会话终止通知 |
| Ping | 0x03 | 心跳保活 |
| UMPData | 0x10 | UMP 数据传输 |