monoSID

monoSID is a software synthesizer for the Commodore 64. The C64's sound chip is called the SID. A synthesizer that plays only one note at a time is known as a monophonic synthesizer, or mono synth for short—hence the name monoSID.

monoSID can be played via MIDI (the C64 requires a compatible MIDI cartridge) or by using the built-in keyboard piano. The keyboard piano is intended only as a simple fallback; MIDI is the primary and recommended way to play monoSID.

Features

Download

How to Run

Running in VICE

  1. Download and install VICE if necessary. Versions are available for Windows and macOS.
  2. Download the monosid.d64 disk image.
  3. Start the C64 emulator.
  4. Open Preferences → Settings → Cartridges → MIDI Emulation.
  5. Enable MIDI Emulation.
  6. Select Sequential as the MIDI mode.
  7. Choose your MIDI keyboard or other MIDI input device under MIDI In.
  8. Drag and drop the downloaded D64 image onto the VICE window, or load it using VICE's menus.
  9. Enjoy!

Running on Real Hardware

If you own a real Commodore 64, the easiest way to load monoSID is by using an SD2IEC drive.

Copy monosid.prg to an SD card and load it from the C64 as you would any other program.

To use MIDI, you will need one of the five supported MIDI cartridges (Sequential, Passport/Syntech, DATEL/Siel/JMS, Namesoft, or Maplin).

If you would like to purchase a newly manufactured cartridge, an Australian company called GameDude Computers Consoles Retro currently sells replica DATEL cartridges on eBay.

Note: This documentation was written in 2026. By the time you read this, the company—or even eBay itself—may no longer exist. Who knows?

Insert the MIDI cartridge before starting monoSID. The program will automatically detect the cartridge during startup.

User Interface

Overview

The main interface is organized into groups of controls called modules. Each module contains several editable parameters.

At any given time, one control has the input focus. The focused control is highlighted in yellow. You can move the focus using either the cursor keys or the WASD keys, which are often more convenient on an original Commodore 64 keyboard.

monoSID provides five different types of controls:

The available input methods depend on the selected control:

The user interface is divided across two pages. Hold W or S for a while to switch between them or use the F5 and F7 keys.


Page 1

The modules on the first page correspond closely to the registers of the SID sound chip. One of the primary goals of monoSID was to provide a convenient interface for experimenting with the SID's hardware registers without having to manipulate them directly.


Voice Modules (Voice 1–3)

Each voice has its own oscillator and envelope generator.

Parameters

WAVE

Selects the oscillator waveform:

PULSE

Controls the pulse width when the waveform is set to Pulse.

The value ranges from 0 to 4095 (11-bit resolution). A value of 2047 corresponds approximately to a 50% duty cycle.

ATC

Attack time of the ADSR envelope.

DCY

Decay time of the ADSR envelope.

SUS

Sustain level.

RLS

Release time.

USE

Enables or disables the voice.

SYNC

Synchronizes this oscillator with another SID oscillator using the hardware sync feature.

RING

Enables hardware ring modulation.

Ring modulation only affects the triangle waveform. It has no effect when the voice is using pulse, sawtooth, or noise.


SID ADSR Time Table

Value Attack Decay Release
0 2 ms 6 ms 6 ms
1 8 ms 24 ms 24 ms
2 16 ms 48 ms 48 ms
3 24 ms 72 ms 72 ms
4 38 ms 114 ms 114 ms
5 56 ms 168 ms 168 ms
6 68 ms 204 ms 204 ms
7 80 ms 240 ms 240 ms
8 100 ms 0.3 s 0.3 s
9 0.25 s 0.75 s 0.75 s
10 0.5 s 1.5 s 1.5 s
11 0.8 s 2.4 s 2.4 s
12 1 s 3 s 3 s
13 3 s 9 s 9 s
14 5 s 15 s 15 s
15 8 s 24 s 24 s

Oscillator Routing

The SID hardwires oscillator synchronization and ring modulation internally.

Destination Source
Voice 1 Voice 3
Voice 2 Voice 1
Voice 3 Voice 2

Understanding SYNC

When SYNC is enabled, the selected oscillator resets its phase every time the source oscillator completes a cycle.

This forces both oscillators into a fixed phase relationship and creates the characteristic "sync lead" sound that became popular in many classic synthesizers. The effect is most noticeable when sweeping the pitch of the synchronized oscillator while the source oscillator remains at a lower frequency.


Understanding Ring Modulation

Unlike its name suggests, the SID's ring modulation does not perform true analog ring modulation.

Instead, it modifies only the triangle waveform by XOR'ing the most significant bit of the selected oscillator with that of its source oscillator.

As a result:


Filter

All three voices share a single multimode analog filter.

Parameters

CUTOFF

Sets the cutoff frequency.

Range: 0–2047

Approximate frequency range:

RES

Sets the filter resonance.

Higher values increasingly emphasize frequencies around the cutoff frequency.

VOICE 1–3

Determines whether each voice is routed through the filter.

LOWPASS

Passes frequencies below the cutoff frequency while attenuating higher frequencies.

HIGHPASS

Passes frequencies above the cutoff frequency while attenuating lower frequencies.

BANDPASS

Passes only a narrow frequency band around the cutoff frequency.


Main

VOL

Master output volume.

Range: 0–15

Page 2

The second page contains features that extend beyond the SID's hardware registers and turn monoSID into a more practical musical instrument. Here you'll find functions such as oscillator detuning, velocity response, LFO configuration, and oscillator reset options.


Detuning

Detuning allows each oscillator to be shifted independently from the played note. This is useful for creating thicker sounds, chorusing effects, intervals, or simple chords.

Parameters

VOICE 1–3

Detuning amount in cents.

Range: 0–4095 cents

One cent equals one hundredth of a semitone.

NEG 1–3

Makes the corresponding detuning value negative.

How Detuning Works

Each voice can be detuned independently relative to the incoming MIDI note.

Small detuning values create the familiar "beating" effect between oscillators, making the sound richer and wider.

Larger values can be used to create harmonic intervals:

For example:


Reset Oscillators

Parameters

VOICE 1–3

Resets the selected oscillator whenever a new note begins.


Why Reset the Oscillator?

Normally, a SID oscillator continues running continuously, regardless of whether a key is currently pressed.

When oscillator reset is enabled, the oscillator starts from the same phase each time a new note begins. This produces a more consistent attack and is particularly useful for percussive sounds and bass patches.

Leaving oscillator reset disabled produces a more natural, analog-style behavior, as each note begins at a different phase of the waveform.


Gate Behavior

Understanding the SID's gate signal helps explain when oscillator reset and envelope triggering occur.

Consequently, oscillator reset occurs only when the gate opens—not for every overlapping note.


Velocity

monoSID optionally supports MIDI Note-On velocity.

Parameters

USE

Enables velocity sensitivity.

The velocity of each incoming MIDI note determines how loudly the note is played.

SUSTAIN

Instead of controlling the SID's master volume, velocity modifies the Sustain level of all three voices.

Why Is Velocity Implemented This Way?

Unlike modern synthesizer chips, the SID does not provide an individual volume control for each voice.

The only available volume control is the chip's global master volume register.

Changing this register while a note is playing produces the characteristic SID volume click. Larger volume changes result in more audible clicks.

This behavior is less pronounced on later SID revisions (such as those found in the Commodore 64C), but it never disappears completely.

To work around this limitation, monoSID offers the SUSTAIN option.

When enabled, Note-On velocity modifies the Sustain level of each voice instead of the global volume. This greatly reduces audible clicking but works best when the ADSR envelopes are configured with minimal Attack, Decay, and Release times.

Neither solution is perfect, but they represent the best compromises within the hardware limitations of the SID.


LFO (Low-Frequency Oscillator)

The LFO periodically modulates selected synthesis parameters, allowing monoSID to produce vibrato, tremolo-like effects, pulse-width modulation, filter sweeps, and many other animated sounds.

Parameters

LENGTH

LFO cycle length.

Range: 0–4095

MOD PITCH

Applies pitch modulation to all three voices.

MOD PULSE

Applies pulse-width modulation to all three voices.

MOD FILTER

Applies modulation to the shared filter cutoff frequency.

SQUARE WAVE

Selects a square-wave LFO.

If disabled, the LFO uses a triangle waveform.

RESET OSCILLATOR

Resets the LFO whenever the gate opens.

This ensures that each newly played note begins at the same point within the modulation cycle.

MOD WITH V3 EG

Uses the ADSR envelope generator of Voice 3 to modulate the LFO itself, allowing for more dynamic modulation effects.

MUTE VOICE 3

Silences Voice 3 while still allowing its envelope generator to control the LFO.

This makes Voice 3 function purely as a modulation source.

PITCH

Maximum pitch modulation depth.

Measured in cents.

PULSE

Maximum pulse-width modulation depth.

CUTOFF

Maximum filter cutoff modulation depth.

NEG

Inverts the modulation polarity for the corresponding destination.

Press F1 to open the main menu.

In addition to displaying information about the detected MIDI cartridge and the currently selected MIDI channel (default: Omni), the menu provides the following functions:

Press F1 again to leave the menu without making any changes.


Patch Selector

Press F3 to open the Patch Selector.

Navigate using either the cursor keys or WASD. Press Return to load the highlighted patch.

Any unsaved changes to the current patch will be lost immediately.

There is no confirmation dialog, so make sure to save your work first if necessary.

Press F3 again to return to the main screen without changing the current patch.


A Few Personal Words

Why?

Yeah. Why — oh why — did I decide to build a software synthesizer for an obsolete old computer, and to do it purely in 8-bit assembly?

Well, because... I like pain, I guess? Just kidding, of course. Although — as Dave Plummer of Dave's Garage once put it on his YouTube channel — programming is mostly frustration management. Which is very true. And there's plenty of frustration to go around, especially when you're developing for a machine running at a little under 1 MHz with 64 KB of RAM.

But it was also fun — and deeply humbling. I had to go back to the basics: reminding myself how numbers work at the bit level, writing super low-level code, even developing my own subroutines to convert an integer into a string and back again. The kind of thing you NEVER have to worry about in a modern programming environment.

Still, going back to basics (and a 6502 processor is about as basic as it gets) wasn't the only reason. There was a healthy dose of nostalgia, too. I started programming at the age of 12 on — you guessed it — an old C64 my father gave me. At first I just played games on it, as you'd expect. But then the disk drive — the original 1541, in all its bulky, beige glory — broke down. Out of sheer boredom, I picked up the manual that came with the C64, which taught the basics of programming in, well, BASIC. After writing my first tiny, simple little BASIC programs (and saving them to a cassette drive, since the 1541 was still dead), I was hooked. I fell in love with programming, and it's been my passion ever since. In my teens I taught myself x86 assembly so I could write cool DOS games. But I never touched C64 assembly back then — I was an absolute noob at 12 — so 35 years later, I decided to finally do some "real" coding on the C64.

The nostalgia trip was rewarding in itself, but I also wanted to learn something useful for the future — ideally toward building more capable, modern software synthesizers (a plan I still haven't realized). MIDI remains the standard language electronic instruments use to talk to each other, so learning it at a low level seemed like a smart move. That said — while I do like pain, as established — I don't like it that much, so I opted for a modern workflow and an emulator (Vice) rather than authentic 80s tools, which would have been a bit too hardcore for me. In the end, I used Kick Assembler (by Mads Nielsen), Visual Studio Code, and a plugin called "Kick Assembler 8-Bit Retro Studio" (by Paul Hocker) to automate assembling and launch Vice with a single keystroke. I have the utmost respect for the folks in the 80s who built complex programs with the archaic tools of the day. It must have been a real struggle.

So in the end, this little synthesizer project brought together old and new technology, stirred up plenty of nostalgia, made me relearn things I'd forgotten, and taught me new things I hope to use down the road.

One very modern twist I hadn't anticipated at the outset was my use of AI. Over the past few months, I leaned on Claude AI a lot — mostly for research, but also for debugging some genuinely tricky problems. It's frightening how good these systems have become. Incredibly useful, too. But still... a little frightening.

All in all, I had a lot of fun (with some deeply frustrating moments sprinkled in) working on this project. Was it worth all the hours I poured into it? The "product" itself, probably not — but I learned a ton. And as the saying goes: "Time you enjoyed wasting is not wasted." So, yeah. That's that. Have a nice day!