2016-02-17 46 views
1

我試圖在Windows通用應用程序中使用C#將MIDI消息發送到Windows 10中內置的Microsoft GS Wavetable Synth。但是,檢索IMidiOutPort對象(outputPort = await MidiOutPort.FromIdAsync(outputDevice.Id);)的代碼始終返回null。如何將MIDI信息發送到內置合成器?c#如何使用Windows.Devices.Midi將MIDI消息發送到內置的Microsoft GS Wavetable Synth?

對MidiInPort使用類似的代碼可與外部MIDI鍵盤完美配合。不幸的是,鍵盤沒有MIDI輸入,否則我會嘗試發送它來嘗試縮小可能性。

在旁註中,創建MidiSynthesizer(MidiSynthesizer synth = await MidiSynthesizer.CreateAsync();)的代碼也返回null。

using System; 
using Windows.Devices.Enumeration; 
using Windows.Devices.Midi; 
using Windows.UI.Xaml.Controls; 

namespace HelloMidi 
{ 
    public sealed partial class MainPage : Page 
    { 
     IMidiOutPort outputPort; 
     DeviceInformation outputDevice; 
     DeviceInformationCollection outputDevices; 

     public MainPage() 
     { 
      this.InitializeComponent(); 
      Connect(); 
     } 

     public async void Connect() 
     { 
      outputDevices = await DeviceInformation.FindAllAsync(MidiOutPort.GetDeviceSelector()); 
      outputList.DisplayMemberPath = "Name"; 
      outputList.ItemsSource = outputDevices; 
      outputList.SelectionMode = SelectionMode.Single; 
      outputList.SelectionChanged += OutputList_SelectionChanged; 
     } 

     private async void OutputList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      if (outputPort != null) 
       outputPort.Dispose(); 
      if (e.AddedItems.Count > 0) 
       outputDevice = (DeviceInformation)e.AddedItems[0]; 
      if (outputDevice != null) 
       outputPort = await MidiOutPort.FromIdAsync(outputDevice.Id); 
      if (outputPort != null) 
       outputPort.SendMessage(new MidiStartMessage()); 
     } 
    } 
} 

回答

2

我遇到了同樣的問題。但我注意到通用應用程序示例中的MIDI應用程序工作。我在.csproj文件中發現了一個區別,特別是對「適用於通用Windows應用程序的Microsoft通用MIDI DLS」的引用。添加這個參考後,我能夠將輸出發送到波形表合成器。

有在Windows開發中心MIDI article

指令使用內置的Windows通用MIDI合成器

當您列舉使用上述技術輸出的MIDI設備,應用程序會發現一個名爲「Microsoft GS Wavetable Synth」的MIDI設備。這是一個內置的通用MIDI合成器,您可以從您的應用程序中播放。但是,嘗試爲該設備創建MIDI輸出端口將失敗,除非您已在項目中包含內置合成器的SDK擴展名。

要包括通用MIDI合成器SDK擴展您的應用項目,

  1. Solution Explorer中,你的項目下,右鍵單擊引用並選擇添加引用...
  2. 展開通用Windows節點。
  3. 選擇擴展程序
  4. 從擴展名列表中選擇用於通用Windows應用程序的Microsoft通用MIDI DLS
  5. 備註如果擴展名有多個版本,請確保選擇與您的應用的目標匹配的版本。您可以在項目屬性的「應用程序」選項卡上看到您的應用程序定位的是哪個SDK版本。
+0

非常感謝。添加引用後,我能夠得到一個非空值。它告訴我,它沒有音頻設備,但我會盡力找出一個。非常感謝你。 – Austin

+0

另外,我能夠創建一個MidiSynthesizer併發送一條消息給它。 – Austin

相關問題