Repository navigation
OPX 0.2.0 #4
thomasgregorymarsden-code
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Two firmwares, each with its own installer, editor and simulator:
opx-0.2.0.fwsc, identity FM-1_9001): Felucca 1.5.1's four parts with the OPX engine.opx-solo-0.2.0.fwsc, identity FM-1_9002): one OPX part with the memory of all four: every opsix effect, SHORT DELAY to 300 ms.Installers: OPX https://thomasgregorymarsden-code.github.io/Felucca-opx/webapp/installer/ · OPX Solo https://thomasgregorymarsden-code.github.io/Felucca-opx/opx-solo/webapp/installer/
OPX Solo's factory patches use the new effects and voice settings (F9 onward; F1-F8, shared with OPX,
unchanged): rotary speaker on PERC ORGAN and ROCK ORGAN; chorus on E.GRAND, POLY KEYS, STEEL PAN, VOX LEAD, the
pads and POLY SYNTH; the string machine's ensemble (U.ENS) on STRINGS, SLOW STRGS, VIOLINS, MS STRINGS; shimmer
reverb on SHIMMER, HALO, SPACE WIND; spring on FUZZ GTR and LASER; tape echo on LO-FI KEYS, FAT LEAD, SOFT LEAD,
SYNC LEAD and DUB CHORD; tempo delays on KALIMBA, SQUARE LD, BELL LEAD, RANDOM PAD, BLIP; early reflections on
TRUMPET, SAXOPHONE, CLAP; GRAIN on COMPUTER and GLITCH. Glide on the mono leads; legato slides on ACID BASS, 808 SUB,
FRETLESS, TROMBONE, CELLO. A patch with its own delay or reverb has its DELAY send at 0 (that bus is silent while
it plays). Levels re-matched with PROG LEVEL (within ~1 dB of before).
opx_test --auditestimates each patch'sshare of the processor (COST: six notes and the effects, from the device benchmark); every Solo patch is under ~66
but AIR PAD (~74, unchanged: two FILTER-mode operators).
Voice section (M6): each OPX patch carries the opsix's PROG LEVEL, BEND UP / DOWN and VOICE page (ASSIGN,
GLIDE and its time, UNISON voices, DETUNE, SPREAD). Picking a patch (SLOT, PRESETS, the editor) sets the track's
VOICE settings from it; OPERATORS' VOICE rows store them back into the patch. PROG LEVEL counts from the INIT's
-6.0 dB (every earlier patch plays as before); BEND sets an OPX track's pitch-wheel range; UNISON plays the patch's
voice count (up to the engine's six) and DETUNE spans 0-200 cents. OPERATORS' P.PITCH section is now PROG, with
BEND +, BEND - and LEVEL; the web editor has a "Level and voice" section. Factory patches marked mono now store
ASSIGN MONO.
OPX Solo: the operators' SHORT DELAY reaches the opsix's 300 ms (OPX: 16.5 ms, as before). Up to 64 ms it
runs at the full rate; longer times at a lower one, the repeats darker (300 ms: ~4 kHz wide).
OPX Solo plays every effect: the delays (DLY, DLYBPM, PDLY, PDLBPM, TDLY, TDLBPM), REF, REVERB, SHVERB, SPRING
and GRAIN, in Felucca's DELAY bus's memory: while one of them is on, the patch's DELAY send is silent. Up to three at
once share it (each delay's longest time shrinks as more share; past what fits the echoes run at a lower rate,
darker). The INIT patch's FX3 REVERB HALL is now heard there. OPX (four parts) is unchanged. The benchmark has a row
for each.
OPX Solo plays six more effects: CHO, U.ENS, FLNG, FLNBPM, RTRY and ENH (a 21 ms line per FX slot, 12 KB). The
INIT patch's FX1 (CHO) is now heard there. OPX (four parts) is unchanged: the 13 cheap
types. The web editor marks the types the connected firmware plays.
Renamed: Felucca-OPX is now OPX, Felucca-OPX Solo OPX Solo (the firmware's screens, the web pages, the
documents; the release files
opx-X.Y.Z.fwsc,opx-solo-X.Y.Z.fwsc). The repository keeps its name, the packageidentities (FM-1_9001, 9002) and the version strings stay.
A logo on the power-on screen: an FM wave disc (six rings, each a sine whose phase another sine bends, cyan to
red, round a white disc with OPX), the firmware's name, its version and Felucca's maker. Drawn, not stored: no image
in flash. In colour in every palette; ABOUT shows it small beside the title (still). On the power-on screen it is
animated: the rings fade in from the centre as circles, take on their lobes and bends, and the bends then travel
round the rings for 3 s, ending on the still logo, which holds 0.25 s. The screen stays 3.25 s (Felucca's splash: 0.4 s),
the keys silent under it as before. MENU > ANIM OFF: the still logo.
A CPU meter in the header: the audio's share of the processor, after the REC mark, updated four times a second;
grey, the accent from 70 %, REC's red from 85 % (where the audio drops a voice). The figure alone when a slot letter
leaves no room for the %.
126 factory patches in OPX Solo, eight in OPX. Original sounds in the categories opsix users'
soundsets have: keys (EPs, a piano, clavinet, harpsichord, organs), plucks, bells and mallets, basses, leads, brass
and winds, pads and strings, drums, effects, chords and sequences. They use the opsix's tricks: operator modes (ring
modulation, wave folder, band-pass operators as formants, the comb), fixed-frequency operators for drums, chords on
one key from carrier ratios, fake hard sync from a pitch envelope, tempo-synced gating, sample-and-hold. Every patch
gives the MOD WHEEL something to do; their levels are matched (
opx_test --audit). OPX has the firsteight (its flash has room for no more, with ~1 KB to spare): the seven of before and DRAWBARS. The
bank is
tools/opx_factory_bank.py(tools/opx_factory.pycompiles it to the firmware's tables): the place toadd or change a factory patch.
SLOT's values are fixed: F1–F126 0–125, OWN 126, INIT 127, in both firmwares (OWN and INIT followed F7 before).
OPX's knob skips the F numbers it lacks. A project or preset from Solo whose SLOT is one of those comes back
with its own copy of the patch as OWN (every project with an OPX track carries its patches), or F1 without one. A
sound of 0.1.0 or before with its own patch (OWN was 7) is OWN again; one without its patch plays F8.
Fix: DIST and G.AMP could leave a constant offset after the sound stopped (a high-pass's rounding: up to ~1 %
of full scale); the 3-band EQ and DIST's EQ could hold one too at low frequencies (their filter carries its rounding
now). G.AMP has DIST's DC high-pass. The main filter's 24 dB types (and the operators' MG filters) round instead of
truncating: at a low cutoff they held ~1 % DC.
MENU > INFO: a long version string (Solo's "v0.2.0-dev-opx-solo") is shown smaller, clear of FIRMWARE.
ABOUT: the copyright lines are "OPX (C) 2026 Tom Marsden" and Felucca's "(C) 2026 Leo Kuroshita, Hügelton
Instruments" (kept, as the GPL asks); Solo's title fits the screen.
Fix: the installers did not find an FM-1 running an
FM-1_OPX-…build. They read the identity as letters, anunderscore and digits (
FM-1_900), so the new identities failed: an install ended with "did not come back", and thenext one with "not found". The web installer and
tools/fm1_install.pynow take letters, digits, dots and dashes.Fix: the benchmark crashed OPX Solo (FELUCCA CRASH, vector 1: a divide by zero). It set track 1 to FM6
for the idle mix, which in Solo is a reserved engine with no presets. It now uses OPX there, and an engine without
presets is handled.
The site links its builds: every installer, editor and simulator page has a bar linking the installer, editor
and simulator of the latest release and of the development build, for OPX and OPX Solo (the
development builds under dev/, Solo under opx-solo/; each with its version). A release now carries its simulators
and editor (
opx-X.Y.Z-web.zip), so the release's pages are the release's own; Solo has a simulator.Web installer: the log of an install is a box of its own height that follows its newest line (scroll up to read
back), not a page growing by 2,300 lines. The progress bar follows the bytes written (the check 0–3 %, the write
3–99 %): the update loader reads the image about twice (measured on an FM-1: 1.95 times its size in 2,323
requests), so a bar of one image's worth was full halfway. The log's last line of the write says what was sent.
The factory patches use the new features. E.PIANO: PAN (a suitcase tremolo), 3EQ, MOD WHEEL brightening its
tine. BELL: 3EQ, a slow PAN. FM BASS: LPF 24 plucked by EG2 x velocity, COMP. BRASS: an EG2 swell on LPF 12 x
velocity, delayed vibrato (LFO1 faded in, PROG PITCH). SAW LEAD: LPF 24 with an EG2 sweep, vibrato on the MOD
WHEEL, DIST. LOOP PAD: LPF 12 with a slow EG2 and LFO2, PHA, PAN. X-MOD: MOD WHEEL -> OP3 LEVEL, LFO3 -> OP2 PITCH,
FLTR, DEC. A project or preset that saved a factory patch as its own copy keeps the copy as it was.
Package identity
FM-1_9001(OPX SoloFM-1_9002), the same for every build and version, thisfirmware's own: releases up to 0.1.0 used Felucca's
FM-1_9XY. (Development builds briefly reportedFM-1_OPX-dev; the installers now also accept letters there.)Release packages are
opx-X.Y.Z.fwsc(andopx-solo-X.Y.Z.fwsc).MENU > INFO and ABOUT show the build (the commit it was built from; "+" when built with local changes).
ABOUT points to this project: its QR code and address are github.com/thomasgregorymarsden-code/Felucca-opx
(Felucca's own stay in the credits).
Fix: the main filter's 24 dB types (LPF 24, POLY6, HPF 24, BPF 6, BRF 6) could run away near the top of the
range with resonance (KTRK on high notes). Their cutoff now stops at 12.3 kHz and their resonance eases above 4.4 kHz.
Fix: a track still on a factory patch played its effects only once it had its own copy.
DIST: a ~40 Hz high-pass after the clipper takes out the DC an uneven wave leaves.
The OPX-only firmware (first step). A second firmware from the same source,
opx-solo.fwsc(version "…-opx-solo"): track 1 plays OPX, the other tracks and engines are silent and cannot be picked, and all 30 effect types
are enabled (the 17 buffered ones pass the sound until they are built). Projects and patches move between it and
OPX unchanged. CI builds both; the OPX-only one's installer page is the site's /dev/opx-solo/ (a release's: /opx-solo/).
OPX M5c, part 1: the program effects FX1–3. Three effects in series on each OPX part after its voices, in a
new FX1-3 section of OPERATORS and the web editor's OPX tab: TYPE (the opsix's 30), ENABLE and the type's four
knobs in its own units. 13 types play: PHA, PHABPM, PAN, PANBPM (the part in stereo), A.WAH, EXC, FLTR, 3EQ, DIST,
G.AMP, DEC, LIMIT, COMP. The other 17 need more memory than OPX has: they read NOT AVAILABLE (dimmed, their
knobs kept, the sound passed) and are for the planned OPX-only firmware, so patches move between the two. INIT carries the opsix's
FX1 CHORUS, FX2 3-BAND EQ, FX3 REVERB, all ON (the flat EQ costs nothing); factory patches keep their effects off.
OPERATORS: the USER section is now ROUTE (it holds what the operator sends to each operator in the USER
algorithm) and PROG is P.PITCH (the opsix's PROG PITCH). On the ROUTE section the matrix highlights the row
the list is on (TO OP6: the 6 on the left) as well as the operator's column, and frames their cell. KNOB 1 reads
ALL on the sections that are the whole patch's (ALGO and after). The FILTER's CUTOFF moves 17 codes
(~2.4 semitones) a click: end to end in 60 clicks (it was 1 code, 1023 clicks).
OPX M5b: the main filter. One filter a voice, after the operators and before the effects, as on the opsix:
TYPE (LPF 12, LPF 24, LPF MS-20, LPF POLY6, HPF 12, HPF 24, HPF MS-20, BPF 6, BPF 12, BRF 6, BRF 12), ENABLE,
CUTOFF (6.49 Hz – 23.68 kHz), RESO, EG2 INT and CTRL, KTRK LOW / CENTER / HIGH, LFO2 INT and CTRL, in a new
FILTER section of OPERATORS (KNOB 2) and the web editor's OPX tab. The virtual patch's FILTER CUTOFF and RESO
now work. INIT is the opsix's (LPF 12 ON, wide open), which OPX skips, so a patch that leaves the filter open costs
nothing more. SHORT DELAY now stops at 16.5 ms (was 16.6). The benchmark has three new rows (MAIN LPF12, LPF24,
MS-20) to measure what the filter costs on the device.
OPX M5a: EG2, EG3, LFO2, LFO3 and the virtual patch. The pages EG1 and LFO1 are now EG1-3 and LFO1-3
(KNOB 1 picks which); OPERATORS has EG1-3 and LFO1-3 sections and a V.PATCH section (12 virtual patches: SRC,
INT, CTRL, DEST as the opsix's scope-then-item knobs). Every CTRL source now works (EG2, EG3, LFO2, LFO3 gave 0).
V.PATCH plays its destinations in the pitch, level, envelope, feedback and LFO groups; the filter's, the effects' and
some others are kept and do nothing yet (the filter's: M5b). INT's scale is a guess. The web editor's OPX tab has all three EGs and LFOs
and the 12 virtual patches. SHORT DELAY now stops at 16.6 ms (was 17.4: the new EGs and LFOs took the memory).
OPX's processor load: a voice no longer runs EG1 or the pitch / level modulation arithmetic when no route uses
them (every INT at 0, as in INIT), which M4 had added to every voice whether used or not.
OPERATORS: one list per section. KNOB 2 (PAGE) shows one section at a time (MODE, PITCH, EG, KTRK, USER,
ALGO, EG1, LFO1, PROG, VOICE) instead of jumping through one long list; KNOB 3 picks a row within it, and each
section keeps the row it was left on.
Fix: P MOD VEL's arithmetic moved to the note-on. It had put two divides per operator into the render, over the
processor budget the tests hold it to; the render is now 15 % under it.
P MOD VEL measured on an opsix: INT % × velocity/127 × 10 is added to the final ratio, COARSE × FINE (100 % at
velocity 127 takes ratio 1 to 11 and COARSE 2 to 12; it was ratio 2 for FINE and 9 for COARSE): FINE as it is;
COARSE to the nearest whole number, added to COARSE before FINE multiplies.
LFO1 TEMPO note values are the opsix's: 24 of them, 1/48 to 4/1, in its knob's order (each length's triplet,
dotted, straight: 1/48 3/128 1/32 … 3/2 2/1 8/3 3/1 4/1), read off an opsix. They were 20 guessed ones. A patch
saved with TEMPO on before this plays a nearby value: re-pick it.
Web editor on iPad / iPhone: every question it asks first (save, load, erase, overwrite, a name) is now its own
dialog in the page. Some WebMIDI browsers there answer the browser's built-in confirm and prompt with "no" without
showing them, so those buttons did nothing (seen with "Put the test patches in empty user presets").
SLOT INIT (OPX, the ALGO page's SLOT after OWN): loads the INIT patch, now the opsix's INITIALIZE: OP1 alone at
LEVEL 100 (OPX's INIT had all six at 100), algorithm 1, ratio 1, no modulation. The web editor's "Init patch" is
the same. Its LFOs start at KSYNC COMMON, as an initialised opsix program shows. From the opsix INIT's screens: the
operator EGs at ATK 0, DECAY 1.000 s, SUS 60, REL 100 ms, CURVE 6 (were DECAY and REL 0, SUS 100, CURVE 0),
EG1..3 at ATK 0, DECAY 1.000 s, SUS 0, REL 100 ms (were SUS 100, times 0), PROG LEVEL -6.0 dB (stored),
ARP GATE 80 (was 75), LFO1 at 6.00 Hz (was 1.00 Hz),
LFO2 and LFO3 at 2.00 Hz, and the stored VOICE values GLIDE TIME 0.500 s, UNISON DETUNE 10, SPREAD 100. The
test patches start from it, so their sustain is now 60 as on an opsix built from INIT.
The web editor's OPX tab: "Put the test patches in empty user presets" writes the 16 opsix comparison patches
(T01–T17 of the test sheet) into empty user presets, never over a used one.
OPX M4: EG1, LFO1 and the pitch modulation. Each operator's P MOD (EG1 INT, LFO1 INT, ±144.00 semitones; VEL
with DEST FINE or COARSE) and LMOD LFO1 INT (±100 %), PROG PITCH (LFO1 INT, TRANS, OCT), each INT with its CTRL
source (MOD WHEEL, PITCH WHEEL ±, PEDAL, NOTE, VEL, EXP VEL, AFTER TOUCH, EG1, LFO1; REL VEL fixed; EG2/3 and
LFO2/3 come with M5). LFO1: the opsix's 23 waves, SPEED 0.01–100 Hz or a note value with TEMPO, KSYNC OFF /
COMMON / VOICE, PHASE (or RND), FADE.
OPX pages EG1 and LFO1 (EDIT, after OP LEVELS): EG1 drawn beside its ATK DEC SUS REL CURVE; LFO1's wave drawn
beside its rows and PROG PITCH's. OPERATORS gains the rows (PITCH: P MOD; EG: LMOD LFO1; sections EG1, LFO1,
PROG). P MOD INT moves 0.05 a click up to 1, 0.50 up to 12, then 1 and 12 semitones.
The web editor's OPX tab edits the same (Modulation, EG1, LFO1, Program pitch).
Fix: HOME > OP MIX: a fast turn of PRESETS or ALGORITHM could still load a sound or change the track now and then
(the knob was read twice a pass; a click landing between the reads went to the usual handler).
Fixes: an OPX phaser product could overflow 32 bits at high resonance (found by the host sanitizer); a host test
read past its buffer.
OPX user presets keep their patch (up to 16 OPX user presets; a 17th is refused with "OPX PRESETS FULL", nothing
written). A rename keeps it; erasing the preset or saving another sound over it frees its place. Presets saved by
0.1.0 load their SLOT's factory patch, as before.
The full backup includes OPX: the projects' and user presets' OPX patches and the tracks' current ones. Archives
of 0.1.0 and Felucca still restore; a new archive restored onto 0.1.0 skips the OPX parts.
OPX pages ENVELOPE and OP LEVELS (trial, beside OPERATORS): the selected operator's EG drawn with ATK DEC SUS
REL CURVE beside it; the six operators' LEVEL beside the algorithm chart.
HOME > OP MIX (OPX tracks; HOME's first page there): the six operator levels on six knobs, PRESETS OP 1,
ALGORITHM OP 2, KNOB 1–4 OP 3–6.
OPX knobs: FINE moves 0.01 a click (was 0.001, below what the screen shows). ATK, DEC and REL move through a
ladder of times (1 ms steps at the bottom up to 5 s steps at the top): 10 ms to 1 s takes 36 clicks (was about 420).
The web editor's OPX tab: read a track's OPX patch or a factory one, edit every operator value the engine plays
(MODE and its values, PITCH, EG, KTRK, the USER matrix), send it to a track (also while editing), save it as a file
(
.opx, the 434-byte record) or load one. The library keeps an OPX sound's patch, and moves it to and from thedevice's user presets. New editor commands OPX_GET / OPX_PUT (121, 122).
Storage: the projects' OPX patches are kept two projects per storage object (was one each), which frees room
for the user presets' without taking more of sample slot 3. The first start after updating moves 0.1.0's layout
over once; a power cut during the move loses nothing (tested at every write). Going back to 0.1.0 afterwards loses
the projects' OPX patches, not the projects.
This discussion was created from the release OPX 0.2.0.
All reactions