Added a default 2000 ms peak hold for the highest Fullsize main L/R meter segment. The hold duration is controlled by X32_MAIN_VU_PEAK_HOLD_MS in x32_style.h; peak tracking uses integer masks and millisecond timestamps.
Skipped the black LCD palette entry during the loud Fullsize Surface initialization so all four diagnostic Scribble lines remain visible.
v0.10.0
Added a separate subscribed VU stream for visible channel faders and the master. The server computes the Surface meter masks from REAPER peaks; the client applies integer masks through the central Surface cache. Bumped the wire protocol to version 14.
Fixed the Fullsize master-strip select button to follow REAPER's selected state and exposed the selected master's FX chain through the existing FX screen. Master routing sends remain unsupported to avoid creating loopbacks.
Blanks the HOME channel-control body while REAPER has the master selected and shows MASTER in a red, white-text top-bar chip.
Shows the selected master's FX chain with the same MASTER title treatment, using a dark-red #bb0000 chip. The loud Surface init now writes four visible diagnostic text lines to each Fullsize scribble strip.
Verified the server CTest suite (1/1), all nine client host tests, and the ARM client build.
v0.9.1
Unified startup and disconnect surface resets. The Fullsize startup identification animates mapped LEDs and encoder rings, moves all 25 faders to nominal unity, and labels the scribble strips CH01 through CH25 with inverted backgrounds cycling through the eight LCD colors; the pattern repeats every eight strips.
Added direct X32 M-class Surface meter output. Channel-strip meter masks cover VU/clip, gate, and compressor/gain-reduction indicators; the startup check lights every mapped meter segment before the reset explicitly clears them. Fullsize main-board preamp, dynamics, and L/R/solo meter fields are initialized and cleared through their extended meter packet.
Preserved wire protocol version 13; these changes affect only local Surface UART output and release metadata.
v0.9.0
Added REAPER automation-following feedback for effective track volume and pan using GetTrackUIVolPan() on every mixer-visible track. X32 motor faders, the active-channel pan ring, and the Home/Mixer pan widget now follow the values REAPER displays during automation playback.
Changed the server poll gate to a 25 ms target (40 Hz nominal). Snapshots still advance only when state changes and reuse the existing bounded latest-state coalescing path; the Surface cache continues to suppress duplicate physical writes.
Kept automation semantics in REAPER: existing X32 control writes continue through the normal REAPER path for READ/LATCH; no client-side automation emulation or Touch behavior was added.
Added snapshot apply and surface sync to the existing client timing histogram so manual REAPER changes and automation use one source-neutral measurement path.
Confirmed effective volume and pan feedback on live REAPER/X32 hardware. Server CTest passed 1/1, client host CTest passed 9/9, and the timing-enabled ARM client build succeeded.
Preserved wire protocol version 13. Existing mixer volume and pan fields now report effective UI values; no message shape changed.
v0.8.6
Fixed the EQ-section View button so it inserts ReaEQ on the active track when the FX chain is empty or does not already contain ReaEQ; an existing ReaEQ instance is reused.
Preserved wire protocol version 13; this release changes client navigation behavior only.
v0.8.5
Changed the X32 client loop to sleep only for the remaining time in its 10 ms target interval.
Added five-second microsecond timing summaries for loop phases, EQ encoder events, and ReaEQ framebuffer compose/blit work, with histogram buckets and approximate percentile reporting.
Preserved wire protocol version 13; this release changes no wire messages.
v0.8.4
Added canonical runtime architecture documentation for server/client responsibilities, thread and task ownership, synchronization, blocking behavior, lifecycle and timing.
Added a unified Surface architecture reference for hardware profiles, UART ownership, the global output cache, feedback handling and verified LCD constraints.
Corrected stale session-replacement, snapshot-flow, hardware-profile, main-bus, generic-FX and development-phase statements across the maintained documentation.
Consolidated durable quality and LCD research findings into the architecture references and removed the obsolete standalone analysis files.
Repaired repository-local documentation links and standardized maintained first-party documentation on English.
Preserved wire protocol version 13; this release changes documentation and software release metadata only.
v0.8.3.1
Increased the post-OTA restart delay from one to three seconds so the updated client and surrounding system state can settle before relaunch.
Preserved wire protocol version 13; this patch changes only client restart timing and release metadata.
v0.8.3
Added server-calculated, pixel-exact aggregate and per-band ReaEQ response curves with colored fills for every active band.
Replaced CSV curve payloads with the versioned binary XREQ format carried as Base64 inside the existing JSON protocol envelope.
Replaced the client's handwritten JSON parser and DOM with vendored yyjson 0.13.0, parsing each received frame once in situ.
Hardened XREQ decoding with strict geometry, length, slot, bounds, padding, and trailing-data validation plus malformed-input and golden-vector tests.
Reduced direct-framebuffer curve composition with full-redraw, direct-column, and lookup-table blending optimizations.
Removed the 100 ms FX-poll wait after ReaEQ controls and the redundant acknowledgement-gated mixer snapshot before subscribed FX detail updates.
Updated the wire protocol from version 11 to version 13. Client and server must be updated together because protocol compatibility remains exact.
Verified all nine X32 client host tests, the ARM client build, the Linux REAPER-server build and smoke test, and live X32 timing. Warm hardware runs decoded snapshots in 13-14 ms and displayed ReaEQ updates in about 45-52 ms.
v0.8.1
Removed generated Autotools noise and obsolete BusyBox workarounds from the OpenX32 patch series.
Restored BusyBox AWK, expr, and shell arithmetic; the ARM cross-build now retains its required library dependencies correctly.
Skipped the unused OpenMixerControl executable and redundant upstream OpenX32 firmware image when building the X32REAPER image.
Used the restored BusyBox shell arithmetic and signal-name lookup to report fatal client exits without a hardcoded signal table.
Verified the ARM compile, X32REAPER image build, and deployment.
Preserved wire protocol version 11; this release changes only the image build process.
v0.8.0
Added startup model detection from /etc/x32.conf for X32 Fullsize, M32 Live, X32 Compact, M32R Live, and X32 Producer consoles.
Added model-specific surface profiles for fader geometry, channel boards, banking controls, navigation, preamp, EQ, display encoders, and main-bus controls.
Added 8/8 Compact, M32R, and Producer layouts with six direct left-bank selections, two direct right-bank selections, and dedicated previous/next paging buttons in eight-channel steps.
Restricted the dedicated Sends section and Scene transport mapping to Fullsize consoles and made startup, disconnect, and boot indication writes respect the hardware available in each profile.
Added a permanent framebuffer error screen for missing, invalid, and unsupported console models before UART or network initialization.
Changed fatal-signal handling in the image init wrapper to open a BusyBox shell after recording the crash and core-dump location, enabling immediate on-console diagnosis.
Added host coverage for model parsing, profile geometry, model-specific control addresses, paging, and partial final-bank clamping.
Preserved wire protocol version 11; this release changes only client-side console detection and surface behavior.
Verified all nine X32 client host tests, the ARM client build, and the Linux REAPER-server smoke test.
v0.7.2
Prevented the generic FX parameter renderer from running for ReaEQ, keeping the dedicated ReaEQ controls and Band info widget stable during tab changes.
Reasserted ReaEQ framebuffer visibility and redraw state when returning to a ReaEQ screen.
Kept the current FX screen visible while a newly selected track's detail snapshot is pending instead of rendering an incomplete zero-FX placeholder.
Coalesced unsent server snapshots during rapid track selection so stale FX states do not delay or blank the current screen.
Retried asynchronous motor-fader writes when the socket write fails, instead of dropping the pending control and allowing an older snapshot value to win.
Verified the Linux server build and smoke test, ARM client build, and all seven X32 client host tests.
v0.7.1
Added an isolated Surface-cache host test covering bounds, deduplication, failed-write retry behavior, LCD line limits, ring state, and fader invalidation without requiring X32 hardware.
Hardened LCD cache input validation by rejecting non-empty line counts with a null line array.
Verified the server and client host suites after the quality changes: server CTest 1/1 and client CTest 7/7 passed.
Verified AddressSanitizer and UndefinedBehaviorSanitizer runs for the server and client host tests without findings.
Removed the temporary ReaEQ binding probe action from the REAPER extension and its unused poller API.
Preserved wire protocol version 11; this release contains no protocol contract change.
v0.7.0
Added a central Surface status/write cache for coherent fader, LCD, LED, encoder-ring, and navigation updates without duplicate UART writes.
Centralized screen transitions and selected-track Sends/FX detail requests, including bounded retries when a requested detail snapshot is delayed or coalesced during a track change.
Kept parsed server snapshots immutable and moved optimistic channel, Sends, generic FX, and ReaEQ interaction state into track-bound client overlays.
Fixed simultaneous motor-fader handling so every pending fader is flushed fairly instead of lower-index controls starving later faders.
Extracted the server snapshot outbox and explicit generic FX/ReaEQ mapping caches from the network and polling paths.
Prevented snapshots queued before a control from overriding newer REAPER state, while preserving the newest coalesced FX-detail response and following it with a fresh mixer resync.
Fixed intermittent empty FX/ReaEQ screens after track changes by retaining the newest requested detail snapshot and retrying unresolved client detail requests after selection confirmation.
Passed the Linux REAPER-server smoke test, all six X32 client host tests, and the ARM client build. Hardware tests confirmed the Surface, fader, Sends, FX, and ReaEQ behavior without remaining regressions.
Passed the Windows MSVC build and CTest suite; the resulting real extension DLL was also verified successfully in REAPER on Windows.
v0.6.8
Preserved complete authoritative snapshot application while eliminating duplicate physical-surface writes: the client now applies an incoming snapshot before flushing held motor-fader feedback.
Made disconnect recovery reset every live surface output, including main, sends, EQ, and low-cut encoder rings, so reconnect always reconciles from a known X32 state.
Hardened nonblocking UART frame writes against temporary backpressure with a bounded 100 ms wait; a stalled surface cannot block the client loop indefinitely.
Reduced redundant FX-screen and framebuffer output while retaining full ReaEQ frequency-response composition for every changed EQ state. The timing breakdown now reports the direct ReaEQ framebuffer phase separately.
Verified the timing-enabled ARM build and all six host tests. On X32 hardware, the measured full FX update path, including ReaEQ composition, LVGL, and surface output, remained below 50 ms in the observed run.
Clamped retained fader-bank offsets to the visible channel count after a REAPER project change, so channel mute/solo states remain mapped correctly when switching from a larger project to a smaller one.
Limited the lower +/- bank buttons to banks containing available channels. The rebuilt ARM client was confirmed on X32 hardware.
v0.6.7
Switched the complete X32 client, image, and deployment build chain to CMake/Ninja; the legacy client Makefile and Make-based wrapper calls were removed.
Confirmed the CMake-built client through image creation and deployment.
Manually verified the deployed build on X32 hardware and in REAPER successfully.
v0.6.6
Documented the CMake/Ninja command equivalent to make TIMING_LOGGING=1 for ARM client builds.
The timing-enabled CMake build is configured with -DX32_TIMING_LOGGING=ON.
No additional tests were run for this documentation-only release update.
v0.6.5
Added reconnect-first client recovery: link loss preserves the session token for reconnect, with a clean hello fallback when the session is rejected.
Added host loopback coverage for hello, mixer snapshots, ordered snapshot acknowledgements, requested snapshots, and reconnect.
Fixed FX detail parsing, channel banking refreshes, and FX stepping so mixer faders, LCDs, select/mute/solo LEDs, EQ view state, and high-pass controls do not retain stale state.
Reduced REAPER polling pressure by moving normal polling to 50 ms and separating selected-track FX/ReaEQ polling at 100 ms while retaining the latest complete FX state between polls.
Added a server TIMING_LOGGING build option matching the X32 client; normal builds keep timing diagnostics disabled.
Instrumented the REAPER poller with microsecond-level scan, per-track and FX timing. Measurements on a 129-track project showed the track API path below 3 ms even during rapid X32 fader and EQ-parameter changes.
Removed the measured-ineffective multi-tick track batching that had added roughly 250 ms snapshot latency; complete snapshots are built in one timer callback again.
Confirmed responsive fader and EQ-parameter control with a quiet REAPER server log after the timing changes.
Manually verified the current local source state with the Windows MSVC build, Windows CTest, and live REAPER functionality; the result was successful.
v0.6.4
Manually verified the current client/server release state; no additional automated tests were rerun for this release.
v0.6.3
Removed the LVGL ReaEQ graph fallback; the direct XRGB8888 framebuffer renderer is now the sole ReaEQ graph path without changing the current controls, markers, LEDs, or navigation behavior.
Reduced timing output to useful loop, snapshot, parser, network, poll, and framebuffer section breakdowns; removed verbose per-event and per-widget diagnostics.
Manually verified the current client/server state on the target workflow.
v0.6.2
Protocol v11 increases the ReaEQ graph response from 128 to 256 logarithmically spaced points.
Reconnects now wait for the first live mixer poll instead of applying a placeholder snapshot that could suppress the real mixer state.
ReaEQ gain controls now expose the full +/-36 dB UI range; X32-originated writes above +12 dB remain a documented follow-up limitation.
Channel Select now updates HOME immediately and refreshes Sends or FX after REAPER confirms the selected track.
Channel Select no longer consumes stale synchronous snapshots or requests a mixer snapshot before REAPER applies the new selection; detail screens now follow the confirmed subscription snapshot.
Reconnects now clear the master-fader feedback hold so the first live master value is written immediately after a REAPER restart.
ReaEQ now rebinds its first visible widget row on initial display, keeps the surface EQ-enable button synchronized with the plugin bypass state, and renders disabled EQ curves and markers in gray.
Reconnects now clear stale channel-fader feedback state, and the client accepts the full 256-point ReaEQ response so the white response curve is not lost while markers remain visible.
The surface EQ-enable button now uses a dedicated plugin-enabled control and cannot write ReaEQ gain or frequency parameters.
Opening the Effects screen now rebinds the cached FX/ReaEQ controls, preventing an intermittently empty first widget row.
ReaEQ gain widgets now use the full +/-36 dB range and preserve correctly rounded negative physical gain values.
v0.6.1
Reduced HOME and SENDS snapshot latency with unchanged-snapshot early exits, field-specific widget updates, physical fader-output caching, and a pre-format scribble cache.
Made fader banking independent of the current REAPER track count across the full 128-channel range; empty banks remain selectable and clear their physical slots without repeated UART writes.
Kept the dedicated sends encoders/page buttons and main level/pan/L-R controls active on every screen, with cached ring, backlight, and LED output.
Preserved authoritative sends data across mixer/FX snapshots, bound it to its owning track, and added one-shot detail snapshot requests for refreshing global sends controls without changing the visible screen subscription.
Added a dedicated Sends snapshot fast parser and removed server-side Sends throttling, preserving immediate updates without the generic DOM-parser cost.
Reduced Sends detail payloads to the selected track and merged that track into the retained client mixer state so banking keeps the full channel list.
Bumped the wire protocol to v10 for the optional request_snapshot.detail field.
Re-enabled the on-screen ReaEQ frequency-response graph using the cached response points and active band state.
Added the first direct-framebuffer ReaEQ graph renderer for the measured 800x480 display layout. It uses a validated 784x264 RGB565 background asset at position 8,112 and draws the curve, markers, selection ring, and band numbers after LVGL; geometry or asset mismatches retain the LVGL fallback.
Converts the source graph PNG once at build time to native XRGB8888 and embeds it directly into the ARM client binary. Runtime graph updates now compose in framebuffer-native pixels and blit by row without RGB565 conversion or a USB/initramfs asset dependency.
Sized OTA response buffers separately from normal snapshot frames so larger embedded-asset binaries can update successfully, and removed one full-size Base64 copy by decoding directly from the parsed JSON string.
Fixed ReaEQ smoke-test fixtures to use explicit sample rates and consistent visible-band identities for frequency, gain, Q, and enabled writes.
Changed the smoke-test harness so port-independent protocol, math, and poller tests always execute even when TCP port 9327 is occupied; only socket tests are skipped in that case.
Treated normal Windows WSAETIMEDOUT and POSIX ETIMEDOUT receive timeouts as retryable polling outcomes instead of logging them as UDP receive errors.
Verified the uploaded local worktree with MSVC, Windows CTest, and live REAPER functionality on Windows.
Added X32-compatible ReaEQ band selection: EQ buttons 1-4 select bands 1-4, buttons 1+2 select band 5, and buttons 3+4 select band 6. EQ LEDs now mirror the selected band for both physical and LCD navigation.
Completed the dedicated ReaEQ control improvements, including the reusable selection widget, logarithmic Q control scaling, larger active graph markers, and typed ReaEQ filter-type control.
v0.6.0
Added the Phase 0.6 ReaEQ communication path: typed per-band frequency, gain, Q, enabled, and filter-type snapshots and X32 control writes using REAPER's official EQ APIs.
Added the integrated ReaEQ editor scaffold with hardware EQ encoder routing, live REAPER-to-X32 updates, actual-band-count handling, and authoritative per-band bypass state.
Bumped the wire protocol to v6 and documented the ReaEQ snapshot/control contract, including the distinction between visible band slots and REAPER's per-band-type indexes.
Added server smoke-test coverage for ReaEQ detection, snapshots, typed parameter writes, enabled writes, and named-config type writes.
Fixed the ReaEQ bandwidth/Q mapping direction: formatted REAPER BW-Band values are now converted to Q before being exposed to the X32 instead of being passed through as if bandwidth and Q were identical. The conversion now uses the current REAPER project sample rate.
Fixed ReaEQ Q writes in the opposite direction so X32 milli-Q values are converted back to ReaEQ bandwidth before calling TrackFX_SetEQParam.
Restored ReaEQ gain writes to the previously working sampled dB-to-normalized parameter path while keeping typed frequency and Q/BW writes separate.
Changed ReaEQ frequency writes to target the resolved single parameter index through formatted-value sampling instead of writing by band type/index, avoiding multi-band movement when bands share a filter type.
Separated visible ReaEQ band slots from REAPER's per-type API indexes: the wire model now addresses visible slots and the server resolves exact parameter names and host indexes internally.
Added a pure server-side ReaEQ response-math foundation with tested RBJ biquad magnitude calculation, aggregate enabled-band response, and fixed 128-point logarithmic response generation.
Bumped the wire protocol to v7 and added ReaEQ aggregate-response snapshot fields for 128 signed tenths-of-dB graph points.
Added the queued reaeq_open control so EQ VIEW can ask the REAPER main thread to find ReaEQ or insert it before ReaComp/at the FX-chain end.
Added server-side caching for the 128-point ReaEQ response, invalidated by project sample rate, FX identity, or any response-relevant band value.
Reduced passive server polling/push latency, made client keepalives nonblocking, and drain queued snapshots while retaining the newest state.
Reduced redundant FX-screen work by skipping hidden mixer updates and coalescing unchanged ReaEQ graph and control refreshes.
Wired EQ/HP view navigation, ReaEQ band selection, the low-cut encoder and per-band enable control to the matching hardware sections.
Wired the physical EQ enable button to ReaEQ's global Bypass parameter and fixed standalone global enabled-state changes being dropped by the client FX cache, restoring authoritative LED feedback and repeated toggling.
Restored complete fader-bank refreshes on the FX screen, including motor faders, scribble strips, and select/mute/solo LEDs, and added immediate channel-button LED feedback while awaiting the authoritative snapshot.
Corrected the low-cut encoder output mapping: ring data uses encoder index 0x01, while its separate background LED is driven at 0x2B.
Removed noisy routine FX/ReaEQ parameter send and parse logging while retaining rejection and error diagnostics.
Bumped the wire protocol to v8, reduced FX detail snapshots to the selected track, encoded the 128 response points compactly, and retained only ReaEQ's global Bypass parameter in the generic parameter list. This removes the dominant ARM-side JSON parsing cost while preserving typed band data.
Coalesced passive FX snapshots to 20 Hz and retained only the newest queued state so continuous REAPER UI edits do not build up stale client work.
Restored automatic connected-session OTA detection from asynchronous keepalive metadata, with one update attempt per advertised build.
Increased the LVGL framebuffer draw buffer to the full 480-line display and cached static graph geometry and pixel-identical curve updates. Hardware response improved from roughly 1 FPS to about 10 FPS; a custom buffered graph renderer remains deferred for further gains.
v0.5.26
Fixed a real server bug found while making the smoke tests actually run: handle_tcp_client()'s select()-based loop ignored SO_RCVTIMEO, so the handshake/idle timeouts were never enforced - a client that connected and sent nothing could pin a server thread forever. The deadline is now checked explicitly against a tracked last-activity time.
Fixed a smoke-test reliability bug: tcp_port_is_available() bound its probe socket without SO_REUSEADDR, so rerunning the suite within the TCP TIME_WAIT window made it silently skip every test while still reporting success. This likely masked the failures below for a long time, including in prior "passing" release builds.
Fixed the smoke tests themselves once they started actually executing: sends_changed/fx_chain_changed/snapshot_changed didn't account for the 50ms poll throttle added in v0.5.20; fx_param tests used a 0-100 scale instead of the real 0-1000 per-mille protocol scale; hello/ reconnect/discover messages hardcoded a stale protocol_version:3 instead of the current version; and the bank-selection contract test had an inverted assertion (the second 16-page must stay locked until channel 17 exists, matching hardware behavior).
v0.5.25
Fixed a Windows MSVC build failure (C2065: SIO_UDP_CONNRESET): the SDK's mstcpip.h guards the macro behind _WIN32_WINNT, so a fallback definition using the documented IOCTL code is now provided when missing.
v0.5.24
Fixed a Windows-only smoke-test failure cascade caused by WSAECONNRESET on the server's UDP discovery socket: an ICMP "port unreachable" reply to a stale datagram made recvfrom() fail repeatedly, spinning the UDP thread and starving other test threads of CPU. Disabled via SIO_UDP_CONNRESET (WSAIoctl) on both the server and smoke-test UDP sockets.
v0.5.23
Fixed a Windows-only hang in the REAPER server smoke tests: accept() on the TCP listen socket ignored SO_RCVTIMEO under Winsock, so stop() could block forever waiting for the accept thread to notice a shutdown request. The listen socket is now closed directly to unblock a pending accept().
Fixed an -Werror=unused-function build failure in the X32 client when timing logging is disabled by scoping snapshot_failure_context() to the X32_TIMING_LOGGING guard that already covers its only caller.
v0.5.22
Completed the 0.5 cleanup phase: corrected FX dB value mapping and wired the EQ encoder parameter banks with their LEDs and encoder backlights.
Completed SENDS surface feedback: the view LED, encoders, and LEDs now follow the selected channel's send state across screens.
Changed HOME active-control borders from white to the primary accent color.
Included the Automation control in HOME active-row border feedback.
Normalized Automation labels on the HOME widget and LCD scribbles to title case.
v0.5.21
Refined the HOME record-enable row layout, removed the lower row's thin container frame, and gave the record-enable control a dark red background.
Fixed FX dB control reads so dB parameters send their half-decibel control value instead of the normal normalized parameter value.
Wired the SENDS view LED and made the dedicated SENDS encoders/rings use the selected channel's session send state across screens.
Added generic FX-slot control from the hardware EQ section with four 3-parameter banks, EQ bank LEDs, encoder rings, and checkbox-safe no-op handling.
Reduced SENDS/FX detail-screen redraw cost by updating only changed visible slots when snapshot structure is unchanged.
Reworked X32-to-REAPER FX dB writes to search REAPER's formatted dB response instead of assuming a linear normalized parameter scale.
Added server-side no_new_value echo suppression for X32-originated SENDS and FX parameter writes, and fixed detail throttling so the final detail revision is not swallowed by mixer-only intermediate snapshots.
Added client-side pending target holds for async SENDS/FX writes so stale snapshots received before the server echo flag arrives cannot overwrite the current X32 encoder target.
Cached FX dB parameter scale sampling on the server so rapid X32 dB encoder moves no longer run a full formatted-value search for every tick.
Hardware testing confirms EQ-encoder-to-FX-UI updates are much smoother than the previous 1 FPS behavior, with occasional remaining dips around 10 FPS.
v0.5.20
Added protocol-level detail subscriptions so HOME/SETUP receive mixer-only snapshots while SENDS and FX opt into their heavier selected-track details.
Reduced HOME CPU load by skipping hidden SENDS/FX widget refreshes on passive mixer snapshots, improving FPS and hardware fader smoothness on large REAPER projects.
Added passive detail throttling for SENDS/FX screens; requested snapshots still return full detail immediately while intermediate mixer-only frames preserve the visible detail cache.
Added snapshot detail metadata, client-side authoritative-detail handling, smoke-test coverage, and protocol documentation for the performance flow.
Added ROADMAP.md with the remaining 0.5 cleanup items and planned 0.6 ReaEQ-specialized surface work.
v0.5.19
Added selected-track record-arm control through the physical +48V button, its LED, and a new red Record enabled control on the two-row HOME screen.
Wired the physical polarity button and LED globally to REAPER track polarity, and enabled bank navigation on every connected screen.
Normalized multiple REAPER track selections to the first visible selected track so the X32 always has one unambiguous active channel.
Added explicit empty-state overlays for HOME, SENDS, and FX when REAPER has no tracks, including reliable motor-fader recovery when tracks return.
Simplified scribble-strip contrast to light text on dark backgrounds, retained visible output for black track colors, and removed the wrapped-name indent.
Improved generic FX controls with filtered/prioritized Wet, Dry, and Bypass parameters, checkbox-style bypass, fixed half-decibel controls, and clearer value formatting.
Replaced the SENDS screen's white active-row frame with configurable active and inactive row intensity styling.
v0.5.18
Keepalive handling now tolerates multiple passive mixer snapshots before the corresponding acknowledgement and treats continued valid frame traffic as transport activity.
REAPER-side diagnostics now report TCP client lifecycle, send failures, and disconnect causes while throttling periodic snapshot messages.
Hardware stress testing confirms responsive REAPER-side fader movements on the X32 without visible stutter or disconnects.
v0.5.17
Release ZIPs now include the complete documentation/screenshots/ collection alongside the project README, license, and third-party notices.
v0.5.16
Release ZIPs now include the project LICENSE file alongside the generated README and platform artifacts.
v0.5.15
First publicly visible X32REAPER release.
Release ZIPs now include a generated README.txt containing the release version, build date, project overview, installation steps, and official project homepage.
v0.5.14
Fixed the timing-diagnostics state so the default client build succeeds with timing logging disabled and -Werror enabled.
Release artifacts are built without client or server timing output by default.
v0.5.13
Coalesced pending continuous controls on the REAPER server so rapid fine-grained fader, send, and FX parameter movements keep only the latest value per target instead of accumulating stale values.
Added opt-in server timing counters for selected-track, send, FX, and FX parameter counts to support further snapshot latency profiling.
Hardware testing confirms that fine-grained fader movements may lag slightly under extreme input rates but remain synchronized and catch up without persistent feedback fighting.
v0.5.12
Added opt-in timing diagnostics for client snapshot frame reads, snapshot parsing, keepalive failures, and REAPER snapshot-poll phases.
Improved client-side surface and LVGL update caching to avoid redundant UART and widget updates during idle operation and live fader control.
Hardware testing confirms smooth X32-to-REAPER fader input; REAPER-to-X32 snapshot feedback remains asynchronous and may be delayed by expensive REAPER API and FX parameter polling.
v0.5.11
Added ./tools/make_release, an automated release builder CLI tool that compiles the X32 client binary and OpenX32 boot image (dcp_corefs_x32reaper.run), compiles the Linux REAPER extension (reaper_x32reaper.so), triggers a remote MSVC Windows build via SSH on a configured Windows build host (reaper_x32reaper.dll), runs ctest on both platforms, and packages all three release artifacts into x32reaper-release-<VERSION>.zip.
Added documentation for the automated release process in documentation/release-process.md and included an example build log in documentation/examples/full-release-build.0.log.
SSH now generates one ed25519 Dropbear host key per writable X32REAPER USB installation, persists it across boots, and reuses it after validation. Invalid stored keys are preserved before replacement. SSH is intentionally disabled when no safe USB-backed host key is available; it no longer uses the static image-wide key.
Dropbear's temporary host-key public-key sidecar is removed after generation.
Hardware-verified on a real USB boot: the persisted host key is created and validates successfully without exposing its private material.
v0.5.10
working
Fader control and bank navigation
Pan and Send encoders
LCD scribble strips with Track names, automation state and automatic color translation
Chanel Home screen
Sends screen
Effects screen
Generic Plugin parameter editor
Minimal transport control
Release preparation
Protocol compatibility now uses the required exact protocol_version field; redundant min/max range fields were removed.
Public documentation links, stale screenshot references, historical Phase 0 strategy link, and platform-specific installation guidance were corrected.
The X32 build script now checks /tmp/uImage as a file and invokes the OpenX32 build when it is absent.
OpenX32 and nested build fixes are preserved as a pinned submodule commit plus a local patch series.
Fresh-clone setup, patch application, kernel build, and complete X32 image build were verified; the resulting image is build/image/artifacts/dcp_corefs_x32reaper.run.