Vibrato and delayed vibrato
What it is#
A periodic pitch wobble on a held note. The important variant is delayed vibrato: the note lands straight, then the vibrato fades in — real singers and lead synths don't wobble immediately. Straight attack + late vibrato instantly makes long notes sound intentional instead of static (source: s-037-lab).
How to do it#
Generic trackers#
Most trackers have a vibrato command, often 4xy (x = speed, y = depth): place it a few rows after the note starts, or use an instrument envelope with a delay (source: s-037-lab). In impulse-tracker / S3M the command is Hxy (4xy in protracker) and Kxy combines it with a volume slide; the Modsquad's chip lead uses H81/HA4 and puts an HFF vibrato on percussion instead of an arpeggio (sources: s-tw074-intro-to-musical-theory, s-tw077-chip-off-the-block).
Necros's rule for leads (source: s-tw012-advanced-tracking-tips): "Realistic vibrato, in a medium-tempo lead, starts out very soft and gradually fades in" — HA1 a row or two into a held note, then HA2, speeds 1–2 so the vibrato "doesn't become the main focus"; only "very up-tempo hard-hitting tunes" tolerate wild vibrato; and on a long sustain either bring it back to zero or fade the note, because "nothing sounds worse than a heavily oscillating note which just refuses to die" (lead-articulation). Over MIDI the modulation wheel (controller 01) usually sets vibrato depth only, the synth decides the rate (midi-in-trackers; source: s-tw098-impulse-tracker-midi).
Numbers from the manuals (sources: s-protracker-23d-help, s-ft2-manual, s-st3-manual, s-openmpt-manual-effect-reference, s-openmpt-manual-samples): ProTracker 4xy (400 continues; ProTracker 1.1A doubled the depth scale "to be compatible with NT2.0"), waveform E4x 0 sine, 1 ramp down, 2 square, 3 random, +4 = do not retrigger the waveform on a new note; FT2 the same plus a volume-column Vx and Sx (speed only); ST3 Hxy with Uxy four times finer "if a note is played very high", waveform S3x; IT/OpenMPT the same letters. Every LFO waveform is 64 points long and the speed is points per tick, so speed 2 completes a cycle in 32 ticks; "random" is unsupported by ProTracker and FastTracker. Sample-level auto-vibrato exists in XM (per instrument) and IT/MPTM (per sample): waveform, depth in 1/64 semitones, a sweep-in (IT: depth × 256 ÷ sweep ticks; XM: sweep ticks) and a rate of 256 ÷ rate ticks per cycle — it adds to pattern vibrato and cannot be changed from the pattern. FT2's ramp-down tremolo is a known bug ("even influenced by vibrato") (source: s-openmpt-manual-compatible-playback).
LSDj#
Vxy: x = speed, y = depth in semitones — 0 0.125, 1 0.25, 2 0.375, 3 0.5, 4 0.75, 5 1, 6 1.5, 7 2, 8 2.5, 9 3, A 3.5, B 4, C 5, D 6, E 7, F 8; V00 resets. Shape and speed depend on the instrument's PITCH setting: with PITCH = TICK the vibrato is synced to the music (assuming 6 ticks/step) and CMD/RATE slows it; A+LEFT/RIGHT on PITCH chooses the shape (triangle, saw or square, upward or downward). Delayed vibrato: put V a few steps after the note, or in the instrument's table on a later row so every note gets it automatically. The manual also suggests V (and P) on noise snares to liven them up (source: s-lsdj-manual).
Dire Hit's account of the digits: the first is the modulation speed (0 slow … F "so fast it almost becomes audible as a tone"), the second the depth; VFF is FM in all but name — Monodeer's pulse-channel cymbals are a single V command, "if you ever need noise percussion out of a pulse channel" (source: s-chipmusic-tables-and-chords-threads). SketchMan3: "High frequency V effects can give you a more complex raspy sound" (source: s-chipmusic-lsdj-advanced-tricks); a fast V on a table's first tick, cancelled by V00 on the second, sharpens an attack (source: s-intense-tech-09-lets-table-this-discussion).
More from intense-tech: random vibrato is V00 on the note and Z03 on each repeat of it, so every repeat acts as V00…V03 (randomization-and-probability; source: s-intense-tech-03-dont-sleep-on-z). The slowing setting was introduced as FX/SPEED in version 7 (7.7.4) — it lengthens each step of C, P, R and V, the V only when PITCH is TICK — and renamed CMD/RATE in version 8 (sources: s-intense-tech-12-scoping-out-new-features, s-intense-tech-14-lets-appreciate-version-8). Since 9.1.0 the TICK vibrato rates are rhythmic at the default groove — one cycle per V0x 16 steps, V1x 12, V2x 32/3, V3x 8, V4x 6, V5x 16/3 … VFx 1/2 step — and V also works on noise instruments, always tick-based (source: s-intense-tech-19-new-noise-and-910-news).
Pushed far enough, a V on the wave channel stops being vibrato: with the right combination of speed and depth a bass note "kind of self-resonates with itself", a sound defense-mechanism rates highly and uses rarely — "I honestly don't use enough V commands on the wave channel". It belongs to one note, so a different pitch needs the values retuned, and silky wave may have softened it (source: s-defensemech-learning-lab-shorts).
Two wave-channel notes from pain-perdu (source: s-painperdu-02-wav-channel-walkthrough): in the instrument screen, LEFT/RIGHT cycles the vibrato type while A+UP/DOWN inverts the vibrato's phase; and a fast V on a wave instrument — normally a pulse-channel trick, since wave instruments are raspy already — turns a raspy hand-drawn wave into "a kind of flanger filtery modulation effect" with no synth movement at all. It costs CPU, and because the modulation interacts with the note's pitch the value that works on one note will not work on the next, so it belongs on the note rather than in the table. A slow vibrato does the opposite job: it detunes a held pulse note enough to "fight off the really robotic feel" (source: s-painperdu-03-isometric-sav-walkthrough).
Two more places V earns its keep. On the noise channel it has worked since 9.1.0, alongside C and P, and combines with P — a bend and a wobble on the same hit; the pitched (short-loop) noise shapes make that read as a tonal snare rather than as noise (source: s-defensemech-noise-channel-92l). And on a wave instrument imitating an acoustic one, V is most of the imitation: "using a variety of vibrato speeds (Vxx commands) will also help make a flutey tone sound more convincing. It's all about articulation, really. LSDJ is really good for flutey articulation though!" — varied speeds across a phrase, not one setting held (Victory Road, source: s-chipmusic-lsdj-wav-instrument-tutorials; lead-articulation).
SID-Wizard#
- Per instrument: four hex digits — amplitude, frequency (speed), and a two-digit delay (or increment speed); the four vibrato types are delayed up-down, delayed downwards, delayed upwards and incremental "violin style" (source: s-witchmaster-creating-chiptunes-with-sid-wizard; note the traced 1.97 player arithmetic runs
$20/$30the other way round — see "What the player actually does" below). Vibrato is "calculated", i.e. its depth is pitch-independent. The book's bass uses3720with delayed up-down. - In the note column:
Shift+Vputs a vibrato flag on the note (amplitude1..F), shown as a tiny graph symbol. - Effects:
$08 xyset amplitude and rate;$8xamplitude only;$9xrate only;$16 xxselect vibrato type (00/10/20/30). - Caveats: an arp entry in the instrument's table cancels vibrato; a pitch slide cancels it too except in the Extra player; the Light player has no calculated vibrato; Bare and Demo drop the vibrato-rate/frequency effects (sid-player-routine).
(source: s-sid-wizard-manual)
What the player actually does (SW 1.97 player.asm)#
The "calculated" arithmetic, from m64's duet research (VIBSLIDE/SETVIB0, player.asm 2085–2171, 2890–2941; source: s-duet-research-sidwizard-deep):
- Vibrato is a triangle added directly to the 16-bit frequency accumulator: period = 2×rate frames, per-frame step
FREQMOD = freq16(4×amplitude + note − 107)looked up through the exponential table — which is why the depth is a constant musical interval at any pitch. - The four types differ only in phase seed and the role of instrument byte 6: type
$00"increasing" has no delay — byte 6 is a per-frame amplitude increment, and the ramp is unbounded (it never clamps); type$10"normal" waits byte 6+1 frames then oscillates symmetrically; type$20seeds at the full rate and, as traced, oscillates above the note; type$30seeds at zero and oscillates below. The source comments name$20"down-oriented" and$30"up-oriented" — the opposite of the traced arithmetic (open question in the research; the traced behaviour is what DUET implements). - Note-column
$6xand small-FX$8xset the amplitude only — the rate stays the instrument's, the phase resets, and the delay counter is not reloaded; they also cancel a running slide/portamento by restoring the instrument's vibrato type.$9xsets the rate only, touching nothing else; big-FX$16the type only. - "Arp cancels vibrato" is an overwrite, not a flag: a pitch-yielding WF-table step writes a fresh table lookup over the accumulator, discarding the displacement; on hold/end ticks the displacement survives and keeps accumulating. On ticks 0/1 before a new note the vibrato stage is skipped altogether (Normal player).
CheeseCutter#
Vibrato is a command-table entry, not an instrument setting: in the command table (JCH called it "the Super Table") 2 is vibrato — "the usual delta vibrato as found in JCH's players from 20.G4 upwards; try $21 $05" — and 5 is a second vibrato taking speed and depth. One player quirk to know: a slide or vibrato on a tied-note row is not executed, and a portamento resets an ongoing slide (source: s-cheesecutter-guide; pitch-slide-and-portamento).
defMON: no vibrato at all#
defMON has no vibrato command, on purpose. The sidTAB is the whole effect language — "you would create a vibrato the way you like it, rather than calling a pre-programmed vibrato" — so a vibrato is a few sidTAB rows that step the pitch up and down, and a step can run two sidTAB chunks at once, one holding the note and one running the wobble. The design argument is the same one frantic makes about hard-restart: fewer built-ins, more flexibility, and no CPU spent on a routine a given tune may not want (source: s-defmon-wiki-manual; sid-player-routine).
GoatTracker#
4XY and the instrument's vibrato parameter both index the speedtable: left byte = how many ticks until the direction changes (speed), right byte = pitch added each tick (depth). 03 40 equals the old one-byte parameter $34; 05 04 is "slow shallow vibrato, suitable for bass notes. Not possible to achieve with old parameters"; 83 04 (high bit set) makes the depth note-independent with a divisor of 4 right-shifts. The instrument's vibrato delay is the tick count before it starts (00 = off) — a delayed vibrato without any pattern command, which also packs smaller. Realtime commands are skipped on tick 0 of each row unless -R0; a one-shot command (5XY–FXY) between vibrato rows leaves the vibrato running, but 0XY stops it; SHIFT+H precalculates "hifi" note-independent depths from the frequency difference of adjacent notes (source: s-goattracker-readme).
On the SID without a player: oscillator 3 (datasheet and Programmer's Reference Guide)#
The chip has a built-in modulation source: register $1B returns oscillator 3's output, and the datasheet's recipe for vibrato is "setting Oscillator 3 to a frequency around 7 Hz and adding the OSC 3 Triangle output (with proper scaling) to the Frequency control of another oscillator", with voice 3 muted by the 3 OFF bit (source: s-mos-6581-datasheet). The PRG's Example 6 does exactly that in BASIC: voice 3 on a triangle at a very low frequency (POKE S+14,117 : POKE S+18,16), POKE S+24,143 for volume 15 + voice 3 off, and inside the note loop FQ = FR + PEEK(S+27)/2 before splitting the result into high and low bytes; with ×3.5 and a longer loop the same program becomes a siren (source: s-c64-prg-chapter-4-sound).
In a player routine (Walleij)#
linus-walleij's design: each instrument has a delay before vibrato, a default amplitude and a default period (or takes them from a MIDI wheel); after the delay counts down, vibrate_channel adds an LFO curve over $D400/$D401 every process step, taking the pitch wheel into account; an arpeggio macro and vibrato on the same voice are "only interesting if you don't use vibrato on this voice really" — the arpeggio step is skipped while vibrato runs. The same mechanism with "larger amplitude" over $D402/$D403 is pulse-width vibrato (pulse-width-modulation) (source: s-walleij-sid-player-routine).
Impulse Tracker details#
Hxy speed x depth y; Uxy is four times finer; S3x picks the waveform (0 sine, 1 square, 2 ramp down, 3 random); Kxy adds a volume slide; H00/U00 reuse the last vibrato of either kind. IT's vibrato is updated every tick and is "two times finer" than ST3's — with Old Effects on it reverts to ST3 depth and timing. Samples also carry their own vibrato (speed 0–64, best 24–48; depth; rate = how quickly it sets in — a built-in delayed vibrato) (sources: s-it-manual, s-ittech).
In the classic drivers (1986–1988)#
- soundmonitor: three sound registers — 12 depth, 13 speed (
00very fast …7Fvery slow, bit 7 = start downward or upward), 14 delay after key-on (source: s-64er-soundmonitor-article). - matt-gray-player: with step V and length L, the frequency value goes down by V for L frames, up for 2L, down for 2L … — "V=10 and L=2 with an A4 note (440Hz)" gives 430, 420, 430, 440, 450, 460, 450, 440 … A constant step on the raw register value is more cents at low pitch, which is exactly what Gray describes: "my vibrato routines didn't use the correct algorithm, as say Rob's or Martin's did. Mine was just a simple up-and-down pitch change … the higher the notes you played, the less vibrato you got, and the lower you went, the deeper it got" — and he counts it as part of his "sound" (sources: s-sidin02-matt-gray-driller, s-c64com-matt-gray-interview).
- musicfile: a "Vibrato routine" with a per-instrument delay table (
vibtabwait:$0c,$18…) and a tune-widevibtotzover = $30constant (source: s-realdmx-sid-players).
- hubbard-player: the frame counter
and #7, mirrored above 3, gives0,1,2,3,3,2,1,0; the step is the frequency difference to the next semitone shifted right depth+1 times (depth$02= ⅛ semitone), added to the note — an 8-frame triangle that bends upward only, and only on notes of 8+ ticks (6+ in Commando) — "A clever little trick to create an oscillating value" (source: s-realdmx-hubbard-player). - galway-player: no vibrato routine — three of the instrument's four signed frequency adders with durations, looping:
!wo 30, !wo -30, !wo 30, !wo 0 / $03,$06,$03,$00 / delay $16(Rambo),$14,$00 / $EC,$FF / $14,$00 / $00,$00 / $03,$06 / $03,$00 / $1E(Arkanoid) — a ±90 or ±60 unit triangle with a 12-frame period after a delay (sources: s-realdmx-galway-rambo-player, s-realdmx-galway-arkanoid-player). - ocean-music-driver:
VIBON delay,rate,depthinline in the voice program — add/subtractrateto the 16-bit frequency, reversing everydepthframes (first leg half);VIBON,0,7,6,VIBON,6,$20,6, the loader lead'sVIBON,0,$FF,4; an active arpeggio suppresses it (source: s-realdmx-ocean-dunn-hughes-driver). - bjerregaard-player: depth = the semitone distance at the current note, read from the frequency table and shifted by the rate nibble, ramped in over N frames — constant in cents across octaves, the opposite of Matt Gray's raw-value wobble (source: s-realdmx-bjerregaard-player).
- Others: Deenen's MUSICFILE shifts the semitone difference right by the depth nibble too, with an optional growing depth (
fx1bit 7) later capped byvibtotzover(source: s-realdmx-deenen-test-tunes); Whittaker's Panther doubles the depth once per two octaves the note lies below$60; Red's player adds a 12-entry table ($00,$30,$60,$90,$c0,$f0,$f0,$c0 …) to the frequency low byte after 26 frames; Fred Gray's Mutants uses rows of its quarter-semitone arpeggio table ($01,$01,$01,$01,$ff,$fe,$fe,$ff …) as vibrato (source: s-realdmx-fredgray-kimmel-whittaker); the Scoop MoN player has a 128-byte sine table anddelay, length, amplitude, speedprograms (source: s-realdmx-deenen-test-tunes); FAME's vibrato is 2-byte segments in the same table engine as its arpeggios (source: s-realdmx-audial-arts-fame-players).
Iseq (2002): vibrato as an additive list#
Steve Judd's iseq has no vibrato command; an instrument's frq+ list is added to the current frequency on every player call, so a vibrato is frq+ 0100 0200 0100 0000 ff00 fe00 ff00 0000 looped — Judd's own example, with the caveat that it is "not 'proportional' — you wouldn't use the same modulations at low and high frequencies" and the upside that one list can also carry a rising frequency, an ornament or an "asymmetric" vibrato. His Commando lead uses frq+=0000 0040 0080 00c0 00c0 0080 (source: s-sidin01-iseq).
- Why Galway's middle phase is twice as long: Tognon's figure for the Arkanoid vibrato (
+$14 × 3, −$14 × 6, +$14 × 3after$1Ecycles) shows the first phase climbing from the note's pitch to the top, the double-length second phase crossing to the bottom, the third returning to the centre — "necessary for having the correct up/down sequence" — before flag$05restarts the phases from the current frequency (source: s-sidin04-galway-arkanoid).
From SIDin #6–#7 (2004–05)#
- The modules driver (Ivan Del Duca, 1988): vibrato is one case of a generic pattern command,
$9B $02 type limit step delay—stepis added to or subtracted from the register everydelayticks,limitdecides where the direction turns, andtype2selects the frequency high byte (0= filter cutoff,1= pulse width high byte);pat00opens with$9B,$02,$02,$04,$01,$06, i.e. one step of the high byte every six ticks;$92stops it. Tognon also notes that the portamento commands$8C/$8F"can be used also for vibrato in conjunction" (source: s-sidin07-inside-modules). - asterion-sid-tracker (2004): per instrument
VDE(delay) andVDS(depth/speed); in the pattern4xsets the depthxat the instrument's speed,40returning to theVDSdepth (source: s-sidin06-asterion-sid-tracker).
JITT64 (2010)#
Command 09 xy: y + 1 ticks per leg, and each tick adds or subtracts (x + 1) × 16 to the raw 16-bit frequency; the first leg lasts one speed count and the following ones two (plus the reload tick), so it starts with a half period — a triangle on the register value, deeper in cents at low pitch like the matt-gray-player's and unlike Bjerregaard's semitone-proportional one; 00 with bit 4 stops it, and a "hifi vibrato … independent from octave/note" was planned. Instrument-level vibrato goes in the frequency column as relative-frequency entries timed by the D/N delay field (sources: s-sidin13-inside-jitt64, s-sidin13-jitt64-tracker).
- matt-gray-player V4.2 adds a per-note vibrato delay: pattern byte
$F9 nncounts down before the instrument's vibrato (step in row byte 8, length in byte 9, the same down / up / up / down / down triangle as Driller) starts (source: s-sidin14-dominator-player). Gray in 2015: "My vibrato routine was very different to his [Hubbard's] and Martin Galway's" (source: s-sidin15-matt-gray-interview).
Vibrato as a routine you had to write#
Before trackers there was no vibrato command anywhere; it was code. matt-gray puts it most plainly: "You had to be able to code everything, even putting a vibrato on a sound needed a mod routine to do it. There was no button to push. You literally had some waveforms to choice from, an ADSR setting and a filter. The rest was up to you." (source: s-rvg-matt-gray-interview). His own routine kept five pieces of state per voice — VIBDELAY, VIBSTEP, VIBTIME, VIBD, VIBDIR — i.e. a delay before onset, a step size, a period, a depth and a direction, with $F9 nn in the pattern setting the vibrato delay per note (source: s-matt-gray-dominator-source). He counted the difference as part of his signature: "My vibrato routine was very different to his and Martin Galway's" (rob-hubbard, martin-galway).
The MoN driver packs the same thing into instrument bytes: in the Armada-era layout fx1 is vibrato depth and speed in one byte ($53, $42, $41 in the shipped bank), and in the later Ouwehand layout fx1 is the vibrato half-period plus a depth as semitone >> n with bit 7 meaning the depth grows, while fx2's high nibble is the vibrato delay. The Dutch source calls a light one vibraatje (source: s-realdmx-ouwehand-mon-tunes). A delay plus a growing depth is a swell — the string-player's vibrato that starts after the note has spoken — encoded in two nibbles.
JCH carried the habit to the PC: his AdLib player of November 1991 had "C64-style arpeggio tables, his own vibrato and modulation control", which "immediately distanced the player from almost anything that used AdLib on the PC" (source: s-chordian-my-computer-chronicles; opl-fm-instruments). The band name works the same way round — Vibrants is "vibrato" + "Ants", coined in a phone call before the PCW show in 1989.
Two practical corollaries from the tracker era. ProTracker changed its vibrato depth scale: 1.1A made it "compatible with NT2.0. Double all your depth numbers if you load old protracker songs" — a real hazard when opening a 1990 module in a later version (source: s-protracker-23-readme-and-docs). And the reason to bother, from a player of a real instrument: playing one teaches "the technique to apply to your tracker … how to make it feel" — slides and vibrato on bass are what made the-zapper's basslines sound real to necros (source: s-tw027-interview-zapper).
Tips & pitfalls#
- Delay ≈ the length of a short note so quick runs stay clean and only held notes wobble.
- Combine with a slide into the note (pitch-slide-and-portamento) for a vocal lead.
Related#
pitch-slide-and-portamento · melody-writing · instrument-design · sid-player-routine
Sources#
s-037-lab · s-sid-wizard-manual · s-goattracker-readme · s-witchmaster-creating-chiptunes-with-sid-wizard · s-chipmusic-tables-and-chords-threads · s-chipmusic-lsdj-advanced-tricks · s-intense-tech-09-lets-table-this-discussion · s-protracker-23d-help · s-ft2-manual · s-st3-manual · s-openmpt-manual-effect-reference · s-openmpt-manual-samples · s-openmpt-manual-compatible-playback · s-tw012-advanced-tracking-tips · s-tw098-impulse-tracker-midi · s-mos-6581-datasheet · s-c64-prg-chapter-4-sound · s-walleij-sid-player-routine · s-intense-tech-03-dont-sleep-on-z · 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-64er-soundmonitor-article · s-sidin02-matt-gray-driller · s-c64com-matt-gray-interview · s-realdmx-sid-players · s-realdmx-hubbard-player · s-realdmx-galway-rambo-player · s-realdmx-galway-arkanoid-player · s-realdmx-ocean-dunn-hughes-driver · s-realdmx-bjerregaard-player · s-realdmx-fredgray-kimmel-whittaker · s-realdmx-audial-arts-fame-players · s-realdmx-deenen-test-tunes · s-sidin01-iseq · s-sidin04-galway-arkanoid · s-sidin06-asterion-sid-tracker · s-sidin07-inside-modules · s-sidin13-inside-jitt64 · s-sidin13-jitt64-tracker · s-sidin14-dominator-player · s-sidin15-matt-gray-interview · s-duet-research-sidwizard-deep · s-duet-research-sidwizard · s-cheesecutter-guide · s-defmon-wiki-manual · s-rvg-matt-gray-interview · s-matt-gray-dominator-source · s-realdmx-ouwehand-mon-tunes · s-chordian-my-computer-chronicles · s-protracker-23-readme-and-docs · s-tw027-interview-zapper · s-defensemech-noise-channel-92l · s-chipmusic-lsdj-wav-instrument-tutorials · s-lsdj-manual · s-tw074-intro-to-musical-theory · s-tw077-chip-off-the-block · s-it-manual · s-ittech · s-painperdu-02-wav-channel-walkthrough · s-painperdu-03-isometric-sav-walkthrough · s-defensemech-learning-lab-shorts