Octave bass
What it is#
The oldest trick in dance music and chiptune alike: alternate the bass note with the same note one octave up (0 12 0 12…) in straight 8ths or 16ths. Instant drive, zero extra channels. Variants: octave on the off-beats only, or up two octaves every 4th hit. Triangle or 25 % pulse works great (source: s-037-lab).
Why it works#
Three reasons, and they are independent of the chip:
- The octave is already in the tone. It is the ×2 partial of the harmonic-series, so doubling at the octave reinforces something the ear is already hearing rather than adding a second pitch. That is why the octave is the one interval the ghost-channel reproduces exactly — every other interval has to be bent to fit a harmonic relationship (source: s-chipmusic-lsdj-ghost-channel).
- On a chip the bass usually carries the beat. rob-hubbard's stated brief was "to try to get a strong bass line and a strong melodic line" (source: s-sidmusic-hubbard-interviews), and in commando there is no kick drum at all — the bass covers the downbeat while percussion is spread over the other voices (source: s-newman-driving-the-sid-chip). An octave hit gives that bass a second accent per beat without spending a channel on it.
- It is arithmetically free. An octave up is the frequency value doubled, so a player can produce it with a shift instead of a table lookup. It shows plainly in ripped data: in dig-dug the paired values are
$10C3/$2187,$0FD2/$1FA5,$0E18/$1C31— each second value twice the first (source: s-sidin01-dig-dug-rip).
How to do it#
Any tracker#
Type the pattern by hand (C-2 C-3 C-2 C-3 …) or, where the tracker has an arpeggio command, run a two-note arp 0 12 at 8th/16th rate (chord-arpeggio).
LSDj#
Two rows of C-2 C-3 work as anywhere else, but the chord command does it in one column: CC0 "plays 0, C, 0, C, 0, C, …" — a true octave alternation at tick rate, slowed with CMD/RATE in the instrument screen. Neighbouring values give the variants: C0C = 0, 0, C (octave every third tick), CCC = 0, C, C, and C00 resets the chord (source: s-lsdj-manual).
The wave channel can also play the octave inside the note: a ghost-channel wave carries a rider at 2× the fundamental, so bass and octave sound together and the octave can be faded or stepped away without touching the bassline (source: s-chipmusic-lsdj-ghost-channel).
A related use of the same interval is the kick that turns into a bass note — start two octaves above and slide down with a P/L pair, or split the two with a groove; the recipes are on wavetable-programming and instrument-design (sources: s-intense-tech-10-kicks-part-1, s-defensemech-every-lsdj-kick).
SID-Wizard#
25 % pulse = pulse width $400 (set with $8x..$Fx in the pulse table or $0E); triangle is a plain waveform entry in the wave table. A short downward pitch envelope in the wave table's Arp column makes the octave hits punchier (instrument-design; source for the table mechanics: s-sid-wizard-manual).
GoatTracker#
Type it, or put it in the instrument: a wavetable whose right byte alternates 00 and 0C (+12 semitones) with the waveform kept (00 left byte) and an FF jump back — the readme's 4-note arpeggio example (41 00 / 00 04 / 00 07 / 00 0C / 00 00 / FF 02) shrunk to two rows; add left-byte delays (01–0F) to slow it to 8ths (derived from the documented table semantics, source: s-goattracker-readme).
SID Factory II#
Same shape, and the manual-level warning that goes with it. In the wave table the second byte is a semitone offset, 0c = +1 octave, and the table runs one row per tick until a 7f xx loop row; repeating a row slows the alternation ("Repeating lines in the wave table can often make instruments sound more pleasant"). Two constraints: slide, portamento and vibrato only work while the offset is 00, so the sustained rows must stay at 00 and the octave belongs on the short rows; and offsets that push the note outside the 8-octave frequency table sound "somewhat random". Values 80–df are static notes read straight from the frequency table regardless of the note played — the documented use is "a static hi-hat before a bass note" (source: s-chordian-sf2-instruments).
Impulse Tracker / OpenMPT#
Jxy is an arpeggio over three notes — "the note playing, a note x halftones above, and a note y halftones above", an effect the manual itself compares to "old C-64 chords". So there is no single command for a strict 0 12 alternation: JCC gives 0 12 12 and J0C gives 0 0 12. For an exact 8th-note octave, type the two rows (source: s-it-manual). See effect-command-crosswalk for the same effect's number in MOD/XM (0xy).
At driver level#
Some C64 drivers put the octave inside the note. In the Ocean driver used by Dunn and Hughes, EFFECT,12 makes every note start an octave up until its release point, so the composer writes only the bass note and the driver supplies the octave attack (source: s-realdmx-ocean-dunn-hughes-driver; pitch-slide-and-portamento). At the small end, the Tiny SID 2 512-byte player spends its third voice on the arpeggio offsets 0 +12 — the whole accompaniment is an octave bass, two bytes of table (source: s-sidin10-tiny-sid-2-part-1).
Tips & pitfalls#
- Put the octave on the attack rows, not the sustain. The SID Factory II rule generalises: in any tracker whose table pitches the note by an offset, a non-zero offset is what slides, portamento and vibrato have to fight. Keep the held rows at
0/00(source: s-chordian-sf2-instruments). - A table octave and a typed octave are not interchangeable. In the table the alternation runs at tick rate and follows the note; typed in rows it follows the pattern and can be broken up, syncopated or left out of a bar. Use rows when the bassline itself should change, tables when every note of the instrument should do it.
- Watch the top of the pitch table. Transposing a bass instrument up in the orderlist can push the
+12rows past the highest note the frequency table holds; SID Factory II reports this as notes that sound "somewhat random" (source: s-chordian-sf2-instruments), and on retuned or underclocked machines the ceiling moves (rom-retuning, alternative-tunings). - The octave competes with a lead in the same register. The alternative when the bass channel is already busy is to put the accent in the timbre instead — a noise frame on the attack turns a 16th bassline into a continuous hi-hat from one channel (channel-interleaving; source: s-newman-driving-the-sid-chip).
Heard in#
rob-hubbard's driver has an instrument flag for an octave arpeggio — "alternating between the original pitch and +1 octave" — heard together with the "skydive" pitch fall in monty-on-the-run and Crazy Comets (source: s-newman-driving-the-sid-chip).
Two 1984 game tunes read from their data in sidin: in David Whittaker's Lazy Jones voice 1 alternates $0426 and $084D (Tognon's note names H1, H2) on every 12-frame step under the melody (source: s-sidin02-whittaker-lazy-jones; whittaker-player); in Datasoft's dig-dug the second voice of the in-game piece plays every note as a pair — $10C3 then $2187, $0FD2 then $1FA5, $0E18 then $1C31 — the second value twice the first, six frames on and two off each (source: s-sidin01-dig-dug-rip). Steve Judd's commando cover in iseq writes the backing as the two-note arpeggio 1 [+0 +12] (source: s-sidin01-iseq).
Related#
rhythm-and-groove · channel-interleaving · pulse-width-modulation · instrument-design · chord-arpeggio · harmonic-series · wavetable-programming
Sources#
s-037-lab · s-sid-wizard-manual · s-newman-driving-the-sid-chip · s-goattracker-readme · s-sidin02-whittaker-lazy-jones · s-sidin01-dig-dug-rip · s-sidin01-iseq · s-chipmusic-lsdj-ghost-channel · s-lsdj-manual · s-it-manual · s-chordian-sf2-instruments · s-realdmx-ocean-dunn-hughes-driver · s-sidin10-tiny-sid-2-part-1 · s-sidmusic-hubbard-interviews · s-intense-tech-10-kicks-part-1 · s-defensemech-every-lsdj-kick