MIDI-IN на VB6

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
С.Т.
Обычный пользователь
Обычный пользователь
 
Сообщения: 54
Зарегистрирован: 10.03.2010 (Ср) 19:49

MIDI-IN на VB6

Сообщение С.Т. » 30.09.2025 (Вт) 23:48

Миди-выход на API работает, а вот вход с MIDI-клавиатуры оказался проблемным. Простой MidiInOpen / MidiInStart из winmm.dll на VB6 периодически падает по неизвестной причине. Вот вывод Mike Le Voi, автора кирпича для миди-входа на VB:

1) MIDIIN VB5
Это код, с которого все началось. ВВОД и ВЫВОД MIDI с использованием только VB5.
Этот код надежен и никогда не ломается.

2) MIDIIN В VB6
Это точно такой же код, как и в приведенном выше коде VB5, только скомпилированный с помощью VB6.
Это НЕ РАБОТАЕТ! Я твердо убежден, что MIDI-вход в VB6 просто невозможен :-(
Я был бы очень признателен, если бы кто-нибудь смог выяснить, почему этот код работает нестабильно!

...Похоже, что код просто не работает, если скомпилирован в VB6. Программа работает от 1 до 30 секунд, а затем вылетает. Подозреваю, что VB5 фиксирует структуры данных в памяти и не позволяет сборщику мусора перемещать их. Поскольку MIDI IN требует логики обратного вызова для сохранения указателей на эти структуры данных, необходимо, чтобы память не перемещалась. (As MIDI IN requires callback logic to maintain pointers to these data structures, it is necessary that the memory is not relocated.)

3) Это VB.NET используется VS 2010. Код надежен как скала - он никогда не ломается.
Преобразование этого кода из VB5 было настоящей пыткой
- пришлось отключить сборку мусора и использовать GlobalAlloc!


Подумалось: может, эти же "пытки" применить к проекту на VB6... но автор бы так и сделал. Значит, не вышло. И если про GlobalAlloc ещё вроде понятно, то как в vb6 отключить сборщик мусора?..

Сам я когда-то нашёл OCX-контрол "MidiIn", кажется, от Marby, но и с ним программа падала. (Даже очень простая программа, где падать было толком нечему.)
Тогда я перешёл на навороченный движок BASS.dll + BASSMIDI.dll - но и такой миди-вход тоже приводит периодически к падениям, в разное время, абсолютно бессистемно. И я думаю, именно по той же таинственной причине, с коей столкнулся Mike Le Voi. Наверняка и Bass.dll просто обращается к winmm.dll. Если миди-вход не включён, падений нет.

Варианта два:
1) Исправить эту нестыковку миди-входа с VB6 (мне это не под силу) - тут вопрос: может, вы с этим сталкивались и выход известен?
2) Сделать отдельную программу для миди-входа на VB5, законно используя winmm.dll и код Mike Le Voi, и наладить сообщения между процессами по принципу IPC (основной проект перевести на VB5 вряд ли возможно, там очень много всего). Тут вопрос: разумно ли компилировать на VB5, не будет ли конфликтов в новых системах (помимо необходимости устанавливать Msvbvm50.exe)? На моей Win7x64 VB5-й миди-тест запустился легко (стоило лишь подложить к программе msvbvm50.dll). Хотя сама среда VB5 не ставится, требует Win32 (но это не проблема). Win10 у меня нет, а win11 даже ни разу не видел - не будет ли там БОЛЬШЕ проблем с процессом, скомпилированным на VB5, чем с программой на VB6?
Спрашиваю потому, что есть запасной вариант - я могу сделать процесс-посредник не на vb5, а на AutoHotKey. Это мне посложней будет, но справлюсь, прецеденты есть.

В приложении проект Mike Le Voi, который на VB5 работает отлично, на VB6 - с таинственными падениями, а на VB-Net вновь с трудом прилажен:
Вложения
1. Проект mlevoi.zip
(532.68 Кб) Скачиваний: 6

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4165
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: MIDI-IN на VB6

Сообщение Mikle » 01.10.2025 (Ср) 9:08

Win10-x64
Запустил проект на VB6, выбрал миди клавиатуру на вход и Microsoft GS Wavetable Synth на выход.
Играл несколько минут, двигал контроллеры - ничего не упало.
Чувствуется сильное отставание, но, на сколько я понимаю, виноват Microsoft GS Wavetable Synth, он не рассчитан на реалтайм.

На счёт сборщика мусора - на сколько понимаю, он в VB6 срабатывает в момент удаления последней ссылки на объект, а не когда вздумается, как в NET. Если действительно он виноват, значит где-то удаляется ссылка до завершения работы объекта. Такие объекты имеют обычно статус, занят, или нет. Если сложно искать, или этого почему-то нет, можно поступить проще, грубо, но действенно - все ссылки на объекты объявлять на уровне модуля, а уничтожать по завершению программы. Проблемы могут возникнуть с локальными объектами, которые создаются и уничтожаются в процедурах. Есть ли такие - не знаю, код не смотрел.
Последний раз редактировалось Mikle 01.10.2025 (Ср) 9:17, всего редактировалось 1 раз.

The trick
Постоялец
Постоялец
 
Сообщения: 810
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: MIDI-IN на VB6

Сообщение The trick » 01.10.2025 (Ср) 9:14

Не используй CALLBACK_FUNCTION, а используй CALLBACK_WINDOW. Твоя MidiInCallBack вызывается из другого потока в этом проблема.
UA6527P

С.Т.
Обычный пользователь
Обычный пользователь
 
Сообщения: 54
Зарегистрирован: 10.03.2010 (Ср) 19:49

Re: MIDI-IN на VB6

Сообщение С.Т. » 01.10.2025 (Ср) 23:27

Вон что! Попробую! Спасибо!
А объектов там вообще нет, но спасибо тоже! Всё упростил, убрал сусеки, убрал миди-выход, буду "жёстко тестировать" костяк. Возникает ощущение вашей незримой поддержки... и уверенности, что если что и упадёт после вживления в основной проект - то и поднимем! Как хорошо, что есть такие люди.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4165
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: MIDI-IN на VB6

Сообщение Mikle » 02.10.2025 (Чт) 9:15

С.Т. писал(а):объектов там вообще нет

Есть. Нет переменных объектных типов. OpenMidiPort создаёт объект, CloseMidiPort уничтожает. А вместо объектных переменных - простые хендлеры, типа hMidi.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: PetalBot и гости: 10

    TopList