Wavetable programming (waveform / arp tables)
What it is#
Changing a voice's waveform (and pitch) every frame from a table — the way C64 instruments get their attack transients, percussion and arpeggios. A couple of frames of noise before a tone makes a snare or a pluck; a fast pitch drop at note start makes a kick out of any voice; a tiny downward pitch envelope makes a bass punchy (source: s-037-lab). The SID-Wizard book calls successive rapid waveform changes "another common way of creating more complex sounds (for example drums)" (source: s-witchmaster-creating-chiptunes-with-sid-wizard). The term itself, in the C64 community, means "a synthesis method, where the waveform and frequency of a SID voice is modulated so fast, that the resulting output sounds like a new waveform … The parameter changes are stored in a table" — unrelated to sample-based "wavetable synthesis"; the frames are 20 ms because the players run from the 50 Hz raster interrupt (source: s-ucapps-wavetable-sounds-tutorial-1).
Why it works#
Updating the waveform at the frame rate makes two sounds appear to play at once: in rob-hubbard's driver "Drums are made from a noise channel and also a fast frequency down, with fast decay. Bass drums use a square wave, and only the first 50th of a second is a noise channel" — the noise "simulates the strike of a stick while the pitched waveform and pitch drop simulates resonance, body, and decay" (McSweeney 1993, quoted in s-newman-driving-the-sid-chip). The same one-frame noise burst on a pitched instrument adds a percussive layer: sanxion's bass is also its hi-hat. Lasse Öörni learned it the slow way — "I used to play back songs slowed down so that I understood how drum sounds (e.g. Hubbard) were pieced together from frames of noise, triangle, pulse etc." — and names the simplest start: "adding a frame of noise waveform into the beginning of notes to get a bit more rhythm to them" (source: s-lemon64-learning-sid-sound-design). The brief behind Hubbard's recipes, in his words: "My main thought was really to try to get a strong bass line and a strong melodic line." (source: s-sidmusic-hubbard-interviews); jeroen-tel's ideal for C64 music starts the same way — "Funky basslines in combination with snappy drums" (source: s-hugi38-interview-jeroen-tel). martin-galway envied exactly this part of Hubbard's driver: "I wouldn't have minded having a go with his software and doing music in my style with his percussion" — the Arkanoid title "needed better drums of course" (source: s-remix64-galway-interview).
How to do it#
SID-Wizard#
The Waveform-Arpeggio-Detune table (Shift+W in the instrument panel; at least one row is required), three columns per row, one row per frame:
| column | values |
|---|---|
| WF | $00–$0F repeat only the arp/detune columns for 1–16 frames (no waveform change) · $10–$FD waveform/control byte written to the SID (waveform bits + test/ring/sync/gate) · $FE xx jump to row xx (≥ $40 jumps to itself = hold) · $FF END (shown, not typed) |
| Arp | $00 original pitch · $01–$5F semitones up · $E0–$FF semitones down · $81–$DF absolute pitch ($81 = C-1, $8D = C-2, $99 = C-3, $A5 = C-4, $B1 = C-5, $BD = C-6, $C9 = C-7, $D5 = C-8) · $80 NOP · $7F jump to the chord (chord speed override in the WF column) |
| Detune | $00–$FE detune up · $FF keep |
Waveform nibble: 1 triangle, 2 saw, 4 pulse, 8 noise (add to combine, noise excluded; pulse needs a pulse-table row); control nibble: 1 gate, 2 sync, 4 ring, 8 test. Shift+SPACE marks a row to be executed on note-off — "more control on the release phase … reverb-like effects by changing the waveform". Related instrument settings: Frame-1 waveform (the byte for the note's first frame, normally $09 = test + gate), WF-Arp table execution speed (run the table slower than 1 row/frame; >$40 also runs the pulse table at multispeed, >$80 the filter table), = negates a value. $09 xx in the pattern jumps to a table row; $04 xx writes the waveform/control register directly (above $F0 jumps to a table position); $4x sets the waveform as a small effect. An arp entry cancels slides and vibrato. In the Extra player program tables are never skipped even at fast tempos (sources: s-sid-wizard-manual, s-witchmaster-creating-chiptunes-with-sid-wizard).
The book's snare (all absolute pitches, so every key sounds the same): 81 CE (noise at F-7), 41 AD, 41 AC (two frames of pulse at G#4 and G-4 — "a tone to the snare"), 80 C4, 80 C5 (noise with the gate off, so the release starts even while the key is held); pulse table 88; ADSR decay D, sustain E, release 9 (source: s-witchmaster-creating-chiptunes-with-sid-wizard).
GoatTracker#
Wavetable rows are left right bytes: left 00 keep waveform, 01–0F delay 1–15 frames, 10–DF waveform/control, E0–EF the inaudible values $00–$0F (E9 = test + gate), F0–FE execute pattern command 0–E (right = parameter; not 0, 8, E), FF xx jump (00 = stop); right 00–5F semitones up, 60–7F down, 80 keep frequency, 81–DF absolute C#0–B-7. A delay or "no change" must not be the instrument's first row. Rows with a delay or 80 let vibrato and realtime commands run underneath (rastertime!). Examples from the readme (from table row 1):
| rows | sound |
|---|---|
21 00 / FF 00 | sawtooth on the note's pitch |
41 00 / 11 00 / FF 00 | "flute": pulse on the first tick, triangle after |
41 01 / 40 00 / FF 00 | "koto": one halfstep up on the first tick, then the note with the gate cleared |
81 D0 / 41 AA / 41 A4 / 80 D4 / 80 D1 / FF 00 | snare drum, all absolute notes — "use pulsewidth 800 for best result" |
81 DF / 41 00 / FF 00 | pulse note preceded by a short noise at B-7, "like a hi-hat" |
41 00 / 00 04 / 00 07 / 00 0C / 00 00 / FF 02 | 4-note looping arpeggio, waveform unchanged in the loop |
21 00 / 02 03 / 02 07 / 02 00 / FF 02 | delayed minor-chord arpeggio, three ticks per step |
41 00 / 03 80 / 11 80 / 03 80 / 41 80 / FF 02 | pulse ↔ triangle every 5 ticks with frequency untouched (vibrato and slides keep working) |
81 CF / 21 00 / 08 00 / F6 2A / FF 00 | noise, then saw, then after 8 frames set sustain/release $2A from inside the table |
Instrument pointers select the start row; 8XY in a pattern jumps into a table mid-way; "Wavetable is never skipped" at any tempo (source: s-goattracker-readme).
SID Factory II#
Rows are waveform note, one per tick, until a 7f xx loop row; repeating a row slows the change ("Repeating lines in the wave table can often make instruments sound more pleasant"); the note byte is a semitone offset (0c = octave) — but slides, portamento and vibrato only work while it is 00, so keep offsets on the short attack rows; 80–df are static frequency-table notes that ignore the played note. The tutorial's oldskool snare: 81 ca / 41 a8 / 41 a4 / 80 ca / 7f 08 — one tick of high noise, two of pulse at descending medium pitches ("a 'thunk'"), then gated-off noise looped so the drum goes into release however long the sequence holds it. Keep rows gated on until the loop; toggling the gate row by row gives "a wobbling volume that you can't always trust" (source: s-chordian-sf2-instruments).
CheeseCutter#
The wave table is two columns, transpose and waveform, read one row per frame (source: s-cheesecutter-guide):
| column | values |
|---|---|
| transpose | 00–5F relative semitones · 80–DF absolute · 7E stop · 7F wrap (byte B holds the wrap point) |
| waveform | 00 keep · 01–0F override the wave delay for the previous row · 10–DF SID waveform/control byte · E0–EF the inaudible values $00–$0F |
The 01–0F delay applying backwards to the row above is the unusual part — it lets one row hold for several frames without a second table entry. Pulse, filter and chord live in separate tables, each with its own jump/stop convention, and chord program 0 doubles as the swing-tempo program when song speed is 0/1 (shuffle-funktempo).
From a register dump: Hubbard's Auf Wiedersehen Monty bass drum#
Thorsten Klose traced the drum with siddump (channel 2 at 0:38, one row per 20 ms frame) (source: s-ucapps-wavetable-sounds-tutorial-1):
| frame | frequency | note | control byte | ADSR | role |
|---|---|---|---|---|---|
| 1 | $0EA3 | A-3 | $11 triangle, gate on | 08F8 | the pitched thump |
| 2 | $40A3 | B-5 | $81 noise, gate on | — | the stick |
| 3 | $0B23 | E-3 | $41 pulse, gate on | — | body |
| 4 | $0923 | C#3 | $40 pulse, gate off | — | release starts |
| 5 | $03CE | A#1 | (unchanged) | — | the pitch keeps falling into the fade |
The steps are +26, −31, −3 and −15 semitones — which is why such a table needs absolute pitches. As a goattracker wavetable (a translation, not the source's): 11 AD / 81 C7 / 41 A8 / 40 A5 / 40 96 / FF 00, ADSR 08/F8 — siddump's absolute-note bytes use the same $80 + semitone numbering as GoatTracker's 81–DF (C#0–B-7), so the dump's AD C7 A8 A5 96 can be typed in unchanged; the pulse width is cut from the published dump (the readme's snare uses $800). In sid-wizard the same rows go into the WF-ARP table with absolute Arp values from the note chart ($81 = C-1 …), checking the octave by ear — SID-Wizard's octave names need not match siddump's. On real hardware the triangle frame was swallowed by the envelope delay (hard-restart): with release 8 "the gate is delayed by up to ca. 30mS". The tune itself (the sequel of monty-on-the-run) was made in "2 days working with Ben [Daglish] at their office" at Gremlin's request (source: s-sidmusic-hubbard-interviews).
Two more frame idioms read from dumps by 4mat (Gallefoss, Electronic Transfer, 5×): a lead whose attack "is just pitching up from a lower note over a few frames" through the table ("you could use an un-looped arpeggio to do the same thing"), the whole preset then looping "with the gate off so it fades out which gives the echo effect" (fake-echo); and a thick "noise slide" made by "a really tight instrument preset switching from noise to triangle(?) every couple of frames" (source: s-chipmusic-sid-music-hints-n-tips).
DUSK (DUET)#
- duet's DUSK plays a P## sample as a row of equal single-cycle frames (frames = sample length / FRAME; "2048 is the Polyend standard") and morphs between the two nearest frames; a slow LFO routed to
morph"is the classic wavetable sweep"; ALIASrawkeeps the aliasing on purpose (source: s-duet-docs-dust-dusk).
Furnace#
furnace does the same with a per-tick waveform macro in the instrument (plus arpeggio and pitch macros for the note column) and, from the pattern, 10xx — 01 triangle, 02 saw, 04 pulse, 08 noise, sums for combinations (source: s-furnace-c64-docs).
LSDj#
Two different things are "wavetables" on the Game Boy:
- Instrument tables — six columns (amplitude envelope, transpose, two command/value pairs), one tick per step by default, started by the instrument's TABLE setting or
Axx, looped withH, with probabilistic hops viaB. They do what the SID-Wizard wave/arp table does: pitch drops for drums (transpose column +L/P), noise-then-tone attacks (switch instruments/Eper row), custom envelopes (tremolo example in the manual). With TABLE set to STEP the table advances one row per note trigger — a per-note sequence. - The wave channel's synth: 16 synth sounds × 16 four-bit waves. The synth screen generates them from a SIGNAL (square, saw, triangle, custom), FILTER (low/high/band/all-pass), DIST (CLIP/FOLD/WRAP), PHASE (PINCH/WARP/RESYNC), fading VOLUME, CUTOFF, Q, VSHIFT, LIMIT and PHASE from the first wave to the last. WAVE instruments play them ONCE, LOOP, PINGPONG or MANUAL;
Fxxsteps through frames by hand (F10= next synth sound),Wxychanges synth speed/length. The wave screen edits single waves.
(source: s-lsdj-manual)
LIMIT is not a volume control, and that is the point (source: s-defensemech-learning-lab-shorts): VOLUME scales the signal before the rest of the chain, so turning it down destroys the clipping or wrapping that made the sound — "you can't get it to wrap if the volume isn't high" — while LIMIT constrains the dynamic range afterwards and keeps the shape. Ramped across a synth's 16 waves it is also the fade the E command cannot give (E steps 0 / 25 / 50 / 100 %). There is no LIMIT command for the phrase screen, so different levels mean different synths. VSHIFT finally has a rule from the same clip: it is to DIST what Q is to the filter — with CLIP it merely squashes the wave against the ceiling ("a sound-bad button", "just a way to make it quieter"), but with FOLD or WRAP the shifted part folds or wraps back in and "that's almost like a pulse-width modulation thing happening" (pulse-width-modulation). 10 lifts the wave about one step; FF is silence. In older versions VSHIFT wrapped regardless of the DIST setting.
Sweeps longer than one synth (same source, credited to hypnogram): slice the CUTOFF range across consecutive synths — synth 1 1→2, synth 2 20→30, synth 3 30→40, Q around 5–7 — and play the matching instruments in sequence, each PLAY ONCE at a slow SPEED. The sweep then continues past the sixteen-frame limit, at the cost of a synth per slice.
The instrument side of the synth (source: s-painperdu-02-wav-channel-walkthrough): LENGTH is how many of the 16 waves the cycle uses, REPEAT is how many frames at the end of that cycle repeat afterwards — "if you play with this cleverly you can have really interesting rhythmic wave cycles" — and SPEED is ticks per frame, which belongs to the groove rather than to taste: SPEED 6 under groove 6/6 advances one wave per step, SPEED 5 under groove 5/5, and so on. SPEED 1 "is more clipping than actual modulation". MANUAL is the quiet mode because only one wave is ever read, so no frame change occurs. Two corrections from the same source: hand-drawn waves are not restricted to MANUAL — "one of the most common misconceptions is that the hand-drawn waves in LSDj are only accessible when you set this to MANUAL … [they] are available even when you're in PINGPONG and LOOP and ONCE" — and F offsets that run past a synth's sixteen waves bleed into the next synth's waves, which is a way to make one note evolve out of its own timbre.
Hand-drawn banks and their hazards (source: s-chipmusic-lsdj-wav-channel-release): the synth screen is a generator, the wave screen an editor, and re-entering the synth screen overwrites all 16 of that synth's waves — later versions warn first ("are you sure you want to override hand-drawn waveforms?"), older ones do it silently. F is relative and accumulates, so F05 F05 lands on frame 0A; a wave — a section of one or a whole one — can be copied and pasted between waves in the WAVE screen (SELECT+B, highlight, B, then SELECT+A on the target), which is what makes a 16-wave hand-drawn bank affordable at all (source: s-painperdu-05-shortcuts-and-workflow); F10 steps into the next synth, which is also how two synths are chained into a 32-frame animation. Frame changes clicked on hardware until LSDj 7's silky wave; the standing advice was to set the frame rate so the clicks fall on 16ths, where percussion masks them.
A wave can also hold two notes at once: draw a second waveform at 2× or 3× the fundamental on top of the first and the channel sounds a bass note plus an independently steerable higher one — the ghost-channel (sources: s-chipmusic-lsdj-ghost-channel, s-tylerbarnes-ghost-channel-tutorial). The 2020 answer needs no drawing at all: an allpass filter with a low CUTOFF and a high Q (around 8–9) lifts one overtone into audibility while passing everything else — "the nice thing about the allpass is that no matter how much you boost this Q you really never lose the root note", where lowpass isolates the fifth but throws away the edge. Both give "this overtone emphasis that sounds like almost two notes … the power chord" (source: s-defensemech-ghost-channel-allpass).
The hardware under the wave channel (sources: s-pandocs-audio-registers, s-pandocs-audio-details): wave RAM ($FF30–$FF3F) holds 16 bytes = 32 four-bit samples, played upper nibble first at 32 × the tone frequency (65536 ÷ (2048 − period value) Hz — one octave below a pulse channel at the same value, which is why WAV is the bass channel). There is no envelope, only the NR32 output level 100 / 50 / 25 % (a right shift of the samples) or mute — LSDj's VOLUME setting and E00–E03. Wave RAM can only be rewritten while the channel is inactive (on the DMG only in step with the channel's own reads; on the Color a write lands on the byte being played), so every wave or synth-frame change means stopping and retriggering the channel; a retrigger resets the read index but keeps the last sample in the output buffer, and on monochrome consoles retriggering while a byte is being read corrupts the first bytes of wave RAM. Pan Docs names the two classic uses: "shortening" the wave by repeating a pattern or doubling samples and read rate, and "lengthening" it by reloading wave RAM as soon as it has been read once — "sometimes used for full-on sample playback", which is presumably how LSDj's kits and speech play on this channel (inference).
Drum tables from Intense Tech (sources: s-intense-tech-10-kicks-part-1, s-intense-tech-11-kicks-part-2): the wave kick table is a fast P on the first line (how quickly the pitch falls from the played note) and on the second an L with transpose 80 — the slide stops at the lowest note instead of wrapping to the top, survives tempo changes (DRUM-mode P/L ignore tempo) and leaves the attack tunable by the note (C5–C7) and the P speed. The "Kyoto kick" (popularised by Toriena) puts a noisy, gritty wave in slot 00 and the clean kick in 01–0F, switching with F01 on the second table line — or without any command by setting PLAY LOOP, LENGTH 1, REPEAT 0, SPEED 01, which plays wave 00 for one tick and then jumps to 0F. A kick that becomes a bass note: in LSDj 7 with DRUM pitch, start two octaves up and let the L line carry transpose E8 (−24); in LSDj 6 it needs FAST pitch and instrument TRANSPOSE ON — line 1 transpose 0C with a two-tick P down, line 3 transpose F4 with an L. A wave snare is the same shape, P then L to the note the snare is tuned to, E commands trimming the decay, layered with a noise snare.
The wave synth in depth (sources: s-intense-tech-01-wave-synth-deep-dive-part-1, s-intense-tech-02-wave-synth-deep-dive-part-2, s-infu-getting-started-with-lsdj): a wave is 32 four-bit samples, and the number of cycles inside the frame is the harmonic that sounds, so the synth's CUTOFF reads as harmonic numbers — every multiple of 10 is one overtone (20 the octave, 30 octave + fifth, 40 two octaves). SIGNAL saw = all harmonics, square = odd harmonics (the pulse channels' 50 % sound), triangle = odd harmonics falling off faster (the deep NES-style bass); there is no sine, but Lowp with CUTOFF 10, Q 3 and VOLUME 08 extracts one — the lowest, cleanest bass and kick wave the channel can make. PHASE Normal compresses the wave and pads it with silence, so Square with Phase 00 → 1F is a pulse-width sweep ("SID lead"; Triangle gives a vocal-like lead); Resync repeats the compressed wave to fill the frame (new overtones), Resync2 repeats without compressing (quieter). DIST governs overflow when VOLUME or Q exceed 0–F: Clip squares the wave off, Fold (version 6) mirrors the excess for resonant highs, Wrap throws it to the opposite edge for buzz; VSHIFT follows the DIST type in version 6 (FF with Fold inverts the wave). LIMIT (version 6) clamps the samples afterwards (5 = 5–A) — the fine volume control the hardware's four levels lack, and with different start and end values a volume fade. Infu's rules of thumb: Q does little until CUTOFF moves, VOLUME above 20 triggers DIST, LIMIT above 0F rarely helps, instrument LENGTH skips waves, and W sets SPEED and LENGTH from a phrase. A synth's parameters interpolate from the first to the last of its 16 waves, so a kick and a bass can share one synth: the kick plays the first wave, the bass loops the rest.
LENGTH changes resolution, not the endpoint (source: s-defensemech-wave-channel-ramble). The synth always travels from wave 0 to wave F; LENGTH decides how many of the sixteen are generated and spreads them evenly — "it actually always plays from zero to F, but it will only play as many frames and it will interpolate those … it kind of skips frames in the middle to equalize them". The chart, written out by defense-mechanism himself (so not subject to transcript error):
| LENGTH | waves generated | LENGTH | waves generated | |
|---|---|---|---|---|
0 | 0 | 8 | 0 1 3 5 7 9 B D F | |
1 | 0 F | 9 | 0 1 3 5 7 8 9 B D F | |
2 | 0 7 F | A | 0 1 3 4 6 7 9 B C E F | |
3 | 0 5 A F | B | 0 1 2 4 5 7 8 A B D E F | |
4 | 0 3 7 B F | C | 0 1 2 3 5 6 7 9 A B D E F | |
5 | 0 3 6 9 C F | D | 0 1 2 3 4 6 7 8 9 B C D E F | |
6 | 0 2 5 7 A D F | E | 0 1 2 3 4 5 6 7 9 A B C D E F | |
7 | 0 2 4 6 9 B D F | F | 0 1 2 3 4 5 6 7 8 9 A B C D E F |
Three more from the same source. The filters are not filters: "this is a wavetable synthesizer, it's not a subtractive synthesizer — so the filters that you see here are actually just kind of emulated" — the filtering happens when the sixteen waves are generated, not on the output, which is why CUTOFF behaves like a harmonic selector rather than a tone control. The harmonic ladder runs further than the 20/30/40 rule above: with bandpass and a high Q, CUTOFF 10 is the fundamental, 20 the octave, 30 the fifth above it, 40 two octaves, 50 a major third, 60 another fifth, 70 "an out-of-tune kind of seventh", 80 another octave, 90 "like a major second", A0 "another major third", B0 "a sharp fourth", C0 a fifth, D0 "almost like a sixth … kind of a flat seventh" — above that the synth "probably only generates up to here really" (harmonic-series). And adding an overtone is multiplying the wave: on the oscilloscope, raising CUTOFF from 10 to 20 "kind of replicate[s] your waveform … every time you add an extra overtone you multiply the waveform", which is also what PHASE RESYNC does by another route — the mechanism the ghost-channel exploits, stated from the outside.
LIMIT ramped into a self-sidechain (same source): with LIMIT 0 on the first wave and F on the last, PLAY LOOP and the loop point at the end, the instrument ducks and recovers on every note — "now we can have this going from zero to F and have this kind of naturally do its own sidechaining", SPEED and LENGTH setting the recovery time and a start value above 0 keeping the duck out of silence. "You could do more than LIMIT too — you could do VOLUME here, you could do Q." He notes this only became practical once the wave channel stopped clicking (sidechain-pump).
How the wave channel changed from version 7 to 9.2 (sources: s-intense-tech-12-scoping-out-new-features, s-intense-tech-14-lets-appreciate-version-8, s-intense-tech-19-new-noise-and-910-news, s-intense-tech-21-whats-new-in-lsdj-92): version 7 introduced silky wave — a timer moves the wave-RAM rewrite to "a more opportune time", so the hardware click of every frame change disappears and a synth at SPEED 01 becomes "eminently more audible at its intended frequency"; version 7 also brought a wave-channel oscilloscope, a wave instrument FINETUNE of -F…+F and the R8x super-fast retrig, which brings the old wave-channel pitch wrap back as a tunable effect (retrigger). Version 8 renamed REPEAT to LOOP POS (the position of the loop point; 0 repeats every frame within LENGTH), made R restart the synth from its first frame, made MANUAL the default play mode and allowed cloning a synth from the wave instrument screen with SELECT+(A,B) on the synth number. Version 9.1.0 gave FINETUNE two digits (an old 01 equals a new 10), gave LIMIT two digits so that values above 0F overdrive — with CLIP the samples wrap and new higher harmonics appear — and made wave F commands immediate again: silky wave had delayed them since version 7, so the slight click returns but frame changes land exactly on the tick. Contradiction: Infu's rule that LIMIT above 0F "rarely helps" (source: s-infu-getting-started-with-lsdj) vs Defense Mechanism presenting the overflow of 9.1.0 as a deliberate overdrive worth trying. Version 9.2 fixed waves that had been inverted and displaced by one sample and rebuilt PHASE: PINCH and WARP are the old NORMAL with better interpolation (PINCH also with less DC offset), the new RESYNC is a smoother version of the old RESYNC that sounds close to the old RESYN2, and the new RESYN2 is the old RESYNC "for when you really want to get dirty with aliasing" — which is how the Normal/Resync/Resync2 description above maps onto the manual's PINCH/WARP/RESYNC/RESYN2; the synth screen also swapped the positions of CUTOFF and Q. A new WAVE instrument play mode RESYNC is PINGPONG without silky wave: SPEED 1 gives the low undertone of versions up to 7.3.3, and slower speeds switch frames exactly in time, which is audible on low bass notes.
LIMIT as a volume control (source: s-intense-tech-15-lets-mix-it-up-and-down): where E02 (50 %) is too soft and E03 (100 %) too loud, LIMIT caps the waveform regardless of the instrument VOLUME — 8 gives about 50 % at VOLUME 3, 9 about 56 %, E about 94 % — and different LIMIT values on the synth's first and last wave, run by W (speed and length), make a volume envelope (volume-slides).
Sample-derived wavetables — the wave cruncher (sources: s-intense-tech-05-wave-cruncher-instrument-library, s-intense-tech-08-dotcnts-wave-cruncher): lsdj-wave-cruncher (by DOTCNT) reduces one tonal note to a series of 4-bit waveforms, one reduced cycle per wave, that fill the 16 frames of a synth — it "turns the wave synth itself into a rudimentary sampler". Command line: crunch SAMPLE.WAV A4 (or the frequency in Hz, or auto, which takes 30–60 s and can fail on complex waveforms) with --normalize, and --linear (one cycle from each of 16 equal slices of the sample) or --exp (more frames from the attack, fewer from the decay) instead of the default first 16 cycles; --channel=0|1 picks a side of a stereo file, --output= names the .snt, --analyze only reports the detected pitch. Bells, FM electric pianos and steel drums work; snares and other non-tonal sounds do not. The .snt is written into a synth slot of a save or an .lsdsng with liblsdj's lsdj-wavetable-import savefile.sav synth.snt 0 (a save is patched only in its working-memory song), so the instrument travels with the song, unlike kit samples in the ROM; play it as a WAVE instrument with PLAY ONCE, LENGTH 3, SPEED 3 as a starting point and adjust to the tempo. Ready-made .snt files are collected in the lsdjsynths repository (psgcabal on GitHub).
Articulating a wave instrument — the flute problem, "all the tutorials I find are just about kick drums and snares" (source: s-chipmusic-lsdj-wav-instrument-tutorials). Victory Road's recipe is a table trick, not a waveform trick: start from a sine or triangle "maybe with a couple notches in it for some extra harmonics", make the first frame of the synth quite a bit louder than the rest, set PLAY to MANUAL, and put an F01 on the first tick of the instrument's table. The loud first frame is the attack, and because a table only restarts when the note carries the instrument number, omitting the instrument number slurs — "you can imitate tonguing and slurring in the phrases by removing the instrument number from notes that you want slurred" (lead-articulation). Flutter tonguing: give the third frame a slightly different volume and shape, then alternate frames two and three from a separate table started with A — "F01 to move ahead, FFF to move back" (FFF is −1 in F's relative arithmetic). tyler-barnes adds noise-burst frames for the breath of the attack; an0va argues against imitation altogether and works subtractively: "Start with sine or a thick square so you have a lot of bass — then mess with parameters and chip away at the bass frequencies until you get something you like. It's like ice sculptures then." (He also settles which end of CUTOFF is which: 00 is the low end, FF the high, which is why a high-pass instrument at the default FF seems silent.)
The instrument number is what retriggers the wave cycle (source: s-painperdu-01-instrument-retriggering). A note without an instrument number plays with whatever is already running; the number re-reads the settings and restarts envelope, table and the synth's wave cycle. So a PINGPONG instrument with LENGTH F and a slow SPEED never gets heard in full if every note is triggered — "I cannot actually hear the full range of wave cycles" — but trigger it once every four notes and the whole cycle plays: "if you have something that cycles through waves really slowly you can have rhythmically evolving waves that are really interesting". The practical wrinkle is that kicks usually live on the wave channel too, and a kick is a different instrument, so it retriggers the lead when the lead returns; the fix is to size the cycle to the gap — LENGTH 3 at SPEED 6 completes between 16th-note kicks. The same rule reshapes tables: with TABLE set to AUTOMATE the table advances per instrument value, so an L/R panning table gives L R L R when every note is triggered and L L R R when only every second one is (stereo-panning).
Two more instrument-level moves: F3 on a three-frame bass offsets the wave cycle so the note does not start at its quietest, and different offsets on successive hits "makes a bit of differentiation to something that's really four-to-the-floor"; and a filter sweep can be built into the synth itself — high cutoff on the first wave, low cutoff with high resonance on the last, so the note "cycles through a very abrasive squarey sound" on its own (source: s-painperdu-03-isometric-sav-walkthrough).
Nesting tables with A (source: s-intense-tech-09-lets-table-this-discussion): tables are "arguably the sole most useful feature to shape your sounds" and there is never a spare one — there is nothing beyond table 1F. The volume column is level + hold ticks (36 = volume 3 for six ticks; on the wave channel the level is only 0–3), and a completely filled column loops from the top while a partly filled one holds its last level. A in the command column stacks a second table under Automate — one command in the phrase, one in table 01, A02 in its second column and two more in table 02 gives "a total of four commands at once"; without Automate it simply extends the current table into the named one. A20 or higher stops the table without needing a K, "since no tables beyond 1F exist". And a quirk worth a free stereo widener: two channels playing the same Automate instrument at the same time split the table between them — channel 1 takes the even-numbered rows, channel 2 the odd ones, "easy stereo panning or similar effects using only one table, one instrument, and one phrase".
Transients by waveform switch (source: s-defensemech-every-lsdj-kick): put a harsh wave in the synth's first frame and step off it with an F on the first tick — and copy the frame you want to keep before editing the synth, because the synth screen regenerates the whole bank. The same trick on the pulse channel is offered untested; the wave channel's advantage is simply that it reaches lower (the pulse channels stop at C2).
Drum tables in the classic drivers (1986–1988)#
- matt-gray-player: in 1987 a drum was effect bit 2 — a different control register "for the first two frames" of the note (source: s-sidin02-matt-gray-driller); by V4.2 a drum table of (control register, pitch) pairs per frame,
DT: $81,$30, $11,$02, $41,$04, $80,$30, $80,$15, $80,$20, $80,$10 … $FF— a pair with bit 7 set is written as absolute waveform + frequency-high, one without subtracts the pitch byte from the note's frequency; plus a hi-hat routine ($81at frequency-high$50) (source: s-matt-gray-dominator-source). Tognon's walkthrough decodes the convention: a control byte with bit 7 set ($8x, noise) sets the frequency high byte to the value that follows, one without ($1x,$4x) subtracts it from the current note — "a 'negative value' of control register is when you choose a noise waveform … while a 'positive' value is for the other waveform (like$4x) that you can use for a bass". SoDTreads:$81,$30noise at$30xx,$11,$02triangle at note −$02xx,$41,$04pulse at note −$04xx, then gate-off noise frames stepping$30, $15, $20, $10, $20, $20, $10, $20; the siblingBTis$81,$30,$41,$03,$40,$03, then noise alternating$20/$10. Pairs run up to 127 per table and end with$FF; the separate hat effect bit is "a brief noise waveform at frequency$50xxplayed after every note duration decrements", and effect bit 4, implex, switches waveform for just the first frames of a note — a pre-tracker hard-restart (source: s-sidin14-dominator-player).
Gray on where the idea came from: "Created from scratch, but there were fundamental things that mine and say Rob Hubbards also did. I did borrow his idea of drum tables but it was always coded from scratch … My vibrato routine was very different to his and Martin Galway's" (source: s-sidin15-matt-gray-interview). And the reason a table drum is worth its rastertime at all, from the same composer: the Bangkok Knights loader is "my best Rob impression … a fast bass line with a small hat on each note. That was all one channel, but it was a good way to get some extra rhythmical or drum element in without taking a whole channel up" (source: s-vandalism63-matt-gray-interview; channel-interleaving).
- musicfile:
drumtabelentries are a length byte, a waveform list and a pitch list —$0b; $81,$81,$20,$20,$10,$10,$10,$10,$10,$10,$10,$10over$34,$0a,$08,$06,$04,$05,$06,$05,$04,$05,$06,$05— two frames of noise, then sawtooth and triangle falling; awavearptable ($80,$10,$80,$10) alternates noise and triangle (source: s-realdmx-sid-players). - tfmx: the per-note script plays "very short drum sounds with a fixed pitch just before a pitched bass sound" on the same voice (source: s-emuwiki-huelsbeck-interview).
- soundmonitor had no wave table: a sound has one waveform at key-on and one at key-off (registers 0 and 8), so its drums were envelopes and slides — "a triangle wave sliding down" (sources: s-64er-soundmonitor-article, s-vgmpf-soundmonitor-tfmx).
- matt-gray: "I also had to write routines to emulate drums by switching waveforms in a certain sequence. I think that was originally Rob Hubbard's idea" (source: s-rvg-matt-gray-interview).
- hubbard-player, the original: no table — an instrument flag. The note starts with the instrument's control byte (noise
$81for the drum instruments), the first tick continues as noise with the gate off, then every frame the instrument's own waveform with the gate cleared while the frequency high byte decrements by one — "Fast attack/decay and a rapid downwards frequency slide creates this sound" (McSweeney). Drum instruments in Monty:$00,$08,$81,$02,$08,$00,$00,$01(noise),$00,$08,$41,$06,$0a,$00,$00,$01(pulse),$00,$00,$11,$0a,$fa,$00,$00,$05(triangle + octave arpeggio) (source: s-realdmx-hubbard-player). - ocean-music-driver (1988): "DunnyDrums" — per-frame (control byte, frequency-high) tables with AD forced
$00:BASS DRUM $41,$41,$10,$80 / $0E,$06,$0F,$10;SNARE $41,$41,$40,$80,$80,$80,$10,$80,$10,$80,$80,$10,$80 / $11,$0C,$08,$70,$70,$2F,$0C,$2E,$0C,$2D,$BC,$0C,$2B— noise at$70alternating with gated-off pulse/triangle at$0C;HI-HAT $11,$11,$80,$80,$80 / $10,$10,$70,$20,$30(source: s-realdmx-ocean-dunn-hughes-driver). - bjerregaard-player: drums are ordinary instruments — a wave program starting with noise (
W0 ;BASSDRUM $01,$81,$41,$40,$FE,W1 ;LONGSNARE $01,$81,$11,$40,$80,$40,$80,$FE) plus a note program that is either absolute notes or, with bit 7 in its first byte, raw$D401bytes:N2 $81 / $58,$08,$06,$04,$03,$02,$03,$04,$03,$FE(source: s-realdmx-bjerregaard-player). - MoN, more rows: the test tune's snare
dwa0 $0b; $81,$41,$40,$40, $80,$10,$80,$10, $80,$10,$80,$10overdto0 $2d,$08,$06,$04, $2d,$10,$2d,$02, $2d,$02,$2d,$02(noise, pulse, then noise/triangle alternating at two pitches — a snare with a hi-hat tail); Armada's bass drum$81,$41,$40 … $40over$50,$0a,$08,$06,$05,$04,$03,$02,$02,$01,$00,$00; the 1990 player's looping pairdw7 $80 / $81,$11,$11,$11,$11,$11,$11,$10,$fewithdt7 $80 / $e0,10,8,6,5,4,3,2,1,$fe($fe= hold) (sources: s-realdmx-deenen-test-tunes, s-realdmx-ouwehand-mon-tunes). - galway-player has none: a drum is a frequency adder of −80 per frame and a short gate (
ISET $00,$b0 / ISET $08,$ff / ISET $1a,$a9 / ISET $1b,$0a); Arkanoid's percussion is synthesized through$D418instead (chip-samples) (source: s-realdmx-galway-rambo-player). - Scene players: Red's
digiwave $00,$81,$11,$81atdigifreq 0,$55,$0a,$44for the first three frames, then the real note; Whittaker's alternate-frame$80with the pitch+ $31(source: s-realdmx-fredgray-kimmel-whittaker); Audial Arts' drum = an arpeggio table of absolute pitches (ap2 $5f,$1e,$1c,$18,$14,$10,$0e,$0c) plus a waveform pattern (wv2 $81,$41,$40,$40,$40,$40,$40,$40,$ff) sharing one counter; FAME'swtab1 $81,$41,$40 ×9,$08ending on the test bit as a mute, withtab1 $26,$0b,$08,$05,$03,$01,$00,$ff,$fe,$fd,$fcas the pitch (source: s-realdmx-audial-arts-fame-players).
Iseq (2002): the three-call drum#
Judd's description of a drum in his register-level editor iseq is the recipe every table player encodes: "1st player call: waveform=$81 freq=$a000 (or whatever); 2nd player call: waveform=$11 freq=$a000; 3rd player call: waveform=$41 freq=original value" — the instrument's fixf "restores the frequency, that's all". His Commando crash is two calls of noise at $0F82 then $1F04 with control $81, $80; crish-v1 runs creg=15 81 81 15 — triangle + ring modulation, noise, noise, back (source: s-sidin01-iseq).
From SIDin #6–#7 (2004–05)#
- A snare in Sadotracker's two-table form, "ripped from zakazazam by Glenn Rune Gallefoss" and shared by dustbin:
wavetable 81 41 40 80 80,arptable CE AE AC CA DE— noise, gated pulse, pulse released, noise, noise over a five-row pitch line; "You can break it and shake it and re-compose it" (source: s-sidin07-dustbin-interview). - asterion-sid-tracker: the WAV macro table holds control-register values per row, ended by
$FEor looped by$FF n, and runs at its own speed independently of the ARP table;9xin the pattern restarts it from indexx(source: s-sidin06-asterion-sid-tracker).
Wavetables in half a kilobyte (Tiny Sid, 2005)#
Even players under 512 bytes keep a wave table, because it is the cheapest sound design there is (source: s-sidin08-tiny-sid-512b):
- laxity's Twone Five — two parallel tables,
wavetab1(control byte) andwavetab2(positive = semitones added to the note, negative = an absolute note,$00ends): Bass$81,$81,$41,$00/$c0,$c0,$00,$00("2 ticks with noise and E5 note, follow by rectangular waveform and relative note 0"); Snare$81,$81,$11,$40,$80,$00/$d0,$d0,$b2,$ac,$ca,$00("A classical snare implementation"); Kick$09,$81,$11,$10,$10,$10,$10,$00/$d2,$d2,$ae,$a6,$a2,$9e,$96,$00; "thing"$81,$81,$12,$00/$c0,$c6,$00,$00. Tognon's remark is the point: "if you had composed with some real editor around, you are familiar with this kind of instrument implementation." - 4mat's Empty, five bytes an instrument: three-entry
instdata/instwaverows whereinstdata ≤ $efis a value for the pitch high byte and$f0–$ffis an arpeggio offset ($f0= the pattern's own note) — instrument 0 ($f3,$f7,$f0/$41,$41,$41) is "a classical arpeggio with 3 values", instrument 2 ($10,$af,$06/$41,$81,$40) a drum: fixed-pitch pulse, noise, gate off. The cost of the compression is stated: "I only have one counter for both data & waveform to save memory, so any instrument that loops can't use release value." - Crue Gurl puts the chord voice on a pair of lists walked one entry per frame —
wave($81,$41,$41,$41,$11,$08,$00,$19 …) andchords(frequency high bytes), a$00entry ending the list with the following byte as the loop index ("both of these are to save memory, since 0 is silence!").
In the 256-byte class the table disappears into the instrument. Agemixer's three-byte instrument is AD, control byte and duration — ctrltab $11,$11,$21,$21,$21,$00,$21 — and Tognon notes that a one-tick duration "means we can also make drums", i.e. the wave table is simply an instrument played fast. Elsewhere the waveform is derived rather than tabled: one entry rotates its control byte every pass of a pattern (rol ctrl3 … ora #$01) so "the waveform changes each loop", and another picks voice 1's second waveform ($21 or $11) from a bit of $D41B, the SID's own noise register — "This gives some kind of life to the music" (source: s-sidin09-tiny-sid-256b; randomization-and-probability).
Two more starts: Plaster's $09,$81 and JITT64's noise drums#
- GRG's 512-byte Plaster keeps its "wavetables" as three control-register sequences shared by five instruments —
$09,$81,$41,$00,$09,$81,$11,$11,$11,$11,$11,$00,$09,$81,$41,$40,$40,$80— every sound opening with a test-bit frame and a noise frame, and a parallel list supplying fixed high-frequency bytes ($8B,$89,$86,$84,$8E,$8C,$8A) for the drum steps (source: s-sidin12-tiny-sid-2-part-3). - jitt64's wave column is one of eight per-instrument columns with a delay/repeat field per row (0 = keep the waveform); its example bank builds bass drums and Matt Gray's snares from "fixed notes" in the frequency column and noise in the wave column, a second bass drum with "more low pitch notes and less noise", and a sea effect from noise with a very long attack/decay and no sustain (source: s-sidin13-jitt64-tracker).
How big is the wave channel's design space#
Thirty-two samples of 4 bits is 16^32 ≈ 3.4 × 10^38 possible waveforms. little-scale built a Max/MSP patch in 2009 to play all of them at 100 per second and calculated the runtime: "1,079,028,307,100,000,000,000,000,000 centuries" (source: s-little-scale-all-4-bit-waveforms; the arithmetic checks out).
Which is the argument for recipes. The hand-drawing school (roboctopus below, ghost-channel) is not a poor substitute for searching that space — searching it is not on the table — so the angular saw, the one-sample pulse and the notched sine are worth writing down precisely because they are a vanishingly thin, musically-chosen slice of it.
Hand-drawn waves: three instruments and a method#
roboctopus's LSDJ & You posts are the drawing school, aimed at "intermediate users [who want] to really fill out their songs". All three of his instruments are a WAV instrument with PLAY MANUAL — "manual play means that unless you use an F command in conjunction with that instrument it will play the static wave in the first frame of the synth" — and a few nudged samples in the WAVE screen (source: s-lsdj-and-you-collapse-of-the-waveform):
- A meaner saw: take the default saw and make it "more angular and vicious" — more bite and more low end than the LSDj default.
- A painfully narrow pulse: start from the synth's pulse at VOLUME
40, then drop every sample to zero except the first. "The sound of this wave is harsh — not much low end, pretty abrasive sounding. It can be useful for a section of the song where you want low notes but no low-end. It works very well for distinctive table arpeggios." Widening it is just raising more samples from0towardF. - A sine with a notch: from a slightly clipped sine at VOLUME
40, cut a notch out of the top of the peak — "a bass with great low-end but enough definition to cut through the mix more than a sine wave".
Two rules come with them. Volume is height: "the overall height (amplitude) of the waveform determines its volume … decrease the height even more for lower volumes. This works for any waveform you draw" — the drawn equivalent of the frame envelope, and the overall height, not the height above the bottom of the screen. And angularity is brightness: "the more angular the wave, the sharper its edges, the sharper and harsher the sound is" — deepen the notch and it harshens, narrow it to one sample and it sharpens, round its contour and it smooths. His mixing note attaches to the same page: if WAV sounds too quiet, turn the pulse and noise channels down ("I rarely have anything on pulse above A8") rather than fighting the hardware — at the cost of making panning and envelope clicks more audible (levels-and-headroom, game-boy-apu).
A method for any waveform you can see: "if you hear a cool waveform you want to replicate in LSDJ, an easy way to achieve it is to do a google image search (I searched 'supersaw waveform' haha) and just try to approximate the shape in the WAV screen." The picture is the spec. His single hand-drawn approximation of a supersaw is "a great bass patch with good treble definition and a nice low end" — but the real supersaw idea, seven detuned saws made by hand-drawing slightly out-of-sync waveforms and frame-switching between them, he abandoned: "the WAV channel synth is a bit noisy when switching frames, so it doesn't sound very clean". That was written in 2013, before silky wave removed the frame-change click, and it marks the boundary of what frame switching could do then (source: s-lsdj-and-you-supersaw-bass).
PWM on a channel with no pulse width (source: s-lsdj-and-you-pwm): draw a square in the first wave and make each of the following fifteen narrower than the one before, then PLAY PINGPONG, REPEAT F, LENGTH F, a slow SPEED. The copy/paste in the WAVE screen is what makes it affordable — "hold SELECT and hit B twice to copy the entire wave shape … move to the next frame and hit SELECT+A to paste it so you don't have to re-draw the entire thing again". Honest about the result: "PWM will allow your game boy to sound a bit more like a C64, though nowhere near as smooth and classy", and "you'll notice you can hear the synth stepping through each frame … This is less noticeable on leads/basses in a full mix … and barely discernible when used in a fast arpeggio". "It's great for giving a lead line a more organic feel, and it makes a pretty massive bass." (pulse-width-modulation) The article predates LSDj 7's silky wave, so how much of the stepping survives on a current build is untested here (unverified).
Tips & pitfalls#
- Keep the table short and end with a self-jump (SID-Wizard
$FE≥$40, GoatTrackerFF xx, SID Factory II7f xx) so the sustain is stable; use the repeat counter ($00–$0F) instead of duplicating rows. - Absolute pitches make a drum sound the same on every key; gate off inside the loop makes it self-terminating.
- Put the test bit (
$09) on the first frame: it resets the oscillator and unlocks noise after a bad waveform combination (ring-modulation-and-sync). - At multispeed with attack 0 the first row can be nearly silent — GoatTracker suggests raising the attack or prepending
E9 00rows (multispeed). - Multispeed drums: "Rubicon's title music by Jeroen Tel is 2x, and has drums that are not possible in 1x single-speed at 50Hz" (jeroen-tel; source: s-witchmaster-creating-chiptunes-with-sid-wizard).
- Metallic noise: write
$F9(all waveforms + test + gate) for one frame, then$81— it "resets the internal pseudo random generator, so the noise waveform play different, on some sids … more 'metallic'";$88–$8Fis a plain noise reset, and noise with triangle or saw ($90–$BF,$D0–$EF) "dies" (4mat's list, source: s-chipmusic-sid-music-hints-n-tips). The reset is not instantaneous — the shift register restarts$2000–$8000cycles later, so the result depends on timing (source: s-sidmusic-alstrup-waveform-examinations). - Do not over-engineer: "typically waveforms only change a couple of times per instrument (if at all) It's in the overall composition" (NM156, source: s-lemon64-learning-sid-sound-design).
Heard in#
commando (drums spread over three channels), monty-on-the-run and Crazy Comets (Hubbard's noise-then-pulse drums, skydive + octave arpeggio), sanxion (bass with a noise attack) (source: s-newman-driving-the-sid-chip). Auf Wiedersehen Monty (Hubbard's five-frame bass drum, above; source: s-ucapps-wavetable-sounds-tutorial-1); Gallefoss's Electronic Transfer (the 5× table lead and the noise slide) and the noise cymbals of the Racing Destruction Set loader (source: s-chipmusic-sid-music-hints-n-tips).
Related#
instrument-tables · instrument-design · chord-arpeggio · ring-modulation-and-sync · adsr-envelope · sid · siddump · furnace · fake-echo · lsdj · lsdj-wave-cruncher · liblsdj · retrigger · rob-hubbard · monty-on-the-run
Sources#
s-sid-wizard-manual · s-037-lab · s-goattracker-readme · s-witchmaster-creating-chiptunes-with-sid-wizard · s-chordian-sf2-instruments · s-newman-driving-the-sid-chip · s-pandocs-audio-registers · s-pandocs-audio-details · s-intense-tech-10-kicks-part-1 · s-intense-tech-11-kicks-part-2 · s-intense-tech-01-wave-synth-deep-dive-part-1 · s-intense-tech-02-wave-synth-deep-dive-part-2 · s-infu-getting-started-with-lsdj · s-intense-tech-05-wave-cruncher-instrument-library · s-intense-tech-08-dotcnts-wave-cruncher · s-intense-tech-12-scoping-out-new-features · s-intense-tech-14-lets-appreciate-version-8 · s-intense-tech-15-lets-mix-it-up-and-down · s-intense-tech-19-new-noise-and-910-news · s-intense-tech-21-whats-new-in-lsdj-92 · s-ucapps-wavetable-sounds-tutorial-1 · s-lemon64-learning-sid-sound-design · s-chipmusic-sid-music-hints-n-tips · s-furnace-c64-docs · s-sidmusic-alstrup-waveform-examinations · s-sidmusic-hubbard-interviews · s-hugi38-interview-jeroen-tel · s-remix64-galway-interview · s-matt-gray-dominator-source · s-sidin02-matt-gray-driller · s-realdmx-sid-players · s-emuwiki-huelsbeck-interview · s-64er-soundmonitor-article · s-rvg-matt-gray-interview · s-realdmx-hubbard-player · s-realdmx-galway-rambo-player · s-realdmx-ocean-dunn-hughes-driver · s-realdmx-bjerregaard-player · s-realdmx-ouwehand-mon-tunes · s-realdmx-deenen-test-tunes · s-realdmx-fredgray-kimmel-whittaker · s-realdmx-audial-arts-fame-players · s-sidin01-iseq · s-sidin07-dustbin-interview · s-sidin06-asterion-sid-tracker · s-sidin12-tiny-sid-2-part-3 · s-sidin13-jitt64-tracker · s-duet-docs-dust-dusk · s-little-scale-all-4-bit-waveforms · s-defensemech-wave-channel-ramble · s-defensemech-ghost-channel-allpass · s-chipmusic-lsdj-wav-instrument-tutorials · s-painperdu-01-instrument-retriggering · s-painperdu-03-isometric-sav-walkthrough · s-intense-tech-09-lets-table-this-discussion · s-defensemech-every-lsdj-kick · s-lsdj-and-you-collapse-of-the-waveform · s-lsdj-and-you-supersaw-bass · s-lsdj-and-you-pwm · s-cheesecutter-guide · s-sidin14-dominator-player · s-sidin15-matt-gray-interview · s-vandalism63-matt-gray-interview · s-sidin08-tiny-sid-512b · s-sidin09-tiny-sid-256b · s-lsdj-manual · s-chipmusic-lsdj-ghost-channel · s-tylerbarnes-ghost-channel-tutorial · s-chipmusic-lsdj-wav-channel-release · s-painperdu-02-wav-channel-walkthrough · s-painperdu-05-shortcuts-and-workflow · s-defensemech-learning-lab-shorts