
Эта статья — сжатый туториал на тему подключения педалей экспрессии к компьютеру. От читателя не требуется специальных навыков в области электроники, но умение паять желательно. На минималистичное повторение подключения при наличии всех узлов и материалов действительно достаточно полчаса (автор проверил с секундомером и уложился в 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, позаимствованная у производителя.

|
Педаль 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