SVDX Midi

March 2022

SVDX with MidiMap on top of it - Obviously not playing

Introduction

Driven by a desire to enhance my gaming experience within a budget, I set out to bridge the world of affordable MIDI controllers with the immersive video game Sound Voltex DX (SVDX). The goal was to create a seamless integration that would elevate gameplay to arcade’s standards, utilizing second-hand MIDI controllers to be accessible to everyone.

Playing a rhythm game on an actual music controller feels like taking the game to another level !

Bridging Controller

Central to this project was MidiMap.py, a pivotal component orchestrating the interaction between MIDI controllers and the game. However, I grappled with the complexities of MIDI communication. Deciphering MIDI keys and configuring them to correspond with in-game actions required a deep understanding of MIDI protocols and the nuances of each controller’s unique communication method.

Building UI

PyGame served as the backbone for MIDI polling, providing robust backend support, while TKinter was chosen for its minimalistic UI capabilities. The GUI, though simplistic in design, offered intuitive controls for MIDI device selection and gameplay initiation. The decision to prioritize performance over aesthetics was critical, ensuring that the interface remained responsive even during fast-paced gaming sessions where split-second inputs are crucial.

Tool UI - Old, Reto, but really fast and don't impact runtime much

Using MIDI

Fine-tuning MIDI polling frequencies was essential for achieving optimal responsiveness, allowing for real-time adjustments and efficient data processing. Prioritizing critical instructions within the switch case structure optimized performance, while Python queues facilitated seamless communication between components. Monitoring the MIDI protocol log provided valuable insights into the controller’s behavior, guiding the refinement process to ensure smooth gameplay.

For the sake of MIDI protocol, here’s some of the log while in DEV mode :

Got key : [[176, 48, 127, 0], 9169345]
MAP OF is_spin
Spin Z
Got key : [[144, 52, 127, 0], 9169388]
MAP OF DOWN
Got key : [[144, 52, 0, 0], 9169518]
MAP OF DOWN
Got key : [[144, 52, 127, 0], 9170314]
MAP OF DOWN
Got key : [[144, 52, 0, 0], 9170458]
MAP OF DOWN
Got key : [[176, 48, 1, 0], 9170695]

And later me getting funky about mapping down to writting some ASCII art of it :

Tool UI - Old, Reto, but really fast and don't impact runtime much

Finally, I used WinKeys to send keys back to the game. At first I did WinAPI tricks to send directly keycodes to the game but it turned out keycode are misshandled depending on your keyboard layout, so I decided to not do that and sacrifice a bit of performance to a library - later realizing it got more responsiveness than my small WinAPI binding trick.

Time to enjoy it !

No one asked for it but just to prove how bad I am at video games

(Someday I sould try to put my play data on a leaderboard web app, just for the show !)

But I'm trying to be better !

Conclusion

Despite the initial challenges and technical intricacies, the SVDX Midi Map project yielded remarkable results, transforming my gaming experience into a seamless and immersive journey.

Working with PyGame and MIDI controllers proved to be a rewarding endeavor, showcasing the power of ingenuity and resourcefulness in overcoming obstacles. The mix of MIDI, PyGame, and SVDX turned out to be a winning combo, proving that even seemingly underestimated tools can lead to impressive results.

Ultimately, the project underscored the potential of leveraging affordable hardware and underestimated tools to achieve impressive outcomes in the world of gaming.

With a jog to spin and scratch, my gameplay took on a whole new vibe. No more toggling between keys; I felt like a true DJ !

Also Read

  • Graph Viewer

    Animator Graph Viewer

    Visualize class relationships and animations with a d3.js-based interface using Vite and Svelte. Class parsing done with Node script.

    • D3
    • Svelte
    • Vite
    • UI
    • NodeJS
  • Phaser web IDE

    Phaser Studio

    Building a PhaserJS IDE using reactive binding with Svelte and TypeScript object mapping from PhaserJS. The scenes are passed from CustomEvent and listed in Inspector view.

    • PhaserJS
    • Web IDE
    • Svelte
    • TypeScript
  • ETL Search Engine

    AyaMe

    This tool was made to provide search capacity among ETL-extracted sensor data.
    It was using a synoptic parser and a fast-index search library.

    • TailWind CSS
    • Python
    • SvelteJS
    • LunrJS

Want more ?

I've got a lot of other awesome projects

See them all !