Skip to content

CoyoteSocket v2.4.0

Choose a tag to compare

@github-actions github-actions released this 25 Apr 10:26
· 10 commits to main since this release

CoyoteSocket v2.4.0

Big-feature release: full gamepad input system plus a baked-in default Xbox layout.

Download

Grab CoyoteSocket-2.4.0.exe from the Assets below. Portable single-file app — no install required. Settings live next to the exe.

✨ Gamepad input system

End-to-end controller support with combo bindings, parameter linkage, and analog continuous control. Works regardless of window focus.

Two engines, switchable at runtime

  • XInput (Windows-only, default) — rock-solid for Xbox controllers via cable, Wireless Adapter, or Bluetooth
  • gilrs (cross-platform fallback) — covers Switch Pro, Joy-Cons, generic HID

Pick the engine in Settings → Gamepad → Input Engine.

Combo bindings (chords)

  • Mix any number of buttons + stick directions + trigger thresholds into a single binding
  • More-specific combos win when overlapping. LB + A + stick suppresses LB + stick when all three are active
  • "Bind" button captures the chord — release all parts and press again to redo without canceling

Continuous analog

  • Stick / trigger bindings emit at 80ms with magnitude scaled by deflection. Combo magnitude = min of its parts (weakest link)
  • Stick Sensitivity slider scales action-driven adjustments (0.05–5.0). Direct parameter linkage stays positional, ignores sensitivity

Button repeat

  • Held button-only bindings auto-repeat after a delay, then fire at a steady interval
  • Both configurable in Settings → Gamepad

Parameter source linkage

  • Pick GP_LX / GP_LY / GP_RX / GP_RY / GP_LT / GP_RT in any axis source dropdown
  • Sticks normalize -1..1 → 0..1 with stick up = 1.0, neutral = 0.5
  • Triggers stay 0..1 native (rest = 0, full = 1)

Combo lock

When a combo's modifiers are active, partner axes are suppressed from parameter linkage. LT + stick → frequency no longer bleeds into intensity at the same time. Trigger-as-modifier counts the same as a button.

Default Xbox layout (ships baked-in)

Modifier What stick / button does
LT held left-stick Y = channel A intensity / freq main
RT held left-stick Y = channel B intensity / freq main
LT + A + stick Y channel A intensity range min edge
LT + B + stick Y channel A intensity range max edge
LB + stick Y channel A frequency main
LB + A + stick Y channel A frequency range min
LB + B + stick Y channel A frequency range max
(mirror with RT/RB for channel B)
LT + DPad ↑/↓ channel A intensity balance
LB + DPad ↑/↓ channel A frequency balance
View open Help
Menu toggle Output Pause

📦 New action bindings

  • 8 intensity range edge actions: channel{A,B}IntRange{Min,Max}{Up,Down}
  • 8 frequency range edge actions: channel{A,B}FreqRange{Min,Max}{Up,Down}

🎨 UI

  • New Gamepad tab in Settings dialog
  • Per-action bind UI with combo capture, live preview as parts arrive, Save / Cancel
  • Engine selector + Stick Sensitivity + Repeat Delay + Repeat Interval sliders
  • Slider thumb alignment fix: indicator dot and range-fill bar account for the 24px thumb diameter so position lines up at extremes

🛠 Internals

  • New gamepad.rs module with engine-agnostic dispatch
  • New deps: gilrs 0.10, rusty-xinput 1.3
  • 27 Kenney CC0 SVGs (Xbox prompts) for the bind UI
  • GamepadBindings schema is a free-form HashMap<String, GamepadBinding> so future actions slot in without migrations

🐛 Carry-over fixes

This release also bundles in-flight work that was running in the same binary:

  • Balance handling fix
  • Processing engine refactor (~1300 line delta in processing.rs)
  • New diagnostic capture module + scripts/analyze-diagnostic.js replay tool

⚙️ Default settings change

Stick sensitivity default lowered from 1.00.3. Existing settings.json files keep their saved values; only fresh installs see this.