Free browser-based SID chiptune player for USBSID-Pico. Play PSID, RSID, MUS and PRG files straight from a searchable HVSC (High Voltage SID Collection) library, a local folder, or a URL (csdb.dk, deepsid.chordian.net). Runs entirely in-browser via a WASM reSIDfp/USBSID-Player build, or streams register writes to real MOS 6581/8580 SID chips and hardware replacements (SIDKICK-pico, FPGASID, ARMSID, SwinSID) over WebUSB, WebSerial or ASID (WebMIDI), with live SID register and STIL info display.
Keyboard shortcuts:
Space - Play / Pause |
S - Stop |
<- -> - Prev / Next subtune
USBSID-Pico is a Raspberry Pi Pico / Pico 2 based board for interfacing one or two MOS SID chips and/or hardware SID emulators (ARMSID, SKPico, FPGASID, SwinSID) over USB / WebUSB with your computer.
This web configuration tool lets you configure the device and play SID files directly from your browser without installing any software.
Firmware & web config: LouD
USBSID-Player (WebUSB & ASID): LouD
SID emulation: reSIDfp / libsidplayfp
ASID & DeepSID modifications: JCH & Thomas Jansson
WebUSB modifications: LouD
License: GPLv2
PCB v1.0 / v1.2: Standard board - no audio switch.
PCB v1.3+: Audio switch (mono ↔ stereo) support.
The audio switch row in Config is only shown for v1.3+ boards.
For many of us retro enthusiasts, the Commodore 64’s MOS Technology SID chip (6581 and 8580) is regarded as one
of the most iconic sound chips in audio history.
(Modern) Software emulation gets close, but nothing truly replaces the analog filters and warm distortion of
real vintage hardware.
I am LouD (short for loudness) and I created
USBSID-Pico to bridge real SID silicon directly to modern workstations, phones, and media
players over USB (CDC/WebUSB/WebSerial), MIDI, ASID and in the future possibly WiFi and Bluetooth.
Powered by the Raspberry Pi Pico microcontroller series (rp2040 and rp2350), the board acts as a flexible
controller for up to two (and soon four) physical SID chips or modern hardware replacements.
What follows is my journey (as far as I remember) and attempt at creating a project build log detailing the start and evolution from early prototypes to the open-source hardware powering the retro audio experience for (at least some) enthusiasts today.
For as long as I can remember I have been interested in how things work.
From the first Commodore 64 my parents bought, the first XT PC we owned at home, to the first Pentium PC I
bought when I was a teenager, up until today (and beyond) where I work as software engineer.
Tech fascinates me, so when I have the option I like to pry it open, find out how it works and put it back
together with "improvements" not caring (at first) if it still works.
I'm not much of a musician but do like to listen to all kinds of music, including chiptunes of course ;-)
Inspired by my older brother who repairs Commodore 64s among other things, a new project idea popped into my head. I wanted to see if I could create a SID playing device to listen to the SID tunes I already listened to on my computer and maybe even play them through a real SID chip.
Around February/March of 2024 I came across a github repo that let you create a SID player based on a Raspberry
Pi Pico called SIDPod.
I liked how simple it seemed to use a microcontroller to play SID files so of course I had to build it.
SIDPod testbuild
The way of adding more SID files to SIDPod's flash made me try and add an SDCard to the already great design,
this resulted in SIDPod-SDCard.
SIDPod-SDCard testbuilds
In early April 2024 still not satisfied by the results I found
ESP32-SIDView.
This seemed like a nice replacement SID player for SIDPod with the added benefit of supporting real SID chips!
Building one was the logical next step, but since I did not own any real SID's at that time I had to find one.
SIDKICK-pico was the first SID replacement I found, no
schematics, but orderable.
Having some hobby level experience in hardware reverse engineering I recreated a schematic and figured out the
Pico to DIP-28 pinout so I could use it on a breadboard.
ESP32-SIDView testbuild
Not being satisfied with the spaghetti you can see in the picture above, I had to tidy things up a bit.
ESP32-SIDView tidy testbuild
Having some issues getting ESP32-SIDView to work, I contacted its developer tobozo through GitHub. We exchanged countless messages about this project on GitHub. We later moved to a different platform and continued talking (and still do) about his and my project(s), coding, cats, daily life etc. This one GitHub issue lead to a - if I may say so - great digital friendship.
In the meantime I also found SidBerry. A linux based console
application for playing SID tunes via the Raspberry Pi's (not Pico) GPIO pins.
RPI breadboard extension with SKPico
SidBerry with Raspberry Pi is what in early May of 2024 eventually led to the creation of FTDI USBSID, my first
try at creating a USB controlled SID device. To do this I used a
FTDI FT223HL breakout board I already owned for reverse
engineering.
Somewhere in between I acquired a v0.1 SIDKICK-pico and 2 half broken MOS6581's.
FTDI USBSID
Creating your own hardware supporting board meant also creating software support.
Reminiscing about that, here are the links:
Using the FTDI breakout board came with a lot of limitations.
It wasn't a microcontroller, so all the GPIO writes and input/output switching had to be done in the driver and
using the FTDI ecosystem wasn't really something I enjoyed.
By the end of May 2024 having had enough of these limitations is what led up to creating
USBSID-Pico, or actually called PicoUSBSID at that time. A
perfboard version with support for a single SID.
PicoUSBSID single SID version
Halfway through June of 2024, I added dual SID support to the same perfboard.
PicoUSBSID dual SID version
With the continued support and encouragement of tobozo (thanks m8) the first actual USBSID-Pico v0.1 board came to life that lead up to the first v1.0 board.
What followed has been an incredible journey of creativity, acquiring new skills, improving existing skills,
learning new things and making new friends (and enemies?).
I talked to and met so many new people and groups, that it is almost impossible to name them all here but I have
tried to name at least a few that inspired me in the credits at the end.
Key Technical Highlights (v1.0):
v1.3 Upgrades:
v1.5 Upgrades:
Pro Roadmap Features (undecided):
So many things have happened since I started this project. To give you an idea of the (hardware) development process starting at v0.1, here is a summarised timeline.





cases/ directory.Developing new and unique PCBs to seat microcontrollers logically requires you to develop the firmware for said
microcontrollers as well.
After having chosen a microcontroller you want to use, you actually need to get some experience with its SDK.
This comes with pros and cons; you need to do a deep dive into the SDK of said microcontroller but also narrows
your view in relation to other microcontrollers. Or at least, this is my experience, mostly because time is
precious and you cannot do everything at once ;-)
Before diving into the clock and bus tricks, it helps to know how the two ARM cores on the Pico actually split
the work.
Core 0 always handles everything USB-related: CDC, WebUSB, MIDI, plus config management.
Core 1 on the other hand has multiple jobs, it runs the MIDI engine, the onboard emulator for SID play or
Cynthcart when required, the SID tests if triggered by the user and handles the VU when not doing any of the
other tasks. When Core 1 is busy handling the onboard emulator the VU is offloaded to Core 0.
Both cores can do SID bus writes because the actual writes are handed off to the DMA/PIO that do the
timing-critical work described below.
Balancing the tasks between the two cores and relying on the DMA/PIO is what lets USB traffic, MIDI processing,
or a config save happen without ever touching the cycle-accurate bus timing. If they shared a core, a badly
timed USB interrupt could jitter the SID clock, exactly the problem the PIO offloading below is solving in the
first place.
The primary challenge when controlling vintage MOS sound hardware over USB is timing precision. The MOS 6581 and 8580 SID chips do not utilize an asynchronous register interface; they rely on a strict phase clock to drive their internal switched-capacitor analog filters, voice envelope generators, and digital-to-analog converters.
Any jitter or frequency drift on the SID clock line results in audible tuning drift, harsh filter stepping, or broken sample playback (Digiplay).
To solve this without sacrificing system responsiveness, USBSID-Pico leverages the hardware Programmable I/O (PIO) state machines and Direct Memory Access (DMA) built into the Raspberry Pi Pico series (rp2040 and rp2350).
In standard PAL Commodore 64 computers, the SID clock runs at 0.985248 MHz (or 1.022727 MHz for NTSC systems). Modern USB controllers often approximate this using CPU bit-banging or standard PWM generators, but CPU interrupts from USB traffic can cause cycle slippage.
USBSID-Pico delegates master clock generation entirely to a dedicated PIO state machine:

Beyond driving the main clock, writing values to a real SID chip requires adhering to precise timing windows relative to PHI2. A register write requires setting up the Address Bus (A₀-A₅), Data Bus (D₀-D₇), and pulling Chip Select (C̅S̅) and Write Enable (W̅E̅) low for specific duration windows during the high phase of PHI2.
USBSID-Pico combines the PIO state machines with DMA buffers to achieve deterministic low-latency bus cycles, resulting in only a single clock cycle overhead:
SET and OUT pin targets in a single clock cycle.[delay]
pre-ops) between asserting C̅S̅
One gotcha worth mentioning: all this only holds up at -O3. Drop the optimization level and the
compiler generates just enough extra overhead around the DMA/PIO handoff to reintroduce timing slack, which
shows up as broken sample playback in the embedded SID player and Cynthcart. So -O3 isn't a
"nice-to-have" for this firmware; it's load-bearing.
Cycle-accurate you say? Prove it!
Wonderland XIII ending by Censor Design (2016)
(Played with MOS6582 on USBSID-Pico)
Not everything in the firmware is about getting bytes onto the SID bus correctly, sometimes you also just want
the board to look alive.
The onboard LED (Pico/Pico 2) and, on the black clone boards with an onboard WS2812, the RGB LED, both act as a
VU meter driven off the SID1 (default) voice data, calculated straight from the register writes going through.
Which voices feed the calculation is configurable, so you can tune it to taste.
Not every socket gets told what's plugged into it, most of the time the firmware has to figure it out on its
own. Real 6581 and 8580 chips (and most clones that bother to emulate the quirk) behave slightly differently
around their envelope/waveform generator internals when you poke certain test bit sequences into the voice
registers and read back what comes out of the oscillator/envelope readback register.
These aren't documented behaviors, they're quirks the C64 scene worked out and shared decades ago (methods like
the ones on codebase64.net, and the detection routine from 1541 Ultimate's SID cart player). USBSID-Pico runs a
few of these probes back to back per socket at boot (and on socket reconfiguration), cross-checks the results
against each other since a single probe can misfire, and falls back through multiple detection methods until
it's confident whether it's looking at a 6581, an 8580, or something it can't identify. Get this wrong and the
firmware would apply the wrong voltage/filter assumptions to a chip that can't take it, so it's not just a
nice-to-have feature.
MIDI notes don't map onto SID registers by themselves. Someone has to decide what "note on, channel 3, velocity
100" actually means in terms of frequency registers, gate bits, and envelope settings, and then get those writes
onto the bus in time to sound right.
The MIDI handler keeps a per-channel voice allocation table so incoming notes get assigned to a free SID voice
slot, tracks note on/off and velocity, and layers an arpeggiator on top that steps through held notes on its own
timer, calling the same note on/off path a human playing key by key would trigger. ASID messages come in through
a completely different transport (MIDI vs a raw byte stream) but funnel into the same underlying register write
path once decoded, so the bus timing code described above doesn't need to know or care which protocol asked for
the write.
From the host's point of view, USBSID-Pico shows up as a single USB device, but under the hood it's a composite
of several TinyUSB interfaces stitched together with Interface Association Descriptors: a CDC interface for the
custom SID protocol, a MIDI interface, and a Vendor (WebUSB) interface, all sharing one physical connection.
Depending on the firmware build there can be extra CDC channels tucked in as well, one used for telemetry,
another that exposes a plain USB UART.
Getting a composite device like that to enumerate cleanly across Windows, macOS, Linux, and Android, each with
their own opinions about driver binding for multi-interface USB devices, turned out to be its own small
adventure that doesn't show up anywhere in the SID bus code but ate plenty of debugging time all the same.
The board remembers its settings (which sockets are enabled, address ranges, clock speed, voltage mode, VU source, and more) across power cycles without running a filesystem. Flash is split at the linker level into a firmware region and a separate persistent storage region (the split is sized per platform in the rp2040 and rp2350 linker scripts), so writing a config update can never accidentally overwrite running code, and a firmware update never has to touch, or wipe, your saved config.
When you create something new and shiny that requires the (hard) work of others to work, you need to prove
yourself and your product worthy of integration into their holy grail. Very understandable.
Adding the first support for any application that is not your own requires you to learn the codebase and
understand the coding rules the developer(s) of that application follow.
This is by itself a complete journey I am not going into here, below is the (current) list of (official/forked)
applications that have support for USBSID-Pico.
I probably missed some of them
As with adding support to applications of others, your hardware project usually has you spawning all sorts of
custom software/repo's for said project.
The hardware needed a driver, this spawned the
USBSID-Pico-driver repo which contains the official
driver written in C++ and Java, plus a mirror of the driver used in Vice.
Because the board has configurable features, the
CLI Configtool was spawned.
To accommodate for the less tech savvy users, the
Web Configtool got
spawned.
Some users would actually like a dedicated deskop application (GUI), spawning
USBSID-Configtool written in my dayjob language
Clojure.
I wanted a more direct way to test SID play on the board while also adding support as embedded SID player
USBSID-Player got spawned.
But having an embedded SID player means you need a way to actually beam the SID tunes to the board,
CLI SendSID was spawned.
In earlier firmware versions I spawned Adorable that
added an embedded version of Cynthcart. This spawn was an adapted version of
emudore.
Not every bit of software support came from me though.
sandlbn wrote and maintains a full
Rust driver for USBSID-Pico, completely on his
own initiative, which was pretty great to wake up to one day.
WilfredC64 also made a Rust implementation for USBSID-Pico
specifically for Acid64 Pro.
Raros also built a custom Cynthcart VST for Windows to go along with the embedded Cynthcart firmware, you'll
find it and his notes in the
repo.
And of course none of this USB plumbing would work half as well without
TinyUSB, which the firmware leans on for the whole USB stack.
During this project my collection of SID chips and hardware replacements kept growing, and still grows.
Any new hardware replacement that catches my eye is a new take my money.
Not only because I like to support the creator, but moreover that I want to add support for it to USBSID-Pico.
I admit that not all hardware replacements that I own are bought. Some are donated and/or traded for one of my
boards, something I am always open to discuss!
I try to handle all my real SID chips with care and mostly use hardware replacements when doing the many firmware tests I do for USBSID-Pico. But I must admit that even I haven't always been careful enough, resulting in a fried SID (or two). And no, it doesn't smell nice; it's hot to the touch and doesn't taste like chicken!
In no particular order, here are the SIDs that I own and have tested/use with USBSID-Pico.
I'm a big fan of retro and pixel art, thus having some special art on the bottom of each board couldn't be skipped (and my friend tobozo forced me to add some).
What can a product be without fanboy swag? The marvelous
greyandslate offered to create some great
t-shirt designs for free! after I asked him about creating something. How's that for exposure! The
shirts are for sale in his Smallrun shop.
USBSID-Pico has popped up in a few places I didn't expect, always a nice surprise.
If you're searching around for more, "usbsid" and "usbsid-pico" turn up most of it.
If you run into trouble or just want to talk shop, the Discord is where most of the day to day happens, GitHub Discussions works too if you prefer that. And if you're curious what's cooking next, the project board is kept reasonably up to date.
Or if you want to see (and hear) more of the board in action, my YouTube channel has plenty of demo videos, and there's a growing pile more on the SHOWCASE page of the main repo.
Here's a picture of my cat :-)

When doing research for something you want to create you often come across similar projects that look like your
idea but are not quite the same.
For me this has always inspired me to do what I do and of course sneak some previously proven ways of doing
things into my own projects.
So while being a unique project, USBSID-Pico does relate to other great projects.
I want to thank tobozo for your continued support!
And my gratitude goes to spotUP for his persistence and believing in the
project from the start!
LukHash and
Nordischsound for their free promotion of USBSID-Pico.
WilfredC64 and
Niels whom I both met at
HCC Commodore Club who have been a great support and early adopters!
Gideon for tips on going jumperless and is also a member at the same club.
All other members of HCC Commodore Club.
I find that giving credit to other developers for their great projects is required, so in no particular order:
All links from the text:
I do this stuff in my free time for my enjoyment.
Since I like to share my joy in creating this with everyone I try my best to provide a working PCB and Firmware.
I am in no way an electronics engineer and can give no guarantees that this stuff does not
break or damage your hardware, computer, phone, or whatever you try to hook it up to.
Be sure to take great care when inserting any real MOS SID chips into the board.
While everything has been tested with real chips, this is in no way a guarantee that nothing could go wrong.
Use of this board and firmware at your own risk!
I am in no way responsible for your damaged hardware.
That being said, have fun!