Ninjatracker
A native commodore-64 music editor by lasse-oorni (Cadaver), written so that his games could have music with low rastertime and memory usage; version 2 (2.0–2.03, dated August–September 2006 by the SIDin news; the #11 editorial of 2007-02-14 says it and laxity's SID Factory "were released in the same week" — sources: s-sidin-news-digest, s-sidin11-sid-factory-vs-ninjatracker), is the one sidin #11 documents. It is a duration-based editor (note, command, duration per row) that can be used "in a manner very similar to a tracker" with a fixed duration and key on/off; the command shown by name on every row is what Tognon liked best (source: s-sidin11-sid-factory-vs-ninjatracker). Only the SIDin article is recorded here.
Facts#
- V1.x, "years ago", "was quite hard to use", but a utility converted goattracker songs into Ninjatracker format, so one could compose in GT and only fix the instruments afterwards (source: s-sidin11-sid-factory-vs-ninjatracker).
- Up to 16 subtunes of 3 tracks; up to 127 commands (a command on a note row is an instrument); grey-scale colours by default, configurable; one screen for patterns, commands and tables; online help inside the editor plus offline docs; ProTracker or DMC note entry; fast forward; the rastertime is displayed during playback (not the notes) (source: s-sidin11-sid-factory-vs-ninjatracker).
- Tools: a pattern packer/optimiser; a relocator with a "Gamemusic" option that saves the song without the player, for sound effects in a game (sid-player-routine); example tunes; file names typed by hand; a border animation while loading; source code available (source: s-sidin11-sid-factory-vs-ninjatracker).
- Limits (2007): no multispeed; instruments cannot be saved for reuse; the many v2.x releases differ in hard-restart type, note durations and minor effects, so a tune is tied to the version it was made with — Tognon wished for loadable players in one editor "like in SIDFactory or JCH" (source: s-sidin11-sid-factory-vs-ninjatracker).
- Tognon's tally against SID Factory: 15 plus and 4 minus, versus 10 and 9 (source: s-sidin11-sid-factory-vs-ninjatracker).
Why it exists, in his own words (2002)#
Asked in November 2002 why he had written so many players — "Music driver, SadoTracker, Goattrk and Ninjatrk" — lasse-oorni gave the reason each time as "memory or speed (rastertime) gain", and NinjaTracker's specifically: "I thought Goattracker would be the ultimate for my personal use, because it was fast & easy to compose on, but finally I had to realize that music made with it takes too much memory (because of the patterns, they're like in Amiga/PC tracker programs). So I started the quest for the extremely optimized playroutine/musicdata combination (Ninjatracker)". By then he considered it to have reached its own peak "in speed & size", as goattracker had in ease of use (sid-player-routine, orderlist; source: s-sidin02-cadaver-interview).
One design decision outlived the program: iLKke's defMON guide credits NinjaTracker as the precedent for no discrimination between instruments and effects — one table serving both — which is the principle defmon took to its conclusion (source: s-defmon-wiki-defmoning-101).
Cheat sheet#
All from s-sidin11-sid-factory-vs-ninjatracker (Ninjatracker V2.x, February 2007).
Track (one per voice, per subtune; orderlist)
| value | meaning |
|---|---|
00 | loop |
01–7F | play pattern 01–7F |
80–BF | transpose downwards |
C0–FF | transpose upwards |
Pattern row: note C1–B7, +++ (key on) or --- (key off) · command 01–7F (instrument if a note is given, effect otherwise) or 81–FF (legato) · note duration · the command's name (display only). Empty fields keep the previous values.
Command = ADSR · wave-table pointer · pulse-table pointer · filter-table pointer. ADSR is not used in legato mode; a pointer of 00 keeps the table already running (instrument-tables).
Wave table (left byte / right byte; wavetable-programming)
| left | right | effect |
|---|---|---|
00–8F | arpeggio: 00–7F relative, 8C–DF absolute note | set waveform (chord-arpeggio) |
90–BF | — | no waveform; delay the arpeggio by 00–2F frames |
C0–DF | depth | vibrato with speed 00–1F |
E0–FE | speed low byte | slide with speed high byte 00–1E (pitch-slide-and-portamento) |
FF | destination | jump — not to be entered directly from a command |
Pulse table (pulse-width-modulation)
| left | right | effect |
|---|---|---|
01–7F | signed speed | modulate the pulse width for that many frames |
80–FE | value | set the pulse width |
FF | destination | jump (can be entered from a command) |
Filter table (filter-programming)
| left | right | effect |
|---|---|---|
01–7F | signed speed | modulate the cutoff for that many frames |
80–FE | cutoff | set passband (left nybble − 8) and the channels to filter (right nybble) |
FF | destination | jump (can be entered from a command) |
Release history (from the SIDin news, 2002–2006)#
- 1.0, 2002-11-01: "a new tracker by Lasse Öörni (Cadaver)" at "only 10 rasterline" for demos short of memory and raster time; 1.01 two weeks later, 1.02 days after that — "only 8 rasterlines even during badlines" (source: s-sidin-news-digest).
- 1.04, 2003-03-05: the filter command returns; a gamemusic version that keeps the playroutine separate as source and "doesn't lie about the rastertime anymore"; GoatTracker→NinjaTracker converter 1.1. 1.05, 2004-01-06: a slide-duration calculator. 1.1, 2004-01-25: "Hardrestart is more solid (set both AD,SR to $00)",
INSinserts00,00in the pulse/filter tables (hard-restart; source: s-sidin-news-digest). - 2.0–2.03, August–September 2006: commands double as instruments, two-column tables, a slide that stops at the target pitch; 2.02 a two-frame hard restart with only 2 zero-page bytes; 2.03 a "hifi" hard restart and note durations 3–65 — released "in the same week" as SID Factory 0.05, hence sidin #11's comparison (source: s-sidin-news-digest).
Related#
lasse-oorni · goattracker · sid-factory-ii · laxity · sid-player-routine · instrument-tables · wavetable-programming · hard-restart · multispeed · sidin · tracker
Sources#
s-sidin11-sid-factory-vs-ninjatracker · s-sidin-news-digest · s-sidin02-cadaver-interview · s-defmon-wiki-defmoning-101