Ghost channel (two notes in one wave)

What it is#

One wave channel playing two notes at once. Instead of alternating between them in time, the two waveforms are added together inside the same single-cycle wave — a low fundamental with a faster wave riding on top of it — so the channel sounds a bass note plus a higher "ghost" note that can be moved, faded or silenced on its own. tyler-barnes named it in 2013: "the ghost Channel or Phantom Channel … a method I've devised in the wave channel of obtaining two sounds being played simultaneously" (source: s-tylerbarnes-ghost-channel-tutorial).

The catch is fixed by arithmetic: the ghost note must be a harmonic of the base note, because both waves have to complete a whole number of cycles inside the same wave (see harmonic-series). An outside description of the same technique puts it exactly: "the higher note must be a harmonic of the lower one, so as to fit in the same amount of space in the wave sample" (source: s-hackaday-gameboy-channelhacking).

It is the frequency-domain answer to the same problem channel-interleaving solves in the time domain and chord-arpeggio solves by speed: more voices than the chip has channels.

Why it works#

A game-boy-apu wave is 32 four-bit samples read in a loop; one pass through the 32 samples is one cycle of the played note. Draw a second wave that completes x cycles inside those same 32 samples and it sounds at x times the fundamental — a genuine second tone, not a timbre change, because the ear separates a strong partial that moves independently from the harmonic stack that stays put. Which second note you get is therefore not free:

overtone xinterval above the base notehalf-wave spacing 16/x (samples)
1the base note
21 octave8
31 octave + 7 semitones (fifth)5⅓
42 octaves4
52 octaves + 4 semitones (major third)3⅕
62 octaves + 7 semitones (fifth)2⅔
72 octaves + 10 semitones (minor seventh)2²⁄₇
83 octaves2

(source: s-chipmusic-lsdj-ghost-channelnitro2k01's table and his rule "you calculate 16/x and that's the number of steps between each alternation".)

Two things ruin the exotic intervals. They are just intervals, "slightly detuned from our modern equal temperament tuning"; and when 16/x is not a whole number of samples the rider has to be drawn unevenly — for the octave + fifth, 5 samples up, 5 down, 6 up, 5 down — which aliases differently at every pitch. Both the author and nitro2k01 land in the same place: "perhaps only index 3 (octave + fifth) is really useful, unless you want to get waves that sound 'bad'" (source: s-chipmusic-lsdj-ghost-channel). In practice the ghost channel is an octave doubler and a power chord, not a chord machine.

The second cost is amplitude. Two waves summed into 16 levels means neither can be loud: "because you're additively piling on waveforms on top of each other, you need extra volume headroom, which means your wav sounds will sound quieter on average" (bryface) — worked around "by making all your other instruments quieter", not by turning the wave channel up. Raising the rider costs the base directly: "you must create more headroom by sacrificing some of your sine wave's amplitude" (source: s-chipmusic-lsdj-ghost-channel). The pulse-splitting experiment in s-hackaday-gameboy-channelhacking pays the identical tax in another register: summing two software voices into one 4-bit amplitude leaves 7 levels instead of 15.

How to do it#

LSDj — drawn by hand (the original method)#

  1. Draw the base. A sine (Lowp, CUTOFF 10, Q 3, VOLUME 08 is the cleanest sine the channel makes — source: s-intense-tech-01-wave-synth-deep-dive-part-1, collected on wavetable-programming) or any smooth wave, at every volume you want the base to take: "starting from silence all the way to the maximum volume".
  2. Add the rider. On a copy of each base wave, push runs of samples up by a uniform amount — the same operation that turns silence into a square, applied to the sine as a baseline. Tyler Barnes counts "1 2 3, 1 2 3" for a rider three units high; the run length is the 16/x above. Repeat for each rider octave.
  3. Add rider volumes. From each superimposed wave, "decrease those Peaks by one pixel every time until you get back to that original sine wave". A three-pixel rider gives three ghost volumes — the rider's dynamic range is its height.
  4. Play it. The wave instrument's PLAY is MANUAL; the note in the phrase sets the base's pitch, the wave frame sets the ghost. "If I want to change the Octave of that square wave I'm going to be changing the frame … the sine wave stays the same octave but only the square wave moves." To move the base under a fixed ghost, do it in reverse: raise the note an octave and step the frame back by the compensating amount. Fxx steps frames relatively, F10 jumps a whole synth (source: s-lsdj-manual).

Labour savers from the thread (source: s-chipmusic-lsdj-ghost-channel): SELECT+B starts a selection, the cursor extends it and UP/DOWN offsets the whole run — this also copies, and SELECT+A pastes; holding A with LEFT/RIGHT or UP/DOWN mirrors the selection. "By using these tricks and abusing symmetries in the waveforms, you can speed up the manual labor a lot." A saw rider works too (steps of 1, 2, 3, 4), but a square rider was found to give "more octaves and a louder sine".

LSDj — with the filter (the cheap route)#

Boost the wanted overtone instead of drawing it. In the synth screen, Allp with a low CUTOFF and a high Q lifts one partial into audibility: "the idea that you can have extra notes in the wave channel — it's really talking about this overtone emphasis that sounds like almost two notes … you've got the low note but then also that octave, or three if you use allpass with Q boosting that fifth: the power chord" (source: s-defensemech-ghost-channel-allpass). Allpass over lowpass, because "no matter how much you boost this Q you really never lose the root note"; lowpass when you want the fifth alone and the top rolled off, which is cleaner but thinner. A Q around 89 is where the fifth sat for defense-mechanism — lower is "kind of subtle", higher "too much".

CUTOFF is calibrated in overtones, so the interval is choosable rather than hunted: every multiple of 10 is one harmonic — 20 the octave, 30 the octave + fifth, 40 two octaves (source: s-intense-tech-01-wave-synth-deep-dive-part-1). That also makes bandpass at CUTOFF 30 with a high Q a third route to the same power chord (inference from the same source — untested here).

LSDj — crunched from audio#

Render the two-note chord you want in any synth or DAW, then let lsdj-wave-cruncher reduce it to a 16-frame synth and liblsdj's lsdj-wavetable-import patch it into the song. This is exactly what the 2013 thread asked for and did not have — "i wonder if there's a tool that can autogenerate these waves and spit out an lsdsng" (source: s-chipmusic-lsdj-ghost-channel); the tooling arrived later (sources: s-intense-tech-05-wave-cruncher-instrument-library, s-intense-tech-08-dotcnts-wave-cruncher). The harmonic constraint still applies: a crunched interval that is not a harmonic of the played note will beat against it.

Other chips#

Any single-cycle wavetable channel with enough sample resolution can be drawn the same way — the constraint is the chip's, not LSDj's. The wiki has no sourced example outside the Game Boy yet; on the sid the equivalent problem is solved with chord-arpeggio and channel-interleaving instead, since its waveforms are generated, not drawn.

Tips & pitfalls#

  • Move the ghost, or it is not a ghost. A static rider reads as timbre. The six demos that open the tutorial are all about independence: ghost volume moving under a steady base, ghost pitch moving, base moving under a steady ghost (source: s-tylerbarnes-ghost-channel-tutorial).
  • Count the frames before you start. (base volume steps) × (rider octaves) × (rider volume steps) waves, in a bank of 16 synths × 16 waves. This, not the drawing, is what makes the hand method expensive — "an awful lot of frames to be manually editing".
  • Never re-enter the synth screen. Editing it regenerates all 16 waves of that synth and wipes the bank you drew — silently in older versions, after a "are you sure you want to override hand-drawn waveforms?" prompt in newer ones (source: s-chipmusic-lsdj-wav-channel-release). Get the base shape from the synth screen first, then draw.
  • Watch the synth boundary. Waves are numbered 00FF in blocks of 16; stepping one frame too far leaves the bank you built. Tyler Barnes runs into it on camera at 21:10 and corrects back.
  • Gate it. E01 mid-note and back to E03 turns a sustained two-note wave into a chugging "fast power chord" (source: s-defensemech-ghost-channel-allpass).
  • Play the notes apart now and then. Sounding the ghost note alone occasionally sells the illusion that there were two players all along — the Hackaday log names this as what makes the technique convincing (source: s-hackaday-gameboy-channelhacking).
  • Do not try to beat the harmonic limit by rewriting wave RAM under the note. It clicks, and the click's pitch tracks CPU load: "the WAV channel is buggy as hell, and produces large clicks when swapping out waves" (source: s-hackaday-gameboy-channelhacking; the hardware rule is on game-boy-apu). From LSDj 7 on, silky wave hides the click for ordinary frame changes (wavetable-programming).

Heard in#

Not sourced. Tyler Barnes's demo song, "Ghost Channel.lsdsng", was posted with the video but the download is dead as of 2026-08-31; bryface reported using the same additive approach on a tune in progress in July 2013, without naming it (source: s-chipmusic-lsdj-ghost-channel).

harmonic-series · wavetable-programming · channel-interleaving · chord-arpeggio · octave-bass · game-boy-apu · lsdj · filter-programming · lsdj-wave-cruncher · levels-and-headroom

Sources#

s-chipmusic-lsdj-ghost-channel · s-tylerbarnes-ghost-channel-tutorial · s-defensemech-ghost-channel-allpass · s-hackaday-gameboy-channelhacking · s-chipmusic-lsdj-wav-channel-release · s-intense-tech-01-wave-synth-deep-dive-part-1 · s-lsdj-manual · s-pandocs-audio-details · s-intense-tech-05-wave-cruncher-instrument-library · s-intense-tech-08-dotcnts-wave-cruncher

source file wiki/techniques/ghost-channel.md · graph