Beyond the Screen: Why I Had to Reverse Engineer My Own Piano
An accessibility-driven reverse engineering walkthrough
I’m a visually impaired software engineer who finds deep joy in exploring ideas and uncovering unexpected connections. I’m drawn to patterns that often go unnoticed. I love finding those veered threads that do not seem related until they suddenly come together. I write to make sense of what I learn and enjoy breaking things down for others. For me, it is about connecting ideas, sharing the process, and letting curiosity lead the way.
Beyond the Screen: Why I Had to Reverse Engineer My Own Piano
The Roland GO:KEYS 5 is a powerful instrument, but for a blind developer, its most interesting features are often locked behind a visual interface I cannot read.
One such feature is the Chord Sequencer. Its purpose is straightforward: instead of holding chords with the left hand to drive the auto-accompaniment engine, the sequencer loops a pre-recorded chord progression. This allows the player to focus on melody, improvisation, or sound manipulation.
From a musical perspective, this is a practical tool for maintaining flow. From an accessibility perspective, it is a black box.
As a visually impaired keyboard player and software engineer, I wanted to understand what chord progressions were actually available on the device. While the manual explains how to trigger the sequencer, it fails to list the actual patterns. Because the device interface isn’t compatible with a screen reader, I could hear the patterns, but I couldn't study, memorize, or categorize them independently.
To understand the musical material on my own terms, I had to stop playing and start hacking. This post documents the step-by-step process of extracting that data directly from the firmware.
Phase 1: Identifying Where the Data Lives
The process began with the official firmware update files. Firmware updates are typically archives containing binary images that get flashed to different memory partitions on the device's board. After extracting the main update archive, several binary blobs remained.
The first challenge: which one contains the musical "knowledge"?
Command & Output:
┌──(kali㉿kali)-[~/roland-gokeys-5/extracted_fw]
└─$ ls -lh
total 35M
-rw-r--r-- 1 kali kali 2.5M Jan 15 10:00 r084_c0c_up.bin
-rw-r--r-- 1 kali kali 1.2K Jan 15 10:00 r084_k_up.bin
-rw-r--r-- 1 kali kali 32M Jan 15 10:00 r084_qspi_drv0_up.bin
-rw-r--r-- 1 kali kali 4.0K Jan 15 10:00 upd_info.bin
The Logic:
I used ls -lh to get human-readable file sizes.
r084_c0c_up.bin(2.5M) appeared to be executable code—the "brain" of the unit.r084_qspi_drv0_up.bin(32M) stood out. QSPI (Quad SPI) flash is frequently used in embedded systems to store large, non-code assets like waveforms, icons, and musical patterns.
Phase 2: Searching for Human-Readable Structures
Even in custom formats, engineers often store structured data as plain text for easier debugging. I searched the binary for strings that looked like file paths. In a pattern-based instrument, "Ptn" (Pattern) is a common naming convention.
Command & Output:
┌──(kali㉿kali)-[~/roland-gokeys-5/extracted_fw]
└─$ strings r084_qspi_drv0_up.bin | grep "Ptn/" | head -n 15
Ptn/Primary01.csv,C-G-Am-F,Bright,Basic,Major,4Meas
Ptn/Primary02.csv,Am-F-C-G,Dark,Basic,Minor,4Meas
Ptn/Primary03.csv,F-G-Em-Am,Chill,Basic,Major,4Meas
Ptn/Relax05.csv,CM9-FM9,Relax,Advance,Major,8Meas,Slow
Ptn/Bright12.csv,G-D-Em-C,Bright,Basic,Major,4Meas,Pop
Ptn/Ennui01.csv,Dm7-G7-CM7-Am7,Ennui,Advance,Minor,4Meas,Jazz
...
The Discovery:
The data was stored as plain-text CSV lines. Crucially, the internal identifier Primary01 corresponds directly to the user-facing name PR001 (Preset 01). The active database had been found.
Phase 3: Extracting the Full Dataset
The next step was to extract every line matching this structure. I also noticed a second format starting with CHORD,, which appeared to represent internal "style" progressions used by the accompaniment engine.
Command & Output:
┌──(kali㉿kali)-[~/roland-gokeys-5/extracted_fw]
└─$ strings r084_qspi_drv0_up.bin | grep -E "Ptn/|CHORD," > raw_roland_db.txt
By using grep -E, I applied an "OR" operator to capture both the Patterns and the internal Chords simultaneously. A quick line count (wc -l) confirmed the successful capture of 342 entries.
Phase 4: Cleaning and Building a Pristine Database
While the raw text was a victory, it remained "messy" with internal file paths and shorthand tags like "Bsc" or "Adv". To make this truly useful for a screen reader, I wrote a Python script to transform this binary dump into a clean, searchable CSV.
The Build Script Highlights:
import csv
import re
def clean_name(filename):
# Transforms "Ptn/Primary01.csv" -> "Primary 01"
name = filename.replace('Ptn/', '').replace('.csv', '')
name = re.sub(r'([a-zA-Z])(\d)', r'\1 \2', name)
return name.replace('_', ' ')
# Processing logic:
# Mapping "Bsc" to "Basic" and "Adv" to "Advanced" for better speech clarity.
The Final Result
The outcome is a fully structured, human-readable database of the Roland GO:KEYS 5's musical logic. Using the column command, the results are verifiable in a clean table format:
Command & Output:
┌──(kali㉿kali)-[~/roland-gokeys-5/extracted_fw]
└─$ head -n 10 Final_Roland_GO_KEYS_5_Database.csv | column -t -s,
Pattern ID Mood Complexity Tonality Length Progression Type
Primary 01 Bright Basic Major 4Meas C-G-Am-F Preset
Primary 02 Dark Basic Minor 4Meas Am-F-C-G Preset
Primary 03 Chill Basic Major 4Meas F-G-Em-Am Preset
Relax 05 Relax Advanced Major 8Meas CM9-FM9 Preset
Ennui 01 Ennui Advanced Minor 4Meas Dm7-G7-CM7-Am7 Preset
...
Why This Matters: The Hidden Tax on Curiosity
For most players, the Chord Sequencer is just a convenience. But for a visually impaired musician, an inaccessible interface is more than a minor hurdle; it is a tax on curiosity.
When a product's documentation is incomplete and its interface is silent, the disabled user is forced to choose: remain a passive consumer of the presets found by trial and error, or spend hours performing forensic analysis on firmware just to reach the same starting line as a sighted peer.
By extracting this data, I have gained:
- A Map of the Territory: These progressions can now be studied through a screen reader, treating the keyboard as a teacher rather than a mystery box.
- Creative Autonomy: Specific moods (like "Ennui") or complexities (like "Advanced") can be searched for without scrolling blindly through menus, allowing creative flow to remain unbroken.
- Dignity in Ownership: There is no longer a need to ask a sighted person to read the screen. The data is accessible because it was made accessible.
A Message to Product Designers
Accessibility is often treated as a compliance checklist. But true accessibility is about empowerment. It is the difference between a user feeling like a guest in an ecosystem and feeling like a master of their tools.
If the preset patterns had been listed in a simple PDF table, or if the device had a basic "Voice Guide" mode, this deep-dive into binary blobs would not have been necessary.
The question for designers is simple: Are you building tools that invite everyone to explore, or are you building gates that only some have the keys to open? Until every keyboard speaks and every manual is complete, the music will have to be found by digging beneath the surface.

