Skip to content

RetroLoom/sed1200emu

Repository files navigation

SED1200Emu

This project replaces the hard-to-obtain Epson SED1200-based LCD module found in the Roland MT-32 (and similar gear) with a modern Raspberry Pi Pico driving a color TFT or grayscale OLED panel. It captures the MT-32's native SED1200 display bus, mirrors the text onto the new panel, and adds a layer of modern features on top: real-time MIDI VU meters, color themes, screensavers/burn-in protection, and a browser-based monitor and control panel.

The project began as a drop-in replacement for the SED1200 using an ATMEGA8 and a standard HD44780 LCD. The original project page can be found at http://sensi.org/~tnt23/sed1200emu/index.html. All attempts to reach the original designer have failed — please reach out if you have any information. This Pico-based revision supersedes the ATMEGA8 design and is where active development now happens.

⚠️ This project is still in active testing. It works and is in use, but it has not been validated across every MT-32 revision, display, or MIDI host. Installation involves opening your synth and soldering to its main board. Use it at your own risk — there is no warranty. See Disclaimer & Warranty before you build or install.

The emulator running in a Roland MT-32, showing live per-channel activity and master volume.

Raspberry Pi Pico installed inside the MT-32, tapping the display bus and MIDI lines.

Features

  • Native SED1200 bus capture — reads the MT-32's original display data and re-renders it on a modern panel.
  • Two supported displays, selectable at compile time:
    • ST7789 — 284×76 RGB565 color TFT
    • SH1122 — 256×64 4-bit grayscale OLED
  • MIDI pass-through forwarder with overflow protection — sits inline between the MIDI source and the MT-32 CPU, solving a long-standing MT-32 problem: SysEx-heavy games can overflow the MT-32's small input buffer, causing dropped data, checksum errors, and stuck or wrong sounds. See MIDI Forwarding & Overflow Protection below.
  • Real-time VU meters — per-channel note activity with velocity-driven brightness, configurable size, position, and labels.
  • Color themes — selectable background/foreground color schemes (color on ST7789, grayscale on SH1122).
  • Screensavers & burn-in protection — automatic dimming and a choice of screensaver styles (blank, waves, plasma, ribbons, and customizable moving text).
  • Persistent settings in flash — all layout, theme, brightness, and behavior options survive power cycles.
  • Live configuration over USB serial or MIDI SysEx — no reflashing needed to tune the display.
  • Web-based monitor & control panel (MT32_Monitor.html) — a browser UI using the Web MIDI API to mirror the display, watch the MIDI buffer, and adjust device settings live.

Hardware

The core is a Raspberry Pi Pico. This repository also includes KiCad designs for the supporting hardware modules:

  • PC910 Module — opto-isolated MIDI input buffering.
  • ST7789 Shim — adapter/carrier for the ST7789 TFT panel.
  • SH1122 Shim — adapter/carrier for the SH1122 OLED panel.

Note: The MT-32 bezel blocks the lower portion of the display, so content is positioned in the upper area. A shim adapter determines the physical display position; see the module folders for the current designs.

Installation

The Pico and its shim board mount inside the MT-32, replacing the original SED1200 LCD. It taps the MT-32's internal display bus to read the text the synth wants to show, and sits inline on the MIDI input path so it can buffer and forward MIDI to the MT-32 CPU.

The Raspberry Pi Pico on its carrier board, wired into the MT-32 main board.

Opto-isolated MIDI tap soldered to the MT-32's CPU, feeding the forwarder's MIDI-in (MI) and MIDI-out (MO) lines.

MIDI Forwarding & Overflow Protection

One of the biggest benefits of this mod is what it does for MIDI reliability. The Pico doesn't just listen to the display — it sits inline between the MIDI source and the MT-32's CPU, forwarding every message. This solves a well-known MT-32 weakness: SysEx-heavy software can overrun the synth's small input buffer, causing dropped bytes, checksum errors, and missing or incorrect instruments.

The forwarder runs on the Pico's second core, isolating MIDI timing from display rendering. Incoming MIDI is received via DMA and sorted into three priority queues:

  • Real-time messages (clock, active sensing) can interleave anywhere, even mid-SysEx.
  • Channel-voice messages (notes, CCs, program changes) flow through at full wire speed, so game and song timing is preserved.
  • SysEx messages are sent atomically with address-aware pacing — the forwarder knows which MT-32 memory regions are slow to write and inserts just enough delay after each message to keep the synth's buffer from overflowing.

Additional reliability features:

  • Overflow & checksum monitoring — the firmware watches both the MIDI input hardware (for overrun/framing errors) and the MT-32's own display bus for its native "buffer overflow" and "checksum error" messages, with counters and diagnostics on the serial log.
  • Runtime pacing toggle — pacing can be turned off for hosts that already pace SysEx themselves (e.g. Orpheus PCMIDI intelligent mode, SoftMPU, DOSBox mt32.delay), letting MIDI pass through transparently at wire speed.
  • MIDI back-channel — responses are sent to the MT-32 with a manufacturer ID the synth ignores, so they appear on its MIDI THRU jack where the web monitor can read device state.

Building the Firmware

The firmware is built with the Raspberry Pi Pico SDK and CMake. The source lives in src/pico/.

Prerequisites

  • Raspberry Pi Pico SDK
  • CMake (3.13+) and the ARM GCC toolchain (arm-none-eabi-gcc)
  • Ninja or Make

Select your display

Open src/pico/display.h and set the display type:

// SELECT YOUR DISPLAY HERE:
#define DISPLAY_TYPE DISPLAY_TYPE_ST7789   // or DISPLAY_TYPE_SH1122

Configure and build

Point CMake at your SDK (use an absolute path) and build:

cd src/pico
cmake -B build -DPICO_SDK_PATH=/path/to/pico-sdk
cmake --build build

The resulting firmware image is build/sed1200_display.uf2.

Flashing

Hold the BOOTSEL button while plugging the Pico into USB so it mounts as a mass-storage device, then copy sed1200_display.uf2 onto it. The Pico reboots and runs the firmware automatically.

Configuration

Settings are stored persistently in the Pico's flash and can be changed at runtime — no reflashing required.

Web Monitor & Control

Open MT32_Monitor.html in a browser that supports the Web MIDI API (e.g. Chrome/Edge). It connects to the device over MIDI and lets you:

  • Mirror the SED display text live
  • Monitor MIDI activity and the forwarder's buffer state
  • Adjust themes, VU meters, brightness, screensaver behavior, and layout
  • Toggle SysEx pacing
  • Save settings to flash or reset to factory defaults

The device exposes a MIDI back-channel via the MT-32's MIDI THRU, allowing the browser to read device state and push changes.

USB Serial / SysEx

The same configuration parameters are available over USB serial and over MIDI SysEx (MT-32-compatible message format), including theme, SED text position/scale, display offset and brightness, VU meter layout and labels, channel indicators, screen-protection timeouts, screensaver style and text, and SysEx pacing. Settings can be saved, loaded, or reset to defaults.

Serial Debugging

The firmware uses USB for stdio output. Connect a serial terminal to view debug and status messages.

Documentation

Reference material lives in documents/, including the MT-32 Implementation Guide (patch/timbre system and SysEx details), the Roland MT-32 owner's manual and service notes, the SED1200 and display datasheets, and the MT-32 sound list.

Original ATMEGA8 Version

Before the Pico-based redesign, this project used an ATMEGA8 to drive a standard HD44780 character LCD as a direct SED1200 replacement. That version is preserved in the project's git history.

The original ATMEGA8 + HD44780 build.

Disclaimer & Warranty

This project is provided "as is," without warranty of any kind. It is an enthusiast hardware/firmware modification that is still in its testing phases — actively developed and in use, but not exhaustively validated across all MT-32 hardware revisions, displays, MIDI sources, or operating conditions. Bugs, regressions, and breaking changes should be expected between revisions.

Please understand and accept the following before building or installing:

  • You install and use this at your own risk. Installation requires opening a vintage instrument and soldering to its main board. Done incorrectly, this can permanently damage your MT-32, the Pico, the display, or connected equipment.
  • No guarantee of fitness. There is no guarantee that the hardware or firmware will work for your particular unit or use case, or that it is free of defects.
  • Not affiliated with Roland. "Roland" and "MT-32" are trademarks of their respective owners. This is an independent, unofficial project and is not endorsed by or affiliated with Roland.
  • Modifications void any remaining manufacturer warranty and may affect the value of collectible hardware.

To the fullest extent permitted by law, the authors and contributors accept no liability for any damage, loss, or injury arising from the use of this project. The full legal terms are in the GPL v3 (software) and CERN OHL-S (hardware) licenses below — note especially their "no warranty" and "disclaimer of liability" sections.

If you find a problem or have improvements, contributions and bug reports are very welcome.

License Information

This project is derived from the original release by Tim Tashpulatov, which was released without license or warranty. The updated revisions of this project (2024 onward) include a GPL v3 license, found in the LICENSE file.

Source code and software license — GPL v3

Hardware design license — CERN OHL-S

About

A Raspberry Pi Pico display replacement for the Roland MT-32, with a modern TFT/OLED, MIDI VU meters, and MIDI buffer-overflow protection.

Topics

Resources

License

Stars

Watchers

Forks