Подключить педали экспрессии к компьютеру за полчаса

в 21:34, , рубрики: виртуальный музыкальный инструмент, Педаль экспрессии
КДПВ. Педаль конструктивно не та!

КДПВ. Педаль конструктивно не та!

Эта статья — сжатый туториал на тему подключения педалей экспрессии к компьютеру. От читателя не требуется специальных навыков в области электроники, но умение паять желательно. На минималистичное повторение подключения при наличии всех узлов и материалов действительно достаточно полчаса (автор проверил с секундомером и уложился в 10 минут). С другой стороны, верхнего предела нет: потенциал по обработке сигнала с педалей (кривые, лимиты) при этом ограничивается разве что фантазией, средствами языка Python и быстродействием контроллера.

Контекст

Сразу стоит оговориться, что речь идет именно о педалях для виртуальных музыкальных инструментов, особенно о ситуации, когда этих педалей нужно более одной. Автосимуляторы с такими педалями не работают, а инструменты на основе физического моделирования на них завязываются очень удачно. Здесь, например, Dr. Mix играет на струнных из Audio Modelling SWAM с применением двух педалей. Pianoteq поддерживает блоки из трех педалей фортепианного типа. Не всегда MIDI-клавиатура или иной контроллер имеет столько физических входов для педалей и не всегда возможности переназначения их функций имеются. Вот тут-то возможно применение решения, о котором далее.

Ингредиенты

  • Педали, от одной до трех штук. Проверено с Roland EV-5 и Roland DP-10 (фортепианная подпружиненная). В теории решение совместимо и с другими педалями, которые имеют потенциометр внутри и оканчиваются TRS-джеком 6,35 мм (1/4 дюйма), но в такой ситуации действуйте на свой страх и риск. Вместо педалей можно рассмотреть и потенциометры-крутилки, и аналоговые духовые контроллеры, но это уже отдельное направление для развития темы.

  • Классический вариант Raspberry Pi Pico на базе RP2040. Переход на Pico 2 также должен протекать беспрепятственно, но не имеет экономической целесообразности. Достаточно одной штуки на всю конструкцию с тремя педалями.

  • USB-кабель для Raspberry Pi Pico (как правило, на стороне контроллера нужен Micro-USB). Тоже один.

  • Ответные разъемы TRS 6,35 мм (гнездо) по количеству педалей.

  • Для макета без пайки — провода «для ардуино» (dupont wires и прочие пафосные названия тоже о том же) и крючки для логического анализатора. Лучше взять побольше.

  • Для изделия — припой, инструменты для пайки и монтажный провод любой не слишком толстый. Требования по току скромные (не выше 1 мА), а монтаж столь прост, что можно распустить витую пару или ПВС 0,5 мм2. Впрочем, гораздо удобнее использовать цветной НВ-4 0,2 мм2.

  • Корпус по вкусу. Одна штука. Для длительной эксплуатации нужен, а для макета можно обойтись.

Программная часть

Работать конструкция будет под CircuitPython, поэтому забираем с сайта проекта самую свежую версию в виде файла UF2.

Для установки змеи достаточно подключить Raspberry Pi Pico с зажатой кнопкой BOOTSEL к компьютеру, после чего закинуть файл UF2 на обнаружившуюся «флешку».

Далее нужно скачать и распаковать zip-архив с библиотеками (версия библиотек должна соответствовать версии CircuitPython). Из папки lib внутри архива в папку lib на Raspberry Pi Pico нужно скопировать отдельный файл simpleio.mpy и целую папку adafruit_midi.

Минимальный набор библиотек

Минимальный набор библиотек

После этого в файл code.py, лежащий на Raspberry Pi Pico (в корне), вставить приведенную в листинге ниже программу. Программа любезно позаимствована здесь и доработана для унификации и поддержки трех педалей.

Список cc_map = [2, 4, 11] можно и нужно редактировать, если требуется переназначить функции педалей.

Строка 31 (now[i] = ...) может быть творчески доработана с целью внедрения кривых чувствительности, инверсии и т. п. Этот шаг не является обязательным, базовое масштабирование диапазона уже включено.

##### code.py #####
import time
import board
import usb_midi
import adafruit_midi
import simpleio
from analogio import AnalogIn
from adafruit_midi.control_change import ControlChange

cc_map = [  # Use a MIDI CC list, e. g. this one https://anotherproducer.com/online-tools-for-musicians/midi-cc-list/
            2, # CC2 (Breath Controller)
            4, # CC4 (Foot Pedal)
            11, # CC11 (Expression)
         ]


midi = adafruit_midi.MIDI(
    midi_in = usb_midi.ports[0], in_channel = 0, midi_out = usb_midi.ports[1], out_channel = 0
)

pedal = [AnalogIn(board.A0), AnalogIn(board.A1), AnalogIn(board.A2)]
now = [0, 0, 0]


while True:

    time.sleep(0.001) # 1 ms
    active = False

    for i in range(3):
        now[i] = int(round(simpleio.map_range(pedal[i].value, 0, 65535, 0, 127)))
        active = active or (now[i] > 2)

    if active:
        message = [ControlChange(cc_map[0], now[0]), ControlChange(cc_map[1], now[1]), ControlChange(cc_map[2], now[2])]
        midi.send(message)

По желанию рядом с code.py можно создать файл boot.py и в целях оптимизации и защиты от случайного изменения отключить в нем лишние функции контроллера.

##### boot.py #####
import usb_hid, usb_midi, usb_cdc
import storage
import board
from digitalio import DigitalInOut, Direction, Pull


usb_cdc.disable()
usb_hid.disable()
usb_midi.enable()


button = DigitalInOut(board.GP14)
button.direction = Direction.INPUT
button.pull = Pull.UP

if button.value:
	storage.disable_usb_drive()
    

Внимание! Данный файл boot.py отключает «режим флешки». Чтобы его вернуть, отключите Raspberry Pi Pico от компьютера, защипните чем-нибудь токопроводящим GP14 и GND (как на фото), после чего подключите обратно.

Перемычка

Перемычка

Аппаратная часть

Raspberry Pi Pico служит мостом между аналоговыми педалями и портом USB.

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

Макет

Макет

На фото показана конструкция для одной педали. Для трех лучше зафиксировать разъемы на корпусе, а соединения выполнить пайкой.

Принципиальная схема не разрабатывалась. Соединения оформлены табличкой. Весьма полезными здесь могут оказаться описание разъема TRS и иллюстрация с назначением выводов Pico, позаимствованная у производителя.

Назначение выводов Raspberry Pi Pico

Назначение выводов Raspberry Pi Pico

Педаль 1

Педаль 2

Педаль 3

Sleeve (гильза)

AGND (33)

AGND (33)

AGND (33)

Ring (кольцо)

3V3 OUT (36)

3V3 OUT (36)

3V3 OUT (36)

Tip (наконечник)

ADC0 (31)

ADC1 (32)

ADC2 (34)

Иными словами, общий провод всех педалей заводится на общий контроллера, питание для всех педалей берется с вывода 36 контроллера, а выход каждой педали поступает на свой вход встроенного АЦП. Назначение контактов штекера приведено для Roland EV-5 и Roland DP-10. Если ваши педали другие, рекомендуется найти их схемы.

Внимание! Разъемы TRS могут вызывать незапланированные замыкания контактов при коммутации, поэтому подключать сначала следует педали к контроллеру, а затем — контроллер к компьютеру. Альтернативой может послужить установка резисторов по 100 Ом в каждый провод, например.

Пробный заезд

В списке MIDI-устройств в Cubase успешно появляется CircuitPython Audio.

Обнаружилось!

Обнаружилось!

Запись с него возможна. Цель достигнута.

Кусочек сигнала, записанного с педалей при помощи собранного устройства

Кусочек сигнала, записанного с педалей при помощи собранного устройства

Вместо заключения. TODO, или идеи развития

  • Однозначно упаковать в корпус.

  • Реализовать те или иные защитные цепи на разъемах (резисторы в разрыв, диодные «вилочки», антистатическая защита на входы АЦП).

  • Изучить надобность RC-фильтра на входе.

  • Прикрутить программные кривые чувствительности.

  • Изучить вопрос регулярной потери нескольких семплов (малозначимо, поскольку педаль — орган управления довольно медленный).

  • Не поддаться соблазну навесить кнопочки и крутилки.

Милости прошу в комментарии, особенно если есть желание и возможность поделиться другими примерами применения!

Автор: kaseiiro

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js