March 2022

SVDX with MidiMap on top of it - Obviously not playing


As a casual player of Sound Voltex DX (SVDX) on budget, I embarked on a journey to unite the world of cheap MIDI controllers bought from second hand market with the captivating realm of the game. The result? A tiny wrapper that harmonizes my MIDI controller with SVDX, unlocking better game experience (I mean, playing a rhythm game on an actual music controller feels like taking the game to another level ! I shoudl try BeatMania IIDX someday…)

Road to Briding Beats

At the heart of this project lies, the maestro orchestrating the MIDI loop and configurations. But the journey wasn’t all smooth melodies; it was a dance of understanding and decoding MIDI keys to game keys. MIDI controllers, as I discovered, had their own unique way of communicating through values, IDs, and even channels. The challenge was real, as I navigated through the intricacies of MIDI quirks, armed with a determination to create a tailored experience for my specific controller.

Building UI

In this journey, PyGame played a crucial role providing the robust backend for MIDI polling, while the UI was composed using the barebones TKinter. The GUI, minimalistic adorned with a dropdown for MIDI device selection and a beckoning ‘play’ button, offered an intuitive click-and-play orchestration. A graceful ‘quit’ button ensured the closure of MIDI polling. The choice of TKinter over a nicely crafter UI in PyGame was because of performance, as it was fundamental for Python to not drop or slow down things because the game judge input up to the milisecond (!) and then evaluate skill from it.

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

Using MIDI

I reconfigured the MIDI poll frequency, fine-tuning polling for swift responsiveness. Handling on-the-fly instructions allowed for real-time curation, discarding extraneous data to optimize the handler’s performance. The arrangement of the switch case was optimized, with critical instructions prioritized for quicker responses. Utilizing Python queues facilitated efficient IPC communication, further enhancing the project’s performance.

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]
Got key : [[144, 52, 0, 0], 9169518]
Got key : [[144, 52, 127, 0], 9170314]
Got key : [[144, 52, 0, 0], 9170458]
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 !


My Gamming Skills ? Unchanged. My Playing Experience ? Delightful ! 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, immersed in the beats.

Working with lower-level hardware was both a challenge and a blast. PyGame, often underestimated, proved to be a reliable ally in handling MIDI intricacies. It surprised me how a tool that’s sometimes laughed off as a “toy” could pack such a punch. Tweaking poll frequencies and optimizing performance might have been a bit of a headache, but the satisfaction of a smoothly running MIDI controller was worth it.

Reflecting on the SVDX Midi Map project, I’m reminded that ingenuity knows no limits. Whether it’s customizing gameplay or diving into technical intricacies, this journey was a real eye-opener. 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.

Also Read

  • Headless personal Blog


    Building my (old) personal blog with VueJS 2 as an headless blog that fetch data from Symfony API

    • Vue JS
    • Symfony
    • Headless CMS
  • Discord in SvelteKit


    Implementing some of the Discord UI and learning how they do VirtualScroller, with Sveltekit once more !

    • SvelteKit
    • REST
    • Discord
    • PoC
    • WiP
  • A better file listing

    Games Center

    Frustrated from the Apache default index page, I decided to write a simple single file web app under constraints

    • Svelte
    • SPA
    • Single File
    • Scraping

Want more ?

I've got a lot of other awesome projects

See them all !