Bome MIDI Translator Pro и BomeBox

dr-music

Well-Known Member
8 Апр 2007
2.877
6.006
113
Moscow
Bome MIDI Translator Pro — программа (€59), предназначенная для превращения одних MIDI-событий в другие MIDI-события, для превращения нажатия клавиш на компьютерной клавиатуре в MIDI-события и MIDI-событий в нажатия клавиш. Иными словами, программа, которая может заставить ваш MIDI-контроллер делать очень многое из того, что не предполагалось производителем контроллера. Win и Mac. Программа работает в реальном времени, задержки если и есть, то измеряются микросекундами. Создатель программы — один человек, Florian Bömers. Последние годы у него есть небольшая команда.

BomeBox — миникомпьютер, предназначенный прежде всего для использования на сцене, который может исполнять скрипты, написанные в программе Bome MIDI Translator, и к которому можно подключить MIDI-устройства и компьютерную клавиатуру напрямую.

Разместил тему в этом разделе, потому что программа теснейшим образом связана с использованием контроллеров. В разделе Музыкальный софт она потеряется, а будет жалко.

Я не являюсь обладателем BomeBox'а, а потому расскажу о работе самой программы. Как пример того, что мне удалось сделать с помощью этой программы, можно почитать здесь и здесь, но за два года я почти все забыл и в том коде уже сходу не разберусь. Для демонстрации возможностей я буду использовать скриптинг, над которым сейчас работаю.

Недавно мной была приобретена клавиатура Native Instruments Komplete Kontrol M32 — самая маленькая из линейки. Задачи на нее возлагаются две: 1) управлять синтезаторами во время аранжировочных MIDI-сессий (как это и предполагается производителем), 2) быть генератором горячих клавиш в нотном редакторе Дорико, на который я плотно подсел, и который уже обладает внушительным функционалом и многострочными меню — мышкой не наелозишься, а свободных клавиш под хоткеи давно уже не осталось. Именно эта модель была выбрана из-за ее маленького размера, что для меня критично.

Начнем, пожалуй. Первое, что нужно сделать в программе, это создать виртуальные миди-каналы. В отличие от других виртуальных миди-соединялок (loopMIDI и т.п.), эти всегда одним концом присоединены к Bome MIDI Транслятору. Bome умеет перехватывать сообщения с любых миди-портов в системе, и каждый из ее собственных портов виден в любой DAW. Мне нужно будет два таких канала, BMT1 и BMT2. Причем, Inputs я использовать не буду, только Outputs.
Моя предварительная настройка такая: в Кубейсе я разрешу в MIDI-Inputs порт BMT1, а BMT2 и «KK M32 MIDI» запрещу. Если последний не запретить, то все, сыгранное на M32, будет приходить в Кубейс в двух копиях — по родному MIDI-каналу KK M32 MIDI и из Bome по BMT1 (это важно для понимания, как оно все работает). Порт KK m32 DAW (второй миди-порт этой клавиатуры) в любом случае останется, именно по нему идут сообщения от ручек и кнопок, и проблем с рулением синтами у меня не будет. При такой настройке играть с M32 Кубейс будет только то, что Bome ему пришлет (или перешлет). В Дорико же, который я запускаю параллельно с Кубейсом, будут запрещены все порты из перечисленных, кроме BMT2.

Основное окно программы выглядит так:
171224


В средней части экрана показаны Трансляторы — минимальные логические элементы, превращающие одно событие в другое. Их содержимое (и место, где, собственно, пишется код) показывается в правой части экрана (на рисунок не вошло). Трансляторов в коде может быть несколько сотен и даже тысяч, поэтому для удобства они объединяются в Пресеты, список пресетов находится в левой части экрана. На картинке в середине экрана видны только трансляторы, относящиеся к пресету Game, который в настоящее время неактивен (не работает, галочка снята). Любой Транслятор или Пресет может быть в любой момент активирован или деактивирован как вручную, так и командой с другого Транслятора.

Что касается музыкантов. Каждому Транслятору может быть назначен свой MIDI-порт на вход и на выход. Но чтобы не проделывать многократно одну и ту же процедуру, MIDI вход и выход может быть назначен на Пресет, и тогда в каждом Трансляторе внутри этого Пресета они будут стоять по умолчанию (разумеется, их можно в любой момент переназначить). Точно также, но уровнем выше можно назначить дефолтные MIDI In и Out на весь проект, и тогда не придется проделывать процедуру назначения портов для каждого Пресета, если они не меняются. В моем проекте я ставлю по умолчанию на вход KK M32 MIDI (перехват сообщений с клавиатуры), а на выход BMT2 — подавляющее большинство моих Трансляторов будут отсылать команды в Дорико, а не в Кубейс. В тех Трансляторах или Пресетах, где мне нужно будет что-то отправить в Кубейс, я переназначу Out на BMT1.

Создаем пресет, назовем его SET, и в нем создадим первый транслятор.
Код:
[x] Translator 0.0: Set variables
Options: stop
Incoming: Project Opened
Rules:
  yb=2
  //yb - PitchBend state (1=Dn,2=middle,3=Up)
  ym=1
  //ym - Modulation state (1=Dn,2=middle,3=Up)
  ys=1
  //ys - Sustain state (1=Up,2=Down)
Outgoing: (none)
«Set variables» (установка переменных) — такое имя пресету дал я сам. Номер 0.0 говорит о том, что это пресет #0, транслятор #0, номер будет автоматически меняться, если пресеты/трансляторы перемещать. Входящее событие — Открытие проекта (запуск Bome), пресет будет выполнен при запуске программы. Опция Stop говорит о том, что он должен перестать работать после разового исполнения. Исходящего события у это Транслятора нет, он ничего никуда не посылает.

О переменных (variables). В Bome есть два типа переменных — глобальные, при помощи которых Трансляторы обмениваются информацией между собой, и локальные, которые на каждое входящие MIDI событие генерируются заново. Глобальные состоят из двух разных букв или цифр, локальные из двух одинаковых букв. Не все сочетания разрешены, но об этом можно легко прочитать в мануале.

Теперь о главном, о том, что я вписал в правила (Rules) этого Транслятора. Сейчас, сейчас все начнет проясняться.
Поскольку у клавиатуры KK M32 всего 32 клавиши, а мне нужно добыть значительно больше хоткеев, то придумана следующая вещь. Полоска модуляции (или тач-стрип) — она вместо колеса в этой модели — будет использоваться как клавиша Shift, только у нее будет три положения — нижнее (1), среднее (2), верхнее (3). И в зависимости от того, где я коснулся полоски в последний раз, клавиатура будет выдавать разные хоткеи. То же самое с полоской питч-бенда (не используется пока) — три положения, и педали сустейн — два положения. Для того, чтобы происходила фиксация последнего действия с полосками и педалью, эти переменные и задаются: yb — для питчбенда (далее PB), ym — для модуляции (далее MW), ys — для сустейна (далее SP). И им сразу присвоены значения по умолчанию — нижнее для MW, среднее для PB, педаль отпущена — для SP. Строки, начинающиеся с двойного слэша, являются в Bome комментариями и никак на работу кода не влияют. Собственно, только что я пересказал содержимое этих строк-комментариев.

Сочиним следующий Транслятор. На примере MW посмотрим, как я буду менять значение переменной ym.
Код:
[x] Translator 1.1: ModWheel SET
Options: swallow
Incoming: Control Change on ch. 1 with CC#:1 (0x01) and any value set 'pp' to value, on port KOMPLETE KONTROL M32 MIDI
Rules:
  if pp<30 then Goto "MW Down"
  if pp>100 then Goto "MW Up"
  ym=2
  Goto "end"
  Label "MW Down"
  ym=1
  Goto "end"
  Label "MW Up"
  ym=3
  Goto "end"
  Label "end"
Outgoing: (none)

Разберем. Опция «swallow» означает, что входящее MIDI-сообщение будет «сожрано», т.е. не будет переслано дальше в оригинальном виде. Эта опция стоит по умолчанию и крайне редко приходится ее менять. Если ее убрать, то на выходе будет и оригинальное, и переделанное сообщение.
Этот Транслятор я поместил уже в следующий пресет, так как предыдущему я задавал в свойствах переставать работать после разового выполнения.
Входящее событие (Incoming) здесь — СС1, которое и генерируется колесом модуляции. На другие MIDI-события этот Транслятор реагировать не будет. Вместо значения уровня СС1 я вписал локальную переменную pp. Это означает, что если пришло сообщение СС1=15, то pp станет равно 15-ти, и дальше с этим числом можно что-то делать. Следующее входящее сообщение СС1 даст свое (новое) значение pp, и т.д.
Полоска PB разбита у меня на три зоны — 0–29, 30–100 и 101–127. Транслятор в первой строке сравнивает значение pp с числом (pp<30), и если оно соответствует условию, то происходит переход к секции «MW Down», где происходит назначение переменной ym значения «1», и дальше идет переход к секции «еnd».
Если значение pp не соответствует первой строке Транслятора, оно идет на обработку во вторую строку. Если pp подходит под условие строки (pp>100), то выполняется переход к секции «MW Up», где переменная ym станет равна «3», и дальше — переход к секции «еnd».
Если pp не соответствует условию и второй строки, то это означает, что pp принадлежит к средней зоне, и мы сразу присваиваем переменной ym значение «2» и переходим к секции «еnd» (в которой ничего нет).

Что делает этот транслятор: если я проведу пальцем по полоске MW от самого начала до самого конца, этот Транслятор обработает команду СС1 128 раз, и 128 раз перезапишет переменную ym, давая ей всего три разных значения. Транслятор для регистрации текущего положения питчбенда построен точно так же, только входящее событие у него другое и на выходе перезаписывается переменная yb.

Предлагаю самим посмотреть, как происходит регистрация положения педали. Отличие здесь только в том, что в Bome можно указывать входящие события не только в формате «тип MIDI-сообщения», а еще и в шестнадцатиричном формате «raw MIDI» (голый поток MIDI). Входящая последовательность «B0 40 pp» и означает контроллер (B0) #64 (40H — педаль сустейна) с любым значением (локальной переменной pp это любое значение и присваивается). Почти во всех случаях я при работе с Bome предпочитаю формат raw: он нагляднее, а цифирки выучиваются быстро.

Код:
[x] Translator 1.2: SustainPedal SET
Options: swallow
Incoming: MIDI B0 40 pp, on port KOMPLETE KONTROL M32 MIDI
Rules:
  if pp==127 then Goto "Sustain Down"
  ys=1
  Goto "end"
  Label "Sustain Down"
  ys=2
  Goto "end"
  Label "end"
Outgoing: (none)

(Не комментируйте пока, продолжение следует.)
 
Последнее редактирование:
Теперь у меня все готово для назначения горячих клавиш и MIDI-сообщений для управления Dorico. Дальнейший код состоит из нескольких десятков однотипных пресетов. Покажу несколько, и различия в них покажут возможности программы.

Код:
[x] Translator 11.21: D3 Alt-Shift-Left
Options: swallow
Incoming: MIDI 90 3E vv
Rules:
  if yb!=2 then exit rules, skip Outgoing Action
  if ym!=1 then exit rules, skip Outgoing Action
  if ys==2 then exit rules, skip Outgoing Action
Outgoing: Text: Alt(Shift(Left))

Входящее сообщение — Note ON, состоит из трех байт. Первый байт (90) обозначает, собственно, что это Note On, второй (3E) — что это нота D4, третий байт заменен локальной переменной vv, что означает любую велосити. В этом Трансляторе переменная vv обрабатываться (участвовать в математических и логических операциях) не будет, и будет каждый раз просто исчезать при завершении обработки текущего события Транслятором. Если я укажу в третьем байте число, то я буду обязан играть ноту только с этой скоростью, а я так, увы, не умею.

Смотрим теперь, что в правилах. Первая строка. Если переменная yb не равна двум, то правило выполнять не надо. То есть, если я в данный момент коснулся полоски PB и перевел ее в любое крайнее положение (тем самым приравняв yb к «1» или «3»), то этот Транслятор ничего на выходе не даст, не сработает. Вторая строка проверяет, в каком положении MW. Если не в нижнем, то Транслятор не сработает. Третья строка аналогично проверяет положение педали.
На выходе транслятора генерируется сочетание клавиш Alt-Shift-Left, выполняющее определенную функцию в программе Дорико.

Зачем нужно это сравнение переменных? Поставлю рядом код еще одного Транслятора для объяснения.
Код:
[x] Translator 12.21: D3 Make into System
Options: swallow
Incoming: MIDI 90 3E vv
Rules:
  if yb!=2 then exit rules, skip Outgoing Action
  if ym!=2 then exit rules, skip Outgoing Action
  if ys==2 then exit rules, skip Outgoing Action
Outgoing: Note On on ch. 1 with note:115 (0x73) and velocity:127 (0x7F)

Этот Транслятор на входе имеет ту же самую ноту D4, но условия другие: MW должен находиться в среднем положении, только тогда Транслятор что-то выдаст на выход. Этот транслятор выдает ноту G8, которая в Дорико включает функцию «Make into System» (настраивается при помощи MIDI learn в самом нотном редакторе).

Итого, если смотреть на два последних транслятора: играем одну и ту же ноту, но получаем разный результат. Только с использованием PB и MW мы получаем 6 этажей горячих клавиш. 32 клавиши * 6 этажей = 192 штук. Куда больше-то! На самом деле PB мною пока не используется, просто запрограммирован. Позже придумаю какие-нибудь служебные функции для него.

По поводу генерации нажатия клавиш компьютерной клавиатуры. Нажатие клавиш из Bome передается в ту программу, окно которой активно (в фокусе). Если я перейду в текстовый редактор, то он тоже будет получать клавиатурные команды. Не очень удобно, но... Но, во-первых, едва ли я стану играть на этой маленькой клавиатуре, находясь в текстовом редакторе (для игры у меня есть клавиатура посолиднее). Во-вторых, в версии Bome под Windows есть экспериментальный режим инжекции, когда текстовые указания отправляются прямо в указанную программу через Windows API. Но далеко не со всеми программами этот режим работает.

Кстати, Bome умеет генерировать текстовые команды в разных режимах. 1) Text (основной режим) — будут сгенерированы нужные символы, а какая раскладка (русская, английская или еще какая) в данный момент включена — не имеет значения. 2) Physical keys — будут сгенерированы нажатия физических клавиш, а символы будут зависеть от текущей раскладки. 3) Down — будет генерироваться только движение клавиши вниз (с возможностью включения повтора — как если бы я нажал клавишу и удерживал ее). 4) Up — сгенерируется отпускание клавиши. Большой простор для экспериментов.

А вот как я обошелся с педалью сустейна.
Код:
[x] Preset 14: Sus=2
Default MIDI IN ports:   KK
Default MIDI OUT ports:  Bome Virtual Port 1

[x] Translator 14.0: any note ON
Options: swallow
Incoming: MIDI 90 ss pp
Rules: if ys==1 then exit rules, skip Outgoing Action
Outgoing: MIDI 90 ss pp

[x] Translator 14.1: any note OFF
Options: swallow
Incoming: MIDI 80 ss pp
Rules: if ys==1 then exit rules, skip Outgoing Action
Outgoing: MIDI 80 ss pp

Это отдельный пресет, и у него выход назначен на BMP1 (т.е. в Кубейс). В Пресете два Транслятора, они одинаковы, но один обрабатывает команду Note On, другой Note Off. На выходе у них то же, что и на входе, т.е. что играешь, то в Кубейс и пойдет. Но Bome будет пропускать ноты через эти трансляторы только тогда, когда SP нажата.
Кстати, вместо ys==1 можно было бы написать и ys!=2 (не равно двум), и ys<2 (меньше двух, т.к. ys=0 в этом скрипте не встречается) — возможностей много.
Смысл этого Пресета, коротко: не нажата педаль — идут управляющие команды, нажата — можно играть нотки. У меня под столом блок из двух педалей, вторую из которых раньше и подключить-то было некуда. Теперь работает.

В заключении несколько примеров куда более сложных трансляторов собственного сочинения из кода для Steinberg CMC-FD. Без объяснения, что они делают, уж извините. Но кто не чужд программирования, увидит и булевы операторы, и арифметику, и использование большого количества локальных переменных, и использование таймеров (отдельная большая тема), и SysEx сообщения.
Непрограммистским же людям скажу, что Bome, во-первых, проверяет синтаксис, подсвечивая ошибки, а во-вторых, имеет встроенный конструктор для построения строчек кода. От руки фразы вроде «then exit rules, skip Outgoing Action» писать не приходится.

Код:
[x] Translator 3.8: Animation 1
Incoming: On timer "Animation 1"
Rules:
  if ku>=27 then ku=0
  rr=ku
  ku=ku+1
  if rr<=12 then rr=ku
  if rr==26 then skip next rule
  if rr>12 then rr=26-rr
  // ========
  if k9==1 then vv=kd
  if k9==2 then vv=kh
  if k9==3 then vv=k8
  vv=vv/10
  vv=vv+1
  if rr==26 then rr=vv
  // ========
  // if k9==1 then oo=233
  // if k9==2 then oo=227
  // if k9==3 then oo=233
  // if k9==1 then pp=51
  // if k9==2 then pp=0
  // if k9==3 then pp=51
  // oo pp rr
Outgoing: MIDI E9 33 rr
Код:
[x] Translator 3.18: Shift+Button 3 – User CC (2, 5, 7, 10)
Options: swallow
Incoming: MIDI 90 2E 7F
Rules:
  if k0!=127 then exit rules, skip Outgoing Action
  k1=m5
  k2=m6
  k3=m7
  k4=m8
  k9=3
  kt=127
  //================
  pp=k5
  pp=pp/10
  pp=pp+1
  qq=k6
  qq=qq/10
  qq=qq+1
  rr=k7
  rr=rr/10
  rr=rr+1
  ss=k8
  ss=ss/10
  ss=ss+1
Outgoing: MIDI F0 43 10 3E 18 00 01 02 01 F7 E9 03 pp E9 13 qq E9 23 rr E9 33 ss
Код:
[x] Translator 3.51: Animation 2
Incoming: On timer "Animation 2"
Rules:
  if kv>=12 then kv=0
  rr=kv
  kv=kv+1
  rr=rr%4
  if k9==1 then tt=kc
  if k9==2 then tt=kg
  if k9==3 then tt=k7
  tt=tt/10
  tt=tt+1
  if rr==1 then ss=tt
  if rr==2 then ss=1
  if rr==3 then ss=tt
  if rr==0 then ss=13
Outgoing: MIDI E9 23 ss
Код:
[x] Translator 7.13: Shift+Button 2 - toggle backlight On (Jump) /Off (Catch)
Options: swallow
Incoming: MIDI 90 31 7F
Rules:
  if g0!=127 then exit rules, execute Outgoing Action
  if g2==0 then vv=1
  if g2==127 then vv=0
  g2=g2^127
  if g1==0 then ww=1
  if g1==127 then ww=0
  g1=g1^127
  // F0 43 10 3E 18 00 01 02 01 F7 - to enable dimming
  // F0 43 10 3E 18 00 01 02 00 F7 - to disable dimming
  //Catch: F0 43 10 3E 18 00 01 01 01 F7
  //Jump: F0 43 10 3E 18 00 01 01 00 F7
Outgoing: MIDI F0 43 10 3E 18 00 01 02 vv F7 F0 43 10 3E 18 00 01 01 ww F7

На этом вводный курс закончен. Все не так сложно, через неделю знакомства с программой скрипты в голове сами сочиняются. Дерзайте, смелые!
 
Последнее редактирование:
Эдак не долго и на рипер пересесть..
Не-а! Я Рипером переболел по молодости и ныне — как это слово-то... вакцинирован, во!
Еще до VePRO у меня второй комп работал сервером под Рипером через VST System Link. Отлично работал, кстати.
 
@dr-music, но нормальный человек не может просто так взять и написать вот это:

[x] Preset 14: Sus=2
Default MIDI IN ports: KK
Default MIDI OUT ports: Bome Virtual Port 1

[x] Translator 14.0: any note ON
Options: swallow
Incoming: MIDI 90 ss pp
Rules: if ys==1 then exit rules, skip Outgoing Action
Outgoing: MIDI 90 ss pp

[x] Translator 14.1: any note OFF
Options: swallow
Incoming: MIDI 80 ss pp
Rules: if ys==1 then exit rules, skip Outgoing Action
Outgoing: MIDI 80 ss pp


Нормальный человек хочет тыц тыц тыц и чтобы всё готово:Dle46:
[automerge]1574545704[/automerge]
Мне страшно
 
но нормальный человек не может
Ну, пусть я ненормальный. Но я же до того заплыва двухлетней давности ни одной строчки скрипта в жизни не написал, даже в Винворде.
Куча непрограммистского народа осваивает эту программу и сочиняет себе всякие удобные штуки. Для непрограммеров и сделано.

В голове сочиняются общие алгоритмы, когда возможности программы более-менее в голове уложились. А сам код — конечно только письменно.
 
Я в рипере ни одного скрипта не сделал, наслаждаюсь тем, что есть и не понимаю, как можно этим "переболеть") или другими словами, какая необходимость может заставить пересесть на что-то другое. Людей в основном красота интерефейса не устраивает, бросают даже не добравшись до сути.



По сабжу скажу, что люблю подобные штуки, но нужна какая-то конкретная задача, которой пока нет. В Дорико хоткеев пока хватает, клавиатурку хоть и хочу купить, но пока не купил...

Идея проги кажется интересной... Не могу пока представить всех возможностей, первое что в голову приходит - повесить на колесо фильтр...
 
Не могу пока представить всех возможностей
Фирма Роланд (емнип) во времена неустоявшегося MIDI-стандарта чудила с ПитчБендом, меняла местами старший и младший байт в своих устройствах. Вот достался кому-то такой древний синтезатор, а колесо питча нифига не работает, чушь посылает. И обратно не пошлешь ему питчбенд — не поймет. В Bome сие недоразумение исправляется примитивнейшим, вообще без «правил» скриптом, одинаковым и в сторону DAW, и обратно:
Код:
Incoming: MIDI E0 ss pp
Outgoing: MIDI E0 pp ss
Этот скрипт должен и в бесплатной (на самом деле просто очень старой) версии Bome работать.

Не обязательно же монструозные сборки делать.

А управление транспортом в DAW по remote MIDI, которое можно организовать практически с любого не очень нужного в хозяйстве миди-устройства? Да куча мелких задач может решаться.
 
Последнее редактирование:
  • Like
Реакции: Alex Longard и Antonio
@dr-music, благодарю за новый взгляд)))) Я эту софтину видел лет наверно десять назад, но тогда был примитивный функционал и на один мидиканал. С тех пор больше неинтересовался.
А после ваших скриптов руки чешуться привязать пару сотен контроллеров синта к мидиклаве, благо количество фейдеров, слайдеров и падов позволяют такой изврат))))
 
  • Like
Реакции: dr-music
руки чешутся привязать пару сотен контроллеров синта к мидиклаве
В Bome есть монитор MIDI-сообщений, и отловить, какие сообщения посылает клавиатура/синт/контроллер не представляет никакого труда. Сложности могут возникнуть в трех случаях.
а) Прибор в разных своих режимах (Voice или Combi в синтах, например) посылает разные команды со своих ручек и кнопок. Тогда либо придется усложнять (дублировать) скрипт, или просто помнить, что управлять DAW можно только в <таком-то> режиме (что неминуемо приведет к генерации матерных слов хозяином, если тот забыл вовремя переключиться).
б) Если нужно отлавливать обратные сигналы из DAW, а производитель приложил усилия, чтобы «закрыть» формат. Насколько я знаю, Маки Контрол (или Маки HUI?) так никто и не сымитировал полностью на «подмененной» аппаратуре, а этот протокол двусторонний, т.е. скрипт должен отловить команды из DAW в контроллер и отработать их. Когда я программировал скрипт для CMC-FD, столкнулся с тем, что в документации, в MIDI Implementation Chart есть ошибки (похожие на умышленные), и мне потребовалось несколько недель, чтобы нарыть в сети структуру используемых сообщений SysEX.
в) В маленьких (с малым числом управляющих элементов), но многофункциональных устройствах (каким и является CMC-FD) часть переключений режимов вообще происходит внутри, в микрокоде, а не в драйвере. Отловить эти переключения невозможно по определению, и какой-нибудь SysEx, вылетающий наружу при переключении, только сбивает с толку, поскольку не является переключалкой, а только сообщает драйверу: «Эй, драйвер! Я сам тут переключился, знай об этом!»

А в случае generic MIDI устройствами проблем вообще нет.
 
@dr-music, у меня версия translator classic, чуть позже поставлю и поковыряю.
У меня миди клава Akai mpk, она передает MMC и CC сообщения, по крайней мере MidiMonitor и Reamidi все эти сообщения ловят.

Я одно время в Reaper писал свой транслятор миди-сообщений для синта, но забил на него болт из-за нехватки свободного времени на хобби с музыкой...
 
@Alex_028, на Translator Classic, увы, далеко не уедешь: виртуальных MIDI-портов нет, правил (секции rules) нет.
Помещу-ка сюда ссылку на таблицу сравнения версий. Classic хоть и бесплатен для некоммерческого использования, но не умеет практически ничего. Pro мне нравится тем, что это офигенский конструктор для взрослых, но неповзрослевших мальчиков. Когда лампочки на контроллере начинают приветственно мигать по алгоритму, который ты вчера четыре часа отлаживал, это отдельный кайф. К музыке, впрочем, отношения не имеющий :)
 
  • Like
Реакции: Alex Longard
@dr-music, ну я выше уже писал что щупал translator classic лет десять назад, он у меня с тех пор на диске с древним музсофтом сохранился, и к моему удивлению даже работает на моей десятке)))
Табличку листал вчера, но для старта функционала хватит, а потом посмотрю в сторону Pro.
 
@dr-music, Приветствую! Уже создал тему по привязке KK M32 к Sibelius, но там тишина. Надеюсь, Вы, как продвинутый пользователь этой клавиатуры и Bome Translator мне сможете помочь.
Пока самое обидное то, что NI не могут сделать нормальную прошивку для КК М32, чтобы в режиме midi работали ВСЕ кнопки, которые передавали бы миди-сообщения, но как видно в Bome, больше половины не работает, в отличии когда мы подключаемся к DAW. Но это ведь в первую очередь МИДИ-котроллер, который обязан работать полноценно не только с софтом NI. А так ведь хотелось назначить все кнопки (левой части девайса) на keypad Сибелиуса, чтобы мышкой не тыкать.
Теперь приходится в Bome на крутили назначать эти все функции.
И вот собственно вопрос. Где Вы код пишете? И зачем? Ведь любые команды можно назначить в самом трансляторе?
Спасибо!
 
@mcvall, доброй ночи!
Расскажу, как оно у меня устроено.
а) Клавиатура M32 у меня не основная, и она покупалась прежде всего для горячих клавиш, а уже во-вторую очередь для использования по назначению (крутить синтами, вбивать нотки и проч.).
б) Я не работал никогда в Сибелиусе и, надеюсь, никогда не придется, так что по Сибу я не советчик. У меня с Дорико неземной роман...
А у Дорико есть свои особенности, и не все из них радуют.
в) Во-первых, пока очень слабо реализован механизм вызова функций из меню по миди, а именно:
— нет возможности выбирать канал входящего миди-события;
— у СС не распознается второй байт. Это означает, что я могу назначить выполнение одной команды на СС71 (с любым значением, без возможности выбора), выполнение другой на СС72, но не могу назначить для первой команды СС71=00, для второй СС71=01 и т.д. Если бы это было возможно, то я мог бы назначить на СС71 128 разных команд, а так приходится думать, какой контроллер мне точно не понадобится для других целей. Очень неудобно;
— нет возможности выделить отдельный миди-порт под управление, а потому ноты (события Note ON) для управления можно использовать только те, что за пределами 88-клавишной клавиатуры, а иначе они в нотный текст будут попадать.
Короче, миди-управление в Дорико пока не фича, а затычка, которую даже ругать лень. Не дошли у дорикан еще руки.
г) Зато в Дорико есть возможность очень и очень многое ввести в текстовом режиме через систему поп-оверов (маленьких всплывающих окон). Чтобы приделать к ноте, например, мордент, я могу набрать Shift-O ► mordent ► Enter ► Enter. Это не самый быстрый (и не единственный) способ, но он дает возможность иметь в арсенале неограниченное количество символов: назначаешь символу текст, а потом вызываешь им функцию. Для супер-профи это очень хорошо, потому что никаких обычных горячих клавиш на это не хватит.
д) И вот тут мы подходим к одной особенности Боме Транслятора: БТ умеет полученное миди-сообщение (любое) превращать в текст. Простейшим скриптом я превращаю нажатие одной клавиши на NI M32 в текст «Shift-O ► mordent ► Enter ► Enter». Один раз назначаешь самые употребительные обозначения, штрихи, исполнительские техники, темпы, что угодно, и дальше вводишь их нажатием одной клавиши. А над компьютером у меня пока висит распечатка-напоминалка.
Возможность перевода миди в текст это уже уважительная (для меня) причина использовать скрипты БТ.
е) Вторая причина. Полоска ModWheel у меня используется как трехпозиционный Shift. Скрипт определяет, где я коснулся полоски последний раз — вверху, внизу или в середине, причем касаться можно достаточно небрежно. И у меня получается как бы не 32 клавиши, а 96. При сохранении компактного размера.
ж) Так же, как еще один Shift, только моментально возвращающийся в среднее положение, используется и полоска PitchBend. А это еще 96 виртуальных клавиш и еще один довод в пользу БТ.
з) NI M32 у меня не предназначена для непосредственного ввода нот. Но если мне все же придется когда-то работать без «основной» миди-клавиатуры, то для этого придумана такая фишка (не факт, что удобная, но — пока так; в принципе, можно переназначить как угодно позже): я нажатием педали Sustain отключаю все скрипты и могу вводить ноты в Дорико (или в Кубейс — куда угодно), а с отпусканием педали скрипты снова работают, а ноты не попадают на нотный стан или миди-дорожку.
и) Я запрограммировал почти все функции, что мне нужны, но в целом неверно оценил, что будет надобиться чаще, а что реже, а потому все эти мини-скриптики еще предстоит подвигать по клавишам, поменять местами. В связи с эмиграцией на дачу всей семьи от произвола Собянинских ментов и необходимостью обеспечивать онлайн учебный процесс кучи детей, сейчас мне малость не до доделки скрипта. Но я могу выложить код as is с тем, чтобы можно было поворовать идеи оттуда.
И вот собственно вопрос. Где Вы код пишете? И зачем? Ведь любые команды можно назначить в самом трансляторе?
Не знаю, ответил ли я уже на вопрос. Я использую переменные, фиксирующие положение MW, PB, Sustain, и эти переменные являются условиями для выполнения или отказа от выполнения того или иного транслятора. В зависимости от текущего значения этих переменных, в ответ на нажатие одной и той же клавиши на M32 (одно и тоже входящее событие Note ON) генерируются разные исходящие миди- или текстовые команды. Разумеется, я пользуюсь полной версией БТ, а не бесплатным недоразумением из прошлого века.
 
  • Like
Реакции: mcvall
@dr-music, Спасибо большое за развернутый ответ! Я использую пока пробную версию Боме, она полностью рабочая, не урезанная, но только работает 20 минут и нужно перезапускать. Но если все будет получаться, то конечно куплю её.
Я просто ещё не совсем понимаю эти алгоритмы)) Что такое сс, yy, ну и т.д.
Пока всё, что получилось это на вход Боме давать команды с М32 и на выход назначать клавиши клавиатуры ПК, работает. Но как я говорил, кнопок мало активных на М32, поэтому интересна Ваша идея с Shift. Я пробовал на питч назначить, но нужно попадать пальцем точно в ту область, которую назначили в incoming. Ведь когда включаем захват миди и двигаем питч или модуляцию или энкодеры, у нас появляется множество миди сообщений. В питче например их от 0 до 8000. Я допустим назначил на 7500 грубо, и знаю, что примерно почти вверху нажимать нужно:) А может можно просто захват сделать от 2000 до 8000 и уже точно не промажешь) Вот здесь не подскажете как лучше?
 
работает 20 минут и нужно перезапускать
Вот это они пытку придумали. Ну хоть бы час дали! За 20 минут я ничего не успевал сделать и со злости купил, поняв, что эта пытка дороже обходится. Потом не разочаровался, конечно, но... осадок остался.

Надо разобраться с отличием локальных и глобальных переменных. Локальные (они из одинаковых букв) рождаются с каждым входящим миди-сообщением и исчезают сразу же после исполнения, не выходя за пределы конкретного транслятора и ни на что «на стороне» не влияя. Равно не влияя и на все последующие события того же типа. Глобальные переменные (из разных букв) служат для обмена информацией между трансляторами. О том, какие буквы можно использовать, а какие нельзя, есть в справке.

Несколько трансляторов для примера.
Первый транслятор — просто устанавливает три глобальных переменных при запуске программы (ну и служит напоминалкой). Строки, начинающиеся с двойных слешей, не исполняются (аналог команды rem из синтаксиса DOS). Чтобы не путаться, я все переменные начинаю с буквы «игрек». Мнемоника простая: yBend, yModulation и ySustain). Когда файл со скриптами разрастется, а у меня уже пара сотен трансляторов для разных нужд, стартовая аккуратность в выборе имен переменных будет на вес золота.
Код:
[x] Translator 1.0: Set variables
Options: stop
Incoming: Project Opened
Rules:
  yb=2
  //yb - PitchBend state (1=Dn,2=middle,3=Up)
  ym=1
  //ym - Modulation state (1=Dn,2=middle,3=Up)
  ys=1
  //ys - Sustain state (1=Up,2=Down)
Outgoing: (none)

Следующий транслятор включится, только если из порта M32 поступит сообщение PitchBend. На любые другие миди-сообщения он реагировать не будет. Я беру для «обработки» только один старший (последний) байт из ПитчБенда (и потому возможных значений у меня только 128; младший байт «с подробностями» нас не интересует), я заменяю его на локальную переменную pp. Синтаксис транслятора можно было сделать короче, но я умышленно, для наглядности приблизил его к синтаксису bat-файлов времен MS-DOS. Значение pp сравнивается с числом, ну а дальше происходят переходы и запись в память нового значения глобальной переменной yb, отвечающей за положение полоски (колеса) PB. На выходе этого транслятора ничего нет, он просто перезаписывает переменную. Напоминаю, что это глобальная переменная, и она будет хранится в памяти до выхода из программы БТ.

Важно для понимания: пока я проведу пальцем по полоске PB, этот транслятор сработает несколько десятков раз, но на выходе будет всегда давать одно из трех значений, соответствующих зонам на полоске. Как только я отпущу палец, PB вернется в среднее положение (как ему и положено, это отработает сама клавиатура) и транслятор вернет переменной yb значение «2». Если бы этот транслятор обрабатывал MW, то при снятии пальца в памяти просто осталось бы последнее обработанное сообщение СС1, ведь колесо MW не имеет возвратной пружины.
Разметка MW и Сустейна делается аналогично в отдельных трансляторах.
Код:
[x] Translator 1.1: PitchBend SET
Options: swallow
Incoming: MIDI E0 00 pp, on port KOMPLETE KONTROL M32 MIDI
Rules:
  if pp<30 then Goto "bend Down"
  if pp>100 then Goto "bend Up"
  yb=2
  Goto "end"
  Label "bend Down"
  yb=1
  Goto "end"
  Label "bend Up"
  yb=3
  Goto "end"
  Label "end"

Outgoing: (none)

Третий транслятор, один из нескольких десятков однотипных. Проделав по образцу второго транслятора аналогичную работу с регистрацией MW и Сустейна, я в огромном количестве «размножаю» однотипные трансляторы. Входящее событие — какая-то нота. Первое правило проверяет положение PB, и если yb не равно двум (т.е. если в данный момент положение PB не среднее), то транслятор не выполняется. Второе правило проверяет положение MW, и если полоска (колесо) MW не находится в верхнем (дальнем) положении, то транслятор не выполняется. Третье правило проверяет педаль сустейн, не нажата ли она.
Если PB оставлен в покое, MW наверху и педаль не нажата, транслятор вызовет в Дорико нужный поп-овер (Shift-P), впечатает в него слово «arco» и закроет поп-овер. Если хоть одно из условий не будет выполнено, транслятор на нажатую ноту не сработает, а сработает какой-то другой (с той же входящей нотой), где, например, условием будет среднее или нижнее положение MW.
«!=» означает «не равно», «==» — «равно».

Код:
[x] Translator 4.3: G#1 Arco
Options: swallow
Incoming: MIDI 90 2C vv
Rules:
  if yb!=2 then exit rules, skip Outgoing Action
  if ym!=3 then exit rules, skip Outgoing Action
  if ys==2 then exit rules, skip Outgoing Action
Outgoing: Text: Shift(P)arco Return Return
 
Последнее редактирование:
  • Like
Реакции: mcvall и faur
@mcvall, уточнение.
Смотрите, в трансляторе «Разметка положения PitchBend» входящим событием указано MIDI E0 00 pp. Последний, третий байт здесь старший, он грубо — на 128 частей — разделяет диапазон питчбенда, с этим байтом мы и работаем. А на месте второго, младшего, уточняющего байта написаны нули. И тут такое дело. M32 физически не умеет оцифровывать палец на полоске с более высоким разрешением, она дает всего 128 значений, и на месте младшего байта у M32 всегда будут нули.

А вот если взять какое-то другое устройство, которое оцифровывает питчбенд с более высоким разрешением, то в младшем байте будут разные цифры, и этот транслятор не будет пропускать сообщения питчбенда с младшим байтом, отличным от нуля — как не соответствующие входному фильтру. Поэтому правильнее (универсальнее) в этом трансляторе было бы написать во входящих MIDI E0 oo pp. Локальная переменная oo во входящих означает, что здесь может быть любое число, а не только нули. Ничто нам не мешает вообще не использовать эту переменную в коде. Как и все локальные переменные, переменные оо и pp умрут сразу по окончании работы транслятора, и будут воссозданы при следующем подходящем событии.

Я могу во всех трансляторах использовать только буквы oo и pp для локальных переменных (ну вот нравятся мне эти буквы!). Если я сам не буду путаться, то Боме Транслятор уж точно никогда их не перепутает. Хотя какие-то негласные правила сложились в комьюнити. Например, для значения велосити почти всегда мнемонически используют vv, хотя это и не обязательно.
 
  • Like
Реакции: mcvall
@dr-music, Приветствую ! Есть ли возможность трансляции midi файла в нажатия qwerty клавиатуры?
 
@orlikm, Доброго дня!
В Боме Трансляторе нет вообще никакого проигрывателя, поэтому MIDI-файл должен проигрывать кто-то еще. Но если MIDI-выход такого проигрывателя (DAW) направить на вход одного из виртуальных MIDI-кабелей Боме Транслятора, то он обработает MIDI-события и превратит их в QWERTY.

БТ умеет по входящему MIDI-событию а) нажимать «физическую клавишу», при этом сгенерированный код будет зависеть от текущей раскладки, б) по отдельности делать нажатие и отпускание физической клавиши (можно сделать «залипание»), в) генерировать символ вне зависимости от текущей раскладки. (Тут я могу быть неточен в мелочах, надо смотреть в справке, глава 9.2 Keystrokes.)

Виртуальные MIDI-кабели создаются в БТ в любом количестве, и их главное отличие от утилит вроде loopMIDI в том, что в центре всегда БТ.
 
Последнее редактирование:
Пока самое обидное то, что NI не могут сделать нормальную прошивку для КК М32, чтобы в режиме midi работали ВСЕ кнопки, которые передавали бы миди-сообщения, но как видно в Bome, больше половины не работает, в отличии когда мы подключаемся к DAW.
Перечитал последние тексты в этой теме и сообразил, что при нажатии кнопок (не клавиш) NI KK-клавиатуры передают свои сообщения не по основному MIDI-порту («Komplete Kontrol M32 MIDI»), а по вспомогательному («Komplete Kontrol M DAW»). Для того NI и требует при настройке DAW из входящих портов убрать этот «M DAW», чтобы управляющие кнопки не звучали.
Так что все перехватывается, просто надо еще один виртуальный MIDI-кабель создать в БТ и подключить его соответствующе...
 
Последнее редактирование:
  • Like
Реакции: mcvall
@mcvall Но я могу выложить код as is с тем, чтобы можно было поворовать идеи оттуда.
@dr-music, Добрый день. Будет здорово, если поделитесь кодом)
Покурил вчера мануал, и уже понял, что с помощью ВТ можно ракету в космос запускать. Но пока всё же есть непонятки с переменными. Спасибо!
 
@mcvall,
а) в папке Documents\Bome MIDI Translator\Presets есть готовые пресеты для разных устройств, их изучение крайне полезно;
б) я не знаю, как поведут себя виртуальные MIDI-порты при переносе с машины на машину, никогда этого не делал; наверно их придется воссоздавать;
в) файл для Дорико (со всеми мелкими ошибками, код еще не доделан и не вычищен) прикладываю; один из портов (не основной, ворой) посылает инфу в DAW, другой в нотный редактор.
 

Вложения

  • Like
Реакции: mcvall
Перечитал последние тексты в этомй теме и сообразил, что при нажатии кнопок (не клавиш) NI KK-клавиатуры передают свои сообщения не по основному MIDI-порту («Komplete Kontrol M32 MIDI»), а по вспомогательному («Komplete Kontrol M DAW»). Для того NI и требует при настройке DAW из входящих портов убрать этот «M DAW», чтобы управляющие кнопки не звучали.
Так что все перехватывается, просто надо еще один виртуальный MIDI-кабель создать в БТ и подключить его соответствующе...
С этой проблемой столкнулись многие, возмущенные, на форуме NI. Сейчас КК М32 напрямую работает не со всеми DAW. Допустим я в Аблетоне начал ковыряться, там у них всё ок. Но когда выходим из DAW и родной программы-плеера-семплера Komplete Kontrol, клавиатура автоматически переключается в режим midi и кнопки становятся неактивными (рабочими кнопками, способными передавать миди сообщения, остались Loop, Start, Rec, Stop, колесо прокрутки и крутилки-энкодеры), а все остальные молчат. Я изначально на вход миди в ВТ поставил галочку на Komplete Kontrol M32 MIDI и Komplete Kontrol M DAW, но ВТ эти кнопки так и не увидел...

P.s. Большое спасибо за код:)
 
  • Like
Реакции: dr-music
@dr-music, Посмотрел код. Теперь я начал понимать о чём шла речь в Ваших постах.

Теперь несколько вопросов.
1. Как вернуть команду yb=1, чтобы ym стал снова неактивным, как это происходит при запуске BT. Я так понял нужно создать новый транслятор, который будет запускать пресет "1", и продублировать этот транслятор во всех пресетах? Или он где-то уже зарыт в коде?

2. Я хочу на удержание РВ (на yb=3, допустим, это не важно) назначить команду "удерживать Ctrl, отменить действия всех пресетов и трансляторов, при этом активировать на клавиатуре М32 заранее назначенные клавиши", как это сделано у вас на пресетах "Bend".

Надеюсь логика моя вам ясна:) Спасибо!
 
Как вернуть команду yb=1, чтобы ym стал снова неактивным,
Это как? Если разговор про Питчбенд (yb), то он сам (в данном случае внутри M32) вернется в среднее положение и БТ запишет yb=2. Если разговор про Модуляцию (ym), то надо коснуться пальцем в начале полоски и yb станет =1.

Здесь нет ничего неактивного, переменные хранят свои значения до перезапуска программы.

Попробуйте описать без переменных, на простом человеческом, что хотите получить.


2. Я хочу на удержание РВ (на yb=3, допустим, это не важно) назначить команду "удерживать Ctrl, отменить действия всех пресетов и трансляторов, при этом активировать на клавиатуре М32 заранее назначенные клавиши", как это сделано у вас на пресетах "Bend".
Пусть события Note ON от клавиш имеют вид 90 22 vv, 90 23 vv, 90 24 мм (ноты 22, 23, 24 по первому каналу с любой велосити; смотреть, что там M32 генерирует).
Тогда создаются по два транслятора на каждую ноту, один из которых начинается с условия
Код:
if yb!=3 then exit rules, skip Outgoing Action
и в этот транслятор в Outgoing впечатывается Ctrl-буква,
а другой с той же нотой на входе начинается с
Код:
if yb==3 then exit rules, skip Outgoing Action
, и сюда вписывается другое действие.

Первый транслятор сработает только если PB наверху, а второй — в любом другом положении.
 
Последнее редактирование:
Когда запускается пресет "Set" и в нём транслятор "Set variables" , происходит
yb=1
//yb - PitchBend state (1=Dn,2=middle,3=Up)
ym=0
//ym - Modulation state (1=Dn,2=middle,3=Up)
ys=1
//ys - Sustain state (1=Up,2=Down)
Т.е. пока yb не сдвинем с места, трансляторы в пресетах "Bend=2 Mod=1 Sus=1", "Bend=2 Mod=2 Sus=1","Bend=2 Mod=3 Sus=1" неактивны и работают клавиши М32 в обычном режиме.
 
Попробуйте описать без переменных, на простом человеческом, что хотите получить.
1. Убрать все активные процессы, нажатием одной кнопки снять галочки со всех пресетов.

2. Удерживать Ctrl (заранее назначенный на питч-бенд) отменить действия всех пресетов и оставить только один пресет активным.
 
@mcvall,
На всякий случай: ВСЕ наивозможные глобальные переменные всегда существуют в БТ со значением «ноль» с момента запуска. В БТ есть команда, которая показывает текущие значения всех переменных, и она не выводит те, которые в данный момент равны нулю (хотя и используются в проекте). Мне это неудобно, а потому я не использую для нумерации 0,1,2... , а только 1,2,3... .

Все равно не понимаю, зачем выключать пресеты. Выключить несколько пресетов разом можно через механизм моментального таймера, но что-то это как-то... не для новичка, в общем :)
Клавишу Ctrl надо не удерживать, а вписывать в исходящие Keystrokes. Питчбенд отпустили, yb стала =2, а в «обычных» трансляторах ставить условие if yb==3 , then exit rules, skip outgoing action. Это и будет нажатый Ctrl.
 

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