SIDin #11 — SID Factory vs Ninjatracker (Stefano Tognon, 2007)
Two native C64 editors "released about the same day": laxity's SID Factory (the 2007 ancestor of sid-factory-ii) and lasse-oorni's ninjatracker V2. Tognon documents the data formats of both — the SID Factory drivers' instrument/table bytes and commands, Ninjatracker's track, pattern and table syntax — and scores them feature by feature.
Key claims#
SID Factory (Laxity)#
- Looks like the JCH editor: one editor loading different player drivers, a table-based tracker, similar screens. Main menu: enter editor, disk, packer, options; the lower part shows the loaded driver's information (the JCH editor shows the disk directory there instead). Colours green/white plus light green and blue.
- Editor screen: per track a pattern number and below it the pattern; a row holds instrument (32 max), command (64 max) and note; instruments and commands index fixed tables at the bottom; a dynamic table in the centre shows the table the cursor points into.
- Two drivers shipped: v5.0x — "standard music driver with calculated vibrato and no aim at execution speed (multispeed allowed)"; v6.0x — "'fast' music driver without calculated vibrato and aims at a maximum execution spike at around $18 scanlines" (sid-player-routine, multispeed).
- Instrument, v5.0x
aa bb cc dd ee ff gg hh: AD · SR · properties 1 (bits 7–6 restart settings, bit 5 arpeggio mode, bit 4 oscillator reset, bits 3–0 hard-restart table pointer) · properties 2 (bits 7–6 pulse and filter settings, bits 5–0 arpeggio delta delay) · resonance (non-zero switches the filter on for that channel) · filter table pointer · pulse table pointer · wave table pointer. v6.0xaa bb cc dd ee ff: AD · SR · properties ($80restart,$40filter pointer set enable,$20pulse pointer set disable,$10oscillator reset — "changed from $08 in driver 6.02 and forward") · filter pointer (used if$40) · pulse pointer (unless$20) · wave pointer (instrument-tables). - Wave table
aa bb: note offset (bit 7 = fixed note) and waveform;$7f bbjump; v5 also$7eset wave-table delay,$7dwait (not implemented). Arpeggio table (v5 only): note offsets,$7x= "repeat X steps from the top of the current arpeggio" (wavetable-programming, chord-arpeggio). - Pulse table v5
aa bb cc:aa < $10addaabbforccframes;$8x bb ccset width$xbband waitcc;$7f ?? ccjump. v6aa bb:aa < $80= frames,bb= sweep value "reversed nibble";aa ≥ $80set width,bb = xy→$0yx0;$7f bbjump (pulse-width-modulation). - Filter table v5:
0a bb ccadd (low byte first — "the opposite of the pulse table"),$8x bb ccset high byte and wait,$7f ?? ccjump; v6:aa bbframes and add value,$80 bbset,$7f bbjump (filter-programming). - Commands v5:
0x aa ?bslide (additive only);1x aa ?bvibrato (frequency, amplitude);2x ?? aaarpeggio pointer;3x aa bbfilter and/or pulse pointer (bit 0 →aafilter, bit 1 →bbpulse);4x aa bbwave and/or pulse pointer;8x AD SRADSR for the instrument's scope;9x AD SRADSR for this note only;c0 xxvolume;f0 xxtempo (pointer into a tempo table);f1 xx xxportamento ("set until vibrato, slide or new instrument is set!"). v6:0X XXslide up,1X XXslide down (12-bit values);2X YYvibrato (X frequency, YY amplitude);3X YYfilter parameters (band width, resonance + select bits);4x YY/5x YY/6x YYfilter / pulse / wave pointer;8D SRset DSR — "Attack is always set to 0.. Bummer!". v6 init tableaa bb cc: tempo index, volume/filter passband ($1f= volume$f, band-pass 1), resonance/channels ($f1= resonance$f, voice 1; bits$01/$02/$04= voices 1–3) (vibrato, pitch-slide-and-portamento). - Tognon's remarks: no way found to relocate a tune ("maybe a features not present into this alfa version"), no subtunes, no online help, fixed colours, no fast forward, files chosen from a list, source not available, example tunes included, a packer, and "Multispeed in a natural way with a specific player. I can say that this is the first editor I try that has this features".
Ninjatracker V2.x (Cadaver)#
- Based on V1.x, made "for having an editor that had low rastertime and memory usage that can be used for the music of his games"; V1 "was quite hard to use", but a utility converted goattracker tunes to Ninjatracker format so one only had to fix the instruments. Grey-scale colours by default ("similar to the Goattracker editor"), user-configurable.
- Up to 16 subtunes of 3 tracks; track values
00loop,01–7Fpattern,80–BFtranspose down,C0–FFtranspose up (orderlist). - Pattern row: note
C1–B7/+++key on /---key off · command01–7F(an instrument when a note is given, an effect otherwise) or81–FFlegato · note duration · the command's name shown "just for best looking" ("probably one of the best features"). Omitted values repeat the previous ones; with a fixed duration and key on/off it works "very similar to a tracker" — otherwise it is a duration-based editor. - A command =
ADSR, wave-table pointer, pulse-table pointer, filter-table pointer(ADSR ignored in legato; pointer00= keep the running table). - Tables (left byte / right byte): wave
00–8Fwaveform + arpeggio (00–7Frelative,8C–DFabsolute),90–BFno waveform, delay the arpeggio00–2Fframes,C0–DFvibrato speed00–1F+ depth,E0–FEslide speed high00–1E+ low,FFjump (not from a command); pulse01–7Fmodulate for n frames at a signed speed,80–FEset,FFjump; filter01–7Fmodulate cutoff,80–FEset passband (left nybble − 8) and channels (right nybble) + cutoff,FFjump. - Cadaver released many v2.x versions differing "in some points like hardrestart type, notes duration and other minus effects. This means that you have to choose the editor you need to use" — loadable players in one editor "like in SIDFactory or JCH" would be better. Also: pattern packer/optimiser, a relocator that can save the song without the player for game sound effects ("Gamemusic option"), very low rastertime, no multispeed, online help, ProTracker or DMC note entry, fast forward, rastertime display, source code available, example tunes; instruments cannot be saved separately.
Comparison and conclusion#
- Tognon's tally: Ninjatracker 15 plus / 4 minus, SID Factory 10 plus / 9 minus — SID Factory "is in alpha state and so no all the simple features are inserted". He prefers a tracker over a duration-based editor "as it is more evident the flow of what happens in the tune". Both lack a display of the notes being played and instrument load/save.
Practical takeaways#
- Two driver-defined table layouts to read alongside GoatTracker's: SID Factory's instrument is a byte row of pointers with flag bits, and its "fast" v6 driver removes calculated vibrato to cap rastertime at about
$18lines — the trade-off a game musician makes (sid-player-routine). - Ninjatracker's wave table folds vibrato and slides into the same byte range as waveforms and arpeggio — one table per instrument for everything but pulse and filter.
- A GoatTracker-to-Ninjatracker path existed in 2007: compose in GT, convert, fix instruments in the low-rastertime player.
Notable quotes#
"This means that you have to choose the editor you need to use."
"Multispeed in a natural way with a specific player. I can say that this is the first editor I try that has this features."
Relevance to the wiki#
Creates ninjatracker; documents the 2007 SID Factory drivers on sid-factory-ii; adds to lasse-oorni, laxity and goattracker; table formats for instrument-tables, filter-programming and multispeed.
Pages touched#
ninjatracker · sid-factory-ii · lasse-oorni · laxity · goattracker · instrument-tables · filter-programming · multispeed · sid-player-routine · sidin
To verify#
- SID Factory's version at the time (Laxity's interview in the same issue speaks of a released 0.5 and an unreleased 0.6; Tognon says "alfa") — the article gives no number.
- The Ninjatracker 2.x version history is in the issue's news section, not read for this summary.