2013-05-26 33 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做你想要的。它将需要对代码体系结构进行一些修改。 –