A new instrument: Roland's Jupiters (Jupiter-4, Jupiter-6, Jupiter-8) #20
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Roland's Jupiters as a new instrument: the Jupiter-4, the Jupiter-6 and the Jupiter-8, and perhaps the MKS-80 Super Jupiter. Not started.
Everything below is from recollection, with nothing read. Find and read Roland's owner's manuals and service notes before designing anything, and put them in
docs/references.md.The instruments, as recalled
To settle with the owner first
mini6is taken by the Juno, andmini8would be nearmini800andmini8000.What it needs that is not here yet
engine/four_pole_filter.hhas the four stages, so the two-pole output may be a tap.engine/state_variable_filter.hgives the three outputs at two poles; what the hardware's slopes are wants the service notes.engine/analog_vco.his this already, from the SEM family; check its waveforms against the Jupiters'.engine/zones.hare the same idea.What is already here to build on
engine/analog_vco.h,engine/ramp_oscillator.h(for the Jupiter-4's sub oscillator, if it is made as the SH-101's is),engine/four_pole_filter.h,engine/state_variable_filter.h,instruments/juno/hpf.h.engine/key_assign.h,engine/zones.h,engine/portamento.h,engine/variance.h, the shared arpeggiator (the Jupiters have their own, as the Juno-6 has) and effects.instruments/README.mdsays what an instrument must provide.Provenance
Sources read, 2026-10-12, before anything was designed. All are Roland's own; no emulator, firmware or ROM was looked at.
MPG-80_OM.pdf, with the MIDI implementationNot found: the Jupiter-8's "Circuit Description", a separate booklet its service notes point to, so Roland's words on its 12/24 dB switch, cross modulation, sync, LFO delay and key assigner are missing and those rest on the block diagram and a reading of the schematics. The MKS-80's separate "MIDI" booklet (the sheets bound into its owner's manual were used).
What the recollection in this issue had wrong, by the manuals:
Roland gives no range in hertz for the Jupiter-8's or the Jupiter-4's low-pass, no pulse width for the Jupiter-8, no depth for most modulations, no envelope curve and no control taper for any of them. Those will be placeholders.
Decision taken without asking, to be confirmed: one instrument for all four, the Jupiter-4 being the same voice with the second VCO giving only noise and a sub oscillator under the first, as the SEM and the OB-X are one.
Built, in one local commit,
5f68768"Add the Roland Jupiters as a ninth instrument". Not pushed. It has not been played or heard: it has been rendered offline and benched on the Pi. Left open for you to close after playing it.What was built
mini-JP:
instruments/jupiter/, programsminijpd,minijpctl,minijpweb,minijprender,minijpbench, patches.mjp, web port 8808. One instrument for the Jupiter-8, Jupiter-6, Jupiter-4 and MKS-80; eight voices by default,--voice.count=6a Jupiter-6,4a Jupiter-4.filter.two_pole), or the Jupiter-6's two 12 dB stages in a row as low-pass, band-pass or high-pass (filter.mode,filter.two_stage).zone.assign: Solo, Unison 1 (all voices on one key), Unison 2 (voices shared among the keys held), Poly 1, Poly 2, and Rotate (the Jupiter-4's POLY 1).zone.low_notefor the Jupiter-8's and Jupiter-4's low note priority.rom/jupiter/tables.h: Roland's ends, placeholders between.Shared code changed, since the Jupiters needed what the JX and the SEM had:
engine/seats.h(new): the JX's per-zone key seating and pedal hold, moved out ofinstruments/jx/synth.h, plus the shared unison. The JX's tests pass unchanged.engine/sub_oscillator.h(new): moved out ofinstruments/sem/voice.h.engine/four_pole_filter.h: a second output,ProcessTwoPole.Results
bazel test //...: 84 tests pass, no warnings.bazel build --config=pi --config=opt //instruments/...succeeds.minijpbenchis in the Pi's home with the others.Deliberately not done
The filters singing where the hardware's do; envelope curves; the MKS-80's ENV RESET and its later module board; memories, presets, tape and cartridge; the HOLD buttons; the Jupiter-8's separate outputs and DCB; the Jupiter-4's sample and hold to the cutoff, LFO rate bend, bender to the loudness and transpose; the Jupiter-6's faster random; foot pedals; the instruments' own arpeggiators (the shared one stands in); the MKS-80's System Exclusive.
Open questions, and what was chosen
minijp/ mini-JP /jupiter/.mjp/ 8808.filter.two_stageis off by default, so a Jupiter-6 or MKS-80 low-pass wants it switched on. The panel does not set it.zone.assignand so on).voice.countfreeze where they were.All of these are under "Open decisions" in
CLAUDE.md.A known bug that was found while this was built and not written down, now confirmed from the code and recorded in CLAUDE.md (under the Jupiters, in "Open decisions"). It is not fixed.
In the shared unison (
zone.assign2,SeatMode::kSharedinengine/seats.h), a key struck when every voice already has a key of its own is not played, but it is still counted as held:Strikeininstruments/jupiter/synth.hcallsseats.Press(key)beforeSeats::StrikeSharedturns the key away, andSeats::full(), which guards the poly way, answers false for the shared way. While that silent key stays down, the next key struck is not a first key, so withvoice.portamento_legatoon it glides though nothing else sounds.The cure is probably to ask before pressing, as the poly way does.
Worked through what was open here, 2026-10-12. The changes are in the working tree, not committed.
bazel test //...passes (120 tests) and the Pi build succeeds.Fixed
Seats::full()now answers for the shared way too, so a key struck when every voice has a key of its own is turned away before it is pressed and is never counted as held. The next key after the others come up is a first key, and does not glide undervoice.portamento_legato.engine/seats.h, so the JX has it too.voice.count(item 10). They are silenced at once, where they froze and carried on when the count was raised again. Jupiters and JX both. It is a cut with no release, which is a plain choice.Added
env.resetin each sound, number 37 of the panel, off as it comes. A note struck starts both envelopes from nothing (owner's manual, p.19). Plain choices: the level drops in one sample, and a legato note in a solo does not reset.Measured
The Jupiters' and the JX's benches on the Pi, before and after, one straight after the other beside the idle
minijxd: neither moved. Every case was 0.1 to 1.3 lower after (Jupiters, eight voices with everything: 18.0% before, 17.7% after; thirty-two: 73.3% and 72.0%).The new
minijpd,minijpctl,minijpweb,minijprenderandminijpbenchare in the Pi's home. Nothing was started:minijxdhas the Scarlett.Still yours to say
Nothing below was touched; each is as the earlier comment and CLAUDE.md have it.
minijp, mini-JP,.mjp, 8808.filter.two_stageshould start on.Closing, 2026-10-12. Everything since the comment above is in one local commit,
5550eb5"Finish the Jupiters: three key fixes, ENV RESET and the Jupiter-4's routes", which also holds what that comment described. Not pushed.bazel test //...passes (120 tests).Played and heard. On the Pi through the Scarlett: "sounds like a jupe to me", and later "looks and sounds great".
Settled by the owner
minijp, mini-JP,.mjp, 8808.filter.two_stagestarts off.Added since the last comment
sh.cutoff: the Jupiter-4's noise, sampled and held to the cutoff at the first zone'sarp.rate(owner's manual, p.19). Its clock runs free of the arpeggio's steps and of MIDI clock; the external clock for it is not done.bend.ampandstick.amp: the Jupiter-4's bender to the VCA, and its lever at LFO for the VCA (p.21).lfo.fast_random: the Jupiter-6's random at four times the rate of its other shapes.lfo.ratehere.The Jupiters' bench on the Pi after all of it, no daemon beside it, was within a tenth of the first figures in every case.
Left open, in CLAUDE.md