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

  • Автор темы Автор темы Удалённый пользователь 75985
  • Дата начала Дата начала
Откуда взялся nFader? Файл .ReaperOsc тоже правили?

Добавил в ваш вариант свои порты, загрузил в оскибот и смотрю лог Рипера в Option/Control Surfaces/Device Settings/Listen.

Попробовал подёргать фэйдеры на контроллере.
OSC сообщения от восьми фэйдеров (ориентировочно) - от /Fader-3 до /Fader4.
Стоит только тронуть Fader1, как Оскибот вылетает с ошибкой. не пойму, отчего так.

2H9BWrA.png


Fader88 это он же.
 
Последнее редактирование модератором:
Откуда взялся nFader? Файл .ReaperOsc тоже правили?
Да, на скорую руку для тестов сделал так -
TRACK_VOLUME n/Fader@/value
одна строка в .ReaperOsc

Попробовал подёргать фэйдеры на контроллере.
OSC сообщения от восьми фэйдеров (ориентировочно) - от /Fader-3 до /Fader4.
Стоит только тронуть Fader1, как Оскибот вылетает с ошибкой. не пойму, отчего так.
Ну во-первых, у меня там прописан 16-ый канал на MIDI в скрипте.
Во-вторых, по скольку у меня первый фейдер на моей Акаи посылает сигнал по CC20, второй CC21 и т.д. в скрипте вычисляется номер фейдера как -
nFader = msg2 - 19
где msg2 - это номер контролера во входном MIDI сообщении, а он у меня с 20-го начинается -
раз у вас от минус 3-го, то чтоб правильно работало, вместо 19 вбейте 15 наверное - так чтоб первый Фейдер выдавал Fader1.

Ну и там в скрипте ещё и управление по второму OSC выходу - я попробовал сразу двумя Риперами на разных компах синхронно управлять с Акаи - получилось, кстати!
И второй выход MIDI виртуальный - по которому собственно и SySex отправлял и принимал в Рипер для контроля.

В общем много для вас лишнего, я же програмку в том числе и под свои нужды смотрю :)
 
Последнее редактирование:
Канал поменял на первый, конечно.
Второй выход OSC тоже отключил.
И второй MIDI тоже.

Фэйдеры у меня CC 10-17, поэтому пока неясно, из-за чего происходит крэш оскибота. По идее, 13 минус 19 не должно давать 88 и последующий крэш. Буду разбираться.
Sysex пока не понял в вашем конфиге. То есть, принцип отправки сообщения ясен. Непонятно, для чего оно в Рипер (ошибаюсь?) отправляет. В моём случае, sysex должны оставаться между контроллером и оскиботом. В Рипер и из него идут только OSC сообщения.
 
Фэйдеры у меня CC 10-17, поэтому пока неясно, из-за чего происходит крэш оскибота. По идее, 13 минус 19 не должно давать 88 и последующий крэш. Буду разбираться.
Раз первый Фейдер у вас CC10 - значит вместо 19 (в строке - nFader = msg2 - 19) нужно 9 вколотить! Крэш может быть из-за отрицательных значений в общем-то.
[DOUBLEPOST=1445208093,1445207831][/DOUBLEPOST]
Sysex пока не понял в вашем конфиге. То есть, принцип отправки сообщения ясен. Непонятно, для чего оно в Рипер (ошибаюсь?) отправляет.
Да, ошибаетесь - он какраз на второй MIDI Out у меня в скрипте отправлялся, который вы удалили :) а потом в Рипер я его принимал через луп бэк виртуального МИДИ порта.
Но я то это сделал только чтоб проверить, что скрипт вообще SySEX отправляет и не более того.
Вам нужно всё делать иначе.....
Но для начала разберитесь от какого точно SySex ваш контролер просыпает вход.
Отправьте по очереди каждый из SySex с того-же Midi-OX в ваш контролер или как я писал из Рипера.
Дальше разберёмся уже в ВАШЕМ скрипте.
 
Вычитаю 9. Опять не то. Может, дело в том, что вычитается число в десятиричном формате из шестнадцатиричного?

qnGXtwU.png


98 это опять пятый фэйдер.

С Sysex завтра разберусь обязательно.
Там должно быть достаточно вот этого кода:

Код:
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


Первые три sysex сообщения просто пишут вот такой текст на LCD:
PXWEqAR.jpg


Вот это сообщение для старта, в развёрнутом виде, в мануале:
nYkQV95.png


P.S. Второй midi не удалил, а перевёл на первый. Но, оно не должно пока ни на что влиять, т.к. фэйдеры у моего контроллера не моторизированные и визуального фидбэка не имеют никакого.
 
Вычитаю 9. Опять не то. Может, дело в том, что вычитается число в десятиричном формате из шестнадцатиричного?
Но у меня то вычитается нормально.
Но это ведь вам не нужно, управлять фейдерами Рипера?
если нужно - разберёмся.
А .ReaperOsc подменили на мой?
[DOUBLEPOST=1445209039,1445208883][/DOUBLEPOST]
Вот это сообщение для старта, в развёрнутом виде, в мануале:
Еслиб я ещё понимал, что такое этот ваш Автомап.
Но так вроде ясно, что просыпает контролер.
 
Но у меня то вычитается нормально.
Да у меня вроде тоже. Надо на свежую голову смотреть.

Но это ведь вам не нужно, управлять фейдерами Рипера?
Нужно. Мне вообще нужно всем Рипером управлять с контроллера)

А .ReaperOsc подменили на мой?
Сейчас да, но, вылёт всё равно остаётся.

Еслиб я ещё понимал, что такое этот ваш Автомап.
Но так вроде ясно, что просыпает контролер.
Про автомап даже не думайте. Вернее, объясню в двух словах.
Мой контроллер это просто миди контроллер. Железка.
Автомап - программная прослойка между железкой и DAW.
Оно умеет разные вкусности из серии автоматического маппинга контролов выбранного вст и разное другое.
Но автомап тупой, не гибкий и вообще бяка.

Контроллер умеет быть обычной midi железкой (режим advanced). В этом режиме отсылаются настроенные пользователем CC. Есть готовые шаблоны в самом контроллере. Есть возможность их редактировать как на контроллере, так и с помощью специального редактора на компьютере, с последующей заливкой в контроллер. Фидбека нет.

Контроллер умеет переходить в автомап режим отдельной кнопкой. В этом режиме есть фидбек и разные плюшки от автомапа.

Также, ещё с первой версии контроллеров, был оставлен специальный advanced шаблон для совместимости с аблетоном, который тогда не умел автомап (не знаю, умеет ли сейчас).

В этом режиме контроллер отсылает CC и умеет фидбек. Единственное, чтобы он в этом режиме нормально принимал фидбек, контроллеру нужно знать, что на хосте запущен автомап/аблетон. В противном случае, на экран выводится надпись Ableton is OFFLINE. Чтобы этой надписи не было, мы отсылаем контроллеру соответствующее sysex сообщение всякий раз, когда он просит об этом.
После чего оскибот или другое приложение получает возможность отсылать фидбек в контроллер.

Так выглядит интерфейс настройки автомапа. Вызывается кликом по иконке программы в трее или кнопкой view на самом контроллере.
automap4_1_b.png


P.S. Если хотите, я могу вам в личке дать доступ к своему компьютеру через Teamviewer. Сможем пообщаться голосом и в реальном времени проследить за тем, как реагируют контроллер и Рипер на настройки скрипта.
 
Последнее редактирование модератором:
P.S. Если хотите, я могу вам в личке дать доступ к своему компьютеру через Teamviewer. Сможем пообщаться голосом и в реальном времени проследить за тем, как реагируют контроллер и Рипер на настройки скрипта.
Да, уже наверное так будет быстрее.
Общее понимание есть.
 
Хотел бы предупредить, что хочу не просто скрипт который будет передавать данные от контрола миди в рипер и обратно, но сложный скрипт.
С несколькими раскладками. С возможностью использовать 8 имеющихся на контроллере фэйдеров для управления всеми треками проекта, как то 1-8, 9-16 и т.д.
С несколькими страницами настроек, как это можно делать при помощи редактора от Novation (см. картинку автомапа выше, правый верхний угол).
В общем, переходим в личку, а здесь будем отписываться о прогрессе, если тема интересна кому-то ещё.
 
Хотел бы предупредить, что хочу не просто скрипт который будет передавать данные от контрола миди в рипер и обратно, но сложный скрипт.
:)
Тогда предупреждаю - прийдётся очень много чего разобрать и научиться.....
ну и для начала - взвесить свои силы и целесообразность - в Личке.
[DOUBLEPOST=1445809273,1445252998][/DOUBLEPOST]



Дело сильно продвинулось,
и в общем-то есть понимание Скрипта и написан начальный скелет для любого миди Контролера с не моторизированными Фейдерами и энкодерами бесконечными, который при управлении не портит открытый проект Рипера, а управляет с тех точек, в которых установлены были параметры в проекте Рипера.
Если кому интересно - могу выслать Скрипт на переделку под команды своего контролера (да хоть на миди клавишах который) и проверку функционала.
Пока пишу дальше.

Основная фича в том, что благодаря OSCII-bot-у удаётся обходить тот факт, что Рипер не умеет миди фидбэк.
И получилось сделать так, что обычный миди контролер, не поддерживающий протокол Mackie Control, при подключении к Риперу понимает в каком положении (с какими значениями) стоят в нём все параметры и перемещает их только с этих значений.
 
Последнее редактирование:
  • Like
Реакции: noshyn
Александр, может прикрепить "начальный скелет для любого миди-контролера" в шапке темы?
 
Я это дело забросил давненько уже, делал для автора темы....
Посмотрю что осталось.
Ну и чтоб в шапке - нужно модератора просить
 
Приветствую!
У меня несколько другая задача, я пишу свою программу для работы с SL MKII. Хочу поблагодарить @fundorin за приведенные дампы sysex-сообщений, у меня они сработали. К сожалению, в открытом доступе я не нашел документа под названием "SLMKII MIDI Programmers Reference", который упоминали некоторые разработчики на англоязычных форумах. Но я написал в техподдержку Novation. Посмотрим, может, дадут документацию.
 
К сожалению, в открытом доступе я не нашел документа под названием "SLMKII MIDI Programmers Reference", который упоминали некоторые разработчики на англоязычных форумах.
Расскажите про свою программу. Мне показалось, что вариант с оскиботом будет максимально гибким и универсальным. К сожалению, мне не хватило знаний для того, чтобы написать рабочий вариант скрипта.

Выложил документацию в дропбокс. Забирайте.
 
  • Like
Реакции: «G~Li†ch» и Quadium
Спасибо огромное!
У меня клавиатура SL MKII и синтезатор Virus TI Snow. Передо мной стоит задача выводить MIDI-сигналы с первого на второе. Вариант подключения их напрямую меня не устраивает, потому что синтезатор мне нужно держать в USB-режиме, чтобы через его ЦАП выводить еще и минусовку. Пока что мы (группа) используем ноутбук с Ableton Live для всех вспомогательных задач. У меня есть устойчивое желание отказаться как от аблетона, так и от ноутбука, потому что, ни то ни другое не устраивает меня по надежности.

У меня есть микрокомпьютер Raspberry PI, на нем работает Linux. Задачи, возлагаемые на компьютер, минимальны, потому я и решился написать небольшую программу, которая там будет запускаться и не требовать для своей работы ни монитора, ни мышки. Вообще получается малюсенькая коробочка, в которую будут втыкаться два USB-шнура и питание, и все. Ну а программа будет реагировать на нажатия кнопок Новейшена, запускать минусовку, маршрутизировать входящие ноты на один или несколько каналов синтезатора, выводить что-нибудь полезное на экран клавиатуры, мигать лампочками на клавиатуре, заменяя метроном.
 
Ну а программа будет реагировать на нажатия кнопок Новейшена, запускать минусовку, маршрутизировать входящие ноты на один или несколько каналов синтезатора, выводить что-нибудь полезное на экран клавиатуры, мигать лампочками на клавиатуре, заменяя метроном.
Это всё без всякой коробочки можно сделать средствами Рипера, его скриптов и OSCII-bot, а скоро и только скриптов (OSCII-Bot будет туда интегрирован).
 
Охотно Вам верю. Признаться, с Рипером не знаком. Наверное, мне стоило бы на него посмотреть. Но моя идея заключается в том, чтобы перестать носить ноутбук на репетиции и концерты.
 
Но моя идея заключается в том, чтобы перестать носить ноутбук на репетиции и концерты.
Если от ноута вам нужны только описанные выше функции, то безусловно - лучше это сделать на каком-нит Линукс микропроцессоре.
 
Кстати, на мой запрос в Novation молчание было мне ответом. Так что еще раз спасибо fundorin за документацию.
[DOUBLEPOST=1458046798,1456838202][/DOUBLEPOST]Техподдержка Novation ответила, что программистского справочника не существует. С трудом сдержался от того, чтобы его им отправить. :)
 
Огромное спасибо за документацию (в 2019 г. файлы уже удалены) – очень помогла прописать ZeRO MkII под VirtualDJ.
Но чтобы контроллер "управлял" виртуальником, нужно после того, когда загорится кнопка automap, нажать кнопку edit, затем с левой стороны шестую кнопку, затем нижнюю четвёртую (менять Routing - Port U3 на U2). И так каждый раз, при входе в 33-й Automap Universal-Special-Template. Но, почему-то при повторном входе в него, все лампочки застынут (перестанет работать обратная связь), чего не происходит при 32-м Ableton Autoamp Special-Template.
Проблема решается макросом refresh_controller на [A] EXIT Automap Universal или [*] EXIT Special-Template.
Эта настройка универсальна для любого Novation SL/Mk-подобного контроллера (однако vid и pid в первой строке xml-файла указаны для ZeRO MkII):
<device name="ZeRO MkII" description="novation ZeRO SL MkII" version="741" type="MIDI" vid="0x1235" pid="0xC">
<sysex value="F000202903031200040002020900F7" name="[*]R:LCD_ClearLow"/>
<sysex value="F000202903031200040002020800F7" name="[*]R:LCD_ClearTop"/>
<text sysex="F000202903031200040002014104047E20202020202000F7" offset="16" size="6" scroll="no" name="[*]R:LCD_66-Low-71"/>
<text sysex="F000202903031200040002012D04040A2020202020202020202020202020202020202000F7" offset="16" size="19" scroll="no" name="[*]R:LCD_45-Low-64"/>
<text sysex="F0002029030312000400020127040420202020202000F7" offset="15" size="6" scroll="no" name="[*]R:LCD_39-Low-44"/>
<text sysex="F0002029030312000400020121040420202020202000F7" offset="15" size="6" scroll="no" name="[*]R:LCD_33-Low-38"/>
<text sysex="F000202903031200040002011B040420202020202000F7" offset="15" size="6" scroll="no" name="[*]R:LCD_27-Low-32"/>
<text sysex="F00020290303120004000201070404202020202020202020202020202020202020200A00F7" offset="15" size="19" scroll="no" name="[*]R:LCD_07-Low-25"/>
<text sysex="F000202903031200040002010004042020202020207F00F7" offset="15" size="6" scroll="no" name="[*]R:LCD_00-Low-05"/>
<text sysex="F000202903031200040002014402042020202000F7" offset="15" size="4" scroll="no" name="[*]R:LCD_68-Top-71"/>
<text sysex="F000202903031200040002012D0204202020202020202020202020202020202020202020207F00F7" offset="15" size="22" scroll="no" name="[*]R:LCD_45-Top-66"/>
<text sysex="F0002029030312000400020127020420202020202000F7" offset="15" size="6" scroll="no" name="[*]R:LCD_39-Top-44"/>
<text sysex="F0002029030312000400020121020420202020202000F7" offset="15" size="6" scroll="no" name="[*]R:LCD_33-Top-38"/>
<text sysex="F000202903031200040002011B020420202020202000F7" offset="15" size="6" scroll="no" name="[*]R:LCD_27-Top-32"/>
<text sysex="F000202903031200040002010502042020202020202020202020202020202020202020202000F7" offset="15" size="22" scroll="no" name="[*]R:LCD_05-Top-26"/>
<text sysex="F00020290303120004000201000204202020207E00F7" offset="15" size="4" scroll="no" name="[*]R:LCD_00-Top-03"/>
<sysex value="F000202903031200040002020700F7" name="[*]L:LCD_ClearLow"/>
<sysex value="F000202903031200040002020600F7" name="[*]L:LCD_ClearTop"/>
<text sysex="F0002029030312000400020142030420202020202000F7" offset="15" size="6" scroll="no" name="[*]L:LCD_66-Low-71"/>
<text sysex="F0002029030312000400020127030420202020202020202020202020202020202020202020202020207E00F7" offset="15" size="26" scroll="no" name="[*]L:LCD_39-Low-64"/>
<text sysex="F0002029030312000400020121030420202020202000F7" offset="15" size="6" scroll="no" name="[*]L:LCD_33-Low-38"/>
<text sysex="F000202903031200040002010603047F20202020202020202020202020202020202020202020202020202000F7" offset="16" size="26" scroll="no" name="[*]L:LCD_07-Low-32"/>
<text sysex="F0002029030312000400020100030420202020202000F7" offset="15" size="6" scroll="no" name="[*]L:LCD_00-Low-05"/>
<text sysex="F000202903031200040002014101047F20202020202000F7" offset="16" size="6" scroll="no" name="[*]L:LCD_66-Top-71"/>
<text sysex="F00020290303120004000201270104202020202020202020202020202020202020202020202020202000F7" offset="15" size="26" scroll="no" name="[*]L:LCD_39-Top-64"/>
<text sysex="F0002029030312000400020121010420202020202000F7" offset="15" size="6" scroll="no" name="[*]L:LCD_33-Top-38"/>
<text sysex="F00020290303120004000201070104202020202020202020202020202020202020202020202020202000F7" offset="15" size="26" scroll="no" name="[*]L:LCD_07-Top-32"/>
<text sysex="F000202903031200040002010001042020202020207E00F7" offset="15" size="6" scroll="no" name="[*]L:LCD_00-Top-05"/>
<led cc="0x18" value="1" channel="7" name="LED L1-up" default="Button:1"/>
<led cc="0x19" value="1" channel="7" name="LED L2-up" default="Button:2"/>
<led cc="0x1A" value="1" channel="7" name="LED L3-up" default="Button:3"/>
<led cc="0x1B" value="1" channel="7" name="LED L4-up" default="Button:4"/>
<led cc="0x1C" value="1" channel="7" name="LED L5-up" default="Button:5"/>
<led cc="0x1D" value="1" channel="7" name="LED L6-up" default="Button:6"/>
<led cc="0x1E" value="1" channel="7" name="LED L7-up" default="Button:7"/>
<led cc="0x1F" value="1" channel="7" name="LED L8-up" default="Button:8"/>
<led cc="0x20" value="1" channel="7" name="LED L1-lw" default="Button:9"/>
<led cc="0x21" value="1" channel="7" name="LED L3-lw" default="Button:10"/>
<led cc="0x22" value="1" channel="7" name="LED L3-lw" default="Button:11"/>
<led cc="0x23" value="1" channel="7" name="LED L4-lw" default="Button:12"/>
<led cc="0x24" value="1" channel="7" name="LED L5-lw" default="Button:13"/>
<led cc="0x25" value="1" channel="7" name="LED L6-lw" default="Button:14"/>
<led cc="0x26" value="1" channel="7" name="LED L7-lw" default="Button:15"/>
<led cc="0x27" value="1" channel="7" name="LED L8-lw" default="Button:16"/>
<led cc="0x28" value="1" channel="7" name="LED R1-up" default="Button:17"/>
<led cc="0x29" value="1" channel="7" name="LED R2-up" default="Button:18"/>
<led cc="0x2A" value="1" channel="7" name="LED R3-up" default="Button:19"/>
<led cc="0x2B" value="1" channel="7" name="LED R4-up" default="Button:20"/>
<led cc="0x2C" value="1" channel="7" name="LED R5-up" default="Button:21"/>
<led cc="0x2D" value="1" channel="7" name="LED R6-up" default="Button:22"/>
<led cc="0x2E" value="1" channel="7" name="LED R7-up" default="Button:23"/>
<led cc="0x2F" value="1" channel="7" name="LED R8-up" default="Button:24"/>
<led cc="0x30" value="1" channel="7" name="LED R1-lw/RWD" default="Button:25"/>
<led cc="0x31" value="1" channel="7" name="LED R2-lw/FWD" default="Button:26"/>
<led cc="0x32" value="1" channel="7" name="LED R3-lw/STOP" default="Button:27"/>
<led cc="0x33" value="1" channel="7" name="LED R4-lw/PLAY" default="Button:28"/>
<led cc="0x34" value="1" channel="7" name="LED R5-lw/LOOP" default="Button:29"/>
<led cc="0x35" value="1" channel="7" name="LED R6-lw/REC" default="Button:30"/>
<led cc="0x36" value="1" channel="7" name="LED R7-lw" default="Button:31"/>
<led cc="0x37" value="1" channel="7" name="LED R8-lw" default="Button:32"/>
<led cc="0x48" value="1" channel="7" name="LED learn"/>
<led cc="0x49" value="1" channel="7" name="LED view"/>
<led cc="0x4A" value="1" channel="7" name="LED user"/>
<led cc="0x4B" value="1" channel="7" name="LED fx"/>
<led cc="0x4C" value="1" channel="7" name="LED [A] inst | [*] REC"/>
<led cc="0x4D" value="1" channel="7" name="LED mixer"/>
<led cc="0x4E" value="0" channel="7" name="LEDs OFF (BLACKOUT)"/>
<led cc="0x4F" value="1" channel="7" name="LED transport lock" default="[*] transport (toggle)"/>
<led cc="0x50" value="1" channel="7" name="LED !L_Upper row"/>
<led cc="0x51" value="1" channel="7" name="LED !L_Encoders row"/>
<led cc="0x52" value="1" channel="7" name="LED !L_Lower row"/>
<led cc="0x53" value="1" channel="7" name="LED !L_Pots row"/>
<led cc="0x54" value="1" channel="7" name="LED !L_Pads row"/>
<led cc="0x55" value="1" channel="7" name="LED !R_Sliders row"/>
<led cc="0x56" value="1" channel="7" name="LED !R_Upper row"/>
<led cc="0x57" value="1" channel="7" name="LED !R_Lower row"/>
<led cc="0x58" value="1" channel="7" name="LED !L_CC#88 page"/>
<led cc="0x59" value="1" channel="7" name="LED !L_CC#89 page"/>
<led cc="0x5A" ccoff="0x5B" off="0" channel="7" value="1" name="LED !R_CC#90 page"/>
<led cc="0x5B" ccoff="0x5A" off="0" channel="7" value="1" name="LED !R_CC#91 page"/>
<bar cc="0x60" min="0" max="31" channel="7" name="LEDs !Left"/>
<bar cc="0x61" min="0" max="7" channel="7" name="LEDs !Right"/>
<led cc="0x6A" value="1" channel="7" name="LED Encoders-D (Compact)"/>
<bar cc="0x70" min="0" max="11" zero="6" channel="7" name="LED Ring:1" default="Encoder:1"/>
<bar cc="0x71" min="0" max="11" zero="6" channel="7" name="LED Ring:2" default="Encoder:2"/>
<bar cc="0x72" min="0" max="11" zero="6" channel="7" name="LED Ring:3" default="Encoder:3"/>
<bar cc="0x73" min="0" max="11" zero="6" channel="7" name="LED Ring:4" default="Encoder:4"/>
<bar cc="0x74" min="0" max="11" zero="6" channel="7" name="LED Ring:5" default="Encoder:5"/>
<bar cc="0x75" min="0" max="11" zero="6" channel="7" name="LED Ring:6" default="Encoder:6"/>
<bar cc="0x76" min="0" max="11" zero="6" channel="7" name="LED Ring:7" default="Encoder:7"/>
<bar cc="0x77" min="0" max="11" zero="6" channel="7" name="LED Ring:8" default="Encoder:8"/>
<bar cc="0x78" min="0" max="64" channel="7" name="Ring:1:Mode"/>
<bar cc="0x79" min="0" max="64" channel="7" name="Ring:2:Mode"/>
<bar cc="0x7A" min="0" max="64" channel="7" name="Ring:3:Mode"/>
<bar cc="0x7B" min="0" max="64" channel="7" name="Ring:4:Mode"/>
<bar cc="0x7C" min="0" max="64" channel="7" name="Ring:5:Mode"/>
<bar cc="0x7D" min="0" max="64" channel="7" name="Ring:6:Mode"/>
<bar cc="0x7E" min="0" max="64" channel="7" name="Ring:7:Mode"/>
<bar cc="0x7F" min="0" max="64" channel="7" name="Ring:8:Mode"/>
<init sendsysex="F00020290303120002000100F7F00020290303120002000101F7F000202903031200020002012E0104706F636B65747300F7BF4E01F00020290303120002000201250104546F702000011C010460000120010421782C2000F7BF6B01"/>
<init sendsysex="F00020290303120002000201020304436F6E74726F6C73206D6179206265206C6F636B656421205072657373203C656469743E207C20526F7574696E67207E20436F6D6E506F72742027553327207E2027553227207C20436865636B205B415D204D617070696E672100F7"/>
<exit sendsysex="F00020290303120004000100F7BF4E01BF6B00"/>
<sysex value="F000202903031200020002020900F7" name="[A]R:LCD_ClearLow"/>
<sysex value="F000202903031200020002020800F7" name="[A]R:LCD_ClearTop"/>
<text sysex="F000202903031200020002014104047E20202020202000F7" offset="16" size="6" scroll="no" name="[A]R:LCD_66-Low-71"/>
<text sysex="F000202903031200020002012D04040A2020202020202020202020202020202020202000F7" offset="16" size="19" scroll="no" name="[A]R:LCD_45-Low-64"/>
<text sysex="F0002029030312000200020127040420202020202000F7" offset="15" size="6" scroll="no" name="[A]R:LCD_39-Low-44"/>
<text sysex="F0002029030312000200020121040420202020202000F7" offset="15" size="6" scroll="no" name="[A]R:LCD_33-Low-38"/>
<text sysex="F000202903031200020002011B040420202020202000F7" offset="15" size="6" scroll="no" name="[A]R:LCD_27-Low-32"/>
<text sysex="F00020290303120002000201070404202020202020202020202020202020202020200A00F7" offset="15" size="19" scroll="no" name="[A]R:LCD_07-Low-25"/>
<text sysex="F000202903031200020002010004042020202020207F00F7" offset="15" size="6" scroll="no" name="[A]R:LCD_00-Low-05"/>
<text sysex="F000202903031200020002014402042020202000F7" offset="15" size="4" scroll="no" name="[A]R:LCD_68-Top-71"/>
<text sysex="F000202903031200020002012D0204202020202020202020202020202020202020202020207F00F7" offset="15" size="22" scroll="no" name="[A]R:LCD_45-Top-66"/>
<text sysex="F0002029030312000200020127020420202020202000F7" offset="15" size="6" scroll="no" name="[A]R:LCD_39-Top-44"/>
<text sysex="F0002029030312000200020121020420202020202000F7" offset="15" size="6" scroll="no" name="[A]R:LCD_33-Top-38"/>
<text sysex="F000202903031200020002011B020420202020202000F7" offset="15" size="6" scroll="no" name="[A]R:LCD_27-Top-32"/>
<text sysex="F000202903031200020002010502042020202020202020202020202020202020202020202000F7" offset="15" size="22" scroll="no" name="[A]R:LCD_05-Top-26"/>
<text sysex="F00020290303120002000201000204202020207E00F7" offset="15" size="4" scroll="no" name="[A]R:LCD_00-Top-03"/>
<sysex value="F000202903031200020002020700F7" name="[A]L:LCD_ClearLow"/>
<sysex value="F000202903031200020002020600F7" name="[A]L:LCD_ClearTop"/>
<text sysex="F0002029030312000200020142030420202020202000F7" offset="15" size="6" scroll="no" name="[A]L:LCD_66-Low-71"/>
<text sysex="F0002029030312000200020127030420202020202020202020202020202020202020202020202020207E00F7" offset="15" size="26" scroll="no" name="[A]L:LCD_39-Low-64"/>
<text sysex="F0002029030312000200020121030420202020202000F7" offset="15" size="6" scroll="no" name="[A]L:LCD_33-Low-38"/>
<text sysex="F000202903031200020002010603047F20202020202020202020202020202020202020202020202020202000F7" offset="16" size="26" scroll="no" name="[A]L:LCD_07-Low-32"/>
<text sysex="F0002029030312000200020100030420202020202000F7" offset="15" size="6" scroll="no" name="[A]L:LCD_00-Low-05"/>
<text sysex="F000202903031200020002014101047F20202020202000F7" offset="16" size="6" scroll="no" name="[A]L:LCD_66-Top-71"/>
<text sysex="F00020290303120002000201270104202020202020202020202020202020202020202020202020202000F7" offset="15" size="26" scroll="no" name="[A]L:LCD_39-Top-64"/>
<text sysex="F0002029030312000200020121010420202020202000F7" offset="15" size="6" scroll="no" name="[A]L:LCD_33-Top-38"/>
<text sysex="F00020290303120002000201070104202020202020202020202020202020202020202020202020202000F7" offset="15" size="26" scroll="no" name="[A]L:LCD_07-Top-32"/>
<text sysex="F000202903031200020002010001042020202020207E00F7" offset="15" size="6" scroll="no" name="[A]L:LCD_00-Top-05"/>
<slider pitch="1" name="PitchB"/>
<slider cc="0x1" name="ModWheel"/>
<button note="0x24" name="Drumpad:1"/>
<button note="0x25" name="Drumpad:2"/>
<button note="0x26" name="Drumpad:3"/>
<button note="0x27" name="Drumpad:4"/>
<button note="0x28" name="Drumpad:5"/>
<button note="0x29" name="Drumpad:6"/>
<button note="0x2A" name="Drumpad:7"/>
<button note="0x2B" name="Drumpad:8"/>
<slider cc="0x8" zero="64" name="Pot:1"/>
<slider cc="0x9" zero="64" name="Pot:2"/>
<slider cc="0xA" zero="64" name="Pot:3"/>
<slider cc="0xB" zero="64" name="Pot:4"/>
<slider cc="0xC" zero="64" name="Pot:5"/>
<slider cc="0xD" zero="64" name="Pot:6"/>
<slider cc="0xE" zero="64" name="Pot:7"/>
<slider cc="0xF" zero="64" name="Pot:8"/>
<slider cc="0x10" name="Slider:1"/>
<slider cc="0x11" name="Slider:2"/>
<slider cc="0x12" name="Slider:3"/>
<slider cc="0x13" name="Slider:4"/>
<slider cc="0x14" name="Slider:5"/>
<slider cc="0x15" name="Slider:6"/>
<slider cc="0x16" name="Slider:7"/>
<slider cc="0x17" name="Slider:8"/>
<button cc="0x18" off="0" value="1" name="Button:1"/>
<button cc="0x19" off="0" value="1" name="Button:2"/>
<button cc="0x1A" off="0" value="1" name="Button:3"/>
<button cc="0x1B" off="0" value="1" name="Button:4"/>
<button cc="0x1C" off="0" value="1" name="Button:5"/>
<button cc="0x1D" off="0" value="1" name="Button:6"/>
<button cc="0x1E" off="0" value="1" name="Button:7"/>
<button cc="0x1F" off="0" value="1" name="Button:8"/>
<button cc="0x20" off="0" value="0x7F" channel="0" name="Button:9"/>
<button cc="0x20" off="0" value="0x1" channel="15" name="Button:9"/>
<button cc="0x21" off="0" value="0x7F" channel="0" name="Button:10"/>
<button cc="0x21" off="0" value="0x1" channel="15" name="Button:10"/>
<button cc="0x22" off="0" value="0x7F" channel="0" name="Button:11"/>
<button cc="0x22" off="0" value="0x1" channel="15" name="Button:11"/>
<button cc="0x23" off="0" value="0x7F" channel="0" name="Button:12"/>
<button cc="0x23" off="0" value="0x1" channel="15" name="Button:12"/>
<button cc="0x24" off="0" value="0x7F" channel="0" name="Button:13"/>
<button cc="0x24" off="0" value="0x1" channel="15" name="Button:13"/>
<button cc="0x25" off="0" value="0x7F" channel="0" name="Button:14"/>
<button cc="0x25" off="0" value="0x1" channel="15" name="Button:14"/>
<button cc="0x26" off="0" value="0x7F" channel="0" name="Button:15"/>
<button cc="0x26" off="0" value="0x1" channel="15" name="Button:15"/>
<button cc="0x27" off="0" value="0x7F" channel="0" name="Button:16"/>
<button cc="0x27" off="0" value="0x1" channel="15" name="Button:16"/>
<button cc="0x28" off="0" value="1" name="Button:17"/>
<button cc="0x29" off="0" value="1" name="Button:18"/>
<button cc="0x2A" off="0" value="1" name="Button:19"/>
<button cc="0x2B" off="0" value="1" name="Button:20"/>
<button cc="0x2C" off="0" value="1" name="Button:21"/>
<button cc="0x2D" off="0" value="1" name="Button:22"/>
<button cc="0x2E" off="0" value="1" name="Button:23"/>
<button cc="0x2F" off="0" value="1" name="Button:24"/>
<button cc="0x30" off="0" value="1" name="Button:25"/>
<button cc="0x31" off="0" value="1" name="Button:26"/>
<button cc="0x32" off="0" value="1" name="Button:27"/>
<button cc="0x33" off="0" value="1" name="Button:28"/>
<button cc="0x34" off="0" value="1" name="Button:29"/>
<button cc="0x35" off="0" value="1" name="Button:30"/>
<button cc="0x36" off="0" value="1" name="Button:31"/>
<button cc="0x37" off="0" value="1" name="Button:32"/>
<jog cc="0x38" mask="0x1F" max="18" full="4608" zero="0" inverted="false" name="Encoder:1"/>
<jog cc="0x38" mask="0x1F" max="82" full="4608" zero="64" inverted="true" name="Encoder:1"/>
<jog cc="0x39" mask="0x1F" max="18" full="4608" zero="0" inverted="false" name="Encoder:2"/>
<jog cc="0x39" mask="0x1F" max="82" full="4608" zero="64" inverted="true" name="Encoder:2"/>
<jog cc="0x3A" mask="0x1F" max="18" full="4608" zero="0" inverted="false" name="Encoder:3"/>
<jog cc="0x3A" mask="0x1F" max="82" full="4608" zero="64" inverted="true" name="Encoder:3"/>
<jog cc="0x3B" mask="0x1F" max="18" full="4608" zero="0" inverted="false" name="Encoder:4"/>
<jog cc="0x3B" mask="0x1F" max="82" full="4608" zero="64" inverted="true" name="Encoder:4"/>
<jog cc="0x3C" mask="0x1F" max="18" full="4608" zero="0" inverted="false" name="Encoder:5"/>
<jog cc="0x3C" mask="0x1F" max="82" full="4608" zero="64" inverted="true" name="Encoder:5"/>
<jog cc="0x3D" mask="0x1F" max="18" full="4608" zero="0" inverted="false" name="Encoder:6"/>
<jog cc="0x3D" mask="0x1F" max="82" full="4608" zero="64" inverted="true" name="Encoder:6"/>
<jog cc="0x3E" mask="0x1F" max="18" full="4608" zero="0" inverted="false" name="Encoder:7"/>
<jog cc="0x3E" mask="0x1F" max="82" full="4608" zero="64" inverted="true" name="Encoder:7"/>
<jog cc="0x3F" mask="0x1F" max="18" full="4608" zero="0" inverted="false" name="Encoder:8"/>
<jog cc="0x3F" mask="0x1F" max="82" full="4608" zero="64" inverted="true" name="Encoder:8"/>
<button cc="0x40" value="127" off="0" name="Sustain"/>
<slider cc="0x41" name="Expressn"/>
<slider cc="0x42" name="XFader"/>
<slider cc="0x44" name="TchPad:X1"/>
<slider cc="0x45" name="TchPad:Y1"/>
<slider cc="0x46" name="TchPad:X2"/>
<slider cc="0x47" name="TchPad:Y2"/>
<button cc="0x48" off="0" value="1" name="Rewind"/>
<button cc="0x49" off="0" value="1" name="Forward"/>
<button cc="0x4A" off="0" value="1" name="Stop"/>
<button cc="0x4B" off="0" value="1" name="Play"/>
<button cc="0x4C" off="0" value="1" name="Record"/>
<button cc="0x4D" off="0" value="1" name="Loop"/>
<button cc="0x4E" off="0" value="1" name="[A] preview" channel="15"/>
<button cc="0x4F" off="0" value="1" name="[*] transport (toggle)"/>
<button cc="0x50" off="0" value="1" name="preview TopLeft row"/>
<button cc="0x52" off="0" value="1" name="preview BottomLeft row"/>
<button cc="0x54" off="0" value="1" name="preview DrumPads row"/>
<button cc="0x55" off="0" value="1" name="[*] preview Sliders row"/>
<button cc="0x56" off="0" value="1" name="preview TopRight row"/>
<button cc="0x57" off="0" value="1" name="preview BottomRight row"/>
<button cc="0x58" off="0" value="1" name="page down/right (LH)" channel="0"/>
<button cc="0x58" off="0" value="1" name="page up/left (LH)" channel="15"/>
<button cc="0x59" off="0" value="1" name="page up/left (LH)" channel="0"/>
<button cc="0x59" off="0" value="1" name="page down/right (LH)" channel="15"/>
<button cc="0x5A" value="1" name="page up/left (RH) press" channel="15" />
<button cc="0x5A" value="0" name="page up/left (RH) release" channel="0"/>
<button cc="0x5A" value="1" name="page down/right (RH) press" channel="0"/>
<button cc="0x5A" value="0" name="page down/right (RH) release" channel="15" />
<button cc="0x5B" value="1" name="page down/right (RH) press" channel="15"/>
<button cc="0x5B" value="0" name="page down/right (RH) release" channel="0"/>
<button cc="0x5B" value="1" name="page up/left (RH) press" channel="0"/>
<button cc="0x5B" value="0" name="page up/left (RH) release" channel="15"/>
<slider ccmsb="0x5E" cc="0x5F" min="20" max="320" zero="128" name="Tempo"/>
<button cc="0x6B" value="0" channel="0" name="[*] EXIT Special-Template"/>
<button cc="0x6B" value="1" channel="0" name="[*] INIT Special-Template"/>
<button cc="0x6B" value="0" channel="15" name="[A] EXIT Automap Universal"/>
<button cc="0x6B" value="1" channel="15" name="[A] INIT Automap Universal"/>
<jog cc="0x78" mask="0x1F" max="82" full="4608" zero="64" inverted="true" name="Encoder:1" channel="15"/>
<jog cc="0x78" mask="0x1F" max="18" full="4608" zero="0" inverted="false" name="Encoder:1" channel="15"/>
<jog cc="0x79" mask="0x1F" max="82" full="4608" zero="64" inverted="true" name="Encoder:2" channel="15"/>
<jog cc="0x79" mask="0x1F" max="18" full="4608" zero="0" inverted="false" name="Encoder:2" channel="15"/>
<jog cc="0x7A" mask="0x1F" max="82" full="4608" zero="64" inverted="true" name="Encoder:3" channel="15"/>
<jog cc="0x7A" mask="0x1F" max="18" full="4608" zero="0" inverted="false" name="Encoder:3" channel="15"/>
<jog cc="0x7B" mask="0x1F" max="82" full="4608" zero="64" inverted="true" name="Encoder:4" channel="15"/>
<jog cc="0x7B" mask="0x1F" max="18" full="4608" zero="0" inverted="false" name="Encoder:4" channel="15"/>
<jog cc="0x7C" mask="0x1F" max="82" full="4608" zero="64" inverted="true" name="Encoder:5" channel="15"/>
<jog cc="0x7C" mask="0x1F" max="18" full="4608" zero="0" inverted="false" name="Encoder:5" channel="15"/>
<jog cc="0x7D" mask="0x1F" max="82" full="4608" zero="64" inverted="true" name="Encoder:6" channel="15"/>
<jog cc="0x7D" mask="0x1F" max="18" full="4608" zero="0" inverted="false" name="Encoder:6" channel="15"/>
<jog cc="0x7E" mask="0x1F" max="82" full="4608" zero="64" inverted="true" name="Encoder:7" channel="15"/>
<jog cc="0x7E" mask="0x1F" max="18" full="4608" zero="0" inverted="false" name="Encoder:7" channel="15"/>
<jog cc="0x7F" mask="0x1F" max="82" full="4608" zero="64" inverted="true" name="Encoder:8" channel="15"/>
<jog cc="0x7F" mask="0x1F" max="18" full="4608" zero="0" inverted="false" name="Encoder:8" channel="15"/>
</device>
Проблемы:
1. Хотел выложить "дефиницию", чтоб можно было не мьютировать LoopBe (если установлен). из-за чего виртуальник воспринимал свои же сообщения, будто они приходили от контроллера. Но сообщение превышало 30k символов. поэтому сокращено (убрано дублирование некоторых названий кнопок, прописанные под 1-й и 16-й каналы). Так что, либо вырубайте драйвер виртуального MIDI кабеля, либо глушите. 1-й синдром - моргающие с бешенной скоростью page кнопки.
2. LEDs !Left и !Right. Брр.. Лампочки включаются по двоичной системе (каждая по своему биту), лучше воспользоваться альтернативой: LED !(L|R):<n> row...
Условие их "работы": Если контроллер в режиме "Левой руки", то ни одна из трёх лампочек с правой стороны загораться не будет. Если нажать какую-нибудь кнопку на правой стороне, то все 5 лампочек на левой стороне гасятся, но зато с правой стороны начинают работать, и контроллер начнёт отображать содержимое правого дисплея – всё что прописано в R:LCD.
(Надпись OFFLINE затирается, когда с VirtualDJ отправится какой-нибудь текст на этот дисплей. Если уж так бесит эта надпись, то (L|R):LCD_Clear — on)
3. LED [A] inst [*] REC в Автомапном Template зажигает кнопку inst, но в аблетоновском почему-то "красный кружок" (Кнопка Record), причём в режиме "transport LOCK ON".
4.1. Все page кнопки в удержанном состоянии повторяют своё "включение" где-то через 1,2 секунды, потом "разгоняются". Однако нужно учесть, если эта кнопка зажата (и CC команды начинают повторяться), то, нажав другую кнопку кнопку (в т.ч. preview, искл. пэды), то начнёт повторяться CC# новой кнопки (вместо page)! Так что, не используйте page кнопки в качестве "shift'а"!
4.2. preview + ◀ page ▶ кноки / или правосторонние (RightHand) page▲и page▼.
Жмём preview, затем ◀ page - принимаем CC#90 со значением "1". Отпускаем ЕЁ же - принимаем CC#91 со значением "0".
Теперь тоже самое с page ▶: получаем CC#91 со значением "1". Отпускаем - CC#90 со значением "0".
А в аблетоновском (32-м) Special-Template вообще попутаны! Мало того, что вместо CC#88◀ там CC#89◀ (и вместо CC#89▶ отправляет CC#88▶), Так ещё с preview+◀ pageпроиисходит такой же "обмен".
Прописать светодиоды с таким же поведением не удалось, т.к. им пофиг на каком канале приходит CC#88 и CC#89, поэтому LED page придётся менять местами уже в макросах VirtualDJ – к примеру: var $automap ? deck 1 select : deck 2 select.
Скажите пожалуйста, а какие CC отправляют▲page▼ кнопки на SL MK (без preview) в обоих Template'ах?
— КОНФЛИКТЫ при нажатии БОЛЕЕ ДВУХ кнопок.
Чтобы это "увидеть" выберите Template FLStudio или Resolum2.
Зажмите любую кнопку на любом ряде, затем под/над ней, нажимаете кнопку на нижнем ряду – загорается и нажатая, и та, которая НАД ней; нажимаете на верхнем ряду – загорается нажатая, и ПОД ней.
А ещё прикол - нажмите к примеру первые три кнопки верхнего ряда СЛЕВА, любую из первых трёх НА ЛЮБОМ ряде СПРАВА — вместо одной кнопки будут зажигаться ТРИ! :)
Примечание.
10. LEDs OFF (BLACKOUT): Описано, что ZeroSL (не ZeROMkII) и RemoteSL не понимает выключение всех лампочек, однако у меня работает!
11. RINGMODE#
Переключение режима индикации энкодеров. Проверить можно этими макросами:
get constant 0.0 — по часовой стрелке
get constant 0.25 — против часовой стрелки
get constant 0.5 — -5/+5
get constant 0.75 — зеркальное заполнение от центра
get constant 1.0 — по одной точке
12. LED transport lock. Удалённая активация самого transport-режима посредством VirtualDJ. Т.е. если зажжечь эту лампочку, прописав "on". То контроллер будет находится в режиме transport Lock ON, независимо, нажимали ли вы эту кнопки или нет. Кстати, насчёт нажатия, [*] transport (toggle) работает только в Аблетоновском Template. В Automap Universal эта кнопка "прошита" к третьему "скрытому" порту, и VirtualDJ не реагирует на её нажатие (как и на остальные: learn, view, user, fx, inst, mixer, или даже Speed-Dial Encoder/Button, а [*] preview Sliders – работает в 32-м (Ableton Automap) Special-Template, только если включен "TouchSel"). Всё, что помечено [A], исключительно относятся к 33-му (Automap Universal) Template. (как [A] preview).
13.1. [*] EXIT Special-Template — при переходе из "Ableton Automap" в любой обычный Template;
13.2. [A] EXIT Automap Universal – при выходе из "Automap Universal" в обычный Advanved Mode;
13.3. [*] INIT Special-Template — при выборе 32-го Template ("Ableton Automap");
13.4. [A] INIT Automap Universal работает только если используется порт U1 или U2. Тогда после "reinit'а" оно будет срабатывать.
Было бы ещё проще, если б атомиксы написали про <inputsysex/>. Для 8-го виртуальника всё проще, там <sysexin/> работает.
P.S. Хоть и данный пост никак не относится к OSCII-bot'у (и вообще к Риперу), но может, хоть кому-то, да понадобится.
Содержимое тестового скрипта для оскибота меня, как не программиста, пугает, если честно. Не понимаю я вот такие конструкции:
Код:
            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;
            )
Мда, сложновато "замудрено". Однако понятно, что при получении CC#00—CC#31 он включает некий таймер, чтоб принять 14-битный CC.
При настройке энкодера, в 14-битный режим он посылает два Контрол Ченджа: Старший байт — CC#(0-31) затем младший байт — CC#(32-63). Но контроллер не отправляет второй (LSB), если настроить этот энкодер на CC#32 или выше! Поэтому в скрипте и указано <32
Кстати, А как же ModWheel (хоть он к первому порту прошит), работает ли он в рипере? Нет ли конфликта из-за этого скрипта?
 
Последнее редактирование:
О... Без мануала будет трудновато. Я думал, что можно просто "перенести", и "будет работать", но, наверное, это могут сделать только те, у кого клиповое мышление... Всё что я пока представляю, что idx это процедура, buf - функция, а msg2 походу какой-то "алиас", хотя я скорее всего ошибаюсь... На одних "примерах использования" таких процедур я не научусь их использовать, а сейчас они для меня как "калькулятор без кнопок": что они делают, не знаю... Кстати, в одном (а может даже и не одном) Cakewalk'овском DAW именно CC#32 вообще не Learn'ится на синтах, даже на их же "продуктах" — Z3TA, Dimension (а на чужих DAW эти же синты нормально Learn'ятся при CC#32!). Когда я это заметил, я тут же вспомнил про эту «конструкцию», видимо, ждёт CC#0, который не приходит. Не знаю, каким способом это кодили Cakewalk'и, но, была бы у меня эта часть кода, я б подумал, как обставить это по-другому. Ключевое слово тут "подумал": Логику (что зачем, куда и через кого) выстроить легче, чем выразить её в коде. Читая код, можно понять эту логику, однако, чтоб написать этот код, надо ещё знать, ЧТО писать, а вдруг нужно использовать совсем другие процедуры?
Что касается рипера — не привлекает он меня, поэтому нет желания связываться с оссий-ботом.
 
Последнее редактирование:
По сути, тут рипер как раз в последнюю очередь. Речь ведь о бридже midi-osc.
Задача минимум - "замапить" все органы управления контроллера на соответствующие OSC команды. Причём, в несколько слоев - mixer/inst/user/fx. Это, плюс научить отображать на LCD экране данные из хоста.
Задача максимум - сделать универсальный скрипт, который можно было бы редактировать под абсолютно разные контроллеры. Мы что-то пробовали с Олейником и даже получалось немного, но, в силу того, что SL у Александра нет, а я так себе программист, общение по скайпу на эту тему достаточно быстро заглохло.
Тем не менее, я всё ещё надеюсь на то, что кто-нибудь решит заняться этой историей. Тем более, что с открытием третьего миди порта контроллера нет никаких больше ограничений - чистое midi.
 
Не вижу особого смысла.
Берёшь любой планшет, ставиш Lemur и рисуешь себе любой Ремоут.
 
Есть у меня лемур. Переключение между треками крутилкой значительно удобнее, чем тыканье пальцем в экран. Аналогично руление параметров плагина на активном треке удобнее делать ручками. Тем более, что ни одного безглючного шаблона и законченного шаблона для лемура мне ещё не попадалось. Было что-то близкое у звукофора. Даже вторую версию прошлой весной выпустить обещал, да так и заглохло. В каждом шаблоне чего-то не хватает. В одном - кнопок для кастомных действий, в другом - управления плагинами на треке.
Пробовал и сам рисовать, по подобию. Дальше банальных "кнопка=действие" не пошло, чтобы органы управления меняли свой функционал в зависимости от контекста.
Пока что пользуюсь вот этим софтом, с плагином от Klinke для рипера. Правда, некоторые кнопки неверно работают, но, привыкнуть можно.

screen480x480.jpeg
 
Как подсказывает опыт, для работы по сведению внешние контролеры не приживаются. Они удобны только при однообразных и монотонных операциях типпа - порезка, склейка.
Во вмех же прочих - рулит мышка.
А вот если нужно управлять каким либо стабильным проектом - тут рулит всё же индивидуально сделанный ремоут на планшете.
 
Кому что. Мне нравится пользоваться undo/redo кнопками над клавиатурой. Аналогично с зумом, переключением между треками, нажатием record, перемещением по проекту. Зачастую, в руках у меня портативный контроллер и тянуться за мышкой, чтобы куда-то прицелиться, весьма неудобно. Гораздо проще нажать кнопку или повернуть ручку на клавишах.
 
Айпад это конечно здорово, но вновь почувствовал необходимость в физических контролах. Та же эмуляция Mackie на экране планшета это просто боль.
У пульта есть ряд из восьми назначаемых кнопок f1-f8. Если использовать control surface плагин MCU от Klinke, то на эти 8 кнопок можно повесить до 128 действий, в сочетании с кнопками shift, control, alt и option на пульте. Беда в том, что попадать в них пальцами жутко неудобно. Мне, в принципе, хватило бы штатных 8 кнопок плюс 4*8 действий с модификаторами. Но вот именно в модификаторы я тупо не попадаю. Из-за этого получается так, что хочешь одно действие, а рипер выполняет другое. Не говоря уже про такие варианты как shift+alt+f1.
Так что, вновь ищу помощи в написании скрипта для оскибота. Пока что прогресс заключается в том, что контроллер умеет управлять транспортом Рипера и запускать любые экшны с любых кнопок. Дальше дело не идёт, в силу того, что я ни разу не программист.
 
Есть у меня лемур. Переключение между треками крутилкой значительно удобнее, чем тыканье пальцем в экран. Аналогично руление параметров плагина на активном треке удобнее делать ручками.
Не все с вами в этом согласны...
Говорил со многими работающими ежедневно звукорежисёрами - очень многие возвращаются просто к мышке и клавиатуре.
Ткнуть сразу в нужный трек мышкой в разы быстрее, чем крутилкой его искать.
Да и с параметрами плагинов тоже самое.
Ремоуты любые хороши для стационарно стабильного проекта с повторяющимися монотонными действиями. Для творческой работы пока удобного контролера, на мой взгляд, не изобрели.
 
Частично соглашусь по поводу звукорежиссёров. Бывает проще визуально мышкой выбрать нужное, чем вспоминать раскладку контроллера в каждом случае и смотреть на LCD экран.
Особенно, если проект сложный. Однако, для музыканта или продюсера, у которого в руках (или перед ним) находится инструмент, проще не тянуться за мышью, а активировать параметр на контроллере. То же справедливо при сведении на слух.
 

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