Skip to content

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 22 Aug 19:29
· 128 commits to master since this release

fretwire 0.3.0

Impulse responses. The one thing the pedal could not do without HX Edit, it can now do on Linux.
Alongside that: the device's global settings are readable, controller assignments are writable, and
the Helix LT is recognised.

24 commits since v0.2.1.


Impulse responses

The user IR store — 128 slots — is fully managed, from the CLI and from the GUI.

  • List — fretwire ir-list reads the whole directory in one request; --all walks every slot.
  • Export — fretwire ir-export <slot> <file.wav> writes a 48 kHz mono 32-bit float WAV.
    ir-export-all sweeps the lot. The round trip is bit-exact: the device stores the samples
    verbatim, and an exported IR re-uploaded reads back with the same checksum and the same MD5.
  • Upload — fretwire ir-upload <slot> <file.wav>. WAVs are accepted as PCM or float, mono, at
    48 kHz, and resolved through WAVE_FORMAT_EXTENSIBLE where present. Anything else is refused with
    a reason rather than silently resampled.
  • Delete and rename — fretwire ir-delete, fretwire ir-rename.

In the GUI, IRs… in the toolbar opens a panel over the editor: a slot list, per-slot export /
rename / delete, and upload with a native file picker.

Two details worth knowing:

  • Slots are numbered from one, matching the pedal's own menus, not the zero-based wire. A slot
    number read off the pedal is the number to type here.
  • Occupancy is the declared length, never the name. A nameless silent IR reads as empty by name
    and full by length — and it is full. Those show as (unnamed) with a silent tag rather than
    being offered as free space.

These writes are permanent

Every other edit in fretwire lands in the pedal's edit buffer, and a reload takes it back. IR
upload, delete and rename write to flash and there is no undo
— not from the app, not from the
pedal's own menus. Export anything you cannot replace before you overwrite it. Delete and
overwrite both confirm in the GUI, and name what is about to be lost.

Device settings

op 24 reads a setting and op 25 writes it, over a flat numbered namespace. 166 ids answer on an
HX Stomp
— that is the whole space; nothing above 226 responds. Twenty-three are identified: tempo
and its scope, MIDI base channel and MIDI-over-USB, input and output levels, bypass type, snapshot
edits, guitar In-Z, the volume knob, the preset numbering form, and the complete global EQ —
three bands of frequency/Q/gain plus the low and high cuts, ids 190-200 with no gaps. The full table is in
docs/protocol.md.

In the GUI, Globals… in the toolbar opens them as an overlay, grouped the way the pedal's own
menus are. The 22 identified settings are editable; the ~144 ids that answer without ever having
been explained show under Show unidentified as read-only rows, which is also the easiest way to
help map them — change something on the pedal and watch which number moves.

The global EQ gets its own tab, with a frequency-response curve rather than a list of numbers —
a handle per band, cut markers, and log-mapped sliders. The curve is drawn from the parameters the
pedal reports through textbook filter shapes; the pedal has never told us its actual topology, and
the caption says so.

It also knows the factory values, so there is a reset per band, per cut pair, and for the whole
EQ — the same gesture as pushing a knob in on the pedal. Once anything differs from stock, the
factory curve is drawn faintly behind the live one, so a change reads as a shape rather than as a
number you have to have memorised. (Those defaults were read off one HX Stomp. No default appears
anywhere in Line 6's shipped data or on the wire, so nothing else in the panel claims one, and a
setting with no known default offers no reset button rather than resetting to zero.)

These write the pedal itself, take effect immediately, and have no undo. Setting one back is
the way back. fretwire refuses to write an id it cannot name, so an unidentified setting can be
read but never changed from here.

The preset list now numbers itself the way your pedal does. 000-127 or 01A-32D is a
global setting, and 0.2.x had to ask you which one because it was unreadable. It's setting 27, so
the app reads it on connect and matches. The manual toggle stays as an override, and if you've
already set one it is kept.

  • fretwire setting-get <id> / setting-set <id> <value> — typed; the value is written in the type
    the device already holds, so tempo takes a float and an index takes an integer.
  • fretwire settings-dump / settings-diff <a> <b> — dump the namespace, change one thing on the
    pedal, dump again, and diff. This is how the named ids above were found, and it needs no USB
    capture. If you map an id this way, please open an issue.

Tempo, where you can reach it

Tempo is one of those globals, but it is the one anyone changes mid-session, so it also gets a
BPM field in the main toolbar rather than living three clicks into an overlay. Beside it sits
the tempo scope — per snapshot, per preset, or global — because that is what decides what changing
the number actually does, and a bare BPM invites the wrong assumption. The field and the panel are
two views of the same settings and follow each other.

The chain is painted in HX Edit's colours

Block colours now come from the category colours in your own HX_ModelCatalog.json, read at
runtime like every other piece of reference data. Several of ours had been the wrong hue rather
than a different shade — modulation was pink where Line 6 uses blue, dynamics blue where they use
yellow, wah green where they use purple — so a preset could read quite differently in the two
editors. It shouldn't now.

Line 6 also reuses one colour across related categories (amp, preamp and cab share a red; EQ shares
dynamics' yellow), and fretwire follows that rather than "improving" on it. An install that skipped
the data import keeps fretwire's own palette, so the chain stays legible either way.

Controller assignments

Assignments were readable in 0.2.x. They are now writable, and they reach the GUI.

  • Assign or clear a parameter's controller, including footswitches, from the sidebar.
  • An assignment's source is named as the device names it, and its cab selector is read.

The Helix LT

Recognised as 0x0E41/0x424A, contributed and measured on a physical unit by @pakdekro (PR #3).

The protocol did not need to change: the handshake, preset read, snapshot decode and both browses
all work unmodified. The LT was invisible only because its USB ID was in no table and no udev rule,
so it was skipped at open and its device node stayed root-owned.

It is Reported, not Verified — every read path reconciled against real hardware, but no edit
has ever been sent to one. Its preset_device_id and preset banking stay unknown rather than
inherited from the Floor. Survey: docs/helix-lt.md.

Fixes

  • Discrete parameters were read one entry off their range. Every enum — cab mic, amp model
    variant, wave shape — could display and edit as its neighbour. This is the most likely fix to
    change what you see on screen for a preset you already had.
  • A knob on the pedal moved the wrong slider. Status pushes carry key 29, which says whether key
    28 indexes the model's parameters or the block's extra values. It was dropped, and since both
    spaces start at zero, turning Trails arrived as the model's parameter 0 — the Time slider.
    Writes were always correct; only the mirror was wrong.
  • A spliced read could end an export early. read_preset retried a spliced stream and
    read_preset_confirmed — the export path — did not, so one bad read ended a 126-preset sweep at
    23C. Both retry now, and the browse listing is guarded in both directions.
  • Parameters display under their real names. 492 parameters across the model definitions show a
    different name than their symbolic id — SyncSelect1 is "Note Sync", LowCut is "Low Cut". The
    GUI shows the display name; the CLI shows both, since edits are keyed by the symbolic one.
  • The HX Stomp XL's model code is P36, and key 37 was never the firmware version — it had been
    labelled as such since 0.1.

Also

  • Every model draws as the hardware it models — chain blocks and picker rows carry a filled
    silhouette (enclosure, finish, knob and footswitch layout), built as SVG at runtime from a spec
    table. None of Line 6's artwork is read or shipped, and the icons carry no logos or lettering.
  • Preset switching is roughly a third faster. goto_preset now waits for the switch instead of
    leaving the next read to discover it: a 126-preset export went from 251 reads / 51 s to 127 reads
    / 33 s.
  • The HX Stomp XL banks by four (01A–32D), read off an owner's panel. The GUI still carries
    a manual override for the numbering form in the sidebar's ⋯ menu, for devices that do not report
    setting 27.

Known limits

  • Grid and routing planning is still DSP-0 only. Reading and per-block edits are DSP-agnostic —
    a Helix Floor or LT reads both DSPs correctly — but moving and inserting blocks plans inside the
    first 20-slot array. Single-DSP devices are unaffected.
  • IR reorder is not implemented. Delete and re-upload expresses it.
  • The settings namespace is mapped only in part — 166 ids answer, 23 are named. settings-diff
    finds one in about thirty seconds if you want to help, and the panel's read-only rows show you
    which number moved.
  • Footswitch ring colours and labels can be read, not written. We can tell you what colour a
    switch is showing and what it is called; setting a custom one needs ops we have not decoded, and
    probing them blind wedged a pedal. Roadmapped, deliberately parked.
  • No firmware, flash or DFU traffic, by design and permanently. See
    docs/safety.md.

Devices

Device PID Status
HX Stomp 0x4246 verified — developed against one
Helix Floor 0x4248 verified — ~70 logged sessions with a remote tester
Helix LT 0x424a reads verified, edits untested
HX Stomp XL 0x4253 reported working — an owner runs it

Helix Rack and HX Effects are not recognised yet, only because nobody has sent their USB product id.
lsusb -d 0e41: is the whole of what we need.

Installing

Grab the .deb, .rpm or .AppImage for the GUI, or
fretwire-cli-x86_64-linux-musl.tar.gz for a static CLI that runs on any x86-64 distro. The deb and
rpm install the udev rule and the CLI alongside the app; for the AppImage or the tarball, install
packaging/70-hxstomp.rules yourself and replug the pedal.

On first run the app imports the model and preset reference data from your own HX Edit
installation
. Nothing proprietary is shipped in these packages. Skipping the import is allowed —
the editor works without it, with numeric names instead.

Thanks

@pakdekro for the Helix LT survey and PR #3, and the HX Stomp XL and Helix Floor owners who keep
filing reports precise enough to act on — the P36 model code, the 01A–32D banking and the
key-29 bug all came from user reports rather than from our own hardware.