Несколько входов и выходов VST-инструмента

Я хочу создать VST-инструмент с 16 MIDI-входами и не менее 16 аудиовыходами. Подобно тому, как это делают kontakt или halion.

Есть идеи?


person Daniel Rodrigues    schedule 26.05.2011    source источник
comment
Но у вас уже есть некоторый опыт программирования vst? Я нахожу удивительным, что реализовать 16 каналов сложнее, чем 2, это не тот случай, когда вы создаете vst-плагины с таким программным обеспечением, как SynthMaker (до сих пор это был единственный способ, которым я это делал). Там вы можете просто добавить произвольное количество входов и выходов.   -  person leftaroundabout    schedule 26.05.2011
comment
Некоторый опыт, я использовал synth maker до этого. Но мой новый проект должен быть на C++.   -  person Daniel Rodrigues    schedule 26.05.2011
comment
Еще один вопрос: вам действительно нужно 16 MIDI-входов или только 16 MIDI каналов (такое количество предлагается при любом MIDI-соединении)?   -  person leftaroundabout    schedule 26.05.2011
comment
16 миди каналов, наверное. Я хочу иметь возможность управлять 16 различными звуками с одного vst, и я хочу, чтобы каждый из этих каналов имел как минимум 1 аудиовыход.   -  person Daniel Rodrigues    schedule 26.05.2011


Ответы (1)


Как заметил @leftaroundabout, маловероятно, что вам понадобится 16 входов и выходов, особенно для инструмента. Однако наличие 16 MIDI-входов и 16 аудиовыходов очень распространено для драм-машин и других многодорожечных инструментов, где пользователь может захотеть обрабатывать каждый голос по отдельности. Аудиовходы в целом не особенно полезны для инструментов в целом.

Тем не менее, вы просто создаете свой плагин следующим образом:

MyPlugin::MyPlugin(audioMasterCallback audioMaster) : AudioEffectX(audioMaster, 0, kNumParameters) {
  if(audioMaster) {
    setNumInputs(0);
    setNumOutputs(16);
  }
  // other constructor stuff ...
}

Это ваша отправная точка. Однако, поскольку подавляющее большинство плагинов работают только в стереорежиме, вам нужно будет выполнить множество других действий, чтобы хост предоставил вам 16 выходных каналов (при условии, что он это поддерживает). Вероятно, в какой-то момент вам потребуется вызвать getSpeakerArrangement() и setSpeakerArrangement(), а также переопределить getOutputProperties().

Что касается MIDI-каналов, хост не должен относиться к ним иначе, чем обычно. Вам будут доставлены обычные MIDI-события в виде VstMidiEvents, которые будут содержать обычные MIDI-данные (т. е. для всех 16 каналов, если так выберет пользователь). Это самая простая часть - это настройка выходов, вот в чем хитрость.

person Nik Reiman    schedule 26.05.2011
comment
Я полагаю, вы знаете, как работает Kontakt. Как настроить vst так, чтобы каждый миди-канал можно было отправить на другой канал внутри vst? - person Daniel Rodrigues; 26.05.2011
comment
Все midi-события отправляются вместе. Вручную разделите входящие MIDI-события в соответствии с номером канала. - person Shannon Matthews; 27.05.2011
comment
Что сказал @Shannon. ;) По сути, вы берете младший полубайт из байта состояния, чтобы получить канал и отправить его соответствующему голосу. То, как вы обрабатываете 16 каналов, является частью внутреннего дизайна вашего плагина и не имеет ничего общего с фреймворком VST в целом. - person Nik Reiman; 27.05.2011
comment
@Ник, ты не знаешь, есть ли доступный пример кода. Я хотел бы посмотреть, на что это может быть похоже. - person Daniel Rodrigues; 27.05.2011
comment
@Daniel, посмотри здесь: gweep.net/~prefect/eng/ reference/protocol/midispec.html А здесь: srm.com/qtma/davidsmidispec. html - person Brad; 27.05.2011
comment
Итак, я разобрался с основами. Не мне интересно, как можно назначить каждый миди-канал на аудиовыход. (Midi Ch. 1 - Audio Ch. 1, Midi Ch. 2 - Audio Ch. 2 и т. д.) Любые мысли? - person Daniel Rodrigues; 03.06.2011