OSCII-bot. Помощь в настройке скрипта с нуля

  • Автор темы Автор темы Удалённый пользователь 75985
  • Дата начала Дата начала
У

Удалённый пользователь 75985

Guest
Приветствую.
У Джастина в арсенале есть небольшая утилита для рипера. Называется OSCII-bot. Это бридж MIDI<>OSC, который висит в трее и занимается конвертацией входящих и исходящих midi и osc сообщений в фоне.
У меня была мысль использовать OSCII-bot для того, чтобы получить фидбек на контроллере Novation Remote (лампочки, экран) от Рипера, который, как известно, не умеет midi фидбек, но может отдавать его через osc.
Даже создал тему на оф. форуме, но она вылилась в стороннее приложение Transformator, созданное автором похожего бриджа для Bitwig на Max.
Хотелось бы, все-таки, иметь возможность настраивать контроллер самостоятельно, а не использовать чужие шаблоны.
Собственно, ищу человека, который знаком с оскиботом и может подсказать, с чего начать.



P.S. Тема на оф. форуме, для ознакомления.
 
А не проще ли весь нужный интерфейс сделать на Lemur на iPad-е, который полностью поддерживает OSC протокол?
А с OSCII-bot наверное можно разобраться....., не знаю... Нужно глянуть.
 
В целом, наверное, проще. Тем более, что есть шаблон Binder от Викторовича почти удобный.
Но, планшет не даёт того удобства, что реальные ручки и фэйдеры. Как дополнение к железке - весьма.
Давайте глянем)
 
Отлично. Лучше всего смотреть сразу на неофициальный форк с поддержкой SYSEX.
 
В общем-то язык почти понятен, много общего с JS и eel скриптами...., но блин я прям сразу упёрся в инициализацию входов и выходов...., ни какого описания нет, блин.
 
Инициализация вручную. Примерно так.

@input midi_input1 MIDI "MIDIIN2 (SL MkII)"
@input OSC_IN OSC "localhost:9000"
@Output OSC_to_REAPER OSC "0.0.0.0:8000" 1024 0
@Output midi_output1 MIDI "MIDIOUT2 (SL MkII)"

То есть, нужно точно переписать название midi-порта своего контроллера.

Тут референс по коду. А тут немного конфигов которые я собрал с оф. форума, чтобы было, с чем сравнивать.
 
Последнее редактирование модератором:
Не получается у меня переписать точно, не ясно от куда переписывать....
Я скачал тестовые скрипты, мне в них многое понятно, так как с JS разбирался.....
Но вот тупо заставить "услышать" мою мотушку не могу...
 
Последнее редактирование:
Я переписывал прямо отсюда:
36ZzLut.jpg
 
Да, я тоже - не пашет.
Ну вот как строка инициализации миди фхода выглядеть должна для вашего Teency MIDI?
 
До Teensy пока руки не доходили, но, полагаю, вот так:
@input midi_input1 MIDI "Teensy MIDI"

Вы пробовали собственно перевести сначала контроллер в рипере в disabled, чтобы не было конфликтов с Рипером?
 
Да, пробовал....
Возможно где-то ошибку делал.
Попробую ещё завтра..., сегодня уже вне компа.
 
Попробую поразбираться с MIDI2OSC-II.txt
В нём, вроде, по-другому немного инициализируется порт.
Вот так работает. По крайней мере, адрес справа от кнопки Quit в оскиботе меняется при нажатии кнопок на контроллере:
X3aUo5N.png


devicenameforcode можно любой, как я понял. Лишь бы не повторялся.
[DOUBLEPOST=1445028687,1445027984][/DOUBLEPOST]А это вариант с клавишами. Причём, оскибот показывает сообщения с обоих портов контроллера (клавиши и кнопки\фэйдеры) при отключенном режиме automap. При включенном - только клавиши (их порт как раз указан в конфиге). Рипер же, вне зависимости от состояния automap, слышит только клавиши.
RPyNijL.png
 
Да! Вроде разобрался немного - пашет.
Как минимум внешние миди в OSC принимаемые Рипером конвертит как-то.
И да! с портами эта штука как-то по своему работает.... Нужно копать.
У меня Мотушка многопортовая, если пишу любое имя в "" - Осцибот видит только Первый порт Мотухи - Express 128, если пишу имя именно нужного мне порта, например второго - Express 128: Port 2 --
то он принимает сигналы от всех портов и от первого тоже.
PS: С портами вроде разобрался -
Они там пишут -
Uncomment as many lines as you need virtual MIDI cables (i.e. ports) - and match nbinputs var below!
//@input in1 "In From MIDI Yoke: 1"
//@input in2 "In From MIDI Yoke: 2"


Так что если нужно получать сигнал только по второму порту, то в моём случаи нужно писать так -
PHP:
    //@input in1 MIDI "Express  128: Port 1" [skip]
    @input in2 MIDI "Express  128: Port 2" [skip]
А если с обоих -
PHP:
    @input in1 MIDI "Express  128: Port 1" [skip]
    @input in2 MIDI "Express  128: Port 2" [skip]

Output, если комп в сети и хотим принимать в Рипер сконверченные прогой MIDI в OSC нужно писать -

PHP:
@output localhost OSC "10.10.10.201:8000" 0 0

где 10.10.10.201 - адрес компа на котором всё это происходит, а :8000 - порт входной, который нужно указать в Рипере в OSC настройках.
 
Последнее редактирование:
Всё это у меня работает, в принципе. На последнем скриншоте показал "Listen" из настроек Control Surface в Рипере.
У Novation три порта. Первый - клавиши, питч, модуляция. Второй - фэйдеры, кнопки, поты, энкодеры, подсветка и экран (последние два на вход). Третий порт - виртуальный. Через него с контроллером общается программа Automap на компьютере. Увидеть этот порт просто так не получится. Видел как в линуксе его сделали реальным и добавили свою настраиваемую реализацию Automap.
В случае с виндой есть только один вариант - использовать второй порт. При этом, контроллер нужно перевести в режим Ableton. Есть у него отдельный шаблон такой для работы аблетона с автомапом.
Первая проблема заключается в том, что нужно инициализовать контроллер в режиме аблетон-автомап, чтобы он начал принимать данные фидбека от хоста. Что-то вроде приветственного хэндшейка.
Как выглядит хэндшейк можно посмотреть в MIDI Programmers Reference . Именно с тем, чтобы держать контроллер в состоянии онлайн, пока запущен оскибот, и заключается моя основная проблема.
То видео из первого поста - удалось заставить работать следующим образом - через midi-ox отправить хэндшейк в формате sysex контроллеру и после этого отсылать поток midi сообщений для анимации лампочек. Однако, стоит только нажать любую кнопку на контроллере, и на экране тут же появляется надпись "Ableton is OFFLINE".
Как я понимаю, хэндшейк нужно отправлять в режиме пинга контроллеру, чтобы тот постоянно знал о доступности хоста.
Никак не могу с этим разобраться.
Ну и вторая проблема, собственно, после того, как решится первая - написать скрипт для кастомного шаблона контроллера. В принципе, все MIDI команды для фидбека (лампочки, экран) мне известны. Добыты сначала методом проб и ошибок, а потом был найден мануал, где все команды указаны.
Содержимое тестового скрипта для оскибота меня, как не программиста, пугает, если честно. Не понимаю я вот такие конструкции:
Код:
            msg2<32 ? // MSB of CC pair?
            (
                idx = devidx*channel*szitem + msg2;
                buf[idx] = (buf[idx] & 0x7F) | (msg3<<7);

                // "arm" MSB timer
                buf[idx + idx_timers] = time + timermsb;
            )
 
  • Like
Реакции: «G~Li†ch»
@fundorin, я пока что только научился на своей AKAI MPK61 крутить её фейдерами фейдеры Рипера, что в общем по MIDI сделать было нельзя.
Вы явно продвинулись в понимании дальше :)
К сожалению моя AKAI MPK61 вообще не имеет чего-то, чтобы принимало внешний MIDI сигнал, возможно удастся разобраться как на её индикатор что-то принять.
С форматом sysex в общем не разбирался, ну если не считать написанного JS плага, в котором его можно было отфильтровывать (не пускать).

Вашу задачу видимо более-менее понимаю, но не имея под рукой вашего контролера могу только "умные" советы давать.....


Первая проблема заключается в том, что нужно инициализовать контроллер в режиме аблетон-автомап, чтобы он начал принимать данные фидбека от хоста. Что-то вроде приветственного хэндшейка.
Как выглядит хэндшейк можно посмотреть в MIDI Programmers Reference . Именно с тем, чтобы держать контроллер в состоянии онлайн, пока запущен оскибот, и заключается моя основная проблема.
То видео из первого поста - удалось заставить работать следующим образом - через midi-ox отправить хэндшейк в формате sysex контроллеру и после этого отсылать поток midi сообщений для анимации лампочек. Однако, стоит только нажать любую кнопку на контроллере, и на экране тут же появляется надпись "Ableton is OFFLINE".
Как я понимаю, хэндшейк нужно отправлять в режиме пинга контроллеру, чтобы тот постоянно знал о доступности хоста.
Никак не могу с этим разобраться.
Думаю тут некоторый конфлик!
Ваши лампочки ведь управляются и самим контролером, и для них сигналы контролера - приоритет.
Вы хотите, чтобы при сигнале из Рипера (когда вы там тот-же параметр крутанёте) лампочки показали правильное его положение, т.е. полный фидбэк -
Но тогда нужно, чтобы перед каждым миди сообщением сконвертированным из OSC Рипера в MIDI через OSCII-bot в ваш контролер приходил в начале тот самый приветственный хэндшейк, который переводит контролер в режим аблетон-автомап.
Тогда всё будет работать верно -
тронули ручку на контролере - ламочки вокруг него слушаются контролер, тронули эту-же крутилку в Рипере - контролер получил сообщение, которое заставляет его переключиться на приём миди сообщений и лампочки слушаются Рипер.
Думаю как-то так.

Теперь осталось в вашем скрипте сделать так, чтоб этот самый приветственный хэндшейк был началом любого MIDI сообщения.


Содержимое тестового скрипта для оскибота меня, как не программиста, пугает, если честно. Не понимаю я вот такие конструкции:
Код:
            msg2<32 ? // MSB of CC pair?
            (
                idx = devidx*channel*szitem + msg2;
                buf[idx] = (buf[idx] & 0x7F) | (msg3<<7);

                // "arm" MSB timer
                buf[idx + idx_timers] = time + timermsb;
            )
С этим можно потихоньку разобраться, код тот-же, что и в JS-е только новые операторы есть.
Базовые знания по MIDI можно почерпнуть тут -
http://www.midi.org/techspecs/midimessages.php

Я тоже не программист вообще и у меня это всё тоже по началу вызывало оторопь. :)
Особенно 16-и ричность MIDI сообщений.
А SysEx я в общем попробовал понять - и кинул.

PS: Кстати, для того, чтобы Рипер принимая OSC команды мог ими обучать Экшины и модуляции в FX-ах, нужно галочку в Control Surface Settings поставить на -
Allow binding messages to Reaper actions and FX learn
 
Последнее редактирование:
Теперь осталось в вашем скрипте сделать так, чтоб этот самый приветственный хэндшейк был началом любого MIDI сообщения.
Мне кажется это неправильно. Получится, что миди-порт, который итак не сильно быстрый, забивается лишним sysex постоянно.
Вряд ли в оригинале Automap так работает через скрытый порт.
Если что, Automap это как раз родной midi бридж от Novation. C мизерными возможностями по кастомизации.

Базовые знания по MIDI можно почерпнуть тут -
С MIDI более-менее знаком, т.к. писал прошивку для кастомного миди контроллера на базе Teensy.
Вот с кодом скрипта засада.
Попробую сначала сделать базовый рабочий скрипт, чтобы сообщение OFFLINE не появлялось в режиме Ableton'а при нажатии клавиш на контроллере и сообщения от второго порта бегали к риперу и обратно.
Если получится сделать - отпишу здесь и сможем перейти с настройке непосредственно поведения контроллера.
Пока что мозг лопается)
 
Мне кажется это неправильно. Получится, что миди-порт, который итак не сильно быстрый, забивается лишним sysex постоянно.
Не постоянно, а только когда вы тронете в Рипере привязанные к ручкам вашего контролера софтовые крутилки.
А как иначе ваш контролер должен понять, что теперь ему нужно лампочки включать не от ручек контролера, а от внешних миди сообщений?
И в Скрипте OSCII-bot-а можно очень конкретно указать только нужные сообщения.
[DOUBLEPOST=1445115653,1445115582][/DOUBLEPOST]
Пока что мозг лопается)
Это нормальное состояние при изучении скриптов :)
Почитайте ветку по скриптам в Рипере :)
 
Не постоянно, а только когда вы тронете в Рипере привязанные к ручкам вашего контролера софтовые крутилки.
то есть логика будет такой если я верно понимаю:

1. коснулся ручки
2. контроллер сказал оскиботу что он онлайн
3. оскибот сказал контроллеру что он тоже онлайн
4. оба довольны и работают

так?
 
Попробую сначала сделать базовый рабочий скрипт, чтобы сообщение OFFLINE не появлялось в режиме Ableton'а при нажатии клавиш на контроллере и сообщения от второго порта бегали к риперу и обратно.
Тут нужно просто в скрипте указать исключительное действие не по признаку порта, а по признаку активного контролера видимо.
 
Тут нужно просто в скрипте указать исключительное действие не по признаку порта, а по признаку активного контролера видимо.
Вот сейчас не понял)
Давайте я все-таки попробую разобраться самостоятельно с самой основой, чтобы вас не отвлекать. Пока основная проблема такая что тестовый скрипт показывает в рипере только данные с первого порта. То есть noteon-off, питч и модуляцию, но не CC.
 
то есть логика будет такой если я верно понимаю:
1. коснулся ручки
2. контроллер сказал оскиботу что он онлайн
3. оскибот сказал контроллеру что он тоже онлайн
4. оба довольны и работают
так?
Не совсем -
1. Коснулся ручки - контроллер сказал оскиботу что он Мастер и оскибот блокирует передачу сообщений в контролер по определённым MIDI сообщениям (по тем, для которых вам нужен фидбэк)
2. Коснулись тех самых софтовых крутилок в Рипере (по которым вам нужен в контролер фидбэк) - оскибот сказал контроллеру что он теперь Мастер и сообщения разблокирует, но перед сообщением отправляет контролеру то самое сообщение делающее его открытым на вход
3. оба переодически довольны и работают :)

Как то так
[DOUBLEPOST=1445116404,1445116157][/DOUBLEPOST]
Вот сейчас не понял)
В скрипте можно указать что делать если пришло сообщение note on/off, а что делать если пришло CC с конкретным диаппазоном или PC. Это не сложно - я расскажу, если не разберётесь.
В скрипте в общем можно с данными приходящими и уходящими делать всё что угодно и в математическом смысле и в логическом.
Пока основная проблема такая что тестовый скрипт показывает в рипере только данные с первого порта. То есть noteon-off, питч и модуляцию, но не CC.
Это значит, что вы в скрипте не включили второй порт - я выше написал как я это сделал для своей Мотушки.
 
Нашёл инициализирующее сообщение для ввода контроллера в режим получения данных. Умеют же они порт засирать.

Код:
F0 00 20 29 03 03 12 00 04 00
02 01 00 01 04
44 65 73 63 72 69 70 74
69 6F 6E 20 28 6C 65 66
74 20 62 6C 6F 63 6B 29
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
F7

F0 00 20 29 03 03 12 00 04 00
02 01 00 02 04
44 65 73 63 72 69 70 74
69 6F 6E 20 28 72 69 67
68 74 20 62 6C 6F 63 6B
29 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
F7

F0 00 20 29 03 03 12 00 04 00
02 01 00 03 04
56 61 6C 75 65 73 20 28
6C 65 66 74 20 62 6C 6F
63 6B 29 20 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
F7

F0 00 20 29 03 03 12 00 04 00
02 01 00 04 04
56 61 6C 75 65 73 20 28
72 69 67 68 74 20 62 6C
6F 63 6B 29 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
F7

F0 00 20 29 03 03 12 00 04 00
01 01
F7

(clear and reset lights and LEDs)

B0 5A 00
B0 5B 00
B0 67 01

Осталось понять, как это прикрутить в оскибота. По сути, нашёл все нужные команды для фидбека. Так что, можно начинать, наверное)
 
Последнее редактирование модератором:
  • Like
Реакции: «G~Li†ch» и Quadium
Чем вы его отманиторили?
Есть мониторы, которые умеют показывать сообщения в разных форматах.
 
Оно уже код. Это sysex сообщения.
Если нужно мониторить то Midi-OX. Ничего лучше под виндой нет, как мне кажется. По удобству конечно не самый лучший.
Код выше я не мониторил. Есть же мануалы. Выше я приводил ссылку на архив с мануалами. Там SYSEX коды по кусочкам разбираются.
Сам код взял из исходников проекта с гитхаба. Там товарищ сэмулировал Mackie на Python'е для Novation SL MkII Zero (контроллер без клавиатуры).
20091201143735.jpg
 
Та я понимаю, что это SySEX, я пока не понимаю как его послать скриптом.
Это серия SySex сообщений
И я не уверен, что вся серия нужна для того, чтоб контролер начал принимать нужные вам сообщения.
Также смущает раздел
PHP:
(clear and reset lights and LEDs)

B0 5A 00
B0 5B 00
B0 67 01

Вам не нужно ресетить значение, вам нужно его дополнять.
Иначе будет скачёк в показаниях.
Хотя это зависит от реализации в самом контролере

PS: Вы можете проверить это, что именно нужно для того, чтоб контролер переходил в режим приёма -
отправьте последовательно серии SySEX вами найденных из Рипера при помощи ReaControlMIDI - он умеет (внизу там Edit и ReSend) - ну и в Hardware Output трека поставить нужный порт (зарегистрировав его как активный в Рипере).
 
Последнее редактирование:
Тут можно скачать оскибот с поддержкой sysex. Оригинальный не умеет. Сейчас нагуглю, как применять...
Вот, собственно, мануал с командами.

Насчёт ледов не смущайтесь. дело в том, что каждый орган управления реагирует фидбеком не на свой CC а на отдельный.
Попробую пояснить. Допустим, есть одна крутилка. Передаёт в хост CC10. Назначаем её в рипере на последний "потроганный" контрол. Теперь, в зависимости от того, какую ручку в vst мы трогали последней, крутилка будет управлять этим параметром. Но, при этом, даже если хост будет отсылать в контроллер фидбек по CC10 - это ни на что не повлияет. Для фидбека используются отдельные СС.

Конкретно, вот эти:
jmDHygT.png

А вот эти CC контроллер передаёт в хост:
b8uLOE3.png

Ресет, всё же, нужен при старте. Это для того, чтобы старая индикация не мешала. Также, перед выводом информации на экран, делается сначала стирание, т.к. если не сделать, то новая информация будет выводиться поверх старой и, скажем, в той символьной ячейке, где должен быть пробел, будет проглядывать символ из предыдущего вывода.

SYSEX отправлять умею. С помощью вышеупомянутого Midi-Ox. И команду проверил. Работает. Размер команды такой большой оттого, что на экран выводится символов 30 приветственного текста.

Как можно заметить в видео из первого поста, кольца вокруг энкодеров имеют ещё дополнительные CC которые переключают режим отображения фидбека 0-127. В зависимости от того, в какой режим перевести один из энкодеров, он будет отображать фидбек по-разному. Это может быть полезно, например, когда регулируется панорама (лево-право) или линейное значение параметра.
CPD6gYW.png

По поводу дополнения вместо стирания хочу уточнить. Тот код исполняется один раз при старте контроллера. Это не пинг. А вот когда этот старт должен происходить мне пока непонятно.
По идее, при включении контроллера, он отсылает в миди порт sysex, мол, я онлайн. Значит на него и должна отзываться приведённая выше серия sysex сообщений от оскибота. Это в случае, когда сначала запускаем оскибот, а потом контроллер.
Если же наоборот, то оскибот должен первым делом спрашивать контроллер, онлайн ли тот (есть такая команда). При получении ответа, соответственно, также отсылать набор этих же sysex команд и переводить контроллер в режим automap, чтобы тот мог принимать фидбек.
Как-то так мне это видится.
 
Последнее редактирование модератором:
По отправке из скрипта SySex помог разобраться товарищ.... В общем да - по вашей ссылке описано тоже самое - но фиг без консультаций разберёщься....
Сейчас проверю и выложу код.
Но я бы для начала проверил - возможно контролер будет включаться на вход и не по этой длинной серии SySex сообщений.
То, что этот длинный SySex нужен при старте (с ресетом) - это понятно - но это только при старте. Потом скорее всего, для переключения контролера в режим приёма миди сообщений нужен один из этих SySex (междй F0 и F7) - но проверить это можете только вы.
Я сделаю код разбитый на отдельные SySex сообщения и их можно будет проверить как в целом, так и по отдельности.
Но от какого SySex контролер становится на приём - можете проверить и своим Midi-Ox, а можете и Риперовским ReaControlMIDI - как я писал выше.
[DOUBLEPOST=1445194323,1445191911][/DOUBLEPOST]По сути запись отправляемого SySex в скрипте выглядит так -
Для пред последнего из вашей серии -
PHP:
F0 00 20 29 03 03 12 00 04 00
01 01
F7
В скрипте будет -
PHP:
   buf = 800; //это выделение определённого кол-ва ячеек памяти с запасом
   buf[0] = 0xF0;
   buf[1] = 0x00;
   buf[2] = 0x20;
   buf[3] = 0x29;
   buf[4] = 0x03;
   buf[5] = 0x03;
   buf[6] = 0x12;
   buf[7] = 0x00;
   buf[8] = 0x04;
   buf[9] = 0x00;
   buf[10] = 0x01;
   buf[11] = 0x01;
   buf[12] = 0xF7;
   midisend_buf(midiOut2, buf, 13); // это запись данного SySex в матрицу buf5

[DOUBLEPOST=1445203539][/DOUBLEPOST]

PS: В общем я научился отправлять из скрипта SySex сообщение, попутно научился внешним миди сообщением (с фейдеров своей AKAI MPK) крутить фейдера Рипера через конвертацию в OSC.
Отправку SySex в скрипте повесил на приход midi сообщения с первого фейдера Akai, который по 16-ому каналу шлёт CC20 -

SySex002.gif

Можно двигаться дальше.
 
Последнее редактирование:
Отличный прогресс! Попробую завтра повторить ваши достижения. Как вывели наглядные логи в оскибот?
 
Отличный прогресс!
Спасибо!
Попробую завтра повторить ваши достижения.
В атаче скрипт мой
Как вывели наглядные логи в оскибот?
так подсмотрел в одном из вами выложенных - basic.txt
Вот эта часть кода это делает -
PHP:
@init
        function logMidi() (
        event=msg1 & 0xF0;
        chan = (msg1 & 0x0F) + 1;
        fDb = msg2;
        sDb = msg3;
        (event == 0x80) ? #eventId = "Note Off" :
        (event == 0x90) ? #eventId = "Note On" :
        (event == 0xA0) ? #eventId = "Polyphonic Aftertouch" :
        (event == 0xB0) ? #eventId = "Control Change" :
        (event == 0xC0) ? #eventId = "Program Change" :
        (event == 0xD0) ? #eventId = "Channel Aftertouch" :
        (event == 0xE0) ? #eventId = "Pitch Wheel Change" :
        (event == 0xF0) ? #eventId = "System Message";
        printf("\n----------------------------------\nIncoming MIDI...\nEvent: %s\nChannel: %u\nFirst Data Byte: %u\nSecond Data Byte: %u\n",#eventId, chan,fDb,sDb);
        );

@midimsg
        logMidi();
 

Вложения

Сейчас просматривают