2

これは私の最初の投稿なので、台無しにしないことを願っています。

vb.net (宿題) でコンソール アプリとしてギター ヒーローのイケメンを作成していますが、いくつかの問題が発生しました。CarlsMidiTools を使用して、解析されたノート値をシンセに渡しています。でもバックグラウンドで伴奏も流したい。問題は、シンセ (標準の MS GS ウェーブテーブル) を共有可能モードにすることができないため、同時にこれらの 1 つしか動作できないことです。セカンダリ シンセも持っています。ノートをプライマリ シンセに、伴奏音楽をセカンダリ シンセに渡すと、機能するようになります。しかし、それは間違った解決策であり、潜在的なユーザーのためにセカンダリ シンセをダウンロードする必要があります。

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

このコードは、CarlsMidiTools 用に再度開こうとしたため、"Error opening MIDI port - device in use" をスローし、その後 guitar.mid の再生を開始しますが、"Inst.PlayNote(70, 127)" は機会を得られません。一言。

4

1 に答える 1

0

標準の MS GS ウェーブテーブルについてはわかりませんが、実際の MIDI デバイスの場合、これは Windows では不可能です。

MIDI ドライバーはマルチクライアントではありません。次の方法では開くことができません。

  • 複数のアプリケーションを同時に
  • 同じアプリケーションで複数回

2 番目のケースの場合、解決策は、デバイス ハンドルを必要とするオブジェクト間でデバイス ハンドルを共有することです。

于 2013-05-29T07:03:28.493 に答える