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.
Основное окно программы выглядит так:
В средней части экрана показаны Трансляторы — минимальные логические элементы, превращающие одно событие в другое. Их содержимое (и место, где, собственно, пишется код) показывается в правой части экрана (на рисунок не вошло). Трансляторов в коде может быть несколько сотен и даже тысяч, поэтому для удобства они объединяются в Пресеты, список пресетов находится в левой части экрана. На картинке в середине экрана видны только трансляторы, относящиеся к пресету Game, который в настоящее время неактивен (не работает, галочка снята). Любой Транслятор или Пресет может быть в любой момент активирован или деактивирован как вручную, так и командой с другого Транслятора.
Что касается музыкантов. Каждому Транслятору может быть назначен свой MIDI-порт на вход и на выход. Но чтобы не проделывать многократно одну и ту же процедуру, MIDI вход и выход может быть назначен на Пресет, и тогда в каждом Трансляторе внутри этого Пресета они будут стоять по умолчанию (разумеется, их можно в любой момент переназначить). Точно также, но уровнем выше можно назначить дефолтные MIDI In и Out на весь проект, и тогда не придется проделывать процедуру назначения портов для каждого Пресета, если они не меняются. В моем проекте я ставлю по умолчанию на вход KK M32 MIDI (перехват сообщений с клавиатуры), а на выход BMT2 — подавляющее большинство моих Трансляторов будут отсылать команды в Дорико, а не в Кубейс. В тех Трансляторах или Пресетах, где мне нужно будет что-то отправить в Кубейс, я переназначу Out на BMT1.
Создаем пресет, назовем его SET, и в нем создадим первый транслятор.
«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.
Разберем. Опция «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: он нагляднее, а цифирки выучиваются быстро.
(Не комментируйте пока, продолжение следует.)
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.
Основное окно программы выглядит так:
В средней части экрана показаны Трансляторы — минимальные логические элементы, превращающие одно событие в другое. Их содержимое (и место, где, собственно, пишется код) показывается в правой части экрана (на рисунок не вошло). Трансляторов в коде может быть несколько сотен и даже тысяч, поэтому для удобства они объединяются в Пресеты, список пресетов находится в левой части экрана. На картинке в середине экрана видны только трансляторы, относящиеся к пресету 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)
О переменных (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)
(Не комментируйте пока, продолжение следует.)
Последнее редактирование: