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

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мм держится в нём отлично. Во время разработки синтезатора я словил гиперфиксацию, ждать доставку наушников не хотелось, поэтому взял двухсторонний текстолит и ювелирно вырезал плату канцелярским ножом

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


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

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

Но тут я столкнулся с проблемой, которую не придумал, как можно красиво решить. Хотелось сделать печатную плату с оптопарой и разъёмом для подключения прямо в PSP, чтобы можно было заказать и спать кучку таких адаптеров. Проблема в том, что PSP выдаёт напряжение на HPRM порт только если воткнуть в гнездо 3.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 выставляется на максимум. Усиление каждой волны можно подстроить отдельно, так как квадрат звучит громче треугольника и синуса.
