JSFX конвертёр CV в MIDI (1 онлайн

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Привет.
Я использую Reaktor для всего рутинга в проекте (CV с главного клока, секвенсоров и всего такого вместо фактического клока REAPER и MIDI в привычном понимании). То есть аудио посылами я шлю непосредственно импульсы (clock, gate) или другой сигнал (pitch, velocity, автоматика и так далее) между треками. Используя только инстанции Reaktor со всем этим проблем нет. Однако при отправлении MIDI на другие синты из Reaktor возникла пара проблем.

1) Периодически Reaktor случайным образом перестаёт отправлять MIDI из себя. Решается перезапуском проекта. Тем не менее, наблюдаются проблемы с дрейфом времени отправки сообщений. Так что эта идея отпадает. Возможно, я что-то упустил, и есть где-то в реакторе параметры синхронизации MIDI? Макро из блочной структуры выглядит так:

2) Пытаюсь нарисовать JSFX (первый раз с ними имею дело в качестве разработчика), который проделывает то же самое, взяв левый канал в качестве pitch, правый в качестве Gate (из источника разумеется рутинг соответствующий). Однако с дрифтом времени проблема та же. Вопрос: реально ли теоретически более жёстко закрепить клок MIDI, чтобы дрифт гулял на вменяемые значения в рамках конвертирования клока сэмплов в PPQ? Или это как с частотой обновления в ReaScript? Если я правильно понял, в блоке _@block MIDI рекомендовано, но в моём случае нужна большая точность и поэтому MIDI сообщения нужно отправлять напрямую из блока _@sample Касаемо JSFX всё выглядит так:
PHP:
desc:MPL_Test CV to MIDI
in_pin:left input
in_pin:right input
@init
  threshold_dB = -40;
  threshold = 10^(threshold_dB/20); // Gate threshold
@sample
  spl0=spl0;
  spl1=spl1;
  pitch = floor(spl0*120);
  cur_smpl = abs(spl1);
  (last_smpl < threshold) && (cur_smpl > threshold) ? midisend(0, $x90, pitch, 127); // send MIDI Note On
  (last_smpl > threshold) && (cur_smpl < threshold) ? midisend(10, $x80, pitch); // send MIDI Note Off
  last_smpl = cur_smpl;
 
Последнее редактирование:

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Да, спасибо за инфо.
Он использует редуцирование возможных сообщение аналогом реакторовского StepFilter (оценивать сигнал только при изменении значения сэмпла). Метод работает лучше, но, к сожалению, дрифт всё равно имеет место, видимо, от этого не уйти.
 

@Michael

Well-Known Member
14 Дек 2010
969
1.461
93
Орёл / Москва
Благодарю. Видел offset, но подумал, что он просто как задержка перед отправкой MIDI сообщения. Теперь всё работает, ещё раз спасибо!

PHP:
desc:MPL_CV to MIDI
@init
  threshold_dB = -80;
  threshold = 10^(threshold_dB/20); // Gate threshold
@block
  spl_cnt = 0;
@sample
  spl_cnt+=1;
  pitch = floor(spl0*120);
  cur_smpl = abs(spl1);
  cur_smpl > threshold ? (gate = 1 ):( gate = 0);
  (gate == 1 && last_gate != 1 && pitch > 0) ?
    midisend(spl_cnt, $x90, pitch, 127); // send MIDI Note On
  (gate == 0 && last_gate == 1)  ?
    pitch == 0 ? midisend(spl_cnt, $x80, last_pitch):midisend(spl_cnt, $x80, pitch); // send MIDI Note Off
  last_gate = gate;
  last_pitch = pitch;
 
Последнее редактирование:
  • Like
Реакции: Aleksandr Oleynik

Сейчас онлайн (Пользователей: 0, Гостей: 1)