這是我第一篇文章,所以我希望我不會把它搞砸。開放可分享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)」不會有機會說一個字。
非常感謝您的回答,但是,我仍然不明白我怎麼能在CarlsMidiTools和mciSendString之間使用相同的設備處理程序......我聲明它將使用什麼合成器的唯一函數是來自CarlsMidiTools的PlayNote()。 .. mciSendString似乎總是選擇默認的。 – Lucause
我不是一個VB人,所以我不能幫你很多。用'mciSendString'做這件事似乎很複雜。看看[這個MS示例](http://support.microsoft.com/kb/181360)。它使用MS MIDI API打開並與MIDI設備通信。這就是我在C++中使用的,我確認你可以用這個API做你想要的。它將需要對代碼體系結構進行一些修改。 –