Orderlist (sequence)

aliases order list, sequence, song list, pattern order
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) · Intense Tech #06 — Groovy Groove and Tick Tricks, Part 1 (Defense Mechanism) · ProTracker 2.3d help file (edited by echolevel) · Scream Tracker 3.2 User's Manual (ST3.DOC) · Scream Tracker 3.20 File Formats And Mixing Info (TECH.DOC) · FastTracker v2.08 Manual (Urban Jonsson, 1996) · OpenMPT manual — Module formats · TW #96 — Studio Tracking Tips (Zinc) · TW #27 — Basehead on Lotus Position (Cyberdmon) · TW #18 — Interview With Basehead (again) (Psibelius) · TW #72 — Composing Whole Modules (Sir Nick / Deck Blasters) · 64'er 10/1986 — Musik wie noch nie: the Soundmonitor article and manual · SIDin #2 — Matt Gray's Driller music routine (Stefano Tognon, 2002) · Matt Gray's Dominator subtune 6 source (PLAYER V4.2, 1987) and the Reformation driver competition · GitHub realdmx/c64_6581_sid_players — Cybernoid II in Deenen's MUSICFILE, the MoN SFX player, the Driller listing · C64.COM interview #36: Matt Gray (2014) · 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: 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 #5 — Music Engines Pattern Searching, part 2: the Lostack database (Stefano Tognon, 2004) · SIDin #5 — High Voltage Music Engines Collection (Stefano Tognon, 2004) · SIDin #6 — Asterion Sid Tracker v1.0 reviewed (Stefano Tognon, 2004) · SIDin #7 — Inside Modules: Ivan Del Duca's music engine (Stefano Tognon, 2005) · SIDin #6 — Inside DigiOrganizer, Polonius's 4-bit sample editor (Stefano Tognon, 2004) · SIDin #7 — xxlarge: Ninja's 256-byte cover of 'X large' analysed (Stefano Tognon, 2005) · SIDin #10 — Tiny Sid 2, part 1: XL5, Mini Digi Drum, RM, Miniature Rhapsody (Stefano Tognon, 2006) · SIDin #11 — Tiny Sid 2, part 2: BLOCK ACID DUB and Resolution (Stefano Tognon, 2007) · 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 — Inside Matt Gray's Serpent Demo player (the 4-bit sample voice, reverse-engineered, 2015) · DUET research: SID-Wizard 1.97 formats and player (summary) · DUET research: SID-Wizard player.asm deep dive (summary) · My Computer Chronicles — Jens-Christian Huus / JCH (2017) · chipmusic.org — C64 Music for Dummies (ant1's SID-Wizard 1.0 tutorial, 2012) · sid-wizard-vessel README — MIDI sync IN and live-act features for SID-Wizard · SIDin #10 — Goattracker 2: a cover in the table-based GT2 (Stefano Tognon, 2006) · defMON wiki — features, interface overview, seqED key map · defMON wiki — release history 2008–2020, creations, links · chipmusic.org — the defMON megathread (2014–2026) · The CheeseCutter Guide — the recovered site manual (Wayback) · SIDin #13 — JITT64 Tracker: Tognon's Java Ice Team Tracker from the user's side (2010) · Pain Perdu — Hidden LSDJ Tricks EP5: Shortcuts and Workflow (video, 2016) · chipmusic.org — LSDJ live performance thread (2010) · VGMPF wiki: Soundmonitor, TFMX Editor (C64) and The Great Giana Sisters (C64) · SIDin #4 — Ripping a BASIC program into RSID: Telengard (Stefano Tognon, 2003) · SIDin #4 — Martin Galway's Arkanoid music routine, the explanation (Stefano Tognon, 2003) · ProTracker 2.3A ReadMe, 2.0A effect and format docs, version table · SIDin #8 — Tiny Sid Compo, the 512-byte entries (Stefano Tognon, 2005) · SIDin #12 — Tiny Sid 2, part 3: Plaster (512 b) and Back To Basics (256 b) (Stefano Tognon, 2008)
created 2026-08-30 · updated 2026-08-31

The list that tells a tracker which pattern plays next; in C64 trackers each track has its own orderlist, so tracks can loop patterns of different lengths independently. Besides pattern numbers it can carry song-level commands — transposition, volume, tempo, jumps — which is where cheap arrangement moves live: repeating a section transposed up, changing tempo per section, jumping between subtunes.

Why each voice gets its own orderlist#

The split between the C64 family (one orderlist per voice) and the Amiga/PC family (one order list for the whole song) is a design decision with a date and an author. JCH wanted "tracks to follow each other so that multiple voices could be compared easily", and disliked how Amiga SoundTracker's voices were "fused together in the same pattern": his voices should follow each other while having independent sequences of any size. Version 1 of the jch-editor (November 1988) shipped with the corner cut of "infinitely long voices"; version 2 (December 1988) recoded them into the flexible per-voice sequences — "a massive leap from composing directly in an assembler listing". He notes the difference again from the other side in 1995, when he moved to fasttracker-2: "much of the same principle as my own music editors of the past, except the channels did not use separate sequences" (source: s-chordian-my-computer-chronicles). This is the stacked-track view cheesecutter preserved.

In SID-Wizard (F6)#

valuemeaning
$01–$7Fpattern number
$80–$8Ftranspose down ($8F = one semitone down)
$90–$9Ftranspose up ($90 = original key)
$A0–$AFmain volume $0–$F
$B0–$EFsingle tempo for this track
$F0–$FDseparator NOP with a section id (---D), visual only
$FEend of tune, stop
$FF xxjump to position xx; xx$80 jumps to a subtune

The orderlist must not begin with $FE/$FF. Editing: RETURN goes to the pattern under the cursor, C=+E finds the first empty pattern, C=+DEL/Insert deletes/inserts an entire column, C=+SPACE sets an individual track play-mark, Shift+SPACE sets all play-marks (then F2 plays from them), C=+Z/C/V undo/copy/paste (source: s-sid-wizard-manual).

From a beginner's side: a fresh orderlist is three rows reading .1 FE, .2 FE, .3 FE. Insert a column, type the pattern numbers (04 05 06), and RETURN on one opens that pattern. The important gotcha is that FE and FF are per channel — a loop has to be typed on all three, or one voice stops while the others repeat (source: s-chipmusic-c64-music-for-dummies).

The 1.6-era book lists $B0–$FD as track tempo ($00–$5D), i.e. the separator range $F0–$FD of the 1.8 manual was still tempo then; it adds that an orderlist effect must not sit directly before a $FF loop (the loop would be ignored to prevent freezing), that pattern 00 cannot be used, and that a subtune jump has to be typed on every track (source: s-witchmaster-creating-chiptunes-with-sid-wizard).

What the source adds (SW 1.97, m64's DUET research)#

From the editor and player sources (source: s-duet-research-sidwizard):

  • $00 is not a value a song can carry — it is the zero-fill after a track's end, drawn as dots. Typing 0 writes $01, INSERT writes $01, a $00 cannot be overwritten, and the cursor snaps off one back to the track's terminator: you cannot park below the end.
  • A terminator can only be typed where one already is: there are no END/JUMP keys, and the editor accepts $FE/$FF only when the byte under the cursor is already ≥ $FE. To move a track's end, delete rows above it.
  • Every subtune always exists. The subtune keys merely select; an unused subtune is three orderlists that are nothing but their $FE, and trailing empty subtunes are not written to disk. The cap is per format: 8 subtunes in .swm, 2 in .sws, 1 in .swt/.swq (swm-format).
  • The subtune jump $FF $8x moves ONE track's orderlist pointer (SETSEQA, player.asm 2671) — the format allows the three tracks to sit in different subtunes at once. The editor never follows it: the display always shows the selected subtune, playback starts from it, and selecting a subtune stops the transport. Measured over the 102 shipped modules: 10 are multi-subtune, 9 chain subtunes with jumps, and none ever splits its tracks.
  • Orderlist effects run one row early (during the tick-1 look-ahead) through delay shadows: a transpose lands exactly on the new pattern's first note; volume and tempo apply at the next row boundary.

Live: moving through the orderlist while it plays (sid-wizard-vessel)#

m64's MIDI-sync fork turns the orderlist into a pattern launcher (source: s-sid-wizard-vessel-readme):

  • Cursor UP/DOWN moves back and forward in the orderlist during playback without cutting anything off — "the currently playing pattern is not interrupted, playback will advance after end of pattern is reached".
  • A virtual position −1 exists so the next pattern played can be the song start, i.e. you can go back to the top without breaking the movement logic.
  • F3 holds (loops) the pattern now playing — the oscilloscope turns green. F1 releases the hold and playback advances to wherever the cursor has been moved — oscilloscope purple.

The whole performance grammar is four keys: cursor for "next up", F3 to hold, F1 to release, SHIFT+1–3 to mute; follow-play is forced on "for better orientation", and sync mode requires tempo 06 (live-tracking, sync).

In GoatTracker (F6)#

Each channel of each of up to 32 subtunes has an orderlist of up to 254 entries: pattern numbers, transpose (+ / - keys; up +0..14, down -1..15 semitones, reset only when the song starts, not on loop), repeat (SHIFT+R; R1–R16, R0 = 16) and the RST endmark followed by the restart position. Rules the editor enforces by stopping playback: with both, TRANSPOSE comes before REPEAT; the entry before RST must be a pattern number (reset a transpose at the start of the loop instead). SPACE/BACKSPACE set start/end positions for F2, RETURN goes to the pattern, SHIFT+1/2/3 swap a channel's orderlist with another channel's (source: s-goattracker-readme).

The Rxx pitfall. stefano-tognon, writing up a GT2 cover that leans hard on orderlist repeats and pattern transposes, then warns against the repeats: with "play from the current start position", moving the start across an Rxx moves one voice's position for all of the repeats at once and desynchronises the voices — "don't use the Rxx command or … only when the tune is finished" (source: s-sidin10-goattracker-2).

In defMON (seqLIST)#

The seqLIST is "a zoomed out view of the entire song" — one sequence number per voice per row, shown to the right of the note editor; RUN/STOP jumps between the two screens. Everything is hex, and the jump is the only command in the list (source: s-defmon-wiki-manual):

entrymeaning
00–7Fsequence number (128 sequences, $00–$7F)
FF + xx + 00jump to position xx — the target is read from the next voice's column
FF + xx + yyjump back to xx, yy times, then carry on

FF 00 03 therefore plays position 00 three extra times, four in all. Finite loops were at first the only difference between the normal build and the "deluxe (dx)" build (iLKke, 2014-06-14) (sources: s-defmon-wiki-manual, s-chipmusic-defmon-thread).

Practice from the support thread (iLKke 2015-08-01, frantic 2017–2020):

  • No-op jumps as section markersFF 08 00 on step 07 jumps to where playback was going anyway, and reads as a visual break in a long list.
  • FF xx yy while sketching, unfolded later: loop a section a fixed number of times, then write it out when the arrangement settles.
  • Keep every sequence referenced. Sequences that appear nowhere in the seqLIST are not saved to disk (F7sus4, 2020-07-31), so park unused ones below the end row rather than dropping them out of the list.
  • SHIFT+N clones to the next empty sequence; SHIFT+U to the next sequence unused in the list, "no matter if this sequence is actually empty or not!" — "SHIFT+U is a more dangerous operation" (frantic, 2017-10-26), and in 2SID mode it has to scan both lists.
  • CTRL+Z CTRL+A = ZONE ALL edits every sequence at once — the border colour warns, CTRL+RETURN exits. It is frantic's way of changing the speed of a whole song, and equally good at destroying one.

Channels always sequence-break together even though each has its own speed column, so per-voice swing re-aligns at every break (frantic, 2020-10-29) (multispeed, shuffle-funktempo). Two list bugs were live for years: pattern breaks in unused sequences were lost on save/load (fixed in the 2017-10 builds, which also re-enabled SHIFT+N), and the loop-jump was not re-initialised on restart while SHIFT+U misread a jump's FF XX XX parameters as used sequence numbers (both fixed in "Packman", 2020-06-01) — old builds are worth avoiding for this reason alone (source: s-defmon-wiki-releases).

In CheeseCutter#

Sequences are the orderlist here: 128 sequences across up to 32 subtunes, three columns each (note · instrument · command), with signed track transposes in which A0 is zero "similarily to SDI" and 80 keeps the previous value (source: s-cheesecutter-guide). The guide's workflow tips are all orderlist habits:

  • Keep sequence 00 empty — it is a reserved dummy.
  • Develop parts as subtunes and combine them at the end. A subtune whose voices are all A000 counts as "unused" to the packer, so sketches left behind cost nothing in the exported tune.
  • Keep the three voices' lengths aligned while composing, then split and de-duplicate at the end — the opposite habit to the independent-length freedom the format allows, adopted because of the next point.
  • F1 plays from the playback mark (blue bar, Backspace) and the tracks must be aligned at that mark or the sequencer misaligns (Ctrl-L resets); F3 plays from the cursor and the guide calls it "advisable to use it"; the wrap point is a purple bar on Ctrl-Backspace.
  • Ctrl-T switches the note display between absolute (JCH-style) and relative to the track transpose (SDI-style) — the same data, two readings of what a transposed sequence means.

In jitt64#

stefano-tognon's Java tracker keeps the track column deliberately small — four commands, right-clicked into a cell (source: s-sidin13-jitt64-tracker):

commandmeaning
0..222pattern number
REPrepeat the sequence of following commands; block size 16, repeat count 2–17
TRtranspose −15..+15 for all following patterns
RSTrestart index — always last, or let the voice simply end

His own example has the three voices doing three different things at once: voice 1 plays patterns 0, 1, 2 and stops; voice 2 plays pattern 0 at pitch, a half step up, a half step down, forever; voice 3 plays 0, 1, 2 twice and ends.

In LSDj: song → chain → phrase#

LSDj replaces the single orderlist with a tree: the song screen has one column per channel listing chains; a chain lists phrases (16 steps each) with an optional transpose per phrase; phrases and chains are shared between channels. Transposition therefore lives in the chain, and a project-wide TRANSPOSE in the project screen shifts pulse and wave instruments (instruments with TRANSP. OFF ignore both — drums). Hxy hops: H00–H0F to the next phrase at step y, H10–HFE back within the phrase x times, HFF stops; H00 on step C of every phrase gives 3/4 time. Cloning (SELECT+(B,A)) copies a chain deep (new phrases) or slim (same phrases) (source: s-lsdj-manual). pain-perdu's rule of thumb for which: slim for a one-note variation or an octave change, since the phrases stay shared; deep when you mean to rework every phrase inside — "but be careful about not running out of phrases". His general form of it: "everything you can highlight you can copy, paste and cut, and every value you can select you can clone." The clipboard survives loading another song, but it carries values only, not what they refer to — chain 1B pasted into a second song points at that song's 1B, which works properly only when both songs come from the same template save (source: s-painperdu-05-shortcuts-and-workflow).

LSDj: the song screen as a live instrument#

Song mode advances every channel in step; live mode queues chains per channel, independently — "PU1 can be playing the chain at position 01 while PU2 plays the chain at position 2F" (Bit Shifter). The arrangement technique built on that is chain-loop islands: because the sequencer in live mode stops rewinding as soon as it hits an empty step, blocks of chains separated by empty rows each cycle on themselves — "you can be assured that a bassline will only cycle through the parts you want it to, rather than continuing on and advancing through the rest of the song. Until you TELL it to" (source: s-chipmusic-lsdj-live-performance).

pain-perdu reaches the same layout from the workflow side: empty rows between sections air the song screen out visually and make each block loop back on itself in live mode — "if I'm looking for the next section to jump to, I have time to decide" instead of triggering something unsynced. Pressing B three times in the song screen marks a block, so intro, break, riser and drop are identifiable at a glance mid-set ("it's in the manual but not a lot of people know about it"; the number of marks is limited). And paste blank space rather than cut when separating sections — cutting shifts everything after it and "can screw up your alignment" (source: s-painperdu-05-shortcuts-and-workflow).

Two things the song screen can do that no pattern edit can:

  • Vamp on chains of mismatched lengths. Write several chains of different lengths over the same harmonic material on PU1, PU2 and WAV and let them cycle freely: "you can get amazing resultant harmonic/melodic textures that you never would have planned for … the mix of tones, melodies and registers can be quite beautiful, string quartet-like". H commands turn the mismatch rhythmic, cycling against the song's straight 16ths — "(I suggest being subtle with this, otherwise it can sound like utter shite)" (BR1GHT PR1MATE) (rhythm-and-groove, arrangement).
  • Transpose instead of cloning. An eight-bar motif in Pain Perdu's Evasive Maneuvers is two phrases plus the chain's transpose column: "this is just a transposition of the same musical sentence, and so with only two phrases I do eight bars." Live, hold A and press the arrows in the project screen — the new project transpose applies only when A is released, so a key change lands exactly on a bar line ("now I have modulated my whole track one semitone up"). Caveat: "L commands and other pitch bends can react differently, and low notes can wrap to the next octave if you're not careful" (source: s-painperdu-05-shortcuts-and-workflow).

LSDj phrase length#

A phrase is 16 steps, but H inside it loops (H71 = seven hops to line 1, H5A five hops to line A), so a 3-tick phrase can last as long as a 6-tick one — arpeggios and long lines from a single phrase (source: s-intense-tech-06-groove-and-tick-tricks-part-1).

In the 1980s drivers#

  • soundmonitor (1986): the track/step table — steps $00–$FF, per voice the memory address of a bar, plus a transpose (TR, semitones, FC = −4) and a sound-transpose (ST) column; F3/F5 mark the first and last step, SHIFT+= copies a block of steps (source: s-64er-soundmonitor-article). The step table carries more than pattern numbers: per row a tempo, a length, a volume and a fade-out speed; per cell (one SID channel in that step) a bar, a transpose and an instrument set; per note an instrument plus flags to disable transpose or enable portamento and arpeggio — the three levels later trackers formalised as orderlist, pattern and note, already separated in 1986 (source: s-vgmpf-soundmonitor-tfmx).
  • Before any of that, the minimal form: the BASIC sound engine in Telengard (Avalon Hill, 1983) has no patterns at all, only a sequencer reading rows of four bytes — a duration in jiffies and one byte per voice, where 0 leaves the voice alone and 255 gates it off. Hold and release, which is still what a tracker's empty row and note-off mean (source: s-sidin04-ripping-basic-rsid).
  • matt-gray-player: a song is three tracks, each a list of pattern numbers — drillerMainTr1: .byte $01,$01,$07,$09,$09,$09,$01,$07 — with $FF = restart the track and $FE = stop; Gray called this "a sequencer approach … a series of smaller sequences" (sources: s-sidin02-matt-gray-driller, s-matt-gray-dominator-source, s-c64com-matt-gray-interview).
  • musicfile: per song three sequences (seq0a–c) of step-table numbers below $40 with prefix bytes — verified in the code: $80–$fd transpose upward by byte & $1f semitones for the following steps ($84,$01 = +4, step 1), $40–$5f repeat the next step, $60–$7f instrument offset, $fe end, $ff restart (sources: s-realdmx-sid-players, s-realdmx-deenen-test-tunes). The 1990 successor adds an intro record and a loop record per song and a global transpose (source: s-realdmx-ouwehand-mon-tunes).

Two families: pattern lists and voice programs#

The drivers recovered as source in the realdmx collection fall into two families (details on the tool pages):

  • Track = list of pattern numbers (the tracker's orderlist): hubbard-player — a track per voice of pattern numbers, $ff restart, $fe stop (source: s-realdmx-hubbard-player); bjerregaard-player — pattern numbers with transpose prefixes (byte & $7f) − $40, $ff restarting all three voices (source: s-realdmx-bjerregaard-player); Audial Arts (1991) — block numbers with $40+n repeat, $80+n transpose, $c0+n instrument offset, $ff,pos loop to a track position; FAME (1988) — step numbers with transpose, instrument offset, $c0+n repeat and an absolute $ff lo hi jump (source: s-realdmx-audial-arts-fame-players); whittaker-player — tracks of pattern addresses of different lengths per voice, !wo 0 to loop; Red's player — pattern words with $xx,$ff transpose markers (source: s-realdmx-fredgray-kimmel-whittaker).
  • Voice = program: galway-player and the ocean-music-driver have no patterns — each voice is a byte-code stream with CALL/RET (an 8- or 5-deep stack), LOOP/NEXT, JUMP, and transposed calls (PLAYT/JSRT/CT) that play one phrase in several keys; Ocean's RET resets the transpose so a phrase cannot leak it (sources: s-realdmx-galway-rambo-player, s-realdmx-ocean-dunn-hughes-driver). Tognon, reading Galway's Arkanoid: "there are not the division in tracks and patterns … there are other methods to take advantage of the use of patterns: subroutine call" — "programming a track is like creating a music program using a high level language", an approach "very powerful if it is compiled by hand, but too complicated by an editor program" (source: s-sidin04-galway-arkanoid). That last clause is why the family died out: the orderlist won because an editor can display it. Fred Gray's Mutants goes further: the song is 26 hand-written routines and a step table of their addresses (source: s-realdmx-fredgray-kimmel-whittaker).

In PC trackers#

ProTracker: a song table of up to 128 positions pointing at 64 patterns (100 with M!K!), edited with Pos / Pattern / Length and the I(nsert)/D(elete) gadgets or the Position Editor, where patterns can be named ("INTRO") without affecting the module; Bxx jumps to a hex position (source: s-protracker-23d-help). In the file itself the song length is 1–128 followed by 128 position bytes of pattern numbers 0–63 (0–99 with M!K!), and between them one byte that ProTracker deliberately wastes: it is "set to 127, so that old trackers will search through all patterns … Noisetracker uses this byte for restart, but we don't" — the one place the two Amiga trackers disagree about the orderlist (source: s-protracker-23-readme-and-docs; mod-format). ST3: 255 orders of 100 patterns, edited with the number keys on F1, G jumps into the pattern; in the file 255 = end (--) and 254 = a skipped marker (++) (sources: s-st3-manual, s-st3-tech-doc). FT2: song positions with Shift+Left/Right, pattern length up to $100 rows, Expand/Shrink to halve or double a pattern's speed (source: s-ft2-manual). IT: 256 orders (impulse-tracker); OpenMPT's MPTM allows several order lists (sequences) in one file (source: s-openmpt-manual-module-formats).

Pattern cloning (Zinc, source: s-tw096-studio-tracking-tips): "Try your best not to repeat patterns in your order list" — copy the pattern to a new number instead, so a later change in one section does not silently change every repeat; the cost is file size, which is why chip-style songs do the opposite (song-init-and-looping). His companion rule: if 64 rows are too few, make the pattern 128 rows and double the speed.

Length without repetition: basehead's Open Your Mind runs 208 orders over 99 patterns, and his Imajica is 189 orders from 94 patterns "with an ending thrown on" — almost no pattern reused (sources: s-tw027-interview-basehead-lotus-position, s-tw018-interview-basehead). The opposite complaint, from Sir Nick (1996): editing note data "in blocks of only few bars" shapes the music, and a progression that spans two patterns is painful to edit pattern by pattern — plan the phrases first, then cut patterns to fit them (source: s-tw072-composing-whole-modules; see arrangement).

Track and sector positions, and what they reveal#

  • The 1980s C64 players kept, per voice, the current index into the track (the sequence of pattern numbers) and into the pattern; Lada Lostak's engine database (2004) records their addresses as OrderPos and SecPos, three each — OrderPos=$0921,$0922,$0923, SecPos=$0924,$0924,$0926 for Future Composer 1.0 — or the same address three times for players in which "all the tree voices use the same track". Tognon's illustration is a tracker song: Track v1: 01 02 03 01 01 00, Sector 01: ins1 dur3 C4 C5 D4 D5. Two uses: a player program can show live where the driver is in the song, and it can find the true length of a tune from the track end marks, "usually $FF and $FE" — one restarts the track, the other stops the voice; with restarts the tune has looped only when all three voices have wrapped (Track1: 01 02 03 FE / Track2: 05 05 06 07 07 07 FE / Track3: 08 08 FE loops when voice 2 does), with stops it has ended when SecPos no longer changes (source: s-sidin05-pattern-searching-2; player-identification).
  • Whether note lengths sit in the pattern as a command (DUR 03) or fall out of the number of rows between notes is the line Tognon draws between "editor" and "tracker" in hvmec (source: s-sidin05-hvmec; tracker).

Four more track formats from SIDin #6–#7#

  • The modules driver (1988): a track entry is 4 bytes — pattern address high and low, the number of pattern bytes to play ($FF = until an ending command) and the number of extra repeats — >pat00, <pat00, $3D, $02 plays the first $3D bytes of pat00 three times; the length field lets one pattern serve as several shorter ones (source: s-sidin07-inside-modules).
  • asterion-sid-tracker (2004): three track columns of pattern numbers $01–$7F; $80–$FE transposes the pattern that follows; $FF n loops the track to position n (source: s-sidin06-asterion-sid-tracker).
  • digiorganizer: the digi track is a list of pattern, repeats−1 pairs (01 04 = pattern 1 five times) ending in $FF (restart) or $FE (stop), over 32-step patterns of sample numbers (source: s-sidin06-digiorganizer).
  • xxlarge (under 256 bytes): a pattern_list of eight pattern offsets read backwards through a 3-bit counter, patterns being nibble streams terminated by a 0 byte (source: s-sidin07-xxlarge).

Orderlists under 512 bytes (Tiny Sid, 2005–2006)#

The 2005 round already had the whole repertoire (source: s-sidin08-tiny-sid-512b):

  • One-byte pattern pointers, a year before XL5's. Crue Gurl (Jaymz Julian / A Life in Hell) keeps three lists orderList1–3 terminated by $FF = repeat, holding patN-pat1 offsets from the first pattern; with a zero-page pointer to pat1 the whole fetch is lda orderList1,y / tay / lda (zp1),y. Tognon: "Using 1 byte instead of 2 for each pointer is a clear way for save lot of space."
  • No orderlist at all. laxity's Twone Five: "Only one sequence per channel. Channel two has a transpose table for the bass ostinate" — the orderlist collapses into a transpose table tp: 0,0,0,0,5,7,0,0 applied at each end mark, the same move as RM below.
  • Order commands cut to the bone. 4mat's winning Empty has song data of ≤ $7F = a position in the pattern data to start from, $80–$8F transpose, $FF end: "I removed the 'repeat pattern' command and made the maximum patterndata 128 bytes to save some memory". Voice 2 is two bytes of song data, $13,$FF.
  • One track shared by two voices. GRG's Plaster (512 b, 2006, the top-scoring entry) has two tracks — one for voice 1, one shared by voices 2 and 3 — a track byte indexing the pattern table, a negative byte's low five bits transposing the next pattern. The two voices on one track are kept apart by XORing voice 2's transpose with $F0 at each track step, XORing voice 3's instrument with $07 at each pattern, and adding a fixed $1E to voice 3's frequency low byte (source: s-sidin12-tiny-sid-2-part-3; detune).

The 2006 round (source below) pushes each of these one step further:

  • One-byte relative offsets: XL5's track is .byte (pat1-pat), (pat2-pat), …, $FF — a pattern number is its offset from the first pattern; $00 ends a pattern, a negative track byte restarts the track. Eight bytes were then saved by deleting the $00 of a pattern whose successor in memory is the pattern that follows it in the track anyway, so playback runs straight on. Resolution's patTable works the same way (13 one-byte entries) (sources: s-sidin10-tiny-sid-2-part-1, s-sidin11-tiny-sid-2-part-2).
  • Transpose lists instead of pattern lists: in RM voice 1 repeats one 10-note pattern and voice 2 one 16-note pattern, so their "tracks" are lists of transpositions (trans1: 0,0,12,12,0,0,12,12, …, $FF) applied by a single ADC to an octave/base-note byte; only voice 3 has a pattern list as well (source: s-sidin10-tiny-sid-2-part-1).
  • No orderlist at all: BLOCK ACID DUB loops one 32-byte grid whose bytes carry a duration and a pointer to a 4-way choice of what to play next, resolved by a CIA timer read — "one stream of data for all channels … that just loops all the time to avoid seq-tables" (source: s-sidin11-tiny-sid-2-part-2).

arrangement · tracker · sid-wizard · shuffle-funktempo · live-tracking · defmon · cheesecutter · jitt64 · jch-editor · song-init-and-looping

Sources#

s-sid-wizard-manual · s-037-lab · s-goattracker-readme · s-witchmaster-creating-chiptunes-with-sid-wizard · s-intense-tech-06-groove-and-tick-tricks-part-1 · s-protracker-23d-help · s-st3-manual · s-st3-tech-doc · s-ft2-manual · s-openmpt-manual-module-formats · s-tw096-studio-tracking-tips · s-lsdj-manual · s-tw027-interview-basehead-lotus-position · s-tw018-interview-basehead · s-tw072-composing-whole-modules · s-64er-soundmonitor-article · s-sidin02-matt-gray-driller · s-matt-gray-dominator-source · s-realdmx-sid-players · s-c64com-matt-gray-interview · s-realdmx-hubbard-player · s-realdmx-galway-rambo-player · s-realdmx-ocean-dunn-hughes-driver · s-realdmx-bjerregaard-player · s-realdmx-fredgray-kimmel-whittaker · s-realdmx-audial-arts-fame-players · s-sidin05-pattern-searching-2 · s-sidin05-hvmec · s-sidin06-asterion-sid-tracker · s-sidin07-inside-modules · s-sidin06-digiorganizer · s-sidin07-xxlarge · s-sidin10-tiny-sid-2-part-1 · s-sidin11-tiny-sid-2-part-2 · s-sidin14-dominator-player · s-sidin15-serpent-demo-player · s-duet-research-sidwizard · s-duet-research-sidwizard-deep · s-chordian-my-computer-chronicles · s-chipmusic-c64-music-for-dummies · s-sid-wizard-vessel-readme · s-sidin10-goattracker-2 · s-defmon-wiki-manual · s-defmon-wiki-releases · s-chipmusic-defmon-thread · s-cheesecutter-guide · s-sidin13-jitt64-tracker · s-painperdu-05-shortcuts-and-workflow · s-chipmusic-lsdj-live-performance · s-vgmpf-soundmonitor-tfmx · s-sidin04-ripping-basic-rsid · s-sidin04-galway-arkanoid · s-protracker-23-readme-and-docs · s-sidin08-tiny-sid-512b · s-sidin12-tiny-sid-2-part-3

source file wiki/concepts/orderlist.md · graph