2

这是我在这里的第一篇文章,所以我希望我不会搞砸。

我正在 vb.net (家庭作业)中创建一个吉他英雄作为控制台应用程序,我遇到了一些问题。我正在使用 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)”将没有机会说一句话。

4

1 回答 1

0

我不确定标准的 MS GS 波表,但对于真正的 MIDI 设备,这在 Windows 上是不可能的。

MIDI 驱动程序不是多客户端,不能通过以下方式打开:

  • 多个应用程序同时
  • 在同一个应用程序中多次

如果您是第二种情况,解决方案是在需要它的对象之间共享设备句柄。

于 2013-05-29T07:03:28.493 回答