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

Ссылки

Комментарии (9)


  1. Yoti
    31.01.2026 18:34

    Плата получается достаточно толстой, поэтому большинство кабелей джек не влезают в гнездо, подходят только очень тонкие

    Если не ошибаюсь, там механический детект. Так что можно взять пластиковую заглушку от пыли для джека, она не будет особо выступать из корпуса.


    1. AlexKaut Автор
      31.01.2026 18:34

      Да, механически. Отличная идея для игры через динамики пихи, спасибо!


      1. Yoti
        31.01.2026 18:34

        Нет, звук должен пропасть при срабатывания детекта. Или в модуле ядра пробуй патчить вывод.


        1. AlexKaut Автор
          31.01.2026 18:34

          Да, точно, подумал про размыкание пина для включения питания, но не подумал про переключение звука с динамиков на джек. В таком случае лучше джек без корпуса использовать. Как на гифке с светодиодом


  1. zatim
    31.01.2026 18:34

    Минимальное напряжение питания для 6N138 4.5 вольт, от 2.5 из PSP она, конечно, не запустилась,

    Не понял этот момент. Как это не запустилась? Это же оптопара, она работает от нуля вольт. Правда там 2 каскада, чтобы открылся последний надо хотя бы 0,7 В питания. А почему была выбрана именно эта оптопара? Можно взять любую обычную, 4-пиновую, выдрать ее из какого-нибудь бп. Она точно будет работать от 0 вольт.

    Скорее всего, дело не в вольтах, а в скорости. Оптические пары обычно очень тормознутые. У той же 138-й задержки десятки мкс на малых токах, то есть прогнать через данные нее быстрее чем на 9600 вряд ли получится.


    1. AlexKaut Автор
      31.01.2026 18:34

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


      1. zatim
        31.01.2026 18:34

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


        1. AlexKaut Автор
          31.01.2026 18:34

          Искал информацию на форумах по DIY синтезаторам, была пара постов с попытками запустить 6n138 от 3.3 вольт, там предлагали использовать другую оптопару
          Когда пытался запустить 6n138 от 2.5 вольт, делителя на выходе, конечно, не было, подтягивающий резистор пробовал в 220 и 330ом, не работало. Попробую повторить такой сценарий

          Только сейчас вспомнил про популярный опенсорсный MIDI модуль на STM32, посмотрел схему, стоит 6n137 с питанием от 3.3 вольт


          1. zatim
            31.01.2026 18:34

            Возможно, вам попалась неисправная или поддельная 6N138. В таких случаях очень сильно помогает осциллограф. Чтобы посмотреть что там реально творится на входе и на выходе.