Skip to content

Releases

O-simpleBeatmaker v1.6.0

Choose a tag to compare

This release includes every change since v1.4.1: versions 1.4.2, 1.4.3, 1.5.0 and 1.6.0.

[1.6.0] — 2026-11-01

Removed

  • Swing. The knob and all swing timing are gone, along with the Triplet Swing lesson preset (five lesson presets remain) and the swing legend in the timing lane. Quantize Demo keeps its humanize and quantize settings and now plays without swing. Sessions and pattern automation that used swing now play straight.

Changed

  • The swing parameter ID stays as a hidden, non-automatable parameter named "Swing (unused)", so saved sessions keep loading. Nothing reads it. A DAW may still list it, or an existing swing lane, where it has no effect.

Tests

  • Render harness: swing-param-inert and swing-param-hidden replace swing-offset, quantize-removes-humanize replaces quantize-preserves-swing, and the carry-over check in block-boundary now uses humanized hits.

[1.5.0] — 2026-11-01

Changed

  • The pattern now plays only when the DAW plays. Stopping the DAW stops the pattern at once, and voices that are already sounding ring out. MIDI notes from a track still play the drums while stopped. In a DAW the grid always follows the host tempo, including during Preview, and the Tempo knob shows that tempo and takes no drag. The knob sets the speed only where no host reports a tempo, such as the standalone app. Behaviour change for existing sessions: an instance that used to free-run while the DAW was stopped is now silent.
  • The transport line reads stopped, preview or synced. "free-run" is gone.

Added

  • Preview button, below the step grid. It plays the pattern from step 1 while the DAW is stopped. Pressing play in the DAW ends it, so stopping the DAW afterwards is silent. Closing the plugin window also ends it, and offline renders ignore it. It is never saved in a session.
  • MIDI note numbers on the lane labels (Kick 36, Snare 38, Clap 39, Closed Hat 42, Open Hat 46, Tom 45).
  • Twelve pattern slots, recalled by MIDI notes 0–11 or from the row below the grid. Click loads, Store then click saves, right-click or Delete empties. A slot holds the steps, their velocities and the pattern length. Swing, humanize, quantize and the voice knobs stay as set. A note switches at its exact sample, so a note on a downbeat changes that downbeat, at any block size. An empty slot ignores its note. Slots are saved in the session; older sessions open with all slots empty.

Fixed

  • A step that rounded onto the first sample of a block fired one sample early, at the end of the previous block. Each step now fires in the block that contains its rounded sample. This was also needed for switching: without it, a switch note on a downbeat could lose to the old pattern's step.

Notes

  • Starting playback partway through a song does not chase the last switch note, so the pattern stays whichever was last recalled. Put a switch note at the start of every section, including the first.
  • Some DAWs may stop calling a plugin while the transport is stopped, which would leave Preview silent. Not yet tested in a DAW.

Tests

  • Render harness: 26/26, with 14 new gates covering the stopped transport, Preview, switch position across block sizes and all 64 block-edge alignments, length recall with no message thread, empty slots, and session round trips including pre-1.5.0 sessions. Removing the half-sample window fails the downbeat and block-edge gates.

[1.4.3] — 2026-10-19

Fixed

  • Clicking another dial now applies a typed value. With a value-entry field open, pressing on a different dial left the field open and its readout frozen. The press now applies the typed value and closes the field before the new drag starts.

[1.4.2] — 2026-10-19

Changed

  • Output level now starts at −6 dB on new instances and is the last stage of
    the chain. Lesson presets no longer set it, and loading a preset leaves it
    where you put it. Saved sessions recall their stored level unchanged. The six
    per-voice Level knobs are unchanged and still part of each preset.
  • Double-click a dial to type a value — Enter or click away applies, Esc
    cancels. Alt/Option-click resets a control to its default (this was
    double-click). Typed values accept % on Swing (0–75 %) and the percent
    knobs, BPM on Tempo, -inf for a level floor.

O-simplePhysicalModelSynth v1.5.0

Choose a tag to compare

Damping and Decay now shape the Modal resonator. No parameter IDs or ranges change, but saved Modal sounds will sound different.

Fixed

  • Decay now works across its whole range on the Modal resonator. From about C4 upward, every setting above roughly 30% sounded the same, and the default of 70% was already past that point. Root cause: each mode's ring time was turned into a filter Q, and Q was capped at 500. At C4 the fundamental stopped growing at 4.2 s and the 4th mode at 1.05 s. At C5 nothing changed above 25%. The cap is gone. The ring time is now limited to 0.3–7.2 s instead, and the 8 mode filters run in double precision so the very high Q values stay accurate.
  • Damping now acts on the Modal resonator. Before, it only reached the String resonator (the Modal bank had no damping input), and that also left the Material macro half-dead in Modal mode. It now removes high-frequency energy with the String loop filter's 12 kHz → 1.5 kHz cutoff, at the same loss per second as a C4 string loop. Modes near or above the cutoff die faster, so more Damping gives a darker, shorter tail, which is what Damping already does on the String.

Changed

  • Bow → Modal gets makeup gain that rises with Damping (drive × (1 + 0.5 · Damping)). A sustained bow's level follows √Q, so Damping alone made Bow → Modal about 4 dB quieter at the default 60%. At Damping 0 the gain is unchanged, so the loudest case (C6, velocity 127, Force 100, Decay 100) stays at a 0.99 peak.
  • Factory presets Struck Bar and Bell re-fitted: Damping 55 → 12 and 70 → 15, Decay unchanged. Both were authored while Damping had no effect. The re-fitted values keep their old upper-partial ring times within about 20%, and the fundamentals now ring as long as their Decay values always asked for.
  • Modal sounds at the default Damping of 60% are now darker. Pluck → Modal at C4 is about 2.6 dB quieter early in the note.

Testing

  • Render harness 29/29. New checks: modal-decay-upper-range (C5, Decay 50 vs 100), modal-damping-darkens (C4, Damping 10 vs 90: darker and quieter tail), modal-sweep-finite, and modal-bow-bounded (Bow → Modal over Damping {0,100} × Decay {0,50,100} × C2/C4/C6, peak < 1.05). The first two FAIL on v1.4.4 with bit-identical output for both settings.

O-simpleGrain v1.5.6

Choose a tag to compare

Fixed

  • Dropped sounds now come back when a project reopens. A file dragged onto the plugin was saved only by name, because the WebView doesn't pass the file's location. After a DAW restart or project reopen the plugin silently went back to Fire. The session now stores the sound itself.
  • A loaded file that moved or was deleted no longer breaks the session. Files from Load… are still re-read from their path first. If the file is gone, the stored copy is used instead, which also covers opening the project on another machine.
  • The status line names the loaded file. It now shows when the editor opens (it used to appear only right after a load), names files loaded with Load… (they used to show only "Source loaded"), and clears when you switch to a built-in sound (the old file's name used to stay).
  • A sound that can't be restored is reported. Older sessions only have the name of a dropped file, so they still can't recover it. When that happens, or the stored copy is missing, a notice names the file and says the default source is playing instead.

Notes

  • The stored copy is the audio the plugin actually uses (up to 10 s) at the file's own sample rate. Integer files are stored as lossless FLAC, float files as 32-bit float WAV so peaks above 0 dBFS aren't clipped. That adds roughly 0.5–3 MB per instance to a session, however long the dropped file was.
  • A change of sample rate now re-decodes the stored copy instead of re-reading the Load… file from disk on every prepare.

O-simpleSubtractive v1.7.4

Choose a tag to compare

Fixed

  • Windows: no more "page not found" when WebView2 cannot start. v1.7.1
    selected the WebView2 backend, but if the WebView2 environment cannot be
    created on a machine (runtime not installed, or its data folder unusable),
    JUCE silently builds the legacy IE control instead. That control has no
    resource provider, so the page still came up "not found" (reported in
    Reaper). The editor now probes with WebBrowserComponent::areOptionsSupported
    first; when WebView2 is unavailable it paints a native notice with a link to
    the Microsoft Edge WebView2 Runtime instead. Audio, parameters and host
    automation are unaffected.
  • WebView2 data folder moved out of %TEMP%. It is now
    %APPDATA%\Ouaricon\WebView2\O-simpleSubtractive, created before WebView2
    starts, so temp cleaners and locked temp folders cannot stop the UI loading.
    macOS (WKWebView) and the DSP are unchanged.

O-simpleReverb v3.0.0

Choose a tag to compare

O-simple family retrofit. MAJOR: the plugin is renamed O-simpleReverb
(was O-SimpleReverb) and gets the O-simple field-guide interface. The DSP is
untouched: every render nulls bit-exact against v2.0.0 (48 presets x 3 stimuli
x 44.1 / 96 kHz + an automation run, 290 buffers, on the installed VST3). No
parameter ID, range, skew, default, plugin code (OuSr) or state format
changed: v2.0.0 (and v1.x) sessions, automation and user presets load with
identical values.

Changed

  • Renamed O-SimpleReverb -> O-simpleReverb (case only), to match the
    O-simple family. Hosts identify the plugin by its codes, not its name, so
    sessions reconnect; the name a host lists changes after its plugin rescan.
  • The interface is rebuilt at 1180 x 780, resizable 0.6x - 1.5x at a fixed
    aspect (the size is saved with the session). Four live wells, each drawn
    from the processor's own numbers: Live Decay (input and wet tail in
    dBFS over the last 6 s, with the RT60 slope the DSP is set to), Early
    Reflections
    (the actual taps for the type and SIZE; Spring shows its own
    echoes, Plate has none), Tone of the Tail (the tone stage's real
    response, Character and Low Cut as separate curves) and the output
    meter
    . A signal-path strip lights the stage each control moves.
  • Lessons: two rows under the controls — the six Spaces (one per type)
    and Init plus four Ideas (Size ≠ Decay, Character: dark ↔ bright, Low Cut,
    Insert vs Send). A lesson resets everything to defaults and applies its
    recipe; lessons are never written to disk. The 48 utility presets stay in
    the preset browser, grouped by type.
  • ◀ / ▶ walk the bank in TYPE order, then your user presets (sorted).
    v2.0.0 walked one alphabetical list with user presets mixed in.
  • Preset bar: Save and Delete are inline (a user preset cannot take a
    lesson or factory name in any language). Load file… moved to the gear
    menu. The v2 "Save to file" dialog is gone — user presets save into the
    plugin's preset folder.
  • Every label and hover tip in English, French and Simplified Chinese; the
    type names stay English (they are the host automation names).

Notes

  • No preset-folder migration is needed. User presets live in
    ~/Library/O-SimpleReverb/Presets/User; on the case-insensitive volumes
    macOS and Windows use, O-simpleReverb is the same folder, and the folder
    keeps its old-case name on disk. On a case-sensitive macOS volume the
    plugin renames O-SimpleReverb to O-simpleReverb the first time it loads,
    before anything reads the folder (a no-op everywhere else).
  • A user preset named like a lesson is renamed, not hidden. v2.0.0 had no
    lessons, so a user preset could be called "Init". On first load v3 renames
    Init.json to Init (user).json (Init (user 2) if that is taken), so it
    stays listed, loadable and deletable. Nothing is deleted. A v2 session saved
    on that preset shows "Init (user)" when its values match the renamed file
    rather than the lesson.
  • An existing O-SimpleReverb install is replaced by the installer; on macOS
    the old-case bundle folder name may remain (cosmetic).

O-Octagon v1.16.0

Choose a tag to compare

@github-actions github-actions released this 16 Oct 04:48

Added

  • Factory venues: Default venue / Flat ring. Two buttons at the right of the
    Venue screen's header load a room without needing a .venue file. Flat ring
    is a generic octophonic ring: eight speakers 45° apart on a 5 m circle about
    (6, 6) m, at seated ear height (1.20 m) over a flat floor (rake 1.20 / 1.20).
    Speaker 1 is front-left and the numbering runs clockwise, the same order as the
    Barnett placeholder, so a label set made for one reads the same on the other.
    Default venue reloads the Roy Barnett placeholder.
    Both replace the geometry, rake and name, set trims and delays to zero, and
    keep the eight output labels (the cabling belongs to the operator, not the
    room). Built in C++ (VenueModel::applyFactoryRoom) and applied through
    applyVenueEditChecked, like every other venue write. The result is shown on
    the header's result line. Bridge surface: 27 → 28 calls (applyFactoryRoom).
  • The buttons sit in the header, not the rail, because a rail group overflowed the
    rail by 78 px at the shipping size. They are pinned at the widest language
    (French), so nothing moves between en, fr and zh-Hans.

Notes

  • The default venue is unchanged: VenueModel() and resetToDefaults() are
    untouched, and loading Default venue is bit-equal to them (unit probe FR4).
  • zh-Hans strings ship at reviewed:'mt' and the French at reviewed:false. Both
    still need their reverse/read pass.
  • Gates: unit 64/0 (FR1–FR4 new: ring on the circle, 45° spacing, 8 hull
    vertices, flat rake, Derive ≈ 0 on the ring, labels kept). Layout 39 sections
    pass. check-ui-labels, check-i18n, fr-lint and zh-lint pass. ui_frontend_check:
    43/44. Section 30 (GainStage reset() count 23 vs 20) fails identically on the
    v1.15.4 backup, so it predates this change.

O-Marimba v1.16.0

Choose a tag to compare

@github-actions github-actions released this 16 Oct 22:29

The Effects tab gets a reverb: the new shared modules/effects/reverb-unit 1.0.0, mounted under the compressor. The EQ and compressor strips are restyled to match it (analog-eq-unit and compressor-unit 1.3.0; O-Marimba is their only consumer). The release also carries two fixes from a UI review. MINOR: 7 parameters are added, and none is renamed, re-ranged or removed. The reverb is OFF by default. Preset loading resets every parameter to its default before applying the stored subset (WR-01), so existing presets and sessions render exactly as before. Harness check: with the unit OFF, the output is bit-identical to the input.

Added

  • Reverb unit (Effects tab, third strip). The tank is the 8-channel FDN plate from O-Formant v1.32's ReverbProcessor, the same design O-Bells and O-Lyrica use. Formant's copy was chosen because it carries the WR-16 per-sample size and pre-delay smoothing and the IN-12 sample-rate fixes.
    • Controls: REVERB (bypass), Size, Damp, Pre-dly, Mod, Shimmer and Mix.

    • Parameters:

      ID Range Default
      fx_rev_enabled on/off off
      fx_rev_size 0–1 0.5
      fx_rev_damp 0–1 0.5
      fx_rev_predelay 0–200 ms 20 ms
      fx_rev_mix 0–1 0.25
      fx_rev_mod 0–1 0.2
      fx_rev_shimmer 0–1 0
    • Chain: Synth → Body → EQ → Comp → Reverb → Output Gain. The reverb sits after the compressor so the tail is not pumped.

  • Three changes from the plugin copies of the tank, made in the module:
    • Turning the unit off, or Mix to 0, ramps the wet path down over 50 ms. The tank idles only once the fade lands on zero. The plugin copies stopped processing on the same block and cut the tail with a step.
    • On a mono output bus the unit outputs (L + R) / 2 of the tank. The plugin copies aliased the right channel onto the left and kept only R.
    • Mod and Shimmer are smoothed per sample. Parameters are read from cached APVTS atomics.
  • getTailLengthSeconds() now reports pre-delay + RT60 (0.2 s + size² × 11.8 s) while the reverb is on. It was a constant 0 and still is when the reverb is off.
  • Captions are localized in EN, FR and zh-Hans using O-Formant's reviewed strings. app.js keys them with literal dataset.i18n assignments, the form check-i18n [15] reads. Shimmer zh-Hans 微光 is reviewed: 'mt'.
  • Strip geometry: 505 × 71 px, the same as COMP, at top 189 with 4 px gaps. Its right edge clears the gear by 10 px.

Changed

  • The three Effects strips share one contract. It lives in analog-eq-unit 1.3.0, compressor-unit 1.3.0 and reverb-unit 1.0.0:
    • One face. Every strip uses var(--font-serif), which is EB Garamond with the page's CJK fallbacks, and buttons inherit it. The modules declared Garamond, which isn't installed, so the EQ and COMP rendered in Times. Under zh-Hans the stack also resolved differently and grew the EQ by 2 px, moving 135 nodes.
    • The same box. Each strip is 505 px wide with 21 px side padding and a 76 px bypass button (EQ / COMP / REVERB). Line-heights are fixed, so nothing changes height between Latin and CJK. Before: EQ 503.4 / COMP 505.5 wide; bypass buttons 45.9 / 61.6 / 80 px; buttons 23 → 26 px tall in zh-Hans.
    • One column grid. EQ bands are 60 px with a 4 px gap. COMP and REVERB knob groups are 48 px with a 16 px gap and a 6 px lead-in. All three sit on a 64 px pitch, so the knob centres at x = 185.5 / 249.5 / 313.5 / 377.5 line up through all three strips. Before, the EQ had a 64 px pitch starting at 195, and COMP and REVERB a 61 px pitch starting at 202 and 192.5. ANALOG and the AUTO + GR cluster both end at x = 530.5.
    • 9 px floor. EQ band labels move up from 8 px. W/M/T, the EQ value tooltip and the GR label move up from 7 px. The COMP readouts move up from 8 px.
    • AA fills. On is #4E6839 with #FFF (6.24:1; it was #6B8E4E, 3.75:1). Off is #6B5040 with #E8D5B7 (5.14:1; it was #8B7355 with #DDD, 3.30:1). Captions are #B8A08C.
    • Off states use colour, not opacity. Only the knob graphics fade, to 0.4. A disabled band's on/off label and Q row, and a bypassed strip's text controls (band labels, W/M/T, ANALOG, AUTO), take a muted #3A2E24 / #B8A08C fill (5.29:1). At opacity they measured 1.37–2.12:1. A disabled band's own on/off label, the control that turns the band back on, sat at 0.14 effective opacity inside the bypassed EQ, which is the default view. The EQ value tooltip stays opaque over the Q row in a dimmed band.
    • A declared ground. Each strip has a solid #221C14 under its gradient. This is the census-ground issue v1.15.0 fixed for the page.

Fixed

  • EQ and COMP strips touched. The EQ strip is 100 px tall at 1.3.0 (99 before), so COMP's top edge sat on the EQ's bottom edge. COMP moves from 109 to 114, restoring the 4 px gap the v1.9.9 comment intended.
  • Strike Position tooltip contradicted the DSP. The tooltip said "Center (0%) … edge (100%)". MarimbaVoice::getStrikePositionMultiplier treats 0 and 1 as the two edges and 0.5 as the centre, and the readout shows Edge / Center the same way. The tooltip now says "Center (50%) … either edge (0% or 100%)". The French text is redrafted (reviewed: false) and the zh-Hans text is re-authored (reviewed: 'mt').

Removed

  • #effects-future, an empty, inline-styled placeholder at 0.3 opacity.

Not changed

  • .tab-content height stays 326. 74 + 326 runs 6 px past the 394 px content box. A trial at 320 lifted every bottom-anchored row by 6 px: velocity and output, the TUNING keyboard, and its 10 px gap to the Scala grid. Those rows were placed against the 326 frame, and the 6 px it clips holds nothing. A comment now records why.

Known: inherited from the tank, not changed here

  • The wet signal is strongly correlated. All 8 channels are fed the same mono input, and the tail's L/R correlation is 0.93. With sustained tonal input the early wet comb-filters against the dry signal. At the defaults (mix 0.25, size 0.5), switching the reverb on changes the level of real notes by −4 to +4 dB depending on pitch: 6 renders averaged per point, at notes 48, 60 and 72.
  • Wet level grows with Size, because RT60 grows as size² and there is no wet normalisation. On a 523 Hz decaying burst at mix 0.25, size 0.5 measures −4.6 dB and size 0.8 measures +6.8 dB.
  • Mix is a linear law, as in DryWetMixer's default: the dry signal drops 2.5 dB at 25 %. The same tank in O-Formant, O-Bells and O-Lyrica behaves identically.

Verified

Check Result
Offline ReverbUnit harness, 12 checks ALL PASS. OFF is bit-identical; tail present; switch-off step 9.4e-4 ≤ the tail's own 1.17e-3; gone within 100 ms; exact silence once idle; mono = (L+R)/2; tail formula; finite at 22.05/44.1/96/192 kHz with max shimmer, mod and size
Negative control (ramp set to 0) The switch-off check FAILS (step 4.46e-3), so the gate is not vacuous
check-i18n.js ALL PASS. Before the keys were literal it failed [15] with 7 dead keys
check-ui-labels.js (now including the new effects tab state) ALL CHECKS PASSED. v1.15.0 on the same state: 135 EQ/COMP nodes moved in zh-Hans
measure-ui.js --contrast 0 / 124 below AA in each language, 0 under 9 px, min 5.14, median 8.56. v1.15.0: 0 / 88 on SOUND and TUNING with the Effects-tab module text excluded, 20 / 20 of which was below AA
Effects-tab geometry (en / fr / zh-Hans) Identical in all three languages: strips at x 47.5 and 505 wide; bypass buttons 76 × 23; knob centres on one grid
Served page, 600 × 400, en/fr/zh-Hans SOUND and TUNING are pixel-identical to v1.15.0 (transitions settled). No page errors, no 404s
Installed VST3 (pedalboard) 7 reverb parameters exposed; finite output; tail at 2–3 s is 0 when OFF and 8.8e-3 when ON
auval AU VALIDATION SUCCEEDED
pluginval, strictness 5 SUCCESS

O-GrainScatter v3.0.1

Choose a tag to compare

Fixed

  • Custom collection: Apply rejected typed cents. The text field used the
    Scala-file rule, where a bare integer is a ratio (2 = 2/1). So
    100 200 … 1200 parsed as the ratios 100/1 … 1200/1, the period 1200/1
    (~12 274 ct) failed the 4-octave check, and Apply was refused every time.
    The field's own default text failed the same way, so reopening the editor
    showed 100 200 … again. In typed input a bare integer is now cents, and a
    ratio needs a /. .scl files keep the Scala rule: their bare integers are
    rewritten as a/1 before they reach the text form.

Added

  • Apply confirms success with "Applied: N pitches per period." under the field.

Testing

  • Parser unit test compiled against juce_core (text and .scl paths, including
    the .scl → text round-trip the processor performs): 9/9 pass. The same test
    on v3.0.0 fails 3 (100 200 … 1200, 100 250 1200, 146.3 292.6 1902, all
    badPeriod), which confirms the root cause.

O-simpleAmbisonics v1.0.1

Choose a tag to compare

Review pass (/improve): bugs, simplification, UI idle cost. No parameter, range, state
or DSP-output change; the engine's audio path is untouched.

Fixed

  • Save could overwrite a user preset without asking. The page checked the typed
    name for the "Replace?" prompt, but the plugin strips "#@,;:<>*^|?\/, control
    characters and leading dots before saving — "My:Pad" silently replaced "MyPad". The
    page now cleans the name exactly as the plugin does before both checks (and "Init?"
    now shows the factory-name message, not the generic save error).
  • A user preset named like a copy key was translated in the dialogs ("decoder"
    read « Décodeur » in the Delete / Replace prompts). Names are bidi-isolated (FSI …
    PDI), which also keeps right-to-left text in a name from reordering the sentence.
  • The azimuth automation gesture could end mid-drag. Scrolling the knob and then
    dragging the sphere within 250 ms let the wheel timer end the gesture while the drag
    still wrote. One shared pointer-drag helper now owns one gesture per parameter: a
    sphere drag first closes the knob's wheel gesture, and a second pointer, the other
    front-end of the same parameter, the wheel or the keys are ignored while a drag runs.
  • The "gain (pattern)" and "peak" captions under the channel bars sat ≈ 7 px right of
    their marks.
  • The output meter drew past the top of its well above 0 dBFS. The bar now stops at 0
    and a clip lamp over each side lights for 1.5 s when the output reaches 0 dBFS.
  • CHANGELOG 1.0.0: Distance never had a delay (gain + air low-pass only).

Changed

  • The page idles when nothing moves. The host-stopped frame is cached on its
    inputs instead of rebuilt every display frame; a meter frame redraws only the
    canvases it changes; the signal-path stations touch the DOM only when their light
    flips; the chevron colour is a constant (no getComputedStyle per redraw).
  • An exception in one frame's drawing no longer stops the animation for the session
    (the frame callback is re-armed first).
  • The Order / Decoder / Orbit segments are proper radio groups: one Tab stop, arrow
    keys move and select.
  • Simplified: one 12-id parameter list (ParamIDs::kAll) for the preset targets and
    the editor's defaults native; one segment binder; dead code removed
    (DecoderMixer::processSample, SpatialEngine::maxBlockSize / latencySamples,
    the unused procedural SH icons, unused locals and CSS variables).

O-Octagon v1.15.4

Choose a tag to compare

@github-actions github-actions released this 15 Oct 16:47

Fixed

  • Windows: the interface showed "page not found" instead of the UI. The
    editor never chose a WebView backend, and on Windows JUCE's
    Backend::defaultBackend is the legacy IE control. That control ignores
    withWinWebView2Options and has no resource provider, so navigating to
    https://juce.backend/ found nothing. The editor now passes
    .withBackend (Backend::webview2). macOS (WKWebView) and the DSP are
    unchanged.