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 x | interval above the base note | half-wave spacing 16/x (samples) |
|---|---|---|
| 1 | the base note | — |
| 2 | 1 octave | 8 |
| 3 | 1 octave + 7 semitones (fifth) | 5⅓ |
| 4 | 2 octaves | 4 |
| 5 | 2 octaves + 4 semitones (major third) | 3⅕ |
| 6 | 2 octaves + 7 semitones (fifth) | 2⅔ |
| 7 | 2 octaves + 10 semitones (minor seventh) | 2²⁄₇ |
| 8 | 3 octaves | 2 |
(source: s-chipmusic-lsdj-ghost-channel — nitro2k01'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)#
- Draw the base. A sine (Lowp, CUTOFF
10, Q3, VOLUME08is 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". - 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/xabove. Repeat for each rider octave. - 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.
- 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.
Fxxsteps frames relatively,F10jumps 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 8–9 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
00–FFin 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.
E01mid-note and back toE03turns 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).
Related#
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