draft: false Name: Vortex Runner short-description: Split-output cinematic synth voice with Web MIDI editing. summary: >- Vortex Runner is a Yamaha CS-80-inspired Workshop Computer synth voice. The current firmware keeps a monophonic note path but renders two related output voices: Audio Out 1 is Voice A and Audio Out 2 is Voice B, detunable relative to Voice A. Pitch, gate, envelopes, portamento, CV policy, MIDI handling, LFO timing, and preset state are shared; only oscillator/filter colour is A/B-specific, including source/output levels, pulse/PWM, and filter settings. It includes expressive envelopes, 12 dB/octave high-pass and low-pass filters with bounded resonance, ring modulation, MIDI/Web MIDI control, a hardware preset browser, and 8mu controller support. The current 8mu build prevents its layer-selection buttons from entering the synth MIDI note path. Language: C++ (Pico SDK + ComputerCard) Creator: Adrian Vos Version: "0.1.1 8mu button-note fix" Status: Beta License: MIT date-created: 2026-08-26 Editor: web tags: - synth - midi - web-midi - split-output - cs-80-inspired - 8mu - usb-host panel: inputs: - id: AudioIn1 name: Pitch CV type: audio description: "Web-selectable 1V/oct pitch input: 0 V to +5 V with C4 at +3 V, or -3 V to +3 V with C4 at 0 V." - id: AudioIn2 name: Audio / Mod In type: audio description: Reserved for future audio-rate modulation or external processing experiments. - id: CVIn1 name: Filter CV type: cv description: Wide high-pass and low-pass filter modulation. - id: CVIn2 name: Expression CV type: cv description: Expression input for brightness and resonance modulation. - id: PulseIn1 name: Gate type: pulse description: Gate input for the amp and filter envelopes. When patched, it takes priority over USB MIDI gate. - id: PulseIn2 name: Trigger / Hold type: pulse description: Reserved for retrigger, sustain, or alternate performance gestures. outputs: - id: AudioOut1 name: Voice A type: audio description: First audio voice output. - id: AudioOut2 name: Voice B type: audio description: Second audio voice output, detunable relative to Voice A. - id: CVOut1 name: Off type: cv description: Reserved for later modulation output once the split-output voice is stable. - id: CVOut2 name: Off type: cv description: Reserved for later modulation output once the split-output voice is stable. - id: PulseOut1 name: Off type: pulse description: Reserved for later clock, gate, or envelope-state output. - id: PulseOut2 name: Off type: pulse description: Reserved for later clock, gate, or envelope-state output. controls: switch: up: name: Filter page description: Low-pass cutoff, high-pass cutoff, and resonance for the selected output voice, with soft pickup. middle: name: Oscillator page description: Shared base pitch plus pulse width and PWM amount for the selected output voice, with soft pickup. down: name: Performance page description: Hold page for Voice B detune, ring modulation, and LFO-to-pitch depth, with soft pickup. knobs: - when: z: up main: name: LP Cutoff description: Low-pass cutoff for the selected output voice. x: name: HP Cutoff description: High-pass cutoff for the selected output voice. y: name: Resonance description: Resonance for the selected output voice. - when: z: middle main: name: Base Pitch description: Shared base pitch offset for both output voices. x: name: Pulse Width description: Pulse width for the selected output voice. y: name: PWM Amount description: Pulse-width modulation amount for the selected output voice. The independent source mixer is Web-editor controlled. - when: z: down main: name: Voice B Detune description: Detunes Audio Out 2 relative to Audio Out 1 while Down is held. x: name: Ring Mod description: Ring-modulation amount. y: name: LFO to Pitch description: Vibrato depth. LFO-to-PWM, filter, and amp routings are independently controlled in the Web editor. leds: - display: list items: - id: LED0 name: Voice A description: Bright when Voice A is selected for hardware-panel editing. - id: LED1 name: Voice B description: Bright when Voice B is selected for hardware-panel editing. - id: LED2 name: X Value description: Stored X parameter value for the active switch page. - id: LED3 name: X Pickup description: Soft-pickup state for the X knob; dim until picked up, bright when active. - id: LED4 name: Y Value description: Stored Y parameter value for the active switch page. - id: LED5 name: Y Pickup description: Soft-pickup state for the Y knob; dim until picked up, bright when active. host: usb: - name: Web MIDI editor role: device description: Browser editor using Web MIDI SysEx for patch apply, readback, and eight persistent named card slots. - name: USB MIDI input role: host-or-device description: MIDI note/gate, pitch-bend, and performance CC input for the split-output voice, following a Gnarly-style dedicated controller block with standard synth aliases. - name: Music Thing Modular 8mu role: host description: Hardware-tested USB-host controller. Buttons A-D select fader layers; panel LEDs show focused fader feedback. Cannot operate with the Web MIDI editor at the same time. notes: >- Draft architecture target: RP2040 at 192 MHz, copy-to-RAM firmware, audio rendering on core 0, USB MIDI/Web MIDI work on core 1, and bounded lockless queues for complete patch handoff and core-0 readback. The current stable firmware keeps one monophonic note path and renders split A/B audio outputs. Stable firmware stores eight named Web MIDI patch slots in flash and embeds 31 factory presets. Holding Down at boot opens a combined factory-plus-saved browser: Main selects an entry, panel LEDs show its one-based number in binary, release Down arms it, and a second Down press loads it. Choosing a saved entry also sets the later startup slot; choosing a factory entry does not. Holding Down for about two seconds during play opens the same browser without stopping audio. With no saved startup slot, the compiled fallback is the Web editor's Doctor Who Theme preset, including its portamento setting. Each saved patch includes its pitch-CV range mode. Web MIDI patch readback and saved slots cover the visible editor controls, including separate A/B additive saw/pulse/sine/noise source levels, output levels, pulse/PWM and filter settings, plus shared portamento, expression depth, separate shared amp ADSR and filter ADSR controls, LFO rate, independent LFO-to-pitch/PWM/VCF/VCA modulation depths, ring amount, and ring speed. Rapid Web MIDI patch updates are coalesced to the newest patch before core 0 applies them on its 64-sample control tick. MIDI note pitch is absolute while MIDI is active and is not transposed by the panel base pitch offset. The current MIDI controller map is: CC1 vibrato depth via LFO-to-pitch; Bank A on CC20-27 for saw level, pulse level, sine level, noise level, pulse width, PWM amount, LP cutoff, and resonance; Bank B on CC28-31 for HP cutoff, ring amount, ring speed, and portamento; CC32-35 for linked amp/filter attack, decay, sustain, and release offsets; CC2/11 expression depth; CC7 voice level; CC76 LFO rate; CC77 or CC93 LFO-to-PWM; CC91 LFO-to-VCF; CC92 LFO-to-VCA; and pitch bend at +/-2 semitones. Attribution: included computercard.h is ComputerCard by Chris Johnson, version 0.3.0, MIT licensed, copied from Demonstrations+HelloWorlds/PicoSDK/ComputerCard/ComputerCard.h. The included pico_sdk_import.cmake is the standard Raspberry Pi Pico SDK import helper and carries the Raspberry Pi (Trading) Ltd. BSD-style notice in the file. USB MIDI host helper files are copied from the local C1ZZL3 cards and retain the upstream rppicomidi MIT notices in source. The TinyUSB descriptor/config pattern is adapted from Adrian Vos's C1ZZL3 cards. contact: social: github: https://github.com/soveda