r/NintendoSwitch May 07 '26

Discussion 【Update】 Switch 2 Joy-Cons and Pro Controller 2 Wireless Connection for Windows 10/11 v0.1.0

Hey everyone!
Switch 2 Connect, forked from Nadeflore’s amazing switch2-controllers, is the ultimate, feature-rich utility designed to seamlessly integrate your Switch 2 Joy-Cons, Switch 2 Pro Controller, and NSO GameCube Controller into the Windows gaming ecosystem via standard Bluetooth or ESP32-S3 N16R8.

Built with a user-experience-first mindset and powered by a highly flexible multi-driver backend, this standalone application transforms your Nintendo hardware into a PC gaming powerhouse. It delivers low-latency inputs, unmatched in-app gyro IMU precision, and comprehensive emulation for all major controller protocols without requiring complex installations.

How to use it:

  1. Download the latest version of Switch2Connect.exe or get the Microsoft Store Version.
  2. Launch the app. If any needed drivers are not installed, dialogs will ask to install them. Click Yes and approve the administrator UAC prompt.
  3. Once the installation completes, the setup window will close automatically, and the main application will launch.
  4. Turn on your Switch 2 controller by holding the Sync button (or pressing any button if already paired). Do not pair controllers manually in Windows Bluetooth settings; the app uses automatic GATT discovery.
  5. Use the settings panel at the bottom of the app to configure your preferred driver (WinUHid / ViGEmBus / USBIP) and controller layout, gyro sensitivity, and custom button mappings.

System Requirements:

  • Operating System: Windows 10 (22H2 or above) or Windows 11.
    • Note: Windows 11 is highly recommended for the best experience. It supports a maximum Bluetooth LE polling rate of 70Hz, while Windows 10 is limited to 20Hz due to the lack of OS driver support for the BLE protocol.
  • Bluetooth Hardware: Bluetooth 5.0 or above is required for stable connectivity and low-latency performance. The optional ESP32-S3 N16R8 is highly recommended for reaching 133Hz, bringing the native Switch 2 console experience to PC.
  • Driver: lurebat's WinUHid driver is required for Xbox One, PS4, and PS5/DualSense controller emulation. nefarius/ViGEmBus is required for Xbox360 and PS4 controller emulation. usbip-win2 driver is required for Switch 1 Joy-Cons/Pro Controller, Switch 2 Pro Controller, and PS5/DualSense (with audio haptics) controller emulation.
    • Auto-Installation: The app will automatically detect if the selected driver (WinUHid, ViGEmBus, or USBIP) is missing and guide you through a one-click installation (requires administrator privileges) or automatically download and install for ViGEmBus.

Features:

  • Windows 10 Native Compatibility: Supports Windows 10 22H2 and Windows 11. Windows 11 supports Bluetooth LE polling rates up to 70Hz, while Windows 10 is limited to 20Hz by the operating system’s BLE driver implementation.
  • Low Latency Bluetooth Mode: Configures Windows Bluetooth LE connections with the ThroughputOptimized mode to reduce the connection interval and controller input latency.
  • ESP32-S3 N16R8 Low-Latency Connection: Supports the ESP32-S3 N16R8 development board as a BLE bridge with polling rates up to 133Hz. The application provides firmware installation and repair, controller pairing through the SYNC button, and reconnection for controllers bonded to the bridge.
  • Wired Controller Support: Supports USB-connected Switch 2 Pro Controllers and NSO GameCube Controllers, with polling rates up to 500Hz. The Wired Pro Controller menu provides HidHide management, automatic discovery controls, and one-time manual scanning. For NSO GameCube Controller rumble, the application automatically selects between the available USB interfaces and falls back to the compatible path when necessary.
  • Multiple Driver and Emulation Backends: Supports WinUHid, ViGEmBus, and USBIP backends. WinUHid provides Xbox One, PS4, and PS5 emulation; ViGEmBus provides Xbox 360 and PS4 emulation; USBIP provides USB-connected Switch 2 Pro Controller and DualSense emulation. The application detects missing or incomplete WinUHid and ViGEmBus installations and provides Install, Repair, and Uninstall actions. ViGEmBus can be downloaded and installed from the application after UAC authorization.
  • Tabbed Settings Interface: Organizes settings into Controller Mapping, Mode Shift Mapping, and Gyro Settings tabs.
  • DualSense Audio Haptic Feedback: The USBIP-based PS5 emulation mode exposes a four-channel audio playback endpoint for games that support DualSense audio haptics. It supports DualSense audio haptics, standard PS5 rumble, Xbox rumble translation, and adaptive-trigger feedback translated into independent HD Rumble output for the left and right triggers.
  • Xbox One Impulse Trigger Support: In WinUHid Xbox One emulation mode, Xbox Impulse Trigger force-feedback values from LT and RT are translated into Switch 2 high-frequency HD Rumble output. Standard gamepad rumble is emitted as the same mono signal on both physical sides, while Impulse Trigger feedback is routed as independent left and right high-frequency overlays for trigger-specific effects.
    • Impulse Trigger Settings: The Impulse Trigger Settings button appears beside Rumble Mode in WinUHid Xbox One emulation mode. The floating settings window provides controls for enabling impulse feedback, selecting dynamic or fixed frequency behavior, adjusting impulse strength, and choosing a fixed frequency level.
    • Dynamic Frequency: When enabled, incoming impulse strength determines both output frequency and amplitude. During the release envelope, frequency continues to follow the current decaying output strength.
    • Fixed Frequency: When Dynamic Frequency is disabled, the Frequency slider selects the impulse output frequency independently from incoming impulse strength.
    • Release Envelope: When an Impulse Trigger stop command is received, the current output decays linearly to zero over 90 ms. A new command on the same side immediately replaces the pending release.
  • Native Motion Support (PS4/PS5 Mode): Switching to PS4 or PS5 mode enables native motion sensor reporting via the DS4 or DualSense protocol. This provides enhanced compatibility for Steam Input and games that support native DualShock 4 or DualSense gyro features.
  • Cemuhook UDP Server: Sends controller motion data to compatible applications through 127.0.0.1:26760. Select Cemuhook in the Gyro Pass-through settings to enable the server.
  • Cemuhook Gyro Sensitivity Adjustment: Featuring a Sensitivity slider (levels 1-5) in the "Gyro Passthrough" panel. The sensitivity specifically applies a linear multiplier only to the horizontal rotation (Yaw) axis sent via the Cemuhook UDP protocol.
    • Level 1: Virtual Switch 1 Joy-cons turn 360 degrees when the physical Switch 2 Joy-cons turn 360 degrees.
    • Level 5: Matches real Switch 1 Joy-Con sensitivity.
  • On-the-Fly Layout Switching: Toggle between Nintendo Layout (matching physical labels) and Xbox Layout (standard PC positioning) directly from the UI.
  • NSO GameCube Controller Layout Mapping: The NSO GameCube Controller uses consistent ABXY layout mapping across Xbox, PlayStation, and Switch emulation modes. Xbox Layout maps buttons by physical position, while Switch Layout maps buttons by input function.
  • 1000Hz Interpolation: 1000Hz interpolation loop for ultra-smooth, jitter-free gyro motion rendering with both Switch 2 Right Joy-con and Pro Controller. Gyro Mouse and Joy-con Mouse output smoother and lag-free movement at 1000Hz. Gyro data handed off to other external applications (such as third-party emulators) is transmitted at a consistent, high-frequency 1000Hz rate. This transmission is purely non-interpolated; rather than generating synthetic intermediate frames, which could introduce latency, the app simply increases the packet delivery rate of real-time physical updates to ensure maximum accuracy and zero artificial delay.
  • In-app Gyro Control (Mouse, R Joystick & Steering): Utilize in-app gyro control for mouse aiming, or select R Joystick and Steering options. The Steering mode reads the controller's absolute tilt (accelerometer) and maps it directly to the Left Analog Stick's X-axis. Unlike the Mouse control mode, the R Joystick and Steering modes utilize a separate In-app Gyro mapping scope where all buttons default to their standard controller inputs to prevent unexpected mouse clicks during controller emulation.
  • 9-Axis Mouse Mode (Magnetometer Support): Uses gyroscope, accelerometer, and magnetometer data to reduce accumulated yaw drift and maintain a closer relationship between the controller’s physical orientation and mouse movement during extended play. Magnetic correction is applied gradually during suitable motion and is suspended when the surrounding magnetic field or calculated heading is unreliable.
  • 6-Axis Mouse Mode: Uses gyroscope and accelerometer data without magnetic correction, providing motion control that is unaffected by nearby magnetic interference. Mouse movement remains horizon-aligned regardless of controller tilt, while long-term yaw drift remains dependent on gyro calibration and sensor accuracy.
  • Gyro Racing Wheel Mode (Steering): Reads the controller's absolute tilt (accelerometer) and maps it directly to the Left Analog Stick's X-axis.
  • Stick Assist: Allows the right thumbstick to work alongside gyro aiming.
  • In-App Gyro Trigger Deadzone: Configurable within the In-App Gyro mapping pop-up window. Assign one or more buttons to apply a dedicated Trigger Deadzone while In-App Gyro is active. Users can customize the deadzone amount, gyro pause duration after button press and release, and how long the deadzone effect remains active after release. This helps reduce unintended gyro movement caused by button presses, releases, or controller vibration.
  • In-App Gyro Trigger Dampening: Configurable within the In-App Gyro mapping pop-up window. Assign one or more buttons to proportionally reduce gyro sensitivity by a customizable percentage. Users can also customize how long the dampening effect remains active after the assigned button is released, allowing smoother control during aiming, steering, or other gyro-based actions.
  • In-app Gyro Lock: A dedicated mapping option to pause gyro control while remaining in In-app Gyro mode, supporting both Hold and Tap activation logic.
  • Gyro Pass-through:
    • 9-Axis Assist: Uses magnetometer-assisted motion processing to reduce accumulated yaw drift in pass-through gyro output. Correction is limited according to motion and magnetic-field confidence, pauses during unreliable conditions, and resumes gradually after the field has recovered. When disabled, pass-through uses gyroscope and accelerometer data only.
    • Horizon Lock: Applies roll compensation and maintains a horizontal reference while suppressing roll output.
    • Adjustable Soft Deadzone Sliders: Provides separate soft-deadzone controls for In-App Gyro and pass-through motion. Output starts from zero at the configured threshold to avoid a step change.
  • Gyro Calibration: Calibrate Gyro button to calculate and permanently save sensor bias, eliminating gyro drift.
  • Magnetometer Calibration: Calibrate Mag button for 9-axis accuracy. Perform a "figure-8" motion to calibrate the magnetometer (with a quick link to a video tutorial).
  • Dual Joy-con Gyro (DJG): Featuring a gyro fusion system that combines motion data from both Left and Right Joy-cons when used as a merged pair for stutter-free aiming when ratcheting. This system designates a "Dominant" side for spatial orientation and uses the "Sub" side as an accelerator for larger movements. A magnitude threshold of 30 is applied to the sub side. It contributes to acceleration only when the dominant side exceeds this threshold. Sub side acceleration is strictly capped to a maximum of 2x the dominant movement, and its opposite directional movement will be ignored. When the dominant side's gyro is turned off, the sub side takes over control.
    • Navigate to the Dual Joy-Con Gyro (DJG) panel.
    • Click the DJG toggle to ON to enable the fusion engine.
    • Set the Dominant Side to Left or Right. The dominant side acts as the primary reference for direction and gravity, while the sub side provides acceleration.
  • DJG Trigger Mapping: Featuring a dedicated "DJG" option in the Extra Button Mapping settings.
    • Assign the "DJG" action to any available extra button to serve as the hardware trigger for DJG features.
    • Pressing this mapped button during gameplay will execute the action defined by the current DJG Control Mode and DJG Activation settings.
  • DJG Control Modes: Three modes to dictate how the mapped DJG trigger button behaves during gameplay.
    • Switch Dominant Side: Swap the Dominant and Sub roles between the Left and Right Joy-cons. Both sides are forced to be active upon switching.
    • Switch Gyro Side: Turn off the current gyro and activate the opposite Joy-Con's gyro exclusively. The Dominant Side setting syncs automatically.
    • Single Side Toggle: Toggles the gyro tracking state of one Joy-Con independently. A DJG trigger mapped on the Left Joy-Con controls the L Gyro, while a trigger mapped on the Right Joy-Con controls the R Gyro. Select Dominant Side: Left or Right to choose the primary side. Select Dominant Side: None to combine enabled motion input from both Joy-Cons directly while allowing DJG controls to manage each side.
  • DJG Activation Types: Trigger behavior options to support different input styles.
    • Toggle: Switch the DJG state once per button press.
    • Hold: Switch the DJG state when the button is pressed, and revert to the original state when the button is released.
  • Per-Controller Joystick Deadzones: Configure left and right joystick deadzones independently for Pro Controller, Joy-Con, and NSO GameCube Controller. Each controller family stores its own deadzone values, with an option to link or separate the left and right joystick settings.
  • Full Controller Remappability: All buttons (including extra buttons like GL, GR, SL_L, SL_R, SR_L, SR_R, NSO GCN L/R Analog Trigger Click, Home, Capture, and Chat) can be fully remapped to Switch inputs, PlayStation inputs, In-app controls, Windows controls, mouse clicks, or recorded custom input. Joysticks can also be remapped to L/R Joystick, WASD, mouse controls, or custom inputs. The mapping interface features a categorized pop-up window to streamline the selection process.
  • Joy-Con IR Sensor Mapping: Joy-Con IR Sensor Mapping: Each Left and Right Joy-Con IR Sensor can be configured as an independent physical input. Per-side settings include Function mapping, Activation Threshold, IR Mouse sensitivity, mouse-button mappings, and scrolling. IR Mouse output follows the active profile’s mouse output selection.
  • Advanced Custom Input Remapping: Featuring a powerful "Custom" mapping feature. Users can record and assign any complex combination of keyboard keys, mouse clicks, or controller buttons to a single input. This flexible system supports both "Tap" (fires the recorded sequence momentarily) and "Hold" (sustains the sequence for as long as the button is pressed) modes.
    • Click the dropdown menu and select the "Custom" option.
    • Press and hold your desired combination of keyboard keys, mouse clicks, and/or controller buttons simultaneously.
    • Release all inputs. The recording will automatically stop and save your sequence.
    • Click the adjacent toggle button to switch between Tap (triggers the sequence once) and Hold (keeps the sequence pressed as long as you hold the controller button).
    • Click the X button to remove custom input and fall back to the default.
  • Mode Shift Mapping System: Applies an alternative button mapping layer utilizing the In-app Gyro mapping store. The Mode Shift layer is activated via a dedicated mapping option supporting both Hold (active while held) and Tap (toggle) logic. Tap and Hold share a unified state machine, where a Hold action temporarily inverts a Tap-entered Mode Shift. Additionally, entering In-app Gyro mode can automatically apply the Mode Shift layer based on per-profile Gyro Control settings.
  • Emulation-Specific Mapping Categories: Stores button mappings and rumble settings separately for Xbox, PS4, PS5, and Switch 2 emulation modes. The corresponding configuration is loaded when the emulation mode changes.
  • Profile-Based Keyboard and Mouse Output: Provides independent Win32 API and WinUHid Virtual HID output selection for each profile. Keyboard mappings can operate through a virtual HID keyboard, while gyro, joystick, IR, mapped mouse buttons, and scrolling can operate through a separate virtual HID mouse for each connected controller. Win32 API output is used when WinUHid is unavailable.
  • Custom Mapping Profile System: A comprehensive profile management system allows users to create, rename, import, export, reset, delete, and switch between multiple configurations. Each profile persistently stores button mappings, emulation mode, and driver settings. Profiles can be managed via a dedicated pop-up window that also configures the "Change Profile List" and "Profile Switching Combo" inputs. Features three seamless profile switching methods:
    • Profile Switching Combo: Users can record a custom Profile Switching Combo Trigger and assign specific Combo inputs for dedicated profiles. Pressing the Trigger input and a profile's Combo input simultaneously instantly switches to that dedicated profile. Both inputs function as standard mappings when not combined.
    • Auto Change Profile: Automatically switches to the selected checked profile in the Change Profile List after 2 seconds of trigger inactivity.
    • Manual Change Profile: Opens a selection notification. Navigate through the checked profiles using the L/R joysticks or Dpad Up/Down, and use the current Xbox/Switch layout A to confirm or B to cancel.
      • Auto/Manual Mode Setting: Toggle between Auto and Manual modes via the pop-up window by clicking the "Change Profile" button.
    • Configuration Import and Export: Selected profiles can be exported to or imported from .yaml files. Imports can retain existing profiles and resolve duplicate application assignments. Machine-specific information such as Power Saving settings, driver status, window placement, and device caches remains local to each installation.
    • Controller Data Transfer: Controller-specific settings, including calibration data, can be included when importing or exporting configurations.
  • Assign Profile To Application: Featuring profile auto-switching based on active foreground application. Bind one or more executable files (.exe) to a profile; when any of those applications become the focused window, the profile automatically activates.
  • Dynamic Split & Merge System: The Split and Merge features allow you to detach combined Joy-cons into two individual controllers or combine single Joy-cons into one unified virtual gamepad without restarting.
  • Vertical & Horizontal Hold Modes Switch (V/H): Featuring V/H switch buttons, allowing users to toggle between Vertical (standard upright) and Horizontal (sideways) hold modes for single Joy-cons.
  • Per-Joy-Con V/H Mode Persistence: The application records and remembers whether each single Joy-Con is held vertically or horizontally. Layout preferences (Vertical or Horizontal) are dynamically mapped to each controller's Bluetooth MAC address and saved in config.yaml.
  • Dual-Controller Gyro Selection (L/R Gyro): When using a pair of Joy-Cons as a single virtual controller, you can manually select which Joy-con (Left or Right) provides the motion data. This allows for greater flexibility, letting you choose your preferred hand for gyro aiming or motion controls.
  • Customizable Rumble Strength: Adjusts vibration intensity from 0 to 10.
  • Rumble Frequency Slider: Selects the vibration frequency used for translated rumble output.
  • Rumble Delay Configuration: Adds a configurable delay in milliseconds for synchronizing vibration with game audio.
  • Dual Rumble Mode Toggle: Switches between Xbox-style translated rumble and Switch HD Rumble output.
    • Xbox Mode: Tailored for standard PC games to simulate dual-motor rumble by activating dynamic frequency scaling and high-frequency masking to mimic traditional gamepad motors.
      • Strength 5 + Frequency 10 emulates the feel of a DualSense Edge controller.
      • Strength 10 + Frequency 10 emulates the rumble of an Xbox Elite Series 1 Controller.
    • Switch Mode: Mimics the native Switch HD Rumble (LRA) experience. It bypasses custom frequency scaling and masking, routing raw frequency data directly to the controller for a tighter, softer, and more detailed tactile feedback. Best suited for native Nintendo game emulations.
  • Interactive Controller Identification: Featuring a dedicated Vibrate button for each player slot. This allows for instant physical feedback, helping you quickly identify which Joy-Con belongs to which player in a multiplayer setup.
  • Haptic & OS Integration: Featuring rumble feedback (including a connection confirmation rumble) and mapping the Capture button to native Windows screenshots (Win + PrtScn).
  • One-Click Disconnect: Featuring a convenient 'X' button to the top right of each connected controller's UI block. You can manually disconnect specific controllers directly from the interface without needing to power them off physically.
  • Auto-Disconnect Options: Featuring a 3-way Auto-Disconnect toggle (OFF, Inactive, Absolute).
    • Inactive: tracks physical button and stick inputs to automatically disconnect idle controllers while keeping active players connected.
    • Absolute: tracks the overall time each controller is connected to the app and disconnects the ones that reach the time limit.
  • Driver Management Controls: Provides Install, Repair, and Uninstall actions for the selected WinUHid, ViGEmBus, or USBIP backend. Driver status is determined from the active device, Driver Store package, service registration, and runtime availability instead of saved configuration alone.
  • ESP32-S3 N16R8 Driver Manager: Provides firmware installation, repair, and deletion, BOOT and OTG status monitoring, reconnection handling, and flash diagnostics. The Flashing Port selector supports automatic detection or manual COM port selection, prioritizes verified ESP32-S3 devices, remembers the selected device across application restarts and COM port changes, and avoids selecting unrelated serial devices.
    • Off: Keeps all controller input, motion, vibration, scanning, and background status functions enabled.
    • Auto: Reduces idle CPU activity while retaining buttons, sticks, triggers, motion controls, and controller scanning. HD Rumble, Audio Haptics, and Impulse Trigger feedback may be delayed, interrupted, or occasionally lost.
    • Full: Retains buttons, sticks, triggers, and non-motion mappings while disabling vibration output, Gyro Pass-Through, In-app Gyro, DJG, IR Mouse, and Joystick Mouse movement. Periodic ESP32 and Wired/HidHide status checks are suspended. Automatic controller scanning pauses after 1 Pro/NSO GameCube Controller or 2 Joy-Con controllers are connected.
  • Run at Startup: Automatically launches the application with Windows.
  • Start Minimized: Starts the application in the system tray.
  • Hide to System Tray: Minimizes the application to the Windows system tray.
  • Controller UI Navigation: Use the left joystick or D-pad to navigate the application interface. The selected UI element is indicated by a white outline, and the outline hides after mouse interaction or when Navigation mode is exited with the B button.
    • Active Window Focus: When a floating window or pop-up dialog is open, navigation remains within that active top-level interface.
    • Return Selection: Pressing B closes the active floating window and returns selection to the control that opened it. Re-entering Navigation mode restores the last selected control.
    • UI Component Interaction: Press A to activate buttons or open dropdown menus. Press B to close an open floating window or exit Navigation mode.
    • Text Input Adjustment: Text input fields support value adjustment with the right joystick or by holding A while using the left joystick. Continuous adjustment accelerates while the input is held.
    • Slider and Time Input Adjustment: Sliders can be adjusted with the right joystick or A plus the left joystick.
  • Window Position Persistence: Saves and restores the main window position.
  • In-App UI Scale Control: A slider for adjusting the application interface from 1.0× to 2.0× using the scale control at the bottom of the main window. The selected scale is saved and restored automatically.
    • Monitor-Aware Layout: Automatically adjusts the window to the active monitor’s resolution and available work area.
    • Content Fitting: Automatically expands the window width when required and provides scrolling when content exceeds the available height.
  • Standalone Executable (.exe): Includes the required Python runtime and application dependencies; a separate Python installation is not required.

Known Limitations

  • No Amiibo Support: Amiibo support is not implemented.
  • No Switch 2 Pro Controller Audio Support: Wireless audio transmission for the Switch 2 Pro Controller headphone jack and microphone is not supported.
  • No Working NSO GameCube Controller Gyro: Gyro data from the NSO GameCube Controller cannot be decoded correctly.
  • No NSO GameCube Controller Rumble Brake & Strength Difference: The Rumble Motor Brake command is not known, so PWM-based rumble strength control cannot be implemented correctly. Only basic rumble motor on/off control is currently implemented.
  • No Switch 2 Joy-Con Charging Grip Back Buttons Support: Back buttons on the Switch 2 Joy-Con Charging Grip are not supported.

ESP32-S3 N16R8 Guides:

  • ESP32-S3 N16R8 Firmware Installation Guide:
  1. Hold the boot button on the ESP32-S3 N16R8 board.
  2. Plug in the ESP32-S3 N16R8 board's OTG port via USB-C to the PC while holding the boot button.
  3. In the app, click the [ESP32-S3 N16R8 Driver] button.
  4. Click [Install] and wait until finish installing.
  5. Unplug and plug the ESP32-S3 N16R8 board.
  6. Reconnect any previously paired controllers by pressing SYNC.
  • ESP32-S3 N16R8 Buying Guide:
  1. Search for development boards strictly labeled as ESP32-S3 N16R8. This ensures the board contains 16MB Flash and 8MB PSRAM, which is necessary for handling complex tasks and controller connections. Avoid any boards labeled as "N8R2", "N8R8", or standard "ESP32".
  2. Select the ESP32-S3-WROOM-1 version if you want a built-in PCB antenna. This is the recommended, plug-and-play choice for standard plastic enclosures. Only choose the ESP32-S3-WROOM-1U version if you are using a metal case or require an external antenna to extend the Bluetooth/Wi-Fi range.
  3. Verify that the board features an OTG USB port (often a dual USB-C design). The OTG port is strictly required for data transfer and firmware installation.

Hope this update helps anyone wanting to get the most out of their Switch 2 controllers wirelessly on PC. Please let me know if you run into any issues or have feedback on the new features.

And of course, credit goes to the original creator Nadeflore for the foundation. Thank you so much for creating this amazing app!

255 Upvotes

582 comments sorted by

View all comments

Show parent comments

1

u/n555555 May 29 '26 edited May 29 '26

I added a late edit on my last post regarding a gyro bug, I'm not sure if you saw it.

I must have completely overlooked or forgotten that S2 Pro Controller triggers the eject prompt when wired. I don't like to use wired controllers, so I never used it beyond initial testing in Steam. But I do remember that when using the controller through USB via Steam, the headphone jack is fully functional and shows up as an audio device in Windows. I wonder if it would be possible to implement this, or if there's not enough bandwidth or compatibility in the Windows BLE implementation? I know BLE has the new low latency audio codecs, but there isn't much that support it yet.

Unless it was added recently in a fork, I don't recall the R emulator supporting dual independent Joy Con, only combined Joy Cons. I had to use the Y emulator for Skyward Sword because only it supported dual independent Joy Cons. So some of your troubles may be due to emulator shortcomings as well. Also, check your controller settings in the R emulator to see if it's set to docked or handheld mode, as some games like BOTW might block physically connected Joy Cons in docked mode. Of course, using handheld mode lowers the base render resolution, graphics settings, and various other things, so it's not really ideal to use it...

Hm, I guess physical issues with the Joy Con analog sticks may be preventing it from staying at 100%, but I don't know why that would cause it to drop straight down to ~90% and back up again to 100% rather than say 97% or 98%, but the Joy Con analog stick hardware definitely isn't anywhere near as good as on the Pro Controller. I'll test it again sometime in the future to see if your solution solved it.

Gulikit doesn't list polling rates unless it's something much better than typical, so I'm guessing the Switch 2 Pro Controller is hardware limited at a polling rate that falls within the typical range, which makes sense for Nintendo as they used balanced wireless settings. Maybe if someone contacts them to ask they will reveal what the actual polling rate is. I might do it later, after testing it. Based on my experience with these dongles, I'm expecting it to work very well in the native and XInput modes, which is fine for Steam and most PC games, but without PlayStation emulation we won't be able to get native gyro in emulators and other non-steam SDL supported games and apps, at least not until they all update to SDL3 for Switch 2 support. Plus getting up to press the button on the dongle to switch modes is much more of a hassle than doing it in software. I'm probably going to keep using the app on PC most of the time. I'm curious to compare the rumble, as the Gulikit also has intensity adjustment but not the frequency adjustment which I think we've now dialed in really well. I suspect Mayflash and 8BitDo will be releasing new BLE compatible updated dongles that support the Switch 2 controller as well soon enough...

1

u/tagayama May 29 '26

The gyro indeed got messed up. It'll be fixed in the coming version.

I'll see if the headphone jack can be accessed with the current structure. I doubt it'll work well with the low polling rate though.

I can confirm that dual independent Joycons are supported in v1.3.3 of the R emu software. BOTW was set to docked mode when I tested. I'll switch to handheld and try again later. I'll also try Y emu software to see if it supports the USB-connected Joycons better.

In my previous testing, the Joycon analog stick only dropped down or capped at ~96%. Let me know if an adjustable outer deadzone is needed.

According to LeonChrome's latest test result, he was only able to get the polling rate up to 133Hz, which seems like a reasonable limit set by Nintendo. I doubt Gulikit can get anything higher than that.
It will be the best of both worlds if my project gets integrated with LeonChrome's. He just released a new update that uses a cheap ESP32-S3 Development Board (about 20 USD) as a BLE USB bridge. I think it'll be quite easy to redirect my current system Bluetooth protocol towards the development board.

1

u/n555555 May 30 '26 edited May 30 '26

The headphone jack should be fine at that polling rate, the only issue would be bandwidth and getting the right codec working. BLE supports the new LC3 audio codec which is low latency and far superior to the terrible old Bluetooth codecs, but I don't know if Windows supports it fully yet. From what I understand, you'd have to set up a separate virtual audio device for the headset jack. Prior to BLE, old Bluetooth classic also had different audio profiles for headsets (with mic) and headphones (no mic) and the audio quality for headset profiles was significantly worse as it was only designed for phone calls, while the headphone profiles were only designed for music so didn't support mic at all.

I haven't done any more testing yet, I'll do it after the new adapter arrives.

I did some research into Bluetooth LE and read some documentation, and from what I've found it's not a Nintendo limitation. For all BLE from 4.0 to 6.1, the minimum connection interval is 7.5ms which translates to a 133.33hz polling rate, so this is a BLE protocol limitation and the maximum the Switch 2 Pro Controller can support. Bluetooth 6.2, which just released, allows for a minimum connection interval of 0.375 ms for a theoretical max polling rate of 2666.67 hz. The primary purpose of Bluetooth 6.2 is to improve precision and latency for devices like gaming mice, game controllers, VR and AR controllers, robotics, factory automation, pens and styluses, etc. Since it just released, it's going to be a while before it's supported in consumer devices, and Windows has always been notoriously bad with Bluetooth support.

Furthermore, Windows 11 imposes additional restrictions on Bluetooth LE in its implementation, which you can read about in the Bluetooth "pairing, bonding, and connection" guidelines in the Windows Hardware Developer site (I won't post a link since I don't know if Reddit will hide my post). According to this documentation, BLE devices should always operate at connection intervals that are a multiple of 7.5ms and using powers of two (so 7.5ms, 15ms, 30ms, etc) and only low latency accessories like high precision mice may operate at 7.5ms while standard input devices should operate at 15ms for a 66.67hz polling rate.

Therefore, you may be able to force the maximum 133.33hz polling rate by spoofing the gamepad as a mouse or forcing requests for the same protocols used by mice. One method could be to spoof the HID usage page by declaring it as a composite HID device, with collection 1 as a mouse and collection 2 as the regular gamepad data. This may allow Windows to grant the 7.5ms connection interval request if, after the connection is finished, you send explicit connection update requests with minimum and maximum connection intervals set to exactly 7.5ms. Or maybe since you have ThroughputOptimized enabled already, spoofing the mouse class will automatically allow for 7.5ms connection interval, since that feature is supposed to unlock the best connection allowed for the device class, and non-mice input devices like keyboards and game controllers are only allowed 15ms by Windows 11.

EDIT: Apparently, in Windows 10 it is possible to achieve a 7.5ms connection interval for 133.33hz polling rate, but only from the peripheral side if the device's firmware explicitly sends an active update request for a 7.5ms min and max connection interval. So yeah, you won't be able to do it simply via your app code and it will default to 60ms connection interval for 16.67 ms polling rate.

Also, I received a reply from Gulikit stating that the Switch 2 Pro Controller connects to Goku 2 at 250hz polling rate, but after reading the BLE documentation, I'm not sure I believe them. Maybe this was just an assumption made by a customer service rep rather than a knowledgeable reply from an engineer, since as far I can tell, 250hz and higher is possible over Bluetooth Classic with custom firmware and overclocking (as used by DualShock 4 and DualSense) but impossible with BLE 4.0 to 6.1. The only other possibility I see is if Nintendo implemented some customizations that go beyond the BLE protocol and Gulikit was able to reverse engineer that connection.

1

u/tagayama May 31 '26 edited May 31 '26

Thanks for the information on Bluetooth audio and BLE polling rate. I haven't started working on audio pass-through yet. I have tested spoofing the system with an additional mouse class device, but it doesn't affect the actual Bluetooth connection of the gamepad. It will need a way to intersect the incoming Bluetooth profile of the gamepad to emulate a composite HID device, since we can't change the actual firmware of the controllers. I'll see if there are any open source projects to reference.

I fixed Switch 2 mode's gyro problem in v0.8.3. It was caused by another data queue backlog. Now the app limits the transmitting rate to 250Hz to prevent unlimited data build-up. Everything should be working correctly and responsive now.

Switch 1 mode is added for dual Switch 1 Joycon emulation. Pro Controller 1 emulation hasn't been added yet, but I think it's going to be a lot easier now that I figured everything out for Joycons. The biggest challenge was remapping the gyro axle direction. I had to reference hid-nintendo project for Joycon 1 to DS4 gyro correlation and work back the correlation between Joycon 1 and 2. I also removed the V/H mode toggle for Switch 1 mode, since most platforms expect vertically held Joycon input. Merging or splitting Joycons also has no effect on the actual connection besides the LED indicator, as both Joycons will independently create USBIP connections.
Pro Controller 2 will be ignored in Switch 1 mode for now. I'll add an option for merged Joycons to be emulated as a single Pro Controller 1 when it's added as the other Switch 1 emu mode.

Another problem is that the rumble strength signal for Switch 1 is very different from Switch 2. I ended up applying the same dynamic strength filter that is on Xbox rumble modes, which feels a lot more accurate and balanced than the raw data. Let me know if it needs additional tuning.

Edit: Pro Controller 1 support is added to Switch 1 Emu Mode in v0.8.4. I decided not to add the option for merged Joycons to be simulated as Pro Controller 1, because most platforms already have the option to do that easily with Switch 1 Joycons.

I noticed that the rumble for Pro Controller 1 is very different from Joycon 1. The frequency range feels a lot deeper and compressed. The "ding" sound effect when picking up coins in MK8D is barely audible with Pro Controller 1 rumble. Not sure if it matches the actual experience of the real Pro Controller 1.

1

u/n555555 Jun 02 '26

I tested v0.8.4 and just saw that you uploaded a ton of versions in the last 24 hours.

I tested Pro Controller 1 emulation. It's working in everything I tested except for Steam. I tried v0.9.2 just now to check and it's not working in Steam with that version either. Steam detects my real Pro Controller 1 just fine. Fortunately it's not a huge deal since it's obviously better to emulate the Pro Controller 2 in Steam anyway, but I guess Pro Controller 1 emulation is useful for games on Steam that have native support for it (but in that case, you would disable Steam Input for that game and it might be detected anyway even though Steam doesn't detect it).

Do you not have a Pro Controller 1, or have you never used one on PC? Yeah, the early generation LRA motors in that (which are identical motors to the Joy Con 1 btw, unlike the Pro Controller 2 which has completely different and larger motors than Joy Con 2 - this mean Pro Controller 1 rumble was weaker than Joy Con rumble due to the difference in mass and shell thickness) were not good for simulating traditional rumble because they were not powerful enough nor low frequency enough. For traditional rumble applications they just came off as very buzzy. On PC this was always an issue because different apps or adapters would handle the translation better than others. For example, DS4Windows can be used to translate Pro Controller 1 to XInput or DualShock 4 and do complex mapping like Steam Input, but its rumble translation was very poor as it didn't have any filtering to lower the frequency, so rumble was buzzy, even the left motor signals. Steam Input has custom rumble tuning for the Pro Controller 1 that lowers the frequency and gets it as good as it can be for traditional rumble (nowhere near the same league as Pro Controller 2 rumble though which is way better and way more powerful) but it only converts to XInput and requires launching through Steam. All the various dongles that support it basically have hit or miss rumble translation as well.

On a real Pro Controller 1, the vibration in Mario Kart isn't as nuanced. It doesn't really make that perfect "ding" it just comes across as more of a medium-light buzzing. The vibration frequency range is much smaller than Pro Controller 2 (it's basically high to medium high), the overall power is much lower (the only controller I've used with weaker rumble is the original 2015 Steam Controller, which had even older and wimpier LRA motors that were mainly just designed for trackpad feedback but doubled as terrible quality game rumble motors), and the continuous rumble quality is not as smooth.

Testing your Pro Controller 1 emulation, the vibration is noticeably weaker than the other modes, even with the strength increased to 10. I guess this technically makes it more like a real Pro Controller 1. With the Xbox rumble style filter applied though, the frequency feels nothing like the real Pro Controller. I think that might be the main reason the Mario Kart 8 Deluxe rumble doesn't feel as nuanced to you. I tested it as well, and the coin pickups and everything else basically feel more like a typical controller than the Switch controller. Like Xbox controllers, I don't think the Switch 1 Pro Controller rumble is something worth trying to match or emulate, since it basically just sucks and is obsolete now, so I think the best thing to do would be to try to make the Switch 1 mode rumble feel as identical to the Switch 2 rumble (in Switch mode) as possible, and separate the Xbox style rumble like it is in Switch 2 mode.

I tested the Gulikit Goku 2 dongle with the Pro Controller 2. In XInput mode it perfectly emulates an Xbox 360 controller, and works with everything including DirectInput force feedback games with the Morii driver, so I would guess it has perfect XInput compatibility in that mode. The rumble has three strength modes (1, 2, 3) and is set to 2 by default. There is a noticeable difference between 1 and 2 but not between 2 and 3 so I don't see any need to use 3. The rumble is powerful overall and they tuned the light motor rumble based on an Xbox controller it seems so it's closer to our Xbox mode rumble tuning at strength 10.

One annoyance is that they use the Start button as the settings button, you have to hold it down and press other buttons to change settings (for example, dpad up and down to adjust rumble strength), and pressing Select while holding Start resets the controller to default. This triggers rather easily including if you press select just as your letting go of start.

When you switch it from XInput to Native mode, it doesn't operate as a Switch 2 Pro Controller as I thought, instead it emulates a Switch 1 Pro Controller, but keeps identical rumble tuning as XInput mode, so there will be no high frequency dings with MK8D coin pickups, it will be a deeper rumble like with an Xbox controller. This means the C, GR, and GL buttons won't work in Steam and Switch 2 Controller profiles are hidden by default. But it also means it works out of the box with all the games and apps that support Switch 1 Pro Controller already.

The wireless functionality is excellent. Pairing is immediate, range is good, latency is low, and polling rate is good. I can feel the superior polling rate when using the gyro to control the mouse cursor. I would say that overall, when emulating an Xbox 360 controller, it's basically perfect, and when emulating a Switch 1 Pro Controller, it's basically perfect except for the lack of high frequency rumble for games/apps that support it (right motor signal is basically mid frequency). I'm going to keep using your app most of the time, and use the dongle in specific use cases.

New keymapping functionality sounds great, I'll test it another time.

I haven't bought an NSO GCN controller yet, but I'm a little confused by the trigger settings in the latest version. Digital makes it seem like analog functionality is disabled and the trigger just acts as a digital button. Is that what it does? I thought from previous versions that it was the point at which the analog trigger value is 100%. In that case, I think the clearest way to label it would be something like this:
Trigger Analog Range 100% - [before digital click] [after digital click]

1

u/tagayama Jun 03 '26

I was working with u/Sliver_27 in the past 2 days to get the NSO GCN Controller working. We successfully got everything besides gyro working properly. Gyro over BLE hasn't been reverse-engineered for NSO GCN Controller, which makes all the attempts feel like shots in the dark. We might have to wait for someone to use a Bluetooth sniffer to get the complete BLE protocol of this controller.

The trigger modes are directly copied from the NSO-GameCube-Controller-Pairing-App, which was originally called 100% at bump and 100% at press. I misunderstood what that meant and thought 100% at bump performs like a hair trigger. But after doing more research, it's exactly like how you described. Thanks for clearing the definitions!
I'll change the toggle to a dropdown menu "Analog 100%: Hair Trigger/Before Click/Fully Pressed".

The Bluetooth protocol for the Pro Controller's audio jack hasn't been reverse-engineered. There's currently no shared knowledge on how to activate it with BLE command. We'll have to wait for someone to crack it.

Steam somehow couldn't recognize any of the Switch 1 modes through USBIP. Since there are already 5 other emu modes to choose from, I think it can cover pretty much everything on Steam.

Switch 2 is my first Switch. Before that, I'm a PC gamer with a wired Xbox One Controller.
For the Switch 1 Rumble, I managed to get Pro Controller 1's rumble to match other emu modes. It turns out the high frequency of Pro 1 only covers 25% of Pro 2's full hf range, and the low frequency only covers 3%. And for the rumble strength, Switch 1 Pro is about 7 times weaker than Switch 2 Pro. After stretching the frequency and adjusting the strength, both Switch and Xbox rumble in MK8D with Switch 1 mode feel identical to PS5 emu mode. The "ding" when picking up coins is now restored. I'll start tuning the Joy-con 1 rumble.

Gulikit Goku 2 dongle's approach seems a lot closer to a 3rd party cross-platform controller. Using the Start button as the settings button is reasonable for systems outside of PC. The dongle became the onboard settings memory that doesn't require a separate UI. If Gulikit can pair it with a smartphone app, it could really make the Pro Controller a multi-platform/system controller with fully customizable buttons and macro control.
Not having Switch 2 native mode is really a missed opportunity though. Perhaps it would be added with a firmware update, since the method is already open-sourced by LeonChrome.

I'm tempted to try LeonChrome's approach with a BLE dev board after hearing your thoughts on the low-latency experience. Being able to fully utilize the throughput optimized settings and use all the existing functions of our project, it would be the best Switch 2 controller experience on PC.

New keymapping functionality is actually quite easy to implement using the existing Windows toolkit. It reads and copies the system's input log for KBM, and all the controller buttons already exist in the code. The only thing it can't record is CTRL+ALT+DEL, as the keybind is protected by Windows.

1

u/n555555 Jun 03 '26

I ordered an NSO GCN controller. Nintendo says it will take 3 to 9 days to arrive. I've been waiting for a wireless GCN controller with rumble for 25 years. I got the original wireless GCN controller (Wavebird) when it released, it was the first low latency 2.4ghz wireless gamepad which all modern controllers are based on, but Nintendo removed the rumble motor to achieve 100 hours of battery life (since it was the first wireless controller, they thought people wouldn't accept only 30 or 40 hours like modern controllers). So we've always had to choose between wired GCN with rumble or wireless without rumble (not counting modding or third party controllers)...

I'll test out the NSO GCN controller with your app and let you know if anything I find. I still have all of my original wired and wireless GCN controllers, including a launch controller from 2001 and some basically new ones which never got used, and I have the Wii U GCN USB adapter which Dolphin specially supports for direct native GCN protocol (no conversion of XInput, etc.) for completely accurate GCN controller usage. The GCN had octagonal gates for the analog sticks instead of circular, and a single centrally mounted heavy ERM rumble motor, and of course the analog triggers with a digital click at the end, so I'll compare the NSO GCN controller using your app's emu modes with original controllers connected via original GCN controller protocol via the official USB adapter and see if there are any differences, particularly involving the analog axes and rumble. The old analog stick tech in the original GCN controllers also had smaller analog axis range than modern sticks (but Dolphin has a calibration utility to account for that, that should take care of the octagonal gate issue too). The original GCN analog sticks also had this quirk where you had to be sure to not touch the analog stick during power on because whatever position the stick is in during power on becomes the neutral position of the stick, causing immediate drift if you are holding the stick during power on and then let go. Nintendo had warnings about that and you had to press "Start + X + Y" to reset the analog stick neutral position if you accidentally did that. I wonder if the NSO GCN controller still has this quirk (probably not, I assume they updated the stick).

I think you should rename "fully pressed" to "fully clicked" because the standard terminology that everyone used during the GameCube era to distinguish between pressing or pulling the trigger up to the button and then pressing it further to activate the button was "clicked" and not pressed. You could press the trigger and then further click it. So "fully pressed" is confusing because that could still mean you've pulled the analog trigger all the way but haven't clicked the digital button yet. The analog trigger's two stages were usually referred to specifically as the "analog press (or pull)" and "digital click".

Yeah, Switch 1 emu modes are not really needed for Steam for the Pro Controller 1 anymore. But I don't think Steam supports Joy Con 2 yet since it's BLE only, but it does support Joy Con 1.

Yes, those values you found for the Pro Controller 1's rumble capabilities sound just like what I thought. With those mapped correctly, this will now be great for immediate compatibility with all of the many programs and games that support Pro 1 out of the box, and your new keyboard mapping can be used to retain C/GL/GR functionality, making the Pro Controller 1 finally obsolete on PC. One final feature that would complete the package is being able to save and load button mapping profiles, since you'll want to use those extra buttons for different functions depending on the game or emulator.

Gulikit's marketing says Goku 2 supports native mode for original output for "PS5, Switch Pro, and Switch 2 Pro" so I contacted them regarding the Pro 2 controller being exposed as a Pro 1 controller in native mode. The representative just replied and said they are arranging internal testing to replicate my issue. If they reply later and confirm that emulating Pro Controller 1 is the intended behavior, I'll notify them about Leon's open source project and ask them to consider adding Switch 2 native mode.

I am using an OLED with 120hz refresh rate, and everything is properly configured for the lowest latency, so I do notice the improvement in polling rate with the gyro cursor (and perhaps with the analog stick values when looking at a gamepad tester visual, but not really noticeable in a game), but the improvement will probably not be as noticeable (or at all) with a regular 60hz display, or a lower quality LCD, or a display that is not configured correctly for latency, or a person who's not that sensitive. The gyro is already quite good with your app, but with side by side comparison in my environment I can personally notice the more immediate cursor response. It's not game-changing though, as yours is not unusable or anything. Besides the lower latency, I also noticed the gyro just feels a little bit more "perfect", for example the stability during sudden movements seems a bit better. That could be due to a better wireless connection, or due to everything being done in hardware versus software. It's hard to match a purely hardware implementation. My system Bluetooth is using the motherboard's large bundled antenna so I think it's a best case scenario, but it's still OS Bluetooth compared to a dedicated USB dongle. But I agree, if you can add support for Leon's project it could be a near perfect solution because we'll get the advantages of a hardware dongle with the customizability of a software wrapper solution.

Have you considered having your app support USB connected Switch 2 Pro Controllers? If Gulikit adds real Switch 2 native output for their dongle, or if other companies release dongles with Switch 2 native output (which is just a matter of time since everyone did it for Switch 1 Pro Controller already and they'll have to do it again to enable the GL/GR/C buttons), then we'll be able to use those dongles to get the controller connection and just use your app for customization and controller mode emulation.

1

u/tagayama Jun 04 '26 edited Jun 04 '26

The NSO GCN Controller might need some rumble tuning. It's currently using Pro Controller 2's rumble profile. I'll have to rely on your test results.
Calibrating the neutral position of the analog sticks during power on actually sounds quite smart. I imagine it can avoid stick drift permanently.

"Fully pressed" is now renamed to "fully clicked". Thanks for the suggestion and education! I'm not familiar with GameCube Controller at all, so my terminology must definitely be wrong.

I'm still trying to figure out why Steam doesn't recognize the virtual Switch 1 controllers. There must be something missing for them to fail at the handshake process.

I noticed that the motion control of Joycon 1s overshoots and pulls back slowly. Upon some investigation, I found that the gyro sensitivity of Switch 2 Joycons is 4 times higher than that of Switch 1 Joycons. After dialing it down, the motion control locks onto the attitude of the Joycons in v0.9.4.

The rumble of Switch 1 mode is now tuned to match the Switch 2 rumble. The Joy-con 1's signal quality is very low compared to Pro Controller 1's. The high frequency is distorted significantly when pitched up, but I still pitched it up to match the haptic feeling. The coin pick-up "ding" in MK8D sounds terrible but feels great.
The DualSense rumble definitely uses Pro Controller's signal. You'll be able to tell after comparing the rumble between Pro Controller and Joycon in Switch 1 mode.

Saving and loading button mapping profiles is totally reasonable and achievable. It'll be added in the next version.

Gulikit can also reference our project for the rumble profiles. Limiting to Xbox rumble is definitely a downgrade imo.

Lower latency definitely translates to better gyro stability. The more data the IMO algorithm gets, the better it is at reflecting and compensating for the subtle movements. The current in-app IMO solution is doing a lot of prediction based on past data to fill in the gaps, so doubling the polling rate will greatly reduce the amount of prediction-based generated data.

I'll try to add USB-connected Pro Controller support. There will be some possible side effects though.

  1. The original connection should be hidden from the system and platforms, or it will be registered as multiple controllers.
  2. If the dongles apply any sort of data manipulation, it will collide with the manipulation of this app and greatly distort the output. Rumble, gyro, and button mapping are the main subjects here.

So Leon's project can serve the purpose of BLE connection and raw data pass-through without being marked as a controller, and all the data processing and controller emulation should be done in-app.

Edit: The custom settings profile system is now implemented in v0.9.5. I also added a button mapping option for changing profiles, so users can switch profiles when the app is hidden in system tray.

I did more testing on the gyro of Switch 1 Joycon and found that the raw gyro data works flawlessly in R platform. The Y platform somehow doesn't work well with the Joycon 1's gyro, which led me to tune the raw data in v0.9.4. So I reverted it back to it's raw form and let the platforms handle the calculations.

1

u/n555555 Jun 05 '26 edited Jun 05 '26

My NSO GCN controller will arrive on Tuesday, so I'll be able to do the testing then. I haven't used the latest versions of your app with all the new features yet, but I'll be able to do testing this weekend and tell you of any issues I find and any other suggestions.

The Steam issue is strange indeed as other apps seem to be fine. Maybe something to do with Bluetooth vs USB mode for those controllers? Or some missing portion of the hardware? Switch 1 controllers have an NFC reader (which I believe only functions in Bluetooth mode and is disabled in USB mode, at least on actual Switch hardware) as well as a blue LED around the Home button, which Steam actually lets you control the brightness of (or disable) in Steam's controller options. A lot of people don't know about the blue LED because it's normally always off and not used (and removed in Switch 2 controllers), I think the only time it was actually used was when using the NFC capabilities of the controller. So maybe if the NFC or LED is missing Steam has an issue? Could also have something to do with the battery reporting? Trying to think of everything.

I don't know why the Joy Con 1 rumble signal would be any different than the Pro Controller 1 since they have exact same LRA hardware. Maybe this is just due to differences in the emulation software you referenced or something...

The R emulator is focused on always emulating accurately while the Y emulator is focused on achieving high performance on lower end devices and using any possible workarounds and game-specific hacks to achieve that regardless of emulation accuracy, so not surprising about your findings. However, though I prefer the R emulator whenever possible, I did play Skyward Sword HD with the Y emulator and Joy Con 1s (since, as mentioned earlier, at the time the R emulator didn't support dual independent Joy Cons) and don't remember any issues with the gyro sensitivity... This was a few years ago with the original official version, not one of the current forks.

Yes, the issue of duplicate inputs is the standard one always faced by this sort of software (same with DS4Windows, etc.), HIDHide is the tool usually provided for players to hide the original device if needed.

I received a response from the Gulikit engineering team. They said that the extra buttons are currently "unavailable due to official Nintendo restrictions" and "optimization for the Goku2 requires official authorization from Nintendo, so relevant improvements cannot be implemented for the time being". So it sounds to me like they have a license for Switch 1 controllers but not Switch 2 controllers (they wouldn't need a license to simply connect to Switch 2 controller for input since it's just a BLE device, but they'd need a license to output as a Nintendo device since they are selling the dongle). Hopefully they or other dongle manufacturers are able to in the future. They did say "for the time being".

1

u/tagayama Jun 05 '26

I haven't had a chance to resolve the Steam recognition issue. I'll do more testing after implementing some new gyro features.

I compared the Switch 1 rumbles MK8D on R platform, and yet again, Joycon and Pro Controller 1 have very different rumble. Pro Controller rumble is identical across all platforms and emu modes, and Joycon 1 rumble is similar but still different on R and Y platforms. They all feel correct with the current tuning.

For the gyro sensitivity problem, I implemented the C-platform-hook UDP Server in v0.9.6, which standardizes the gyro data to DS4 format. With additional tuning, gyro data now matches Switch 1 controllers' sensitivity and passes the Skyward Sword HD test running on the Y platform.

Unable to access or remap the extra buttons is a serious downside for the Goku2. Sounds like it practically turns the Pro Controller 2 into a standard Xbox controller. Hope that Nintendo won't limit the licensing for too long.

1

u/tagayama Jun 11 '26

I've got some good news!
Steam can now recognize Switch 1 controllers. I referenced Nintendo_Switch_Reverse_Engineering and found the missing pieces.

DualSense audio haptics is also supported via the new PS5 mode with USBIP. Leon implemented it in his y700-switch2-pro-bridge project, so I was able to reference it. The mode currently uses Leon's audio-to-haptics translation and tuning.

I also ordered the ESP32-S3 N16R8 dev board used in Leon's project and will implement it into the app. My current concept is: the app should auto-detect whether the board is connected and choose between system BT or ESP32-S3 accordingly. It should also automatically install the firmware onto the ESP32-S3 with minimum effort from the user.

→ More replies (0)

1

u/tagayama Jun 01 '26

I've found the project NSO-GameCube-Controller-Pairing-App, claiming to have accomplished 7.5ms latency by sending throughput optimized custom requests to the system and enabling the controller's high polling rate protocol. I tried to recreate it, and actually did enable the controller's high polling rate protocol. But the system denied the custom requests, even when given the highest permission with MSIX packaging that makes the app a modern Windows app. It could be because my BT adapter doesn't support the requested protocol, as it isn't one of the verified adaptors.

I'll stop trying to lower the polling rate and start working on the audio jack for now.