Arpeggio
Chords from a single channel
Arpeggios rapidly cycled through notes of a chord, simulating polyphony on sound chips limited to single-note channels—a defining technique of chiptune music.
Overview
When a sound chip can only play one note per channel, how do you play chords? Arpeggios cycle through chord tones faster than the ear can separate them, creating the perception of multiple simultaneous notes. The trick predates 8-bit hardware (early computer-music research used it on PDP machines), but the SID, AY, and NES APU pushed it from a workaround into a defining sonic signature.
The technique
Basic concept
Instead of playing C-E-G simultaneously, the routine rewrites the channel's pitch every video frame:
Frame 0: C
Frame 1: E
Frame 2: G
Frame 3: C (cycle restarts)
...
With a 3-note chord at one note per frame, the cycle restarts every 3 frames. On a 50 Hz PAL system that's 50/3 ≈ 16.67 Hz; on a 60 Hz NTSC system, 20 Hz. Around 17-20 Hz the ear stops separating the notes and starts hearing a chord with a buzzy edge — the classic "chip arpeggio" sound.
Note stride vs cycle rate
| Stride (frames per note) | Cycle rate (3-note chord, 50 Hz) | Effect |
|---|---|---|
| 4 | ~4 Hz | Audibly stepped — sounds like a sequence |
| 2 | ~8 Hz | Buzzy chord with rhythmic flutter |
| 1 | ~17 Hz | Smooth chord perception (classic chip sound) |
Some musics use a 4-note arpeggio (e.g. major 7) at stride 1 — that's 50/4 = 12.5 Hz on PAL, slower and more obviously stepped.
Chord types
Common arpeggio patterns, expressed as semitone offsets from the root:
| Chord | Notes | Semitone offset |
|---|---|---|
| Major | C-E-G | 0-4-7 |
| Minor | C-Eb-G | 0-3-7 |
| Diminished | C-Eb-Gb | 0-3-6 |
| Sus4 | C-F-G | 0-5-7 |
| Major 7th | C-E-G-B | 0-4-7-11 |
Implementation
SID (C64) — full example
The SID expects a 16-bit frequency value at $D400/$D401 for voice 1. A note table maps semitones to frequency words:
; 12-entry chromatic frequency table for one octave
; (real code uses a multi-octave table, indexed by MIDI note)
note_freq_lo: .byte $17, $27, $39, $4B, $5F, $74, $8A, $A1, $BA, $D5, $F1, $0F
note_freq_hi: .byte $11, $12, $13, $14, $15, $16, $17, $18, $19, $1A, $1B, $1D
arp_offsets: .byte 0, 4, 7 ; major triad
ARP_LEN = 3
base_note: .byte 36 ; C3 in this scheme
arp_pos: .byte 0
update_arp:
ldx arp_pos
lda arp_offsets,x
clc
adc base_note ; effective semitone
tay ; index into note table
lda note_freq_lo,y
sta $d400 ; voice 1 freq lo
lda note_freq_hi,y
sta $d401 ; voice 1 freq hi
inx
cpx #ARP_LEN
bcc :+
ldx #0
: stx arp_pos
rts
Called from a 50/60 Hz IRQ, this gives stride-1 arpeggio. Stride-2 is one extra frame between writes; just gate the update with a counter.
Tracker notation
ProTracker, FastTracker, FamiTracker, GoatTracker — all use the MOD-format command:
0xy Arpeggio
x = first semitone offset above base note
y = second semitone offset above base note
The cycle is base / +x / +y, looping for as long as the command is on. Example: 047 plays a major triad above the row's base note.
Musical uses
| Application | Purpose |
|---|---|
| Chords | Harmonic support without spending three voices |
| Lead decoration | Add motion to a melody held over a single voice |
| Bass lines | Implied harmony — bass + chord on one channel |
| Rhythmic drive | The buzzy texture itself becomes part of the groove |
Variations
Direction
- Up (C-E-G-C-E-G…)
- Down (G-E-C-G-E-C…)
- Up-down (C-E-G-E-C-E-G…)
Speed changes
Varying the arpeggio stride within a single sustained note creates expression — a fast intro that slows into a held chord, for example.
Combined with effects
Arpeggios layer with:
- Volume envelope (attack/decay shape)
- Pulse width modulation
- Vibrato
- Filter sweeps
By platform
SID advantages
- The filter can smooth the buzz between notes.
- Ring modulation adds inharmonic content for metallic arpeggios.
- All three SID voices are independent — arpeggio on one voice frees the other two for bass and lead, where a chip without it would have to spend three voices on the chord alone.
NES approach
- Clean, sharp arpeggios with no filtering.
- Two pulse channels lets you stack two arpeggios for thicker chords.
- Triangle channel arpeggios produce muscular bass lines.
AY-3-8910 / YM2149
- Bright, cutting timbre — Spectrum 128K and CPC favourites.
- Hardware envelope can interact, giving auto-modulated arpeggios.
- The reason "Spectrum AY music" sounds the way it does.
Composition tips
- Don't overuse — extended arpeggios become tiring to listen to.
- Match arpeggio speed to tempo (faster songs tolerate stride 1; slower songs may want stride 2).
- Consider root motion — moving the base note while the arp pattern stays constant changes the implied chord.
- Use to add energy at key moments rather than as the default texture.