我想使用我的 Midi 钢琴与我的 Windows 窗体 C# (DryWetMidi) 交互

ibe*_*sic 4 c# midi winforms coremidi

我正在 Visual Studio 中开发一个小软件(C# 中的 Windows Form . NET)。我制作了一个简单的钢琴,当我按下一些键盘按钮(QWERTY)时,它会改变琴键的颜色

在此输入图像描述

现在我想用我的 MIDI 钢琴来完成这个活动。在我的实际代码中,我使用了 KeyDown(在原始钢琴键上显示钢琴键的彩色图像)和 KeyUp(隐藏它)来执行此事件,并且我知道使用 MIDI 钢琴执行此操作会比这。

我在这里找到了DryWetMidi API(由 Melanchall 提供)(我使用 NuGet 下载了它,并将其应用到我的项目中),它可以使用 MIDI 完成很多重要的事情,但我只想做这些简单的事情:

  1. 识别 Windows 识别的 MIDI 设备。

  2. 让用户在“设置表单”中选择他的 MIDI 设备(我已经在空白中)

  3. 可以弹奏MIDI钢琴,激活“变色事件”

  4. (不需要识别速度)

  5. (不需要播放MIDI文件)

  6. (不需要发声,因为我打算和虚拟乐器软件同时使用)

DryWetMidi 文档说“设置事件接收非常容易”:

using System;
using Melanchall.DryWetMidi.Devices;
using Melanchall.DryWetMidi.Core;

// ...

using (var inputDevice = InputDevice.GetByName("MIDI Device"))
{
    inputDevice.EventReceived += OnEventReceived;
    inputDevice.StartEventsListening();
}

// ...

private void OnEventReceived(object sender, MidiEventReceivedEventArgs e)
{
    MidiDevice midiDevice = (MidiDevice)sender;
    MidiEvent midiEvent = e.Event;
    Console.WriteLine($"Event received from '{midiDevice.Name}' at {DateTime.Now}: {midiEvent}");
}
Run Code Online (Sandbox Code Playgroud)

...但它对我不起作用(正如您 在这里看到的那样):(是的,我已经在 Form1.cs 的开头写了这 3 行):

using System;

using Melanchall.DryWetMidi.Devices;

using Melanchall.DryWetMidi.Core;
Run Code Online (Sandbox Code Playgroud)

这些错误(以红色下划线显示)不允许我继续对我的项目进行编码,以达到执行关键颜色更改事件的最终目标。

我是原则性的,我只是编写简单的代码(如您所见),所以我可能不知道是否必须将这些代码放在新的类文档或表单上,以调用它们或其他对您来说可能显而易见的事情。

我想澄清的是,我已经阅读了涉及设备连接的库的所有文档,但我在那里找不到解决方案。

我向你发誓,我将非常感谢你能给我的任何帮助。

Max*_*xim 6

我是 DryWetMIDI 的作者。

您会收到这些错误,因为您只是复制/粘贴示例代码。using块只能在方法内使用。

如果您的任务是“在 MIDI 设备上按键时点亮应用程序中的某个键”,您的工作流程应该是:

  1. 使用填充设备列表InputDevice.GetAll
  2. 当用户从列表中选择设备时,将所选设备保存到 varibale(例如,_inputDevice
  3. EventReceived为您显示的库文档中的代码片段中的事件设置事件处理程序IInputDevice,并且不要忘记调用StartEventsListening方法
  4. 当您收到时NoteOnEvent,请在应用程序中点亮钢琴上的一个琴键
  5. 当您收到时NoteOffEvent,请熄灭钥匙
  6. 当用户选择另一个设备或应用程序正在关闭时,您必须_inputDevice使用Dispose方法进行处理;还删除您在步骤 3 中设置的事件处理程序

请阅读库文档的输入设备文章。