← go home Side project · Building with AI · Case study

complicated machine: d50 controller

I designed and built a plugin for my Roland D-05 that puts every parameter on one screen and lets you save and load sounds.

311Parameters on one screen
2Days to build it
The short version

Why

I was music directing a live show and needed to program sounds on a D-05. Without a PG-1000 programmer, editing a D-50 is a 2 line screen and a couple of buttons for 300+ parameters.

What

A DAW plugin with a dedicated, automatable control for every parameter, 2 macro knobs, and a librarian that reads and writes the synth's memory.

How

I set the design rules and approved every screen as a mock first. I built it with Claude to speed up the coding, and tested every build on the hardware.

Outcome

A working AU/VST3 plugin, verified on the unit, with a manual, in about 2 days of sessions.

01 / Why

Programming a D-50 without a programmer is painful

The Roland D-50 is one of the great 80s synths and the D-05 is the modern reissue. Both have over 300 parameters per patch and a 2 line screen to edit them with. Roland sold a separate box, the PG-1000, with a knob or slider for every parameter. They're rare and expensive now.

I was music directing a live performance and needed to program a set of sounds for it. Clicking through menus one value at a time wasn't going to work.

What I wanted was the PG-1000 inside my DAW. Every parameter on screen, every one of them automatable, and a way to keep the sounds I made.

Before

FUNCTION, page, page, INCREMENT, INCREMENT, ENTER. One parameter at a time, from memory of where it lives in the menus.

After

Every parameter is a knob or switch on one screen. Turn it and the synth changes. Draw it in the DAW and it moves over time.

What already existed

A web editor that covers the parameters but can't be automated, a commercial editor I didn't like the look of, and used PG-1000s for more than the synth cost.

02 / Setup and timeline

Just a boy and his synthesizer

The hardware

A D-05 on USB into Ableton Live on my Mac. Claude can't test hardware, so I ran every test on it.

Day 1

Feasibility, requirements, first UI mock, design rules agreed, macro design.

Day 2, morning

Phase 1 on hardware: SysEx proof, pull a patch, change a parameter, play notes through the plugin.

Day 2, afternoon

Full UI with all 311 parameters, macros, collapsing, resizing. Then the library, light mode, palette.

Day 2, wrap up

Library verified against the unit's bulk dump and load, a crash on close fixed, manual written.

03 / What got built

The whole synth on one screen, plus a librarian

The full plugin window with every D-50 parameter as a knob or switch

Editor

311 parameters across patch, 2 tones and 4 partials. Knobs, switches and menus per my design rules. Every change goes to the synth as you make it. Every control is an automation lane in Live or Logic.

Macros

2 knobs that move any group of parameters together, relative to where they sit. Assign by clicking knobs. One lane to automate instead of 10.

Library

Reads and writes the unit's memory over its own bulk dump protocol. Banks are plain .syx files, so any D-50 bank from the internet loads. Drag, rename, right-click.

Extras

Light and dark, a hidden palette editor, a 7 page manual, a SysEx log for support.

Editor
A single tone section of the editor
Library
The librarian with banks and patches from the unit
04 / How

The loop: rules, mock, approve, build, test, log, fix

01 · Rules02 · Mock03 · Approve04 · Build05 · Test on hardware06 · Log07 · FixBack to 02

What I did

  • Described the plugin I wanted in plain language, with the synth manuals attached.
  • Reviewed the UI mocks and marked up what was wrong, same as a design review.
  • Wrote the design rules once: grid, spacing, knob sizes, when a switch becomes a dropdown.
  • Ran one terminal command to rebuild, opened Live, tested, and reported back what happened.
  • Made the scope calls: what to cut, what to rename, when to stop.

What I used Claude for

  • Reading the D-50 MIDI spec and Roland's D-05 docs, and finding the parts that weren't documented by testing.
  • Building the parameter table, the SysEx layer, the UI, the macro system and the library.
  • Rendering mocks, and screenshots of the real build for me to review.
  • Adding a log of every message to and from the synth, and using it to fix the transfers.
  • Drafting the manual from the finished build.

I described it, approved mocks, and tested on my own desk. The parts that needed a human were the parts that need a designer anyway: deciding what it does, how it looks, and whether it's right.

05 / Design rules as the contract

Set the rules once, then every screen followed them

Early on a build came back that didn't match the mock I approved. So I made a rule: no UI change without a mock first, and I sign off before anything gets built. After that the mocks and the builds matched.

I wrote the design rules the way I'd write them for a design system at work. 4px grid, panel padding, knob sizes, label sizes, what gets a switch and what gets a dropdown. Every panel follows those rules.

The rules, as agreed
Grid4px. Window padding 12. Panel gap 8.
Panel1px border, 3px radius, 8px padding, lowercase caption top left, actions top right.
Knob30px ring in a 44px cell, label above, value below. Small variant for envelope stages only.
Switches2 or 3 options only. More than 3 is a dropdown.
ColourNeutral greys. Colour only on knobs assigned to a macro.
TypeOne sans at 3 sizes. Italic serif once, for the title.
ChangesShow a mock, get approval, then build.

Same thing that makes our AI design system work. Define the system first, then generating to it is cheap and consistent.

06 / Debugging hardware from logs

Debugging on the synth

Sending a bank of 64 sounds to the unit failed twice. The synth showed a comm error and nothing else. I used Claude to add a log of every MIDI message in both directions, then ran the failing transfer once.

The log showed it in one read, and one rebuild later it worked. The same loop fixed a crash on close and the bank dump handshake. Every build still writes this log. It's the support tool for the plugin now.

07 / Deciding scope

The calls I made, and what they saved

Feedback, review and testing were necessary to make this a successful product. I tested every build on the synth, and when something was confusing or broken I stopped and called it out before anything else got built.

Stop and spec the library

After 2 confusing builds I said stop, asked for the questions, answered them, approved a mock, and built it once. That build hasn't changed since.

Cut write to unit

The D-05 ignores single patch writes over MIDI. Instead of a workaround, the button went away and the manual says: load it, then press WRITE on the synth.

Name things for the user

"unit" not "d-05", since a D-50 owner uses it too. "save group" not "pull bank". A snapshot is labelled with the time it was read so nobody thinks it's live.

08 / What Claude could and couldn't do

Why review mattered

Could
  • Turn a 1987 MIDI spec into working code, including a handshake protocol it had only read about.
  • Build a UI to a written set of rules and keep every panel consistent.
  • Render the real build and compare it to the mock before handing it to me.
  • Read a log, find the one wrong message, and fix it in a single pass.
  • Write the manual from the finished product with no notes from me.
Couldn't
  • Touch the synth. Every test, every log, every "it works" came from me.
  • Know what the D-05 does differently from the D-50 until the hardware said so.
  • Tell that a UI was confusing. I had to use it and say so.
  • Decide scope. It will happily keep building. Saying no was my job.

This is the same shape as my AI design system work at CDK. The designer sets the rules and approves, the AI generates to them, and the review loop catches what's wrong. The plugin is the proof that the loop holds up all the way to shipped software and real hardware.

Next case studyAn AI-enhanced design system