这是我第一篇文章,所以我希望我不会把它搞砸。开放可分享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做你想要的。它将需要对代码体系结构进行一些修改。 –