CoyoteSocket v2.4.0
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 + sticksuppressesLB + stickwhen 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_RTin 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.rsmodule with engine-agnostic dispatch - New deps:
gilrs 0.10,rusty-xinput 1.3 - 27 Kenney CC0 SVGs (Xbox prompts) for the bind UI
GamepadBindingsschema is a free-formHashMap<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.jsreplay tool
⚙️ Default settings change
Stick sensitivity default lowered from 1.0 → 0.3. Existing settings.json files keep their saved values; only fresh installs see this.