A new instrument: Roland's Jupiters (Jupiter-4, Jupiter-6, Jupiter-8) #20

Closed
opened 2026-10-12 03:07:00 +00:00 by bcox · 5 comments
Owner

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

  • Jupiter-4 (1978). Four voices, one VCO a voice (sawtooth, square, pulse with modulation) with a sub oscillator, and noise. A high-pass, a four-pole low-pass with resonance, an ADSR each for the filter and the amplifier, and an LFO that reaches unusually high rates. An arpeggiator, unison modes, an ensemble chorus, ten presets and eight memories. No MIDI and no velocity.
  • Jupiter-8 (1981). Eight voices, two VCOs a voice, with sync and cross modulation of the first by the second; the second can run at low frequency. A mixer, a high-pass, a low-pass switched between two poles and four, two ADSR envelopes with key follow, one LFO with a delay, and modulation of pitch and pulse width from the LFO and the first envelope. Split and dual, with an upper and a lower patch; an arpeggiator; solo, unison and two poly assign modes; 64 patches. No velocity.
  • Jupiter-6 (1983). Six voices, two VCOs a voice, each able to give several waveforms at once; sync in either direction; cross modulation; a filter that is low-pass, band-pass or high-pass; two envelopes; an LFO, and a second for the bender. Split and dual, an arpeggiator, MIDI. No velocity on the original.
  • MKS-80 Super Jupiter (1984). A rack of eight voices, kin to both the 6 and the 8, with velocity and aftertouch. Its two revisions differ in their chips.
  • JP-8000 (1996). A digital virtual analog with the Jupiter's name and not its voice. The owner decided on 2026-10-11 that it is left out, as an instrument and as a source of features for this one.

To settle with the owner first

  • One instrument, two or three. The Jupiter-8 and Jupiter-6 are both two VCOs a voice and could be one, with the filter's kind and the waveform switches as settings. The Jupiter-4 is one VCO and a sub oscillator, nearer the SH-101 and the Juno than the other two. The SEM family made a SEM and an OB-X one instrument across a wider gap.
  • Its name, and its programs' names. mini6 is taken by the Juno, and mini8 would be near mini800 and mini8000.

What it needs that is not here yet

  • The Jupiter-8's filter, two poles or four from the one filter. engine/four_pole_filter.h has the four stages, so the two-pole output may be a tap.
  • The Jupiter-6's filter. engine/state_variable_filter.h gives the three outputs at two poles; what the hardware's slopes are wants the service notes.
  • A VCO giving several waveforms at once with sync either way and cross modulation. engine/analog_vco.h is this already, from the SEM family; check its waveforms against the Jupiters'.
  • An LFO at audio rates for the Jupiter-4. Ours are read once a block.
  • An upper and a lower patch. The SEM family's sounds and engine/zones.h are 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.md says what an instrument must provide.

Provenance

  • Rule 3: no firmware disassembly and nothing extracted from a ROM. Timings and curves come from the manuals or from measuring a real instrument's audio, or are placeholders.
  • Rule 4: no factory patches. Reading a user's own dump at run time is allowed.
  • Rule 2: emulations exist. None's code may be read for more than how a problem is structured, and nothing lifted.
  • The names are trademarks, which matters for the programs' names and anything sold.
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 - **Jupiter-4** (1978). Four voices, one VCO a voice (sawtooth, square, pulse with modulation) with a sub oscillator, and noise. A high-pass, a four-pole low-pass with resonance, an ADSR each for the filter and the amplifier, and an LFO that reaches unusually high rates. An arpeggiator, unison modes, an ensemble chorus, ten presets and eight memories. No MIDI and no velocity. - **Jupiter-8** (1981). Eight voices, two VCOs a voice, with sync and cross modulation of the first by the second; the second can run at low frequency. A mixer, a high-pass, a low-pass switched between two poles and four, two ADSR envelopes with key follow, one LFO with a delay, and modulation of pitch and pulse width from the LFO and the first envelope. Split and dual, with an upper and a lower patch; an arpeggiator; solo, unison and two poly assign modes; 64 patches. No velocity. - **Jupiter-6** (1983). Six voices, two VCOs a voice, each able to give several waveforms at once; sync in either direction; cross modulation; a filter that is low-pass, band-pass or high-pass; two envelopes; an LFO, and a second for the bender. Split and dual, an arpeggiator, MIDI. No velocity on the original. - **MKS-80 Super Jupiter** (1984). A rack of eight voices, kin to both the 6 and the 8, with velocity and aftertouch. Its two revisions differ in their chips. - **JP-8000** (1996). A digital virtual analog with the Jupiter's name and not its voice. The owner decided on 2026-10-11 that it is left out, as an instrument and as a source of features for this one. ## To settle with the owner first - **One instrument, two or three.** The Jupiter-8 and Jupiter-6 are both two VCOs a voice and could be one, with the filter's kind and the waveform switches as settings. The Jupiter-4 is one VCO and a sub oscillator, nearer the SH-101 and the Juno than the other two. The SEM family made a SEM and an OB-X one instrument across a wider gap. - **Its name**, and its programs' names. `mini6` is taken by the Juno, and `mini8` would be near `mini800` and `mini8000`. ## What it needs that is not here yet - **The Jupiter-8's filter**, two poles or four from the one filter. `engine/four_pole_filter.h` has the four stages, so the two-pole output may be a tap. - **The Jupiter-6's filter.** `engine/state_variable_filter.h` gives the three outputs at two poles; what the hardware's slopes are wants the service notes. - **A VCO giving several waveforms at once with sync either way and cross modulation.** `engine/analog_vco.h` is this already, from the SEM family; check its waveforms against the Jupiters'. - **An LFO at audio rates** for the Jupiter-4. Ours are read once a block. - **An upper and a lower patch.** The SEM family's sounds and `engine/zones.h` are 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.md` says what an instrument must provide. ## Provenance - Rule 3: no firmware disassembly and nothing extracted from a ROM. Timings and curves come from the manuals or from measuring a real instrument's audio, or are placeholders. - Rule 4: no factory patches. Reading a user's own dump at run time is allowed. - Rule 2: emulations exist. None's code may be read for more than how a problem is structured, and nothing lifted. - The names are trademarks, which matters for the programs' names and anything sold.
Author
Owner

Sources read, 2026-10-12, before anything was designed. All are Roland's own; no emulator, firmware or ROM was looked at.

Instrument Owner's manual Service notes
Jupiter-8 https://cdn.roland.com/assets/media/pdf/JP-8_OM.pdf (a later printing, with DCB) Second edition, December 1982, which holds the first of October 1981: https://archive.org/details/roland_JP-8_SERVICE_NOTES_2nd
Jupiter-4 https://cdn.roland.com/assets/media/pdf/JP-4_OM.pdf (August 1982 printing) Second edition, February 1981: https://archive.org/details/roland_JP-4_SERVICE_NOTES
Jupiter-6 https://cdn.roland.com/assets/media/pdf/JP-6_OM.pdf, with its MIDI sheets First edition, June 1983: https://archive.org/details/synthmanual-roland-jp-6-service-notes
MKS-80 https://cdn.roland.com/assets/media/pdf/MKS-80_OM.pdf and MPG-80_OM.pdf, with the MIDI implementation Second edition, April 1985: https://archive.org/details/roland_MKS-80_MPG-80_SERVICE_NOTES_2nd

Not 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:

  • Jupiter-8: VCO-1 is triangle, sawtooth, pulse or square and VCO-2 sine, sawtooth, pulse or noise, one at a time. The high-pass is one pole, in each voice, ahead of the VCF. There is one LFO and one noise source for each half of four voices. Poly 1 and Poly 2 differ in release, not in portamento; Solo is low note priority; Unison shares the eight voices among the keys held. Noise is white with VCO-2 in its normal range and low-passed in LOW FREQ.
  • Jupiter-6: its filter is two identical 12 dB stages in a row: 24 dB low-pass, 24 dB high-pass, 12 dB band-pass. No dual mode, only whole and the two splits. Its MIDI carries keys and patch numbers and nothing else, so it has no numbered parameters.
  • Jupiter-4: pulse width is one of four fixed widths with PWM from the LFO only; the sub oscillator and noise are switches; the LFO is "over 0.1 Hz - 80 Hz"; the random source is noise sampled at the arpeggio's rate, to the cutoff alone; Unison 2 shares the four voices among the keys.
  • MKS-80: low-pass only with a 6 dB high-pass after each board's voices are mixed; one waveform at a time; values 0 to 100, tone parameters 0 to 47 over System Exclusive. Roland's notes do not say "Rev 4" and "Rev 5": they say serial 511800 and up, with other chips, a lower resonance level and a lower cross modulation level.

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.

Sources read, 2026-10-12, before anything was designed. All are Roland's own; no emulator, firmware or ROM was looked at. | Instrument | Owner's manual | Service notes | |---|---|---| | Jupiter-8 | <https://cdn.roland.com/assets/media/pdf/JP-8_OM.pdf> (a later printing, with DCB) | Second edition, December 1982, which holds the first of October 1981: <https://archive.org/details/roland_JP-8_SERVICE_NOTES_2nd> | | Jupiter-4 | <https://cdn.roland.com/assets/media/pdf/JP-4_OM.pdf> (August 1982 printing) | Second edition, February 1981: <https://archive.org/details/roland_JP-4_SERVICE_NOTES> | | Jupiter-6 | <https://cdn.roland.com/assets/media/pdf/JP-6_OM.pdf>, with its MIDI sheets | First edition, June 1983: <https://archive.org/details/synthmanual-roland-jp-6-service-notes> | | MKS-80 | <https://cdn.roland.com/assets/media/pdf/MKS-80_OM.pdf> and `MPG-80_OM.pdf`, with the MIDI implementation | Second edition, April 1985: <https://archive.org/details/roland_MKS-80_MPG-80_SERVICE_NOTES_2nd> | **Not 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: - **Jupiter-8**: VCO-1 is triangle, sawtooth, pulse or square and VCO-2 sine, sawtooth, pulse or noise, one at a time. The high-pass is one pole, in each voice, ahead of the VCF. There is one LFO and one noise source for each half of four voices. Poly 1 and Poly 2 differ in release, not in portamento; Solo is low note priority; Unison shares the eight voices among the keys held. Noise is white with VCO-2 in its normal range and low-passed in LOW FREQ. - **Jupiter-6**: its filter is two identical 12 dB stages in a row: 24 dB low-pass, 24 dB high-pass, 12 dB band-pass. No dual mode, only whole and the two splits. Its MIDI carries keys and patch numbers and nothing else, so it has no numbered parameters. - **Jupiter-4**: pulse width is one of four fixed widths with PWM from the LFO only; the sub oscillator and noise are switches; the LFO is "over 0.1 Hz - 80 Hz"; the random source is noise sampled at the arpeggio's rate, to the cutoff alone; Unison 2 shares the four voices among the keys. - **MKS-80**: low-pass only with a 6 dB high-pass after each board's voices are mixed; one waveform at a time; values 0 to 100, tone parameters 0 to 47 over System Exclusive. Roland's notes do not say "Rev 4" and "Rev 5": they say serial 511800 and up, with other chips, a lower resonance level and a lower cross modulation level. 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.
Author
Owner

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/, programs minijpd, 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=6 a Jupiter-6, 4 a Jupiter-4.

  • Voice: two VCOs, each with a switch for every waveform (the Jupiter-6 has several at once); the Jupiter-8's sine and noise on the second; sync either way; cross modulation of the first by the second, by hand and by ENV-1, worked out every sample; one pulse width for both, moved by the LFO, ENV-1 or the key; the Jupiter-4's sub oscillator; a one-pole high-pass in each voice; two ADSRs with key follow, the first with polarity; the MKS-80's dynamics and aftertouch.
  • Filter: the shared four-pole loop with the Jupiter-8's -12 dB switch as its second stage's output (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).
  • Keys: four sounds and up to four zones, the first two upper and lower. Each zone's 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_note for the Jupiter-8's and Jupiter-4's low note priority.
  • Panel: the MKS-80's tone parameters by its display's numbers, 2 to 49, values 0 to 100. Curves in rom/jupiter/tables.h: Roland's ends, placeholders between.
  • Performance: bender to either VCO and the cutoff; controller 1 is the LFO pad with a rise time, from the sound's LFO (Jupiter-8) or LFO-2 (Jupiter-6); controller 2 the same to the cutoff; controller 64 the hold pedal; the Jupiter-4's ensemble.

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 of instruments/jx/synth.h, plus the shared unison. The JX's tests pass unchanged.
  • engine/sub_oscillator.h (new): moved out of instruments/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.
  • Pi 3B, 2026-10-12, no daemon running: eight voices 10.8% of a core with a sawtooth alone, 17.6% with everything, 18.9% with the ensemble and effects; four 8.8%; six 13.2%; sixteen 35.1%; thirty-two 71.4%, 72.8% with effects. Two-stage filter: eight 16.1%, thirty-two with effects 67.0%.
  • Every other instrument's bench was run on the Pi before and after the shared changes, in one sitting: none moved (54 cases, 45 identical to the tenth, the rest within 0.2 but the Prophets' 32 voices, 0.8 lower after).
  • No daemon was running on the Pi before or after. minijpbench is 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

  1. One instrument or several: one, for all four. The other course is the Jupiter-4 apart.
  2. The MKS-80: included.
  3. Name: minijp / mini-JP / jupiter / .mjp / 8808.
  4. The Jupiter-8's "Circuit Description" was not found. The slope switch as a tap, cross modulation in octaves (three either way at the top, from "3 octaves when CROSS MOD is set at 5"), hard sync and the LFO delay as a fade are read from its schematic and adjustments.
  5. Filter self-oscillation: the loop sings from the shared onset; the two-stage filter never does. Roland says neither way for the 8 and the 6.
  6. filter.two_stage is off by default, so a Jupiter-6 or MKS-80 low-pass wants it switched on. The panel does not set it.
  7. Everything Roland gives no figure for is a placeholder: the 8's and 4's cutoff ranges, pulse width limits, high-pass ranges, the ensemble, tapers, envelope key follow, velocity's reach, the two-stage filter's sharpness.
  8. Key rules chosen plainly: in the shared unison a key gives up its last voices and does not get them back when another is let go; the Jupiter-4's fifth key is not played; solo and Unison 1 retrigger on a key struck and not on one that takes over.
  9. Zone parameter names follow the JX's (zone.assign and so on).
  10. Two small things a review found and left, which the JX has too: pedal up on a solo can move the dying note to another held key; voices above a lowered voice.count freeze where they were.

All of these are under "Open decisions" in CLAUDE.md.

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/`, programs `minijpd`, `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=6` a Jupiter-6, `4` a Jupiter-4. - **Voice**: two VCOs, each with a switch for every waveform (the Jupiter-6 has several at once); the Jupiter-8's sine and noise on the second; sync either way; cross modulation of the first by the second, by hand and by ENV-1, worked out every sample; one pulse width for both, moved by the LFO, ENV-1 or the key; the Jupiter-4's sub oscillator; a one-pole high-pass in each voice; two ADSRs with key follow, the first with polarity; the MKS-80's dynamics and aftertouch. - **Filter**: the shared four-pole loop with the Jupiter-8's -12 dB switch as its second stage's output (`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`). - **Keys**: four sounds and up to four zones, the first two upper and lower. Each zone's `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_note` for the Jupiter-8's and Jupiter-4's low note priority. - **Panel**: the MKS-80's tone parameters by its display's numbers, 2 to 49, values 0 to 100. Curves in `rom/jupiter/tables.h`: Roland's ends, placeholders between. - **Performance**: bender to either VCO and the cutoff; controller 1 is the LFO pad with a rise time, from the sound's LFO (Jupiter-8) or LFO-2 (Jupiter-6); controller 2 the same to the cutoff; controller 64 the hold pedal; the Jupiter-4's ensemble. **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 of `instruments/jx/synth.h`, plus the shared unison. The JX's tests pass unchanged. - `engine/sub_oscillator.h` (new): moved out of `instruments/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. - Pi 3B, 2026-10-12, no daemon running: eight voices 10.8% of a core with a sawtooth alone, 17.6% with everything, 18.9% with the ensemble and effects; four 8.8%; six 13.2%; sixteen 35.1%; thirty-two 71.4%, 72.8% with effects. Two-stage filter: eight 16.1%, thirty-two with effects 67.0%. - Every other instrument's bench was run on the Pi before and after the shared changes, in one sitting: none moved (54 cases, 45 identical to the tenth, the rest within 0.2 but the Prophets' 32 voices, 0.8 lower after). - No daemon was running on the Pi before or after. `minijpbench` is 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 1. **One instrument or several**: one, for all four. The other course is the Jupiter-4 apart. 2. **The MKS-80**: included. 3. **Name**: `minijp` / mini-JP / `jupiter` / `.mjp` / 8808. 4. **The Jupiter-8's "Circuit Description" was not found.** The slope switch as a tap, cross modulation in octaves (three either way at the top, from "3 octaves when CROSS MOD is set at 5"), hard sync and the LFO delay as a fade are read from its schematic and adjustments. 5. **Filter self-oscillation**: the loop sings from the shared onset; the two-stage filter never does. Roland says neither way for the 8 and the 6. 6. **`filter.two_stage` is off by default**, so a Jupiter-6 or MKS-80 low-pass wants it switched on. The panel does not set it. 7. **Everything Roland gives no figure for** is a placeholder: the 8's and 4's cutoff ranges, pulse width limits, high-pass ranges, the ensemble, tapers, envelope key follow, velocity's reach, the two-stage filter's sharpness. 8. **Key rules chosen plainly**: in the shared unison a key gives up its last voices and does not get them back when another is let go; the Jupiter-4's fifth key is not played; solo and Unison 1 retrigger on a key struck and not on one that takes over. 9. **Zone parameter names** follow the JX's (`zone.assign` and so on). 10. **Two small things a review found and left**, which the JX has too: pedal up on a solo can move the dying note to another held key; voices above a lowered `voice.count` freeze where they were. All of these are under "Open decisions" in `CLAUDE.md`.
Author
Owner

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.assign 2, SeatMode::kShared in engine/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: Strike in instruments/jupiter/synth.h calls seats.Press(key) before Seats::StrikeShared turns the key away, and Seats::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 with voice.portamento_legato on it glides though nothing else sounds.

The cure is probably to ask before pressing, as the poly way does.

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.assign` 2, `SeatMode::kShared` in `engine/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: `Strike` in `instruments/jupiter/synth.h` calls `seats.Press(key)` before `Seats::StrikeShared` turns the key away, and `Seats::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 with `voice.portamento_legato` on it glides though nothing else sounds. The cure is probably to ask before pressing, as the poly way does.
Author
Owner

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

  • The shared unison's silent key (the bug in the comment above). 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 under voice.portamento_legato.
  • Pedal up on a solo (item 10). The sounding key is now lifted last, so the note is let go where it is, or handed to a key still down, and never moved to another key the pedal was holding. In engine/seats.h, so the JX has it too.
  • Voices above a lowered 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

  • The MKS-80's ENV RESET: env.reset in 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, minijprender and minijpbench are in the Pi's home. Nothing was started: minijxd has the Scarlett.

Still yours to say

Nothing below was touched; each is as the earlier comment and CLAUDE.md have it.

  1. One instrument for all four, or the Jupiter-4 apart.
  2. Whether the MKS-80 belongs.
  3. The name: minijp, mini-JP, .mjp, 8808.
  4. The Jupiter-8's "Circuit Description", still not found.
  5. Whether either filter should sing where it does.
  6. Whether filter.two_stage should start on.
  7. Every placeholder Roland gives no figure for.
  8. The key rules in the shared unison, and the Jupiter-4's fifth key.
  9. It has still not been heard.
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 - **The shared unison's silent key** (the bug in the comment above). `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 under `voice.portamento_legato`. - **Pedal up on a solo** (item 10). The sounding key is now lifted last, so the note is let go where it is, or handed to a key still down, and never moved to another key the pedal was holding. In `engine/seats.h`, so the JX has it too. - **Voices above a lowered `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 - **The MKS-80's ENV RESET**: `env.reset` in 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`, `minijprender` and `minijpbench` are in the Pi's home. **Nothing was started**: `minijxd` has the Scarlett. ## Still yours to say Nothing below was touched; each is as the earlier comment and CLAUDE.md have it. 1. One instrument for all four, or the Jupiter-4 apart. 2. Whether the MKS-80 belongs. 3. The name: `minijp`, mini-JP, `.mjp`, 8808. 4. The Jupiter-8's "Circuit Description", still not found. 5. Whether either filter should sing where it does. 6. Whether `filter.two_stage` should start on. 7. Every placeholder Roland gives no figure for. 8. The key rules in the shared unison, and the Jupiter-4's fifth key. 9. **It has still not been heard.**
Author
Owner

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

  • One instrument for all four, the MKS-80 included: no reason seen for either split.
  • The name and port: minijp, mini-JP, .mjp, 8808.
  • Its defaults are the Jupiter-8's, there being no model switch, so filter.two_stage starts off.
  • The shared unison's key rules and the other plain choices: fine.
  • System Exclusive left out; the shared arpeggiator in place of the instruments' own; memories and hold left to their own issues.

Added since the last comment

  • Rotate takes the next voice in turn when every voice's key is held (the Jupiter-4's POLY 1); Poly 1 and Poly 2 still leave such a key unplayed, as the Jupiter-8's and MKS-80's manuals say. No document says which the Jupiter-4 does.
  • sh.cutoff: the Jupiter-4's noise, sampled and held to the cutoff at the first zone's arp.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.amp and stick.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.
  • Not added: the Jupiter-4's LFO BEND slider, which only offsets the LFO rate a memory holds (p.20) and so is lfo.rate here.

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

  • The Jupiter-8's "Circuit Description", looked for again and not found. It was issued apart from the first edition of the service notes and never reprinted; the three scans found (two on archive.org, one on synthfool.com) are all the second edition. A printed first edition would have it.
  • Whether the filters sing where the hardware's do: not known, left open.
  • Every figure Roland does not give: waits on measurements and recordings, there being no hardware.
  • Not built: the MKS-80's later module board, and the Jupiter-4's transpose.
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 - One instrument for all four, the MKS-80 included: no reason seen for either split. - The name and port: `minijp`, mini-JP, `.mjp`, 8808. - Its defaults are the Jupiter-8's, there being no model switch, so `filter.two_stage` starts off. - The shared unison's key rules and the other plain choices: fine. - System Exclusive left out; the shared arpeggiator in place of the instruments' own; memories and hold left to their own issues. ## Added since the last comment - **Rotate takes the next voice in turn** when every voice's key is held (the Jupiter-4's POLY 1); Poly 1 and Poly 2 still leave such a key unplayed, as the Jupiter-8's and MKS-80's manuals say. No document says which the Jupiter-4 does. - **`sh.cutoff`**: the Jupiter-4's noise, sampled and held to the cutoff at the first zone's `arp.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.amp`** and **`stick.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. - Not added: the Jupiter-4's LFO BEND slider, which only offsets the LFO rate a memory holds (p.20) and so is `lfo.rate` here. 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 - **The Jupiter-8's "Circuit Description"**, looked for again and not found. It was issued apart from the first edition of the service notes and never reprinted; the three scans found (two on archive.org, one on synthfool.com) are all the second edition. A printed first edition would have it. - **Whether the filters sing** where the hardware's do: not known, left open. - **Every figure Roland does not give**: waits on measurements and recordings, there being no hardware. - Not built: the MKS-80's later module board, and the Jupiter-4's transpose.
bcox closed this issue 2026-10-12 19:50:29 +00:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
bcox/mini-800#20
No description provided.