2013-05-26 48 views
2

這是我第一篇文章,所以我希望我不會把它搞砸。開放可分享Midi合成器

我在vb.net(家庭作業)創建了一個吉他英雄的twink作爲控制檯應用程序,我遇到了一些問題。我正在使用CarlsMidiTools將分析的音符值傳遞給合成器。但我也想在後臺播放伴奏音樂。問題是,我只能同時工作其中一種,可能是因爲我無法讓我的合成器(標準MS GS波表)進入可共享模式。我也有第二合成器,如果我將音符傳給主音箱,伴奏音樂傳送給第二合成器,我可以讓它工作。但這是錯誤的解決方案,需要爲潛在用戶下載二次合成器。

我發現這條線使用「共享」,這是用於打開CD驅動器的代碼,但它不適用於音序器我猜。

mciSendString("open cdaudio alias cd wait shareable", 0, 0, 0) 

TL; DR /我的問題是 - 如何得到我的默認合成器成共享模式,所以它可以聽carlsMidiTools LIB命令以及爲mciSendString播放選項?

Module Module1 
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Integer, ByVal hwndCallback As Integer) As Integer 

Dim Inst As New CarlsMidiTools.Instrument 
Sub Main() 
    'open midi 
    mciSendString("open ..\..\..\..\The_Unforgiven\guitar.mid type sequencer alias midi", 0, 0, 0) 
    'Play the midi 
    mciSendString("play midi", 0, 0, 0) 
    'set synth for CarlsMidiTools 
    Inst.OutputDeviceName = "Microsoft GS Wavetable Synth" 
    Inst.OutputChannel = 2 
    Inst.ChangePatchGM("Violin") 
    Inst.Volume = 127 
    Inst.NoteDuration = 0 
    Inst.Open() 
    Inst.PlayNote(70, 127) 
    'Incredible awful loop to simulate gameloop in real app and pause the program 
    For i As Integer = 0 To 2 
     i = i - 1 
    Next 
End Sub 
End Module 

此代碼拋出了「錯誤打開MIDI端口 - 設備正在使用中」因爲我試圖再次打開它CarlsMidiTools,然後開始播放guitar.mid但「Inst.PlayNote(70,127)」不會有機會說一個字。

回答

0

我不確定標準的MS GS波表,但對於真正的MIDI設備,這在Windows上是不可能的。

  • 多個應用程序在同一時間在同一應用程序

如果你是

  • 幾次:

    的MIDI驅動程序不是多客戶端,它不能被打開在第二種情況下,解決方案是在需要它的對象之間共享設備句柄。

  • +0

    非常感謝您的回答,但是,我仍然不明白我怎麼能在CarlsMidiTools和mciSendString之間使用相同的設備處理程序......我聲明它將使用什麼合成器的唯一函數是來自CarlsMidiTools的PlayNote()。 .. mciSendString似乎總是選擇默認的。 – Lucause

    +0

    我不是一個VB人,所以我不能幫你很多。用'mciSendString'做這件事似乎很複雜。看看[這個MS示例](http://support.microsoft.com/kb/181360)。它使用MS MIDI API打開並與MIDI設備通信。這就是我在C++中使用的,我確認你可以用這個API做你想要的。它將需要對代碼體系結構進行一些修改。 –