Turn any binary (EXE/DLL/SO/OBJ/firmware dump, etc.) into sound + visuals based on “machine-code-ish” byte patterns.
This project has two parts:
main.py— the worker: reads a binary, extracts rolling byte features, generates:- a WAV (sonification)
- a PNG dashboard (visual fingerprint)
gui.py— a simple GUI wrapper aroundmain.py:- file picker + Generate
- Play / Stop / Loop
- 3 visualizer presets (oscilloscope / spectrum bars / radial pulse)
- zoom + pan PNG viewer with cursor anchored zoom
Even without fully disassembling the binary, executables often contain recognizable structural regions (code, padding, string tables, resources, compressed/encrypted blobs, etc.).
By summarizing byte windows with simple statistics (entropy, histograms, nibble patterns) and mapping them into audio + plots, you get a weird but useful "signature" you can compare across files.
For each run you’ll get:
*.wav— audio generated from window by window features*.png— dashboard image:- byte-image ("DNA strip")
- entropy over time (+ mapped pitch)
- byte histogram
- nibble heatmap over time
The GUI saves outputs under ./outputs/ with a timestamped prefix.
Python 3.10+ recommended. (mine is 3.14.0)
python -m venv .venv
# Windows:
# .venv\Scripts\activate
# Linux/macOS:
# source .venv/bin/activatepip install -r requirements.txtsounddevice uses PortAudio.
- Linux (Debian/Ubuntu):
sudo apt-get install libportaudio2
- macOS (Homebrew):
brew install portaudio
Pillow is optional but recommended for smoother image zooming (it’s included in requirements.txt).
python gui.pyOptional: point the GUI at a specific worker path (I dont know why? but in case you have a different worker file):
python gui.py --main /path/to/main.pyGUI workflow
- Browse → select a binary
- Generate → creates WAV + PNG
- PNG appears on the left (zoom/pan)
- Visualizer runs on the right during playback
- Tweak parameters → Regenerate
python main.py /path/to/file.bin -o out
# outputs: out.wav, out.pngUseful parameters:
python main.py input.exe -o out \
--window_bytes 2048 \
--stride_bytes 2048 \
--sr 44100 \
--note_dur 0.08 \
--midi_low 36 \
--midi_high 84Tuning tips
- Large files: increase
--stride_bytes(fewer windows → faster + shorter audio) - More detail: decrease
--stride_bytes(more windows → more detail + longer audio) - Slower / more legible audio: increase
--note_dur - More “musical range”: widen
--midi_low/--midi_high
- Read bytes as
uint8 - Slice into windows (
window_bytes, step bystride_bytes) - Per window compute features like:
- Shannon entropy (0–8 bits)
- mean / std
- nibble histogram (0–15 distribution)
- Sonify each window into a short note:
- mean → pitch (quantized to a pentatonic-ish scale)
- entropy → loudness
- std → "brightness" (FM-ish modulation index)
- Visualize:
- byte-image (reshape bytes into rows)
- entropy trace (and pitch overlay)
- byte histogram
- nibble heatmap
.
├── gui.py # GUI wrapper + player + visualizer
├── main.py # Worker: generate WAV + PNG
├── requirements.txt
└── outputs/ # Generated files (created at runtime)
- Install PortAudio (see install section).
- Make sure your system has an active audio output device.
Install Pillow:
pip install pillowThis project uses TkAgg. If your environment lacks Tk support, install your OS Tk packages (Linux often needs python3-tk).

