JE8086 (Roland JP-8000) on Zynthian — full preset switching with WHOLE / arp reset switch back banks and show preset list continuously applicable for NodalRed2x VirtualJV Osirus

Hey everyone — sharing my JE8086 / Roland JP-8000 setup for Zynthian (V5, RPi
5) in case it helps anyone else struggling with firmware-emulator plugins.

@smatheusale on Instagram — feel free
to reach out there with questions, success reports, or improvements.

What works

  • 128 single patches (Internal A1-1B8-8) — all selectable from the
    Zynthian bank/preset UI, each one resets the plugin to Key Mode = WHOLE
    and arpeggiator OFF.
  • 64 performance patches (Internal P1-1P8-8) — each P-slot carries
    its own full state, so loading P3-3 jumps to that performance with its Key
    Mode (single / dual / split), arp setting, layers, etc.
  • A blank (none) audition entry.
  • An init preset that’s auto-loaded every time you add a new JE8086
    chain — clean WHOLE / arp-off start.

Why this is non-trivial

The Usual Suspects’ firmware-accurate emulators (JE8086, NodalRed2x,
similar for Osirus; and giulioz’s VirtualJV) ignore LV2
state:state restore for patch selection on a running instance
. Even the
vendor’s own “default” preset doesn’t change the active patch at runtime. So
the stock Zynthian LV2 engine path loads a preset and you hear no difference.

The only mechanism that reliably switches patches on a running JE8086 is
MIDI Bank Select + Program Change:

Bank MSB LSB PC range Patches
Single A 0 0 0..63 A1-1 … A8-8 (64)
Single B 0 1 0..63 B1-1 … B8-8 (64)
Performance P 0 2 0..63 P1-1 … P8-8 (64)

Nice surprise: while StateString doesn’t restore the patch slot at runtime,
it does restore Key Mode and arpeggiator on/off reliably. So the
working pattern is:

  • Patch slot → MIDI Bank Select + PC, added via a small zynthian-ui
    engine patch.
  • Key Mode + arpstate:state StateString inside the TTL. All 128 A/B
    singles share the same init blob to force WHOLE / arp-off; each P-slot has
    its own captured state.

How to install

Everything is packaged as a self-contained restore kit:

git clone https://github.com/smatheusale/zynthian-custom.git \
  /zynthian/zynthian-my-data/zynthian-custom
cd /zynthian/zynthian-my-data/zynthian-custom
sudo ./restore.sh   
./verify.sh

That applies the engine patch, drops the preset cache + bundle in place,
restarts Zynthian, and runs 11 sanity checks.

Important gotcha

The Web Admin’s “Scan for new presets” button regenerates
/zynthian/config/jalv/presets_JE8086.json via a vanilla lilv crawl, which
strips out the midi_bank_select fields the engine patch depends on and
drops empty banks. If you hit it by accident:

cd /zynthian/zynthian-my-data/zynthian-custom && sudo ./restore.sh

Optionally lock the cache so the scan can’t touch it:

sudo chattr +i /zynthian/config/jalv/presets_JE8086.json

Generalising to other firmware emulators

The engine patch already handles both midi_pc (int) and midi_bank_select
([msb, lsb, pc]). Same approach should work for NodalRed2x (Nord Lead —
simple PC), VirtualJV (Bank Select + PC like JE8086), and probably
Osirus. Cache layout in presets_JE8086.json is the template.

Legal

  • This repo does not redistribute the JE8086 binary or any vendor assets —
    buy it from The Usual Suspects and install at
    /usr/local/lib/lv2/JE8086.lv2/.
  • Code is MIT-licensed. Engine patch is derived from zynthian-ui and remains
    GPL-3.0. Roland, JP-8000, JD-800, etc. are trademarks of Roland Corporation,
    used here purely descriptively.
  • Full disclaimer:
    zynthian-custom/DISCLAIMER.md at main · smatheusale/zynthian-custom · GitHub

Happy to take questions, PRs, or alternative implementations. Tested on
ZynthianOS 2601 Vangelis + Raspberry Pi 5 + V5 controller. Other revisions should be
fine but ymmv.

-– @smatheusale


Summary of what I did:

3 Likes

This solution only works when the JE8086 chain is set to a FIXED MIDI channel (e.g. channel 1). It does NOT work with the chain’s MIDI channel set to “ALL” / omni.

In omni mode, Zynthian collapses every incoming MIDI channel into ch0, which breaks multitimbral routing for Dual / Split Performances — only the Upper Part will respond. Preset switching also breaks unless the dispatch can target a real channel.

Use MIDI channel 1 (or any other fixed channel) — not ALL. If you want any keyboard to play it regardless of its TX channel, configure the remap on the input side instead of switching the chain to omni.

1 Like