VST SDK 2.4 Инструмент — процесс Заменить и обработать события

Пример: если я хочу воспроизвести звук на своем вскоре самодельном инструменте VST, и эта нота в секвенсоре имеет длину 15000 сэмплов, а нота устанавливается в значение processEvents, функция processReplace начинает воспроизводить звук с 0 до sampleFrames (это 10000 в моем примере здесь). Затем останется 5000 сэмплов для воспроизведения ноты в следующий раз, когда она войдет в цикл в processReplace, но, тем не менее, цикл будет воспроизводить от 0 до 10000, что на 5000 больше, чем сэмплов для воспроизведения с ноты. Будет воспроизведено 5000 сэмплов тишины, и это означает, что эта нота не будет отключена до 5000 сэмплов позже !?

Если новый звук в секвенсоре помещен непосредственно после первого, функция processReplace не увидит короткий период OFF, установленный processEvents, и увидит следующий семпл как непрерывный звук первого, потому что он увидит только новые ноты ON, когда цикл введен снова.

Как я могу предотвратить это?
Как я могу остановить цикл processReplace, если заметка заканчивается в середине цикла?

2

Решение

Я не уверен, что получу ваш вопрос, но вот удар.

Когда вы определили, какие звуки генерировать в processEvents из входящих событий нот Midi, следующий вызов processReplace должен сделать это. Таким образом, вам нужно внутреннее состояние, которое помнит заметки, которые были обнаружены в processEvents и должны быть выведены во время processReplace.

Когда продолжительность семпла (в вашем случае) больше, чем может поместиться буфер (sampleFrames), вы должны помнить, что вы делали и где вы были. В вашем примере 2/3 сэмпла были воспроизведены, и следующий processReplace должен воспроизвести последнюю 1/3 сэмпла.

Если (Midi) нота еще не выключена (вы не получили событие Midi note-off), вы должны решить, как VSTi-плагин, как вы будете это обрабатывать. Поэтому вы можете повторить тот же самый семпл и воспроизвести первую 1/3 его во втором вызове processEvents — и помните, что вам нужно будет воспроизвести остальную часть этого семпла позже.

Если вы получите сообщение об отключении Midi где-нибудь во время этого сценария — вам нужно будет сохранить внутреннее состояние (данные), которое указывает логике processReplace вашего плагина на остановку в нужный момент при воспроизведении этого семпла. Многие плагины используют ярлык и обрабатывают эту информацию в блоках сэмплов, равных sampleFrames буферов processReplace. Но если вы хотите быть точным, вы должны изучить deltaFrames входящего события ноты Midi и учесть это смещение при обработке processReplace.

Хост (DAW) определяет, когда он вызывает ваши методы processEvents и processReplace. Как правило, это будет продолжаться в течение всего времени жизни вашего плагина (экземпляра). Так что это ключ к поддержанию того внутреннего состояния того, что делает ваш плагин. Если он ничего не делает — вы не изменяете выходные буферы в любом случае (обнуление).

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

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]