Я сделал синтезатор на PSP с управлением по MIDI! Приложение максимально простое, 4 голоса, 4 формы волны (квадрат, пила, треугольник, синус), огибающая, фильтр и возможность сохранять 5 пресетов. MIDI клавиатура через классическую схему с оптопарой подключается в PSP's headphone remote (HPRM), тот самый порт рядом с гнездом 3.5мм для наушников

Видео с демонстрацией

MIDI клавиатура подключена в PSP
MIDI клавиатура подключена в PSP

SIO (UART) в PSP

Фирменные наушники для PSP имеют пульт для управления музыкальным плеером, он подключается в HPRM порт и общается с PSP через UART команды. Также через этот порт микроконтроллер пульта получает питание.

Подробности про порт

Очень важный момент! Порты бывают двух видов: у PSP 1000 разъём 6 пиновый и выдаёт напряжение 2.5 вольт, у 2000/3000 разъём 12 пиновый, так как появился вывод видео по кабелю, напряжение 1.9 вольт. Для подключения туда своих устройств необходимо согласовать уровни напряжений!

Для работы с UART я использовал вот этот проект https://github.com/ste2425/PSP-Serial-Example. Очевидно, что никакие PSP игры не пользовались SIO, за всю историю жизни консоли он использовался исключительно для пульта, поэтому работа с ним может быть реализована только на уровне ядра. Этот проект предоставляет возможность взаимодействовать между пользовательским приложением и UART

Рекомендую ознакомиться с проектом, ради которого ste2425 реализовывал работу с UART, это проект для управления PSP при помощи популярных геймпадов https://youtu.be/QHRCPYtjDhs?si=qXpUxitXb5a0Vm1Z&t=170. Геймпады по Bluetooth подключаются к ESP32, а ESP32 по UART передаёт на пиху данные о нажатии кнопок https://github.com/psp-bluetooth

MIDI to PSP адаптер

Самый простой и качественный вариант - купить наушники с пультом, обрезать провода и припаиваться к ним. Альтернативный способ - развести печатную плату под HPRM порт, стандартная толщина в 1.6мм держится в нём отлично. Во время разработки синтезатора я словил гиперфиксацию, ждать доставку наушников не хотелось, поэтому взял двухсторонний текстолит и ювелирно вырезал плату канцелярским ножом

MIDI2PSP1000 DIY штекер
MIDI2PSP1000 DIY штекер

К этому штекеру был припаян USB TTL, с компьютера отправлялись данные, PSP их успешно получала

PSP UART приёмник
PSP UART приёмник
Штекер + плата с оптопарой + гнездо 5din для MIDI
Штекер + плата с оптопарой + гнездо 5din для MIDI

Следующий шаг: схема с оптопарой для подключения MIDI клавиатуры. Собрал и протестировал два варианта:

Первый - это классическая схема на 6n138

6N138
6N138

5 вольт брал по USB type-c, поэтому выходной сигнал обязательно нужно было согласовать до, в моём случае, 2.5 вольт. Минимальное напряжение питания для 6N138 4.5 вольт, от 2.5 из PSP она, конечно, не запустилась, поэтому сообразил второй вариант на быстрой оптопаре tlp2361, по даташиту она требует минимум 2.7 вольт, а 2.5 вольт от PSP оказалось достаточно для работы. При питании от 2.5 вольт уровни согласовывать не пришлось

TLP2361
TLP2361

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

Без штекера в гнезде для наушников PSP не выдаёт 2.5 вольт
Без штекера в гнезде для наушников PSP не выдаёт 2.5 вольт

Можно разобрать PSP и кинуть перемычку, чтобы напряжение выдавалось всегда, но мне такой вариант не нравится, надеюсь придумать что-то попроще и более универсальное

Создание синтезатора через PSPSDK

Проект на гитхабе: https://github.com/AlexKaut/PSP_MidiSynth

Для установки приложения на PSP копируем папку /PSP_MidiSynth на консоль в /PSP/GAME/

Для сборки нужно установить PSPSDK https://pspdev.github.io/installation.html и выполнить make в папке проекта /PSP. В результате компиляции появляются два файла: kernel.prx работающий с UART и само приложение EBOOT.PBP, для удобства загрузки приложения на зызу эти файлы сразу копируются в папку /PSP_MidiSynth

Код пишется на Си, для стабильной работы чтение MIDI и генерация аудио разбиты на два потока. Интерфейс отрисован при помощи pspDebugScreen

Запустить этот синтезатор на эмуляторе, например, PPSSPP, не выйдет, так как эмуляторы не поддерживают кастомные kernel‑модули

// CONFIG
#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"

В самом начале main.c можно настроить синт
Размер буфера в 512 семлов оказался самым оптимальным. При включении приложения громкость PSP выставляется на максимум. Усиление каждой волны можно подстроить отдельно, так как квадрат звучит громче треугольника и синуса.

Ссылки