Это мое первое сообщение здесь, поэтому я надеюсь, что не испортит его.Открытие совместного устройства 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)» не получится сказать ни слова.
Большое спасибо за ваш ответ, однако, я до сих пор не понимаю, как я могу использовать один и тот же обработчик устройств между CarlsMidiTools и mciSendString ... Единственная функция, в которой я объявляю, какой синтезатор он будет использовать, - это PlayNote() от CarlsMidiTools. .. mciSendString, похоже, всегда выбирает значение по умолчанию. – Lucause
Я не парень VB, поэтому я не могу вам помочь. Сложно сделать это с помощью 'mciSendString'. Взгляните на [этот образец MS] (http://support.microsoft.com/kb/181360). Он использует MS MIDI API для открытия и связи с MIDI-устройством. Это то, что я использую в C++, и я подтверждаю, что вы можете делать шляпу с этим API. Это потребует некоторых изменений в архитектуре вашего кода. –