Yamaha PSS 480 (should work for 580, 680 and 780 too)

Yamaha PSS480 patch for Electra One

A patch to control the Yamaha Portasound/Music Station PSS480, and OPL2 YM3812-based FM synthesiser with two operators by Hardingmål.

This should also work for similar OPU2 YM3420 keyboards in the series such as the PSS580 as it’s supposedly a re-release of the PSS480, as well as the PSS680 and PSS780. That said, I have not tested the patch directly with them. If it works with these, please let me know on the forum, user Hardingmal, and I’ll confirm function here.


All main controls are mapped here on a single page and are quite self-explanatory. If in doubt, twist some knobs and get a feel for it!

The second page splits the controls differently, putting both envelopes on a row and both sets of main controls on a row, so it’s up to you which prefer.

It also allows you to set the main target user bank, plus you can also scroll through the standard stock patches here if you like using the PROGRAMME control.

The patch data will always be sent to the targeted user bank.


Because of the limitations of the PSS480, it’s best to use the SNAPSHOT function in the Electra One to store and manage your patches, this will be a little easier than relying on the 5 banks in the PSS and its battery backup.


The Yamaha PSS480 has a strange implementation of SysEx where the entire patch is sent with every adjustment, followed a programme change, only after this can the change can actually be heard.

As a result changes are only sent when you stop touching the Electra One knob. This is per-knob, so if you’re accidentally in contact with another knob, don’t worry, it won’t prevent the current adjustment from being sent.

This is to stop the MIDI buffer overflowing and causing an “Err” error state on the keyboard, or possibly overloading the Electra One and other devices in the chain with a massive backlog of MIDI data, both of which happened in testing.


Touch Screen - Sending when you release a knob is done by subscribing to POT EVENTS. As there’s currently no touch screen event I can find, touch controls won’t send to the device til you quickly tap a pot.

Patch Dump - Patch dump is manual on the PSS480, as the PSS480 does not have a dump request that I could find. If possible I will implement a manual system, where you the patch request button on the Electra One, then press patch dump on the PSS480 until the screen is flashing, then press YES (the plus button). This will dump the current patch into the Electra One. As it stands the dumped SysEx seems a little odd compared to the sent, so this is not currently hooked up as I was struggling to work it out, but I may revisit it.

Multi-timbrality - In the controlled MIDI mode, the PSS480 can technically be multitimbral, responding to multiple MIDI channels controlling multiple patches, but still with the same 12-voice polyphony. Due to the massively increased complexity of this and the limited use in a modern production context, it is not implemented here.

Key Scales - Key scaling is currently as it is depicted in the manual, where zero is off, and other figures are somewhat arbitrary. I may return to make these figures make more sense throughout the knob turn.

V1.0 - 28th April 2024 - Initial release.

1 Like

As a technical note, I’m using this within the main virtual control function to only send when the pot is released. It works well, but it would be nice to have a similarly neat function for touch screen events too, as I often like to tap switches on the screen. As it is a knob must be touched afterwards to send the patch:

    function events.onPotTouch(potId, controlId, touched)
        if touched == false then
            midi.sendSysex(portNum, sysexArray)

            local control = controls.get (5)  -- USER BANK SELECTION - get a reference or this control
            local valueObject = control:getValue ()
            local message = valueObject:getMessage ()
            userBank = message:getValue () --Store the MIDI value of the user bank, which is 100 to 104
            midi.sendProgramChange(portNum, midiChannel, userBank)

The preset is, in effect, entirely Lua, using one virtual-control function for all knobs aside from the bank controls.

It is heavily commented in case that helps future developers with other presets.

1 Like