Подключение MIDI-клавиатуры к синтезатору на PSP

Превращаем Sony PSP в MIDI-синтезатор: аппаратная и программная реализация

Мне удалось реализовать проект портативного синтезатора для консоли PSP с полноценным управлением по протоколу MIDI. Приложение обладает лаконичным функционалом: 4-голосная полифония, поддержка четырех типов волны (квадрат, пила, треугольник и синус), настраиваемая огибающая, фильтр и банк на 5 пресетов. Подключение MIDI-клавиатуры осуществляется через классическую схему с опторазвязкой в порт пульта дистанционного управления (HPRM), расположенный рядом со стандартным аудиоразъёмом 3.5 мм.

Ознакомиться с демонстрацией работы устройства можно на видео: Синтезатор на PSP в действии.

Подключение MIDI-клавиатуры к синтезатору на PSP
Процесс сопряжения MIDI-клавиатуры с консолью

Технические особенности SIO (UART) в архитектуре PSP

Штатный пульт управления наушниками PSP обменивается данными с консолью посредством UART-команд через порт HPRM. Этот же интерфейс обеспечивает питание микроконтроллера пульта. Подробную спецификацию распиновки можно изучить на PS Dev Wiki.

Схема порта HPRM

Критически важный нюанс: существуют различия в вольтаже между ревизиями. В PSP 1000 используется 6-пиновый разъем с напряжением 2.5 В, тогда как в моделях 2000/3000 разъем стал 12-пиновым (из-за поддержки ТВ-выхода), а напряжение снизилось до 1.9 В. При проектировании собственных устройств согласование уровней напряжения является обязательным условием.

Для низкоуровневого взаимодействия с UART я использовал библиотеку PSP-Serial-Example. Поскольку штатное ПО консоли не задействовало SIO-интерфейс для пользовательских нужд, работа с ним возможна только на уровне ядра (kernel mode). Данный проект служит мостом между пользовательским кодом и аппаратным UART.

Стоит также отметить проект PSP-Bluetooth от того же автора, где реализовано управление консолью современными геймпадами через связку ESP32 и UART.

Создание адаптера MIDI to PSP

Наиболее эстетичный вариант изготовления переходника — использование корпуса от штатного пульта. Однако в рамках прототипирования я пошел по пути создания кастомной печатной платы под разъем HPRM. Текстолит стандартной толщины 1.6 мм идеально фиксируется в порту. Из-за невозможности оперативной доставки комплектующих, плата была вырезана вручную из двухстороннего фольгированного диэлектрика.

Самодельный штекер для PSP
Самодельный интерфейсный разъем для PSP 1000

Работоспособность была подтверждена передачей данных через USB-TTL конвертер, после чего я перешел к интеграции опторазвязки. Были протестированы две конфигурации:

  1. Схема на базе 6N138: требует питания 5 В (взято с USB Type-C), что влечет за собой необходимость принудительного согласования выходного сигнала до уровня 2.5 В.
  2. Схема на скоростной оптопаре TLP2361: согласно спецификации, ей достаточно 2.7 В, но практика показала стабильную работу и от 2.5 В, выдаваемых самой PSP. Это позволило отказаться от внешнего питания и согласования уровней.
Схема на TLP2361
Оптимизированная схема на базе TLP2361

В ходе проектирования выявилась конструктивная особенность: PSP подает питание на HPRM только при наличии вставленного 3.5 мм джека в соседнем гнезде. Поскольку самодельный адаптер получился массивным, это ограничивает выбор используемых аудиокабелей — подходят только модели с очень узким корпусом штекера.

Особенности питания порта
Демонстрация зависимости питания порта от аудиоразъема

Программная часть: разработка в среде PSPSDK

Исходный код проекта доступен в моем репозитории: PSP_MidiSynth на GitHub.

Для компиляции использовался стандартный PSPSDK. Архитектура приложения на языке Си построена на двух потоках: один отвечает за считывание MIDI-событий, второй — за генерацию аудиосигнала. Визуальный интерфейс реализован средствами библиотеки pspDebugScreen.

Важно: Работа синтезатора на эмуляторах (включая PPSSPP) невозможна, так как они не поддерживают загрузку кастомных модулей ядра.

// Основные параметры конфигурации синтезатора
#define SAMPLE_RATE   44100
#define BUF_SAMPLES   512
#define MAX_VOICES    4
#define VOLUME        PSP_AUDIO_VOLUME_MAX
#define TWO_PI        6.28318530718f

#define GAIN_SINE      2.1f
#define GAIN_TRIANGLE  2.4f
#define GAIN_SAW       1.2f
#define GAIN_SQUARE    1.0f

#define PRESET_COUNT   5
#define PRESET_FILE "ms0:/PSP/GAME/PSP_MidiSynth/presets.bin"

Экспериментальным путем было установлено, что размер буфера в 512 семплов обеспечивает оптимальный баланс между задержкой и стабильностью звука. Также в коде предусмотрены индивидуальные коэффициенты усиления (Gain) для каждого типа волны, чтобы компенсировать разницу в их субъективной громкости.

Ресурсы и полезные ссылки

 

Источник

Читайте также