Wavetable programming (waveform / arp tables)

aliases wave table, waveform table, WF-ARP table, table drums, wavetable drums
sources SID-Wizard 1.8 User Manual (summary) · 0 3 7 lab — techniques & theory (summary) · Little Sound Dj v9.2.6 Operating Manual (summary) · GoatTracker v2.72 readme (summary) · Creating Chiptunes with SID-Wizard, Second Edition (summary) · Composing in SID Factory II, Part 4 — Instruments (Chordian) · Newman — Driving the SID chip: Assembly Language, Composition, and Sound Design for the C64 (2017) · Pan Docs — Audio Registers · Pan Docs — Audio Details · Intense Tech #10 — Get your Kicks with Version 6, Part 1 (Defense Mechanism) · Intense Tech #11 — Kicks Part 2: Kick Heaven in Version 7 (Defense Mechanism) · Intense Tech #01 — LSDj Wave Synth Deep Dive, Part 1 (Defense Mechanism) · Intense Tech #02 — LSDj Wave Synth Deep Dive, Part 2 (Defense Mechanism) · Getting started with LSDj with Infu (course) · Intense Tech #05 — LSDj Wave Cruncher Instrument Library (Defense Mechanism) · Intense Tech #08 — DOTCNT's LSDj Wave Cruncher (Defense Mechanism) · Intense Tech #12 — Scoping Out New Features (Defense Mechanism) · Intense Tech #14 — Let's Appreciate Version 8 (Defense Mechanism) · Intense Tech #15 — Let's Mix It Up (and Down) (Defense Mechanism) · Intense Tech #19 — New Noise and 9.1.0 News (Defense Mechanism) · Intense Tech #21 — What's New in LSDj v9.2 (Defense Mechanism) · uCApps MIDIbox SID — Wavetable Sounds Tutorial #1 (Thorsten Klose) · Lemon64: How does one learn SID sound design these days? (2020) · chipmusic.org — sid music hints'n'tips (2013) · Furnace tracker — C64 (SID) system and instrument documentation · Asger Alstrup — Examination of SID triangle waveform / noise waveform (The SID Homepage, 1995) · The SID Homepage — Interviews with Rob Hubbard (Commodore Zone, Happy Computer 7/86) · Hugi #38 — Up Close & Personal: Jeroen Tel of Maniacs of Noise (2014) · Remix64 — An Interview with Martin Galway (Neil Carr, 2001) · Matt Gray's Dominator subtune 6 source (PLAYER V4.2, 1987) and the Reformation driver competition · SIDin #2 — Matt Gray's Driller music routine (Stefano Tognon, 2002) · GitHub realdmx/c64_6581_sid_players — Cybernoid II in Deenen's MUSICFILE, the MoN SFX player, the Driller listing · Retrogaming Planet / EmuWiki — Interview with Chris Huelsbeck (2011) · 64'er 10/1986 — Musik wie noch nie: the Soundmonitor article and manual · RVG Interviews: Matt Gray (2016) · realdmx: Rob Hubbard's driver — McSweeney's Monty on the Run disassembly and the Commando title · realdmx: Martin Galway's Rambo II loader — the macro-language player, reverse-engineered by dmx87 · realdmx: Jonathan Dunn's Daley Thompson '88 and Ocean Loader 5 in Paul Hughes's Ocean music driver · realdmx: Johannes Bjerregaard's own player — the James Bond 3 demo (a Maniacs of Noise commission) and Myth · realdmx: Reyn Ouwehand's Armada (MUSICFILE, 'Special version for Reyn Ouwehand', 1989) and Dutch Breeze (the 1990 MoN player) · realdmx: Charles Deenen's two test tunes — an undated MUSICFILE build and the 'Scoop designs' Maniacs of Noise player · realdmx: three smaller drivers — Fred Gray's Mutants (song as code), Jeroen Kimmel's 'Red's music player' (1989) and David Whittaker's Panther driver · realdmx: two scene players with their own sources — Francois Prijt's Audial Arts 'zong player' v1/v2 (1991) and Adam Bulka's FAME 'Sound Routine f 4.1.0' (1988) · SIDin #1 — Iseq music composition program: the comp.sys.cbm threads and Steve Judd's Commando cover (2002) · SIDin #7 — Dustbin (Stefano Palmonari) interview (Stefano Tognon, 2005) · SIDin #6 — Asterion Sid Tracker v1.0 reviewed (Stefano Tognon, 2004) · SIDin #12 — Tiny Sid 2, part 3: Plaster (512 b) and Back To Basics (256 b) (Stefano Tognon, 2008) · SIDin #13 — JITT64 Tracker: Tognon's Java Ice Team Tracker from the user's side (2010) · DUET docs: DUST and DUSK, the two synths (summary) · chipmusic.org — Advanced LSDj Tutorial: The Ghost Channel (2013) · Tyler Barnes — Advanced LSDJ Tutorial: The Ghost Channel (video, 2013) · chipmusic.org — lsdj wav channel release? (2013) · Pain Perdu — Hidden LSDJ Tricks EP2: In-depth WAV channel walkthrough (video, 2016) · Pain Perdu — Hidden LSDJ Tricks EP5: Shortcuts and Workflow (video, 2016) · Defense Mechanism — LSDj Learning Lab shorts: Limit and Vshift, Long Filter Sweeps, Self-Resonating Bass (videos, 2020) · little-scale — All 4-bit Waveforms That Have 32 Samples (2009) · Defense Mechanism — LSDJ Wave Channel Tutorial..? (More of a ramble) (video, 2020) · Defense Mechanism — LSDj Learning Lab: Overtones / Ghost Channel with Allpass Filter (video, 2020) · chipmusic.org — Wav Instrument Tutorials for LSDJ (2014) · Pain Perdu — Hidden LSDJ Tricks EP1: Instrument Retriggering (video, 2016) · Pain Perdu — Hidden LSDJ Tricks EP3: \"Isometric\" save-file walkthrough (video, 2016) · Intense Tech #09 — Let's Table This Discussion! (Defense Mechanism) · Defense Mechanism — Making every LSDJ kick I can think of (video, 2024) · roboctopus — LSDJ & You: Collapse of the Waveform (2014) · roboctopus — The Kinda Sorta Supersaw-lite; or, a Beefy Saw Bass (2013) · roboctopus — PWM, I Choose You! (2014) · The CheeseCutter Guide — the recovered site manual (Wayback) · SIDin #14 — Inside Matt Gray's Dominator player (Tognon's commented PLAYER V4.2 and the musician's guide to composing in it, 2015) · SIDin #15 — Matt Gray interview (technical questions during Reformation, 2015) · Vandalism News #63 — Interview with Matt Gray (Jazzcat, 2014) · SIDin #8 — Tiny Sid Compo, the 512-byte entries (Stefano Tognon, 2005) · SIDin #9 — Tiny Sid Compo, the 256-byte entries (Stefano Tognon, 2006)
created 2026-08-30 · updated 2026-08-31

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:

columnvalues
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#0B-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):

rowssound
21 00 / FF 00sawtooth 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 00snare drum, all absolute notes — "use pulsewidth 800 for best result"
81 DF / 41 00 / FF 00pulse note preceded by a short noise at B-7, "like a hi-hat"
41 00 / 00 04 / 00 07 / 00 0C / 00 00 / FF 024-note looping arpeggio, waveform unchanged in the loop
21 00 / 02 03 / 02 07 / 02 00 / FF 02delayed minor-chord arpeggio, three ticks per step
41 00 / 03 80 / 11 80 / 03 80 / 41 80 / FF 02pulse ↔ triangle every 5 ticks with frequency untouched (vibrato and slides keep working)
81 CF / 21 00 / 08 00 / F6 2A / FF 00noise, 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):

columnvalues
transpose00–5F relative semitones · 80–DF absolute · 7E stop · 7F wrap (byte B holds the wrap point)
waveform00 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):

framefrequencynotecontrol byteADSRrole
1$0EA3A-3$11 triangle, gate on08F8the pitched thump
2$40A3B-5$81 noise, gate onthe stick
3$0B23E-3$41 pulse, gate onbody
4$0923C#3$40 pulse, gate offrelease starts
5$03CEA#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#0B-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"; ALIAS raw keeps 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, 10xx01 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 with H, with probabilistic hops via B. They do what the SID-Wizard wave/arp table does: pitch drops for drums (transpose column + L/P), noise-then-tone attacks (switch instruments/E per 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; Fxx steps through frames by hand (F10 = next synth sound), Wxy changes 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 12, synth 2 2030, synth 3 3040, Q around 57 — 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 89) 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 E00E03. 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 001F 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):

LENGTHwaves generatedLENGTHwaves generated
0080 1 3 5 7 9 B D F
10 F90 1 3 5 7 8 9 B D F
20 7 FA0 1 3 4 6 7 9 B C E F
30 5 A FB0 1 2 4 5 7 8 A B D E F
40 3 7 B FC0 1 2 3 5 6 7 9 A B D E F
50 3 6 9 C FD0 1 2 3 4 6 7 8 9 B C D E F
60 2 5 7 A D FE0 1 2 3 4 5 6 7 9 A B C D E F
70 2 4 6 9 B D FF0 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 ($81 at 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". So DT reads: $81,$30 noise at $30xx, $11,$02 triangle at note − $02xx, $41,$04 pulse at note − $04xx, then gate-off noise frames stepping $30, $15, $20, $10, $20, $20, $10, $20; the sibling BT is $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 $50xx played 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: drumtabel entries are a length byte, a waveform list and a pitch list — $0b; $81,$81,$20,$20,$10,$10,$10,$10,$10,$10,$10,$10 over $34,$0a,$08,$06,$04,$05,$06,$05,$04,$05,$06,$05 — two frames of noise, then sawtooth and triangle falling; a wavearp table ($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 $81 for 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 $70 alternating 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 $D401 bytes: 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,$10 over dto0 $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 … $40 over $50,$0a,$08,$06,$05,$04,$03,$02,$02,$01,$00,$00; the 1990 player's looping pair dw7 $80 / $81,$11,$11,$11,$11,$11,$11,$10,$fe with dt7 $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 $D418 instead (chip-samples) (source: s-realdmx-galway-rambo-player).
  • Scene players: Red's digiwave $00,$81,$11,$81 at digifreq 0,$55,$0a,$44 for the first three frames, then the real note; Whittaker's alternate-frame $80 with 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's wtab1 $81,$41,$40 ×9,$08 ending on the test bit as a mute, with tab1 $26,$0b,$08,$05,$03,$01,$00,$ff,$fe,$fd,$fc as 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 $FE or looped by $FF n, and runs at its own speed independently of the ARP table; 9x in the pattern restarts it from index x (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) and wavetab2 (positive = semitones added to the note, negative = an absolute note, $00 ends): 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/instwave rows where instdata ≤ $ef is a value for the pitch high byte and $f0–$ff is 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 …) and chords (frequency high bytes), a $00 entry 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 durationctrltab $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 from 0 toward F.
  • 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, GoatTracker FF xx, SID Factory II 7f 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 00 rows (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–$8F is 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–$8000 cycles 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).

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

source file wiki/techniques/wavetable-programming.md · 1 unverified · graph