A standalone MOS 6581/8580 (SID) synthesizer for the MiST FPGA board. The SID sound chip is borrowed from the C64-MiSTer project and driven two ways at once:
- MIDI synth — MIDI notes arrive on the board's serial input (via opto-isolator), are parsed and voice-allocated in hardware, and play through a SID core in real time.
.sidrawplayback — a second SID core plays a tune streamed from the SD card as a.sidrawregister dump, picked from an on-screen OSD menu, in parallel with the live MIDI synth.
This build is an early bring-up. What works today:
.sidrawtunes streamed from the SD card, selected via an OSD menu;- a monophonic MIDI synth — one SID voice, last-note priority;
- no MIDI CC handling (note on/off and pitch only).
Short-term goals:
- polyphonic voice allocation across the SID's voices;
- MIDI CC controls (filter, envelope, and other SID parameters).
rtl/ SID core, MIDI front-end, .sidraw player + SD reader, OSD/video,
DC blocker, SDM DAC, top
fpga/ Quartus project (device, pins, PLLs, SDC) + build.sh
hex/ legacy .sidraw BRAM init (unused in this build; SD streaming only)
sw/ sidraw-dump host tools (.sid -> .sidraw -> .wav)
Quartus II 13.1 is required; the build script runs it inside a Docker image so no local install is needed:
cd fpga
./build.shOutput lands in fpga/build/:
sidsynth_mist.rbf— copy to your MiST SD card ascore.rbfto run it.sidsynth_mist.sof— program over JTAG withquartus_pgm -m jtag -o "p;build/sidsynth_mist.sof".
sw/sidraw-dump/ builds a triplet of CLI tools (sidraw-dump,
sidraw-play, sid-play) that convert between .sid, the custom .sidraw
register-dump format, and .wav. They statically link vendored copies of
libsidplayfp + libresidfp, so the result is a self-contained binary:
cd sw/sidraw-dump
mkdir build && cd build
cmake ..
make -jTunes are loaded at runtime from the SD card — no rebuild needed. Convert a
.sid to the .sidraw register-dump format with the host tools and copy it
to a SIDSYNTH directory on the card:
sidraw-dump your_tune.sid -o your_tune.sidraw
cp your_tune.sidraw /path/to/sdcard/SIDSYNTH/With the card inserted, press F12 on the MiST to open the OSD menu and
pick a .sidraw file. user_io mounts the selection and sidraw_sd_reader
streams it on demand through a small FIFO into the .sidraw player — so tune
length is bounded by the SD card, not on-chip BRAM. Stock MiST firmware is
used; no custom firmware is required.
Read more about what I'm working on my blog.
The RTL in rtl/ is licensed under the
CERN-OHL-S v2 (Strongly Reciprocal). The vendored
libsidplayfp and libresidfp sources under sw/sidraw-dump/external/ are
GPL v2 and remain under their own licenses.