vendor/bome/), each hand-assessed against the real source. Status is conservative: an action whose engine works but whose editor is a single text box is PARTIAL, not FULL.This is a code-verified coverage map, not a vibe. Status lives in scripts/port_features.tsv and is set by hand, conservatively: FULL only when behaviour AND editor match BOME; PARTIAL when the engine runs the action but the editor/UI is incomplete (missing fields, no Test button, no Delay UI); MISSING when neither runtime nor editor exists. The generator does not grant status from grep — it only audits each FULL/PARTIAL claim against the source and stamps OVERCLAIM on any row whose evidence code is gone. Coverage weights FULL=1, PARTIAL=0.5. The big gaps are real and named: incoming keystroke hook, app-focus watch, per-action Description/Parameters/Advanced/Test/Delay editors, mouse + preset-control editors.
| Chapter | Feature | Status | Notes / gap |
|---|---|---|---|
| 3 MIDI Setup | Virtual MIDI ports (create in/out) | PARTIAL | engine creates them; no settings UI to name/persist virtual ports (11.5) |
| 3 MIDI Setup | MIDI devices + aliases | MISSING | no alias mapping layer (BOME 3.2 / 6.3) |
| 3 MIDI Setup | Project default MIDI ports | PARTIAL | model + project panel list; no full alias/device picker |
| 3 MIDI Setup | MIDI Router / MIDI Thru (IN->OUT) | FULL | routes applied independently of translators; add/remove in project panel |
| 4 Interface | Toolbar (file/edit/view groups) | PARTIAL | most buttons cloned; no real menu bar, Properties is a focus jump not a toggle |
| 4 Interface | Menu bar (File/Edit/MIDI/View/Help) | MISSING | no native menu bar; toolbar covers a subset |
| 4 Interface | Preset list (+ enable checkboxes) | FULL | |
| 4 Interface | Translator list (+ enable checkboxes) | FULL | plus fzf filter bar (not in BOME) |
| 4 Interface | Properties sidebar | PARTIAL | always-visible editor; no Ctrl+3/4/8 jumps, no Enter-to-open semantics |
| 4 Interface | Event Monitor | FULL | console Monitor tab + MIDI-learn capture |
| 4 Interface | Log window | FULL | console Log tab |
| 7 Preset | Active / Inactive | FULL | checkbox in preset tree |
| 7 Preset | Always Active | PARTIAL | model field; no editor checkbox |
| 7 Preset | Change presets via outgoing action | FULL | |
| 7 Preset | Preset default MIDI ports | PARTIAL | model only; no per-preset port editor |
| 8 Translator | Name | FULL | |
| 8 Translator | Active | FULL | |
| 8 Translator | Stop Processing | FULL | flag + checkbox |
| 8 Translator | Outgoing-once / Swallow flags | FULL | flags + checkboxes |
| 8 Translator | Delay outgoing action (8.5.1) | PARTIAL | editor has the Delay checkbox + ms field; variable-delay (delay from a variable) not yet supported |
| 8 Translator | Description field on action | FULL | Description field on the outgoing editor; documentation only, round-trips in JSON |
| 8 Translator | Test button on action | FULL | Test button applies then fires the outgoing action once via ztr_test_translator |
| 9.1 MIDI Msg | Incoming MIDI (note/cc/pc/bend/pressure) | PARTIAL | matches type/channel/value with fixed/any/range/var per field; no raw/sysex byte editor yet |
| 9.1 MIDI Msg | Incoming system common/realtime | PARTIAL | modelled; editor exposes the common types only |
| 9.1 MIDI Msg | Outgoing MIDI message | PARTIAL | sends typed msg; no raw byte-sequence editor, limited port selection |
| 9.1 MIDI Msg | NRPN/RPN/14-bit/MPE (in + out) | FULL | state machine in, sequence out; editor exposes all modes |
| 9.2 MIDI Port | Incoming MIDI Port action | MISSING | not in the incoming-type dropdown |
| 9.2 MIDI Port | Outgoing MIDI Port (open/close/restart) | FULL | editor op + port |
| 9.3 Router | Outgoing Router action (add/remove/enable/disable) | FULL | editor op + from + to |
| 9.4 Keystroke | Incoming keystroke (global keyboard hook) | MISSING | imported payload is read-only; no CGEventTap listener to fire on host keystrokes |
| 9.4 Keystroke | Outgoing keystroke (key-by-key, modifiers, press/release, repeat) | PARTIAL | types literal text + imported combos; editor is a single Type-text box, no key/modifier/press-release builder |
| 9.5 Timer | Incoming timer (named, elapsed) | FULL | |
| 9.5 Timer | Outgoing timer (start/kill, repeat, delay, period) | FULL | editor name/op/repeat/delay/period |
| 9.6 Preset | Incoming preset (activated/deactivated) | FULL | editor preset + when |
| 9.6 Preset | Outgoing preset control | FULL | editor: preset name + enable/disable; runtime enables/disables the named preset |
| 9.7 Project | Incoming project action | MISSING | not in incoming dropdown |
| 9.7 Project | Outgoing project action (enable/disable processing) | FULL | BOME 9.7.2 = Enable/Disable global processing; both ops + an Open-project-file extension, with the engine gate |
| 9.7 Project | Disable bypasses translators, Enable re-arms | FULL | when disabled only an Enable-Processing translator runs (manual 9.7.2) |
| 9.8 Mouse | Outgoing mouse move / absolute | FULL | editor: action + X/Y (fixed or variable) + relative flag |
| 9.8 Mouse | Outgoing mouse button clicks | FULL | editor exposes left/right/middle click + left down/up |
| 9.8 Mouse | Outgoing mouse wheel | FULL | editor: wheel delta field |
| 9.8 Mouse | Multiple display support | MISSING | no multi-display coordinate mapping |
| 9.9 Exec File | Outgoing execute/launch file | FULL | editor path + args |
| 9.10 Serial | Outgoing serial send (hex/text, baud) | FULL | editor port/baud/data |
| 9.10 Serial | Incoming serial port | FULL | engine serial reader fires Incoming::Serial per byte (auto-reconnects); editor has the Serial byte trigger panel |
| 9.10 Serial | Serial as MIDI device | MISSING | not supported |
| 9.11 AppleScript | Outgoing AppleScript (run script) | FULL | editor: Script + Description + Parameters + Advanced handler; runs script with global handlers prepended |
| 9.11 AppleScript | Parameters (pass MT vars into script) | FULL | editor Parameters field; engine injects `set <var> to <value>` for each listed MT variable |
| 9.11 AppleScript | Advanced: unique handler name | PARTIAL | handler-name field stored + round-trips; not yet used to expose the action for cross-script calls |
| 9.11 AppleScript | setVariable()/getVariable() back into engine | MISSING | script cannot read/write MT variables |
| 9.11 AppleScript | Global AppleScript handler block | FULL | project-level handlers prepended at fire time |
| 9.11 AppleScript | Control MT via external AppleScript (sdef) | MISSING | no AppleScript scripting interface on the host app |
| 9.12 App Focus | Incoming application focus (frontmost watch) | MISSING | no NSWorkspace monitor to fire on app switch |
| 9.12 App Focus | Outgoing application focus (raise app) | FULL | editor app name |
| 10 Rules | Assignment | FULL | |
| 10 Rules | Expression (arith/bitwise/shift) | FULL | |
| 10 Rules | Goto / Label | FULL | |
| 10 Rules | Log | FULL | |
| 10 Rules | Skip / Skip-N | FULL | |
| 10 Rules | Exit & execute / Exit & ignore | FULL | |
| 10 Rules | Conditional (IF a cmp b THEN) | FULL | |
| 10 Rules | Comment | FULL | |
| 10 Rules | Local variables (oo..xx, pp/qq) | FULL | |
| 10 Rules | Global variables (ga..z9, g0..g9) | FULL | |
| 10 Rules | Rules Wizard (Add Rule dropdown, 9 types) | FULL | plus free-text editor; no per-rule structured form like BOME |
| 11 Settings | Startup / appearance / options / confirm prefs | MISSING | app-level preference panes not implemented |
| 11 Settings | Export/Import settings (.bmts) | MISSING | no .bmts settings file support |
| 12 Engine | Incoming event processing pipeline | FULL | router -> match -> rules -> outgoing |
| 12 Engine | Outgoing execution + delayed fire | FULL | |
| 12 Engine | Parallel processing | PARTIAL | single worker thread; not per-translator parallel like BOME |
| bmtp | Import (.bmtp INI + payloads) | PARTIAL | all 44 corpus files import with 0 errors AND 0 unparsed rules (5760 translators); StMa decode {4hex desc}{4hex count}{rules} verified vs BOME; only serial payloads (SerP, 0.03%) remain Raw |
| bmtp | Export (.bmtp, unsigned) | PARTIAL | writes a loadable unsigned file; not byte-identical to BOME, no RSA signature |
| bmtp | RSA [Signatures] block | MISSING | cannot re-sign without BOME private key (import ignores it) |
Pure-Rust, in-engine features that take ztranslator past BOME to match or exceed the wider remapper field — Karabiner-Elements, QMK/VIA, AutoHotkey, Elgato Stream Deck, BetterTouchTool. Each is a real algorithm reachable through the dispatch surface (capi zt_invoke + the Tauri plugin) with a unit or C-ABI test. They are deliberately excluded from the BOME coverage % above because they are not BOME manual features.
| Feature | Competitor gap / origin | Command |
|---|---|---|
| Response-curve value scaling (linear/exp/log/S-curve/invert) | beyond BOME hand-math; Karabiner & Stream Deck have no value shaping | ztr_scale_value |
| Grid quantize / snap-to-step | DAW/BTT slider grids; BOME needs hand-written division | ztr_quantize |
| Analog deadzone with re-expansion (⭐ original) | joystick/gamepad axes — no BOME/Karabiner/AHK equivalent | ztr_deadzone |
| Slew-rate smoothing / CC de-jitter (⭐ original) | a stateful smoother the competitors leave to the user | ztr_slew |
| Musical-scale note snap, 14 scales (⭐ original) | musical quantization beyond every keyboard/MIDI remapper (BOME, Karabiner, QMK) | ztr_scale_snap |
| Note transpose (clamp / octave-fold / wrap) | BOME does raw add only; adds range-overflow policy | ztr_transpose |
| 14-bit value split / combine (pitch-bend, hi-res CC) | BOME NRPN/14-bit parity helper | ztr_split_14bit, ztr_combine_14bit |
| Universal SysEx Identity Request builder | beyond BOME (raw byte editing only) | ztr_sysex_identity_request |
| SysEx manufacturer-ID decode (1- & 3-byte) | BOME shows raw bytes; this names the vendor | ztr_sysex_manufacturer |
| Roland/Boss DT1 checksum | BOME users compute it by hand | ztr_roland_checksum |
| HID usage <-> macOS keycode bridge (usage page 0x07) | Karabiner & QMK/VIA name keys by HID usage ID; BOME cannot | ztr_hid_usage_to_keycode, ztr_hid_name_to_usage |
| Tap-hold / mod-tap resolver (permissive-hold) | QMK MOD_TAP, Karabiner to_if_alone/to_if_held_down; BOME has none | ztr_resolve_tap_hold |
| Chord / combo detection within a time window | QMK combos, Karabiner simultaneous; BOME has none | ztr_detect_chords |
| Layer-stack resolver (momentary/toggle/to/one-shot) | QMK/VIA layers; BOME has none | ztr_resolve_layers |
| Karabiner-Elements config import (simple + basic complex) | Karabiner-Elements — no BOME importer exists | ztr_import_karabiner |
| AutoHotkey hotkey-line grammar parse | AutoHotkey — brings its hotkey syntax to macOS | ztr_parse_ahk_hotkey |
| MIDI 2.0 UMP pack/unpack (MIDI-1.0 channel voice) | MIDI 2.0 spec — BOME is MIDI 1.0 only | ztr_ump_from_midi1, ztr_ump_to_midi1 |
| MPE zone master/member channel layout | MPE spec — BOME has no MPE model | ztr_mpe_zone |
| BPM <-> 24-PPQN MIDI clock interval | MIDI clock timing — BOME forwards clock but does no tempo math | ztr_bpm_to_clock, ztr_clock_to_bpm |
| Song Position Pointer encode/decode | MIDI SPP — beyond BOME's raw byte forwarding | ztr_spp_encode, ztr_spp_decode |
| Event debounce + auto-repeat schedule | Karabiner/QMK debounce & key-repeat — no callable formula elsewhere | ztr_debounce, ztr_repeat_count |
| Standard MIDI File VLQ codec | SMF spec — BOME cannot read/write .mid | ztr_vlq_encode, ztr_vlq_decode |
| Standard MIDI File MThd header build/parse | SMF spec — beyond BOME (no file model) | ztr_smf_header, ztr_smf_parse_header |
| OSC 1.0 message encode/decode (i/f/s) | OSC / TouchOSC / Lemur — BOME has no OSC | ztr_osc_encode, ztr_osc_decode |
| Pointer region hit-test + swipe classify | BetterTouchTool gestures — BOME/Karabiner/QMK have no 2-D pointer | ztr_hit_region, ztr_classify_gesture |
| Repeat/loop macro tree expansion | Keyboard Maestro / Stream Deck multi-action — BOME has a flat list | ztr_expand_macro |
| Leader-key sequence matcher | QMK LEADER / Vim — BOME has no sequence trigger | ztr_match_leader |
| Stream Deck paged profile-grid key index | Elgato Stream Deck — BOME has no surface layout model | ztr_streamdeck_index |
| AutoHotkey v2 expression evaluator (arith/compare/logic) | AutoHotkey v2 — BOME rules do integer assignment only | ztr_ahk_eval |
| CC -> discrete action band matrix with hysteresis | beyond BOME single-value if comparisons | ztr_cc_band |
| Remap config linter — conflicts/no-ops/dead targets (⭐ original) | no competitor validates a remap set (BOME/Karabiner/AHK/QMK) | ztr_lint_mappings |
| 128-entry velocity/aftertouch response curve LUT | QMK / Native Instruments velocity curves — BOME rescales one value by hand | ztr_velocity_curve |
| Note-name <-> MIDI-number (scientific pitch, C4=60) | BOME/Karabiner/QMK treat a note as a bare 0-127 int | ztr_note_name, ztr_note_number |
| Chord builder from root + quality (20 qualities) | no remapper explodes a trigger into a chord | ztr_chord_notes |
| Scale note enumeration (root + mask, N octaves) | beyond BOME — no scale model | ztr_scale_notes |
| Chord identification from held notes (⭐ original) | no MIDI remapper names a chord from its notes | ztr_identify_chord |
| Arpeggiator model (up/down/updown/downup/converge, octaves) | hardware/DAW arps & QMK music mode — BOME just re-emits | ztr_arpeggiate |
| Step-sequencer step + gate-length model | hardware step sequencers — BOME has no clocked grid | ztr_sequencer_step |
| MIDI-CI Discovery build/parse (28-bit MUID) | MIDI 2.0 Capability Inquiry — BOME is MIDI 1.0 only | ztr_ci_discovery, ztr_ci_parse |
| MIDI-CI Property Exchange Get build/parse (JSON header) | MIDI 2.0 Property Exchange — no BOME equivalent | ztr_ci_property_get, ztr_ci_parse_property_get |
| Pointer scroll-tick accumulation + point clamp | BetterTouchTool/Keyboard Maestro continuous pointer — BOME moves to a point only | ztr_scroll_accumulate, ztr_clamp_point |
| Conditional rule tree (if/else/while) + variable store | Keyboard Maestro/AHK nested logic — BOME rules are a flat list | ztr_eval_logic |
| SMF track event parse (meta/tempo/timesig, running status) | SMF spec — BOME cannot read .mid | ztr_smf_parse_track |
| Tempo <-> BPM (microseconds-per-quarter) conversion | SMF/DAW tempo math — beyond BOME | ztr_tempo_convert |
| MIDI Time Code quarter-frame encode/decode | MTC SMPTE sync — BOME forwards F1 bytes but never assembles a timecode | ztr_mtc_encode, ztr_mtc_decode |
| Deterministic humanize timing/velocity jitter (⭐ original) | hardware-sequencer groove/feel — BOME has none | ztr_humanize |
| RPN/NRPN builder + CC-stream decoder | BOME has 14-bit output but no callable (N)RPN build/parse | ztr_rpn_build, ztr_rpn_parse |
| HID Consumer usage page media keys (play/vol/brightness) | Karabiner/QMK KC_MEDIA_* — BOME can't name usage page 0x0C | ztr_consumer_usage, ztr_consumer_name |
| Stream Deck+ dial/encoder model (acceleration + clamp) | Elgato Stream Deck+ rotary — BOME has no encoder model | ztr_dial_rotate |
| Stream Deck multi-action timeline | Stream Deck Multi Action / Keyboard Maestro — BOME has a flat action list | ztr_multi_action |
| Key-sequence recording + normalization (canonical chords) | Karabiner/Keyboard Maestro trigger capture — BOME has no recorder | ztr_normalize_sequence |
| MIDI 2.0 Channel Voice (type 0x4) note pack/unpack | MIDI 2.0 64-bit UMP with 16-bit velocity + note attribute — BOME is MIDI 1.0 only | ztr_ump2_from_note, ztr_ump2_to_note |
| MIDI 2.0 velocity scaling (7<->16-bit, min-center-max) | MIDI 2.0 spec bit-scaling — BOME has no 16-bit velocity | ztr_velocity_7_to_16, ztr_velocity_16_to_7 |
| UMP JR (jitter-reduction) timestamp build/parse | MIDI 2.0 transport timestamps — no BOME concept | ztr_jr_timestamp, ztr_jr_parse |
| MPE pitch-bend range -> semitones | MPE per-note bend range — BOME has no bend-range model | ztr_mpe_bend |
| SMF track serialize + MTrk chunk write | SMF spec writer — BOME cannot write .mid at all | ztr_smf_serialize_track, ztr_smf_write_mtrk |
| OSC bundle + NTP timetag encode/decode | OSC 1.0 temporal bundles — beyond ztranslator's message codec, no BOME OSC | ztr_osc_bundle_encode, ztr_osc_bundle_decode |
| LFO generator — 6 shapes incl. sample-and-hold (⭐ original) | hardware/DAW LFOs sweep a CC over time — no remapper generates a moving value | ztr_lfo_value |
| ADSR envelope generator (value over time) (⭐ original) | synth envelope to shape a CC/velocity — BOME can only emit a fixed value | ztr_adsr_value |
| Swing quantize (triplet feel) (⭐ original) | DAW/MPC swing — BOME/Karabiner/QMK have no groove model | ztr_swing_quantize |
| Groove templates (swing/shuffle/push/laid-back) (⭐ original) | named per-step timing+velocity feel — no remapper equivalent | ztr_groove_apply |
| Chord strum (up/down, timed spread) (⭐ original) | guitar/harp strum a chord across time — BOME re-emits simultaneously | ztr_strum |
| Note-repeat / drum roll with velocity ramp (⭐ original) | hardware pad note-repeat — BOME re-emits once | ztr_note_roll |
| Velocity compressor (threshold/ratio/makeup) (⭐ original) | studio dynamics on velocity — beyond BOME's single-value rescale | ztr_velocity_compress |
| Headless rules-VM simulator / debugger (⭐ original) | BOME tests rules only by sending live MIDI — no offline evaluator that reports outcome, Log output and final vars | ztr_run_rules |
| Feature | Reason |
|---|---|
| BomeBox hardware runtime | no public firmware/runtime to target |
| MT-Player / signed project export | requires BOME private key |
| HUI / Mackie Control protocol | not part of the .bmtp action set |
| Windows injected key/mouse events (9.4.3 / 9.8.6) | Windows-only API |
scripts/gen_port_report.sh from scripts/port_features.tsv. Regenerate after any port work: scripts/gen_port_report.sh --write. Spec source: vendor/bome/manual.pdf.