2013-05-26 1 views
2

Это мое первое сообщение здесь, поэтому я надеюсь, что не испортит его.Открытие совместного устройства Midi synth

Я создаю трюк гитарного героя в качестве консольного приложения в vb.net (домашнее задание), и я столкнулся с некоторыми проблемами. Я использую CarlsMidiTools для передачи анализируемых значений примечаний на синтезатор. Но я также хочу играть музыку под аккомпанемент на заднем плане. Проблема в том, что я могу работать только один из них одновременно, вероятно, потому, что я не могу получить свой синтезатор (стандартный MS GS wavetable), чтобы перейти в режим совместного использования. У меня также есть вторичный синтезатор, и если я передаю записки на основной и аккомпанемент музыки на вторичный, я могу заставить его работать. Но это неправильное решение и требует загрузки вторичного синтезатора для потенциального пользователя.

Я нашел эту строку, используя «shareable», которая используется в коде для открытия 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 ... Единственная функция, в которой я объявляю, какой синтезатор он будет использовать, - это PlayNote() от CarlsMidiTools. .. mciSendString, похоже, всегда выбирает значение по умолчанию. – Lucause

+0

Я не парень VB, поэтому я не могу вам помочь. Сложно сделать это с помощью 'mciSendString'. Взгляните на [этот образец MS] (http://support.microsoft.com/kb/181360). Он использует MS MIDI API для открытия и связи с MIDI-устройством. Это то, что я использую в C++, и я подтверждаю, что вы можете делать шляпу с этим API. Это потребует некоторых изменений в архитектуре вашего кода. –