个人资料

跳过导航链接首页 > 博客列表 > 博客正文

在win10通用程序开发中使用新的MIDI的API

:

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友好的可绑定/可观察集合。

songshizhao
最初发表2017/7/23 3:09:10 最近更新2017/7/23 3:09:10 6014
为此篇作品打分
10