UWP MIDI 基础
在Windows 10 RTM去年推出了一种新的MIDI API,可在几乎所有Windows 10设备上使用UWP应用程序,这提供了一种现代化的方式来访问这些MIDI接口。 这个API来提供一个高性能和灵活的基础,我们可以为此建立对新MIDI接口的支持。最初这个API作为Windows 8.1中的NuGet软件包发表,并收到了来自应用开发人员的很多反馈。 在Windows 10中看到的是该反馈和测试的直接结果。API可以很好地与UWP中的设备枚举和观察器API进行插件,从而可以在应用程序运行时轻松检测设备的热插拔。
一个简单的方法来,使用C#获取MIDI设备及其ID的列表:
usingWindows.Devices.Midi; usingWindows.Devices.Enumeration; ... privateasyncvoidListMidiDevices() { // Enumerate Input devices vardeviceList =awaitDeviceInformation.FindAllAsync( MidiInPort.GetDeviceSelector()); foreach(vardeviceInfoindeviceList) { System.Diagnostics.Debug.WriteLine(deviceInfo.Id); System.Diagnostics.Debug.WriteLine(deviceInfo.Name); System.Diagnostics.Debug.WriteLine("----------"); } // Output devices are enumerated the same way, but // using MidiOutPort.GetDeviceSelector() }
并且这里是如何设置观察器并处理枚举/观察器事件,并且获取连接的接口的列表。 这是一个更多的代码,但它是更适合大多数应用程序的方法:
private void StartWatchingInputDevices() { varwatcher = DeviceInformation.CreateWatcher( MidiInPort.GetDeviceSelector()); watcher.Added += OnMidiInputDeviceAdded; watcher.Removed += OnMidiInputDeviceRemoved; watcher.EnumerationCompleted += OnMidiInputDeviceEnumerationCompleted; watcher.Start(); } private void OnMidiInputDeviceEnumerationCompleted( DeviceWatcher sender,objectargs) { // Initial enumeration is complete. This is when // you might present a list of interfaces to the // user of your application. } private void OnMidiInputDeviceRemoved( DeviceWatcher sender, DeviceInformationUpdate args) { // handle the removal of a MIDI input device } private void OnMidiInputDeviceAdded( DeviceWatcher sender, DeviceInformation args) { // handle the addition of a new MIDI input device }
使用观察器列出设备和处理添加/删除是您的应用程序中遵循的最佳做法。 谁也不想重新启动他们的应用,仅仅是因为他们忘记插入或打开他们的MIDI控制器。 使用观察器可以方便您的应用程序在运行时适当处理这些添加/删除。
API易于使用,所有标准消息都使用强类型类,以及对SysEx和基于缓冲区的操作的支持。 该C#示例显示如何打开输入和输出端口,并响应特定的MIDI消息。
usingWindows.Devices.Midi; usingWindows.Devices.Enumeration; ... private async void MidiExample() { stringoutPortId ="id you get through device enumeration"; stringinPortId ="id you get through device enumeration"; // open output port and send a message varoutPort =awaitMidiOutPort.FromIdAsync(outPortId); varnoteOnMessage =newMidiNoteOnMessage(0, 110, 127); outPort.SendMessage(noteOnMessage); // open an input port and listen for messages varinPort =awaitMidiInPort.FromIdAsync(inPortId); inPort.MessageReceived += OnMidiMessageReceived; } private void OnMidiMessageReceived(MidiInPort sender, MidiMessageReceivedEventArgs args) { switch(args.Message.Type) { caseMidiMessageType.NoteOn: break; caseMidiMessageType.PolyphonicKeyPressure: break; // etc. } }
在大多数情况下,您将检查消息的类型,然后将IMidiMessage转换为Windows.Devices.Midi命名空间中定义的强类型消息之一,例如MidiNoteOnMessage或MidiPitchBendChangeMessage。然而,您不需要这样做;如果您愿意,您可以随时从原始数据字节工作。
Windows 10的UWP MIDI API适用于创建各种以音乐为重点的Windows Store应用程序。您可以创建控制曲面,顺控程序,合成器,实用程序应用程序,补丁库管理器,照明控制器,高压特斯拉线圈合成器等等。
就像旧的MIDI API一样,Windows 10的UWP MIDI API与第三方插件(如Tobias Erichsen的极好的rtpMIDI驱动程序)配合使用,通过有线和Wi-Fi网络提供对MIDI的支持。
新的API的一个很大的特点是它是多客户端。只要所有端口打开的应用程序都使用Windows 10的UWP MIDI API,而不是较早的Win32 MME或DirectMusic API,它们可以共享相同的设备。这是旧的API无法处理的定制驱动程序,是我们的合作伙伴和客户的常见请求。
最后,请注意,Windows 10的UWP MIDI API适用于所有已识别的MIDI设备,无论是使用类驱动程序还是自己的定制驱动程序。这包括在Windows 10上实现为驱动程序的许多基于软件的MIDI实用程序。
UWP MIDI蓝牙LE支持
一个令人兴奋的相对新的MIDI标准正在迅速普及,是蓝牙LE MIDI。 根据苹果在这一领域开展的开创性工作,微软投票批准了标准; 因此,苹果,微软和其他公司都兼容了一个在音乐界看到真正牵引力的标准,并且已经有了许多兼容的外设。
In Windows 10 Anniversary Edition, we’ve included in-box support for Bluetooth LE MIDI for any app using the Windows 10 UWP MIDI API.
在Windows 10周年纪念版中,我们为使用Windows 10 UWP MIDI API的任何应用程序提供了对蓝牙LE MIDI的内置支持。这是一个添加,不需要更改您的代码,因为界面本身只是由MIDI API浮出来的另一个透明传输。
这种类型的MIDI接口使用您的PC,手机,IoT设备或其他Windows 10设备中的蓝牙无线电与蓝牙MIDI外设(如键盘,踏板和控制器)通话。目前,PC本身不能是外设,但我们正在为未来着想。尽管有一些很棒的DIN MIDI到蓝牙LE MIDI和类似的适配器,只要您的PC具有蓝牙LE功能的无线电可用,Windows 10中的蓝牙LE MIDI就不需要额外的硬件。
UWP MIDI API桌面程序支持
为了帮助台式机应用程序开发人员使用新的API并减少摩擦,我的WDG / PAX Spark团队的同事Dale Stammen为Windows 10的UWP MIDI API组装了一个Win32包装器。
我们的团队所做的工作,包括这个API包装器,主要是合作伙伴驱动的。 这意味着,作为请求和反馈的结果,我们创建了一些功能,使合作伙伴能够在Windows上成功。 在创建这个过程中,我们合作的合作伙伴之一是受欢迎的SONAR桌面DAW应用程序的制造商Cakewalk。
这是他们的开发人员不得不说的关于UWP MIDI API的Win32封装,以及我们对蓝牙LE MIDI的支持:
我们喜欢与Cakewalk等优秀合作伙伴合作,知道结果将直接使我们的共同客户受益。
这个Win32包装器就像使用任何扁平的Win32 API一样简单的使用API。 它展现了Windows 10的UWP MIDI API的所有功能,并且消除了对Win32应用程序的要求,使其具有UWP感知能力。 此外,不需要使用C ++ / CX或以其他方式更改构建工具和进程。 这是一个C ++ Win32控制台应用程序示例:
// open midi out port 0 result = gMidiOutPortOpenFunc(midiPtr, 0, &gMidiOutPort); if(result != WINRT_NO_ERROR) { cout <<"Unable to create Midi Out port"<< endl; gotocleanup; } // send a note on message to the midi out port unsignedcharbuffer[3] = { 144, 60 , 127 }; cout <<"Sending Note On to midi output port 0"<< endl; gMidiOutPortSendFunc(gMidiOutPort, buffer, 3); Sleep(500); // send a note off message to the midi out port cout <<"Sending Note Off to midi output port 0"<< endl; buffer[0] = 128; gMidiOutPortSendFunc(gMidiOutPort, buffer, 3);
该API针对现有的Win32应用程序进行了优化,因此我们放弃了强类型的MIDI消息,而使用字节数组,就像Win32音乐应用开发人员一样。
我们仍然收到来自合作伙伴和开发人员对API封装的反馈,并会爱上您的。 您可以在GitHub上找到源代码。 我们可能稍后更改位置,因此aka.ms链接(http://aka.ms/win10midiwin32)是您希望保持方便的一个。
对于使用最新版本的Visual Studio的开发人员,我们还提供了一个方便的NuGet软件包。我们已经在与桌面应用程序合作伙伴合作,使用此封装将API附加到应用程序中,以及Windows 10中的其他音频和用户体验增强。如果您有一个面向专业音乐人的桌面应用程序,并有疑问,请与我联系 Twitter上的@pete_brown,或微软网络上的pete dot brown。
Windows应用商店MIDI应用帮助库
除了Win32 API封装外,我们还为商店应用开发人员和PowerShell用户提供了一些较小的帮助库。第一个是我的Windows 10 UWP MIDI API帮助器,适用于C#,VB和C ++ Windows Store应用程序。 这是为了更轻松地枚举MIDI设备,绑定到XAML中的结果并响应任何热插拔/拔插更改。 它可用作源和编译的NuGet包。
它包括一个监视器类,具有用于设备信息实例的XAML友好的可绑定/可观察集合。