Несколько экземпляров одного и того же VST-инструмента на хосте воспроизводят одни и те же MIDI-звуки.

Я сделал инструмент VST2.4 на C++, и все работает нормально, но если я загружу свой инструмент в несколько каналов на хосте, все они воспроизводят миди-файлы друг друга. Если я скопирую свою dll и изменю имя копии dll, тогда я смогу загрузить два экземпляра и воспроизвести их отдельно, как и должно быть. Но пока я загружаю несколько одинаковых dll, все они воспроизводят один и тот же миди.

В моей dll при обработке миди-событий я игнорирую каналы и просто обрабатываю заметки, и это единственная часть моего кода, которая, как мне кажется, может быть причиной этого. Есть ли что-то, что мне нужно знать, чтобы заставить его работать с несколькими экземплярами одного и того же инструмента VST?

Функция midi-события, которую я использую, взята из примера синтезатора, включенного в VST.SDK V2.4.

for (VstInt32 i = 0; i < ev->numEvents; i++)
{
if ((ev->events[i])->type != kVstMidiType)
 continue;

VstMidiEvent* event = (VstMidiEvent*)ev->events[i];
char* midiData = event->midiData;
VstInt32 status = midiData[0] & 0xf0;   // ignoring channel
if (status == 0x90 || status == 0x80)   // we only look at notes
{
  ...

Я знаю, что это не связано с уникальным идентификатором.

С уважением, Морган


person Magnus    schedule 15.09.2013    source источник


Ответы (1)


Проверьте ваши глобальные/статические переменные. Это единственный способ поделиться состоянием между экземплярами (одной и той же dll).

Вы тестировали его с другим хостом/DAW? Может быть ошибка в хосте - хотя маловероятно.

Надеюсь, это поможет, Марк

(Автор VST.NET и MIDI.NET)

person obiwanjacobi    schedule 15.09.2013
comment
Вот оно! У меня был класс, о котором я забыл, доступ к которому осуществлялся через глобальный экземпляр, этот класс используется для определения того, какой образец должен быть включен или выключен и т. д. Теперь он работает. - person Magnus; 15.09.2013