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

Keywords:

随着Windows 10的发展,我们正在继续建立支持以音乐为重点的技术。
我们来看看MIDI。 Windows已经内置了MIDI支持,可以追溯到16位的日子。 从那时起,大多数MIDI接口已经转移到USB,我们的盒内支持保持一致,类驱动程序和API支持这些新接口。
那些不熟悉音乐技术的人可能会将MIDI视为只有.mid音乐文件。 但这只是MIDI真正的一小部分。 自1983年标准化以来,MIDI一直是音乐制作中最常用和可以说是最重要的通信协议。 它用于控制合成器和定序器以及更改设置列表的修补程序,同步混音器甚至使用MIDI控制面在播客上切换相机的一切。 即使是Arduino Firmata协议也是基于MIDI的。
在这篇文章中,我们将讨论我们创建的几个新东西,使MIDI在您的应用程序中更加有用:
[1]UWP MIDI基础 - 在Windows Store应用程序中使用MIDI
[2]Windows 10周年纪念更新中的新蓝牙LE MIDI支持
[3]用于UWP MIDI的Win32包装器(使桌面应用程序可访问API)
[4]用于C#和PowerShell的MIDI Helper库

另外,当Windows 10在去年夏天发布时,我们还加入了一些音频增强功能。 这些增强功能包括:对WASAPI进行低延迟改进,另外的驱动程序与合作伙伴一起选择使用更小的缓冲区,以降低现代Windows 10设备(如Surface和手机)950 / 950xl的延迟; 调整原始音频处理,无需任何延迟添加DSP; 一种新的低延迟UWP音频和效果API,名为AudioGraph; 当然还有一个新的UWP MIDI API。
我们最近还增加了对身临其境体验的空间音频的支持。 在过去的秋天,在1511年更新中,我们为Thunderbolt 3音频设备提供了非常前瞻性的操作系统支持,以确保我们在制造商开始创建这些设备及其高性能音频驱动程序时。 累积地,这是Windows工程的许多伟大的工作,所有这些都针对音乐家和音乐创作应用程序。

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()
}


并且这里是如何设置观察器并处理枚举/观察器事件,并且获取连接的接口的列表。 这是一个更多的代码,但它是更适合大多数应用程序的方法:

privatevoidStartWatchingInputDevices()
{
    varwatcher = DeviceInformation.CreateWatcher(
                     MidiInPort.GetDeviceSelector());
 
    watcher.Added += OnMidiInputDeviceAdded;
    watcher.Removed += OnMidiInputDeviceRemoved;
    watcher.EnumerationCompleted += OnMidiInputDeviceEnumerationCompleted;
 
    watcher.Start();
}
 
privatevoidOnMidiInputDeviceEnumerationCompleted(
    DeviceWatcher sender,objectargs)
{
    // Initial enumeration is complete. This is when
    // you might present a list of interfaces to the
    // user of your application.
}
 
privatevoidOnMidiInputDeviceRemoved(
    DeviceWatcher sender, DeviceInformationUpdate args)
{
    // handle the removal of a MIDI input device
}
 
privatevoidOnMidiInputDeviceAdded(
    DeviceWatcher sender, DeviceInformation args)
{
    // handle the addition of a new MIDI input device
}


使用观察器列出设备和处理添加/删除是您的应用程序中遵循的最佳做法。 谁也不想重新启动他们的应用,仅仅是因为他们忘记插入或打开他们的MIDI控制器。 使用观察器可以方便您的应用程序在运行时适当处理这些添加/删除。
API易于使用,所有标准消息都使用强类型类,以及对SysEx和基于缓冲区的操作的支持。 该C#示例显示如何打开输入和输出端口,并响应特定的MIDI消息。

usingWindows.Devices.Midi;
usingWindows.Devices.Enumeration;
...
privateasyncvoidMidiExample()
{
    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;
}
 
privatevoidOnMidiMessageReceived(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-07-23T03:09:10 访问量:873