Я сделал синтезатор на 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 выставляется на максимум. Усиление каждой волны можно подстроить отдельно, так как квадрат звучит громче треугольника и синуса.
Ссылки
Комментарии (9)

zatim
31.01.2026 18:34Минимальное напряжение питания для 6N138 4.5 вольт, от 2.5 из PSP она, конечно, не запустилась,
Не понял этот момент. Как это не запустилась? Это же оптопара, она работает от нуля вольт. Правда там 2 каскада, чтобы открылся последний надо хотя бы 0,7 В питания. А почему была выбрана именно эта оптопара? Можно взять любую обычную, 4-пиновую, выдрать ее из какого-нибудь бп. Она точно будет работать от 0 вольт.
Скорее всего, дело не в вольтах, а в скорости. Оптические пары обычно очень тормознутые. У той же 138-й задержки десятки мкс на малых токах, то есть прогнать через данные нее быстрее чем на 9600 вряд ли получится.

AlexKaut Автор
31.01.2026 18:346n138 стандартная оптопара для MIDI входа. По поиску "MIDI In schematic" практически все схемы будут на ней. Чтобы оптопара корректно работала как логический элемент, ей требуется минимум 4.5 вольт. Запитав её от 2.5 вольт, PSP входящий сигнал не видела

zatim
31.01.2026 18:34Оптопара это не логический элемент. Это транзистор (или сборка транзисторов), управляемый светом. Я посмотрел даташит, там нигде нет числа 4,5. Непонятно, откуда оно взялось. Оптопару можно питать любым напряжением, в том числе и 2,5 вольт. В вашей схеме нужно выкинуть нафиг делитель, а коллектор выходного транзистора подтянуть к питанию через низкоомный резистор (в даташите фигурирует 270 ом). И схема заработает.

AlexKaut Автор
31.01.2026 18:34Искал информацию на форумах по DIY синтезаторам, была пара постов с попытками запустить 6n138 от 3.3 вольт, там предлагали использовать другую оптопару
Когда пытался запустить 6n138 от 2.5 вольт, делителя на выходе, конечно, не было, подтягивающий резистор пробовал в 220 и 330ом, не работало. Попробую повторить такой сценарий
Только сейчас вспомнил про популярный опенсорсный MIDI модуль на STM32, посмотрел схему, стоит 6n137 с питанием от 3.3 вольт
zatim
31.01.2026 18:34Возможно, вам попалась неисправная или поддельная 6N138. В таких случаях очень сильно помогает осциллограф. Чтобы посмотреть что там реально творится на входе и на выходе.
Yoti
Если не ошибаюсь, там механический детект. Так что можно взять пластиковую заглушку от пыли для джека, она не будет особо выступать из корпуса.
AlexKaut Автор
Да, механически. Отличная идея для игры через динамики пихи, спасибо!
Yoti
Нет, звук должен пропасть при срабатывания детекта. Или в модуле ядра пробуй патчить вывод.
AlexKaut Автор
Да, точно, подумал про размыкание пина для включения питания, но не подумал про переключение звука с динамиков на джек. В таком случае лучше джек без корпуса использовать. Как на гифке с светодиодом