Una de mandos: NEO·GEO mini PAD

Como seguro recuerdas, siguiendo la moda de las consolas "mini", en 2018 SNK decidió lanzar la suya propia. Y, así, lanzó al mercado la Neo-Geo Mini, una máquina que pasó sin pena ni gloria. Al mismo tiempo, puso a la venta una réplica del mando de Neo-Geo CD que podía comprarse aparte pero que, en teoría, sólo podía ser utilizado conectándolo a uno de los puertos USB-C que la Neo-Geo Mini tiene en los laterales. 

Estos mandos se vendían de salida al módico precio de 30 eurazos. Yo fui uno de los que picaron. Hoy en día no lo haría, aunque visto el precio actual, que ronda los 18 € en Amazon, no es una mala inversión para su uso en juegos retro, ya sea en PC, Raspberry Pi o cualquier otro sistema retro similar.

La principal pega de este mando, más allá del precio cuando salió, era el conector USB-C y la ausencia de microswitches en esa cruceta digital disfrazada de stick. De hecho, en muchos de los comentarios que uno puede leer en Amazon se advierte de la circunstancia de que sólo funcionan con la Neo-Geo Mini y no tienen ninguna utilidad en PC.

Pues bien: la realidad es que, de hecho, funciona perfectamente en PC, y hoy aquí lo vamos a demostrar. Cosas a tener en cuenta:

  • Necesitamos un adaptador de USB-C a USB-A, es decir, a los puertos USB normales de toda la vida. Por lo que he leído, aunque no lo he comprobado, el mando no funciona si lo conectamos directamente al puerto USB-C de la placa. También hay quien dice que no sirve cualquier adaptador USB-C a USB-A. Uno que funciona al 100%, tal y como he podido comprobar, es éste. Cuesta 6 € en el momento de escribir esto, pero al menos vienen dos unidades.
  • Una vez conectado al PC con el adaptador, Windows lo reconocerá como mando directinput. Esto no debería suponer un problema y, de hecho, el mando funcionará en la inmensa mayoría de juegos que podamos tener. Únicamente no funcionará en aquellos juegos que sólo funcionen con mandos xinput, ya sea un mando xinput cualquiera (como, por ejemplo, Limbo), o específicamente un mando de 360 (como es el caso de Braid). En ambos casos necesitaremos un wrapper que mapee nuestro mando a un mando xinput virtual.


╔════════════════════════════╗
Instalación y configuración
del wrapper "XOutput"
╚════════════════════════════╝

De entrada, soy consciente de que, al tratarse de un mando 100% digital, podremos simplemente mapearlo al teclado usando Joy2Key, pues, qué juego de PC no es compatible con teclado, ¿verdad? Y tendrías razón, pero no me parece la solución más elegante, sobre todo cuando se trata de asignar los controles dentro del propio juego.

Por lo tanto, usaremos un wrapper. Para matar dos pájaros de un tiro, usaremos uno que mapee nuestro mando, no sólo a Xinput, sino, más concretamente, a un mando de Xbox 360 virtual. De este modo juegos como Braid funcionarán sin rechistar.

La gente suele recomendar siempre x360ce, pero particularmente siempre me ha dado más quebraderos de cabeza y problemas que otra cosa. Además, me parece ortopédico y obsoleto. Por eso, usaremos uno que me parece mucho más sencillo y directo: XOutput. En este momento la última version disponible es la 3.32. Descargaremos el zip y lo descomprimiremos. Hay que tener en cuenta que la verdadera magia, la de emular el mando de 360, la hace ViGEm, el cual deberemos descargar de aquí e instalar. En el momento de escribie esto, la última versión disponible es la 1.21.442. No obstante, aquí tienes en detalle el software que necesitas tener instalado. También, desde el 8 de septiembre, el repositorio de GitHub ha pasado a modo de sólo lectura, lo que muy probablemente significa que el creador ha abandonado el proyecto. Habrá que estar atento a los cambios y novedades que puedan surgir en este campo.

XOutput no emula, pues, por sí solo, el mando de 360, sino que se encarga de gestionar todos los mapeos y configuraciones.

Si lo hemos instalado correctamente, al abrirlo nos aparecerá una ventana como ésta (la parte de "Game Controllers" estará vacía aún):



Con el mando enchufado (adaptador USB mediante), presionaremos cualquier botón. En la parte superior de la ventana de XOutput nos aparecerá el mando detectado. Lo detectará como mando DirectInput con el nombre "4 axis 13 button gamepad with hat switch" (ignora los 2/3 inferiores de la ventana por ahora):



Así es. Si esperabas que Windows reconociera el mando como "Réplica barata del mando de Neo·Geo CD para Güindous", estás equivocado:


De vuelta en XOutput, podemos hacer clic en el botón "Edit" que aparece junto a nuestro mando, pero sólo nos servirá para probar los controles y ver que realmente funcionan. No, lo interesante está en el apartado "Game controllers" de esa misma ventana. Si hacemos clic en "Add controller", nos añadirá un mando virtual de Xbox 360 (que aún no está activado a nivel de sistema). Ahora, toca hacer las asociaciones de botones. Para ello, haremos clic en "Edit" (no en el "Edit de antes", sino en el nuevo que nos aparece en el apartado "Game controllers").

En esta ventana debemos asignar/mapear los botones de nuestro mando de Neo·Geo Mini a los del mando de 360 que acabamos de crear y que, de momento, está únicamente dentro del programa. Te recomiendo que asignes la cruceta del mando de Neo-Geo a la cruceta y stick analógico izquierdo del mando de 360 al mismo tiempo. De este modo te asegurarás tanto de poder controlar el juego (que normalmente se controlará con el stick) como de navegar por los menús (que en muchas ocasiones se hará con la cruceta).

Entonces, con botón "Configure All" de la parte inferior de la ventana en la que estás ahora, puedes ir mapeando todo seguido: cruceta a cruceta y a stick izquierdo, y los botones (A, B, C, D, Select y Start) a los botones del mando de 360 que creas más convenientes. Dejaremos sin mapear los siguientes botones del mando de 360: LB, RB, LT, RT, L, R, Home y el stick derecho.

No hemos acabado aún con los mapeos: mapear la cruceta del mando de Neo-Geo al stick analógico izquierdo del mando de 360 con XOutput es un maldito infierno. Por suerte, yo ya he pasado por él para que no tengas que hacerlo tú: por defecto, el punto neutro de la cruceta se mapea a la posición inferior izquierda (Suroeste) del stick. Vamos a arreglar eso.

Una vez mapeados los botones a nuestro gusto, le daremos un nombre al perfil en la parte inferior donde dice "Other settings". Como nuestro mando no tiene vibración, podemos dejar en blanco el apartado "Force feedback". Ahora, cerraremos esa ventana y, ya de vuelta en la ventana principal de XOutput, haremos clic en la parte inferior, donde dice "Save configuration". Ahora, cierra XOutput del todo (asegúrate de que no está el icono en el área de notificaciones de Windows).

Hecho esto buscaremos, en la misma carpeta donde está el ejecutable XOutput.exe, un archivo de JavaScript llamado "settings.json", donde se almacenan las configuraciones de XOutput que hemos ido guardando. Lo abriremos, mismamente, con el bloc de notas. Lo primero que veremos en la parte superior es el listado de dispositivos que XOutput ha encontrado:

{
  "CloseToTray": false,
  "ShowAll": false,
  "HidGuardianEnabled": false,
  "DisableAutoRefresh": false,
  "Language": "English",
  "Input": {
    "fed08e90-54c7-11ee-8001-444553540000": {
      "ForceFeedback": false
    },
    "Keyboard": {
      "ForceFeedback": false
    },
    "Mouse": {
      "ForceFeedback": false
    }
  }

Lo que he marcado en verde es la ID de mi mando de Neo-Geo Mini. Puede que en tu caso no coincida. En todo caso, apúntalo en algún sitio.

Justo a continuación de ese bloque, viene el apartado "Mapping":

"Mapping": [
    {
      "StartWhenConnected": false,
      "Name": "Neo-Geo Mini",
      "Id": "e4880172-a404-4c05-95fe-a1ad6da2ee16",
      "ForceFeedbackDevice": null,

En verde podrás ver el nombre con el que has guardado el perfil de configuración del mando anteriormente. A partir de bloque, veremos los distintos mapeos y asignaciones. Son fáciles de localizar porque cada sección tiene el nombre de un botón del mando de 360: A, B, X, Y... Tendrás que bajar hasta encontrar el stick izquierdo (viene desglosado en sus dos ejes: LX y LY). Tendrá un aspecto muy parecido a éste:

        "LX": {
          "Mappers": [
            {
              "InputDevice": "fed08e90-54c7-11ee-8001-444553540000",
              "InputType": "1003",
              "MinValue": 0.0,
              "MaxValue": 1.0,
              "Deadzone": 0.0
            }
          ],
          "CenterPoint": 0.0
        },
        "LY": {
          "Mappers": [
            {
              "InputDevice": "fed08e90-54c7-11ee-8001-444553540000",
              "InputType": "1001",
              "MinValue": 0.0,
              "MaxValue": 1.0,
              "Deadzone": 0.0
            }
          ],
          "CenterPoint": 0.0
        },

Si algún valor aparte de la ID del mando varía, no te preocupes ahora. Eso sí, asegúrate de seleccionar escrupulosamente todo lo que ves en el recuadro sobre estas líneas y pega, en su lugar, lo siguiente:

        "LX": {
          "Mappers": [
            {
              "InputDevice": "fed08e90-54c7-11ee-8001-444553540000",
              "InputType": "1002",
              "MinValue": 0.5,
              "MaxValue": -0.5,
              "Deadzone": 0.0
            },
            {
              "InputDevice": "fed08e90-54c7-11ee-8001-444553540000",
              "InputType": "1003",
              "MinValue": 0.0,
              "MaxValue": 2.0,
              "Deadzone": 0.0
            }
          ],
          "CenterPoint": 0.0
        },
        "LY": {
          "Mappers": [
            {
              "InputDevice": "fed08e90-54c7-11ee-8001-444553540000",
              "InputType": "1001",
              "MinValue": 0.5,
              "MaxValue": -0.5,
              "Deadzone": 0.0
            },
            {
              "InputDevice": "fed08e90-54c7-11ee-8001-444553540000",
              "InputType": "1000",
              "MinValue": 0.0,
              "MaxValue": 2.0,
              "Deadzone": 0.0
            }
          ],
          "CenterPoint": 0.0
        },

Asegurate de cambiar la ID de mi mando (en color verde) por la del tuyo. No toques nada más. Cierra el archivo y guarda los cambios.

Una vez hecho, abre de nuevo XOutput y haz clic en el botón "Edit" que hay junto al perfil "Neo-Geo Mini" que hemos creado antes, en el apartado "Game Controllers". Una vez dentro mueve la cruceta para comprobar que LX y LY responden correctamente. Adelantándome a lo que viene, pero aprovechando que estamos aún en la ventana "Edit": si queremos que el mando virtual de 360 se conecte cuando conectamos nuestro mando de Neo-Geo Mini al PC, marcaremos abajo del todo la opción "Start emulation when controller is connected"

Ahora ya sólo falta activar el mando virtual de 360. Para ello, en la ventana principal de XOutput, haremos clic en el botón "Start", justo a la derecha del botón "Edit" que hemos pulsado hace un momento. Al hacerlo, escucharemos el típico sonido tras haber conectado algo a un puerto USB. Y es que, efectivamente, para Windows es como si acabásemos de conectar un mando de 360. Lo que Windows no sabe es que se trata de un mando virtual/emulado. Y ése va a ser nuestro mando a ojos del sistema.


╔════════════════════════════╗
Aplicación del mapeo de cruceta
al stick de 360 usando otros mandos
╚════════════════════════════╝

Si quieres aplicar esta solución para otro mando que no sea el de Neo-Geo Mini, tendrás que tener en cuenta no sólo la ID del campo "InputDevice" sino, también, los valores del campo "InputType". Cada uno de esos dígitos correponde a un botón de nuestro mando. Una manera sencilla de saber cuál es cuál es hacer un mapeo previo desde la interfaz de XOutput, guardar el perfil y abrir el archivo "settings.json". Nos fijaremos en los valores del campo "InputType" que aparecen en la zona correspondiente a la cruceta:

        "UP": {
          "Mappers": [
            {
              "InputDevice": "fed08e90-54c7-11ee-8001-444553540000",
              "InputType": "1000",
              "MinValue": 0.0,
              "MaxValue": 1.0,
              "Deadzone": 0.0
            }
          ],
          "CenterPoint": 0.0
        },
        "DOWN": {
          "Mappers": [
            {
              "InputDevice": "fed08e90-54c7-11ee-8001-444553540000",
              "InputType": "1001",
              "MinValue": 0.0,
              "MaxValue": 1.0,
              "Deadzone": 0.0
            }
          ],
          "CenterPoint": 0.0
        },
        "LEFT": {
          "Mappers": [
            {
              "InputDevice": "fed08e90-54c7-11ee-8001-444553540000",
              "InputType": "1002",
              "MinValue": 0.0,
              "MaxValue": 1.0,
              "Deadzone": 0.0
            }
          ],
          "CenterPoint": 0.0
        },
        "RIGHT": {
          "Mappers": [
            {
              "InputDevice": "fed08e90-54c7-11ee-8001-444553540000",
              "InputType": "1003",
              "MinValue": 0.0,
              "MaxValue": 1.0,
              "Deadzone": 0.0
            }
          ],
          "CenterPoint": 0.0
        }

En tu caso los valores pueden ser distintos. Apúntate esos valores. Si has mapeado correctamente la cruceta, podrás usarlos en el mapeo del stick sin miedo a equivocarte con las direcciones. Ten en cuenta que el mapeo del stick del archivo json no va en el mismo orden que el de la cruceta:

En la cruceta, los mapeos vienen presentados en el archivo json en el siguiente orden:

ARRIBA → ABAJO → IZQUIERDA → DERECHA
(1000 → 1001 → 1002 → 1003 en mi caso)

Sin embargo, en el stick, van así, como has podido comprobar más arriba:

(1002 → 1003 → 1001 → 1000 en mi caso) LX- → LX+ → LY- → LY+

Tenlo encuenta. Con esto, la cruceta habrá quedado perfectamente asignada al stick izquierdo y de manera funcional, sin hacer cosas raras, sin valores fuera de rango, sin ejes invertidos, etc.

Para la realización de esta entrada del blog me he basado en este post del GitHub de XOutput.

Saludos y hasta el próximo...


Comentarios

Publicar un comentario