File suffix:






NinjaTrackerPlus (NTP) is a music player for the Apple IIGS. It plays tracked music that can be converted from MOD files. It is a complete rewrite of our existing music player, NinjaTracker.

Use the convert function above to convert files from MOD to NTP.


The SoundSmith/NinjaTracker file format has some limits. It can't handle more than 15 instruments and it always stores 14 tracks. Also, the notes are played slightly different and many effects are not implemented correct. NinjaTrackerPlus solves all of these issues.

Where Download here.



For musicians

Use the upload form above to see if your MOD can be converted. If there are conversion problems, you'll get tips what you probably should change.

The Apple IIGS has a number of constraints:

15 tracks You can use up to 15 tracks to store notes. OpenMPT and other trackers support this variation of the MOD format.
classic Protracker

NTP is handling effects with the same quirks as classic Protracker.

Also, while NTP supports 6 octaves, it is probably best to keep to the 3 octaves of the Amiga frequency limits.

64k for samples

Yes, the Apple IIGS only has 64k of sound memory. NTP has to fit all samples in there. While there are other players that stream samples to this memory, they consume more processor time. NTP does not support streaming.

sample boundaries

The 64k sound memory cannot be used freely. Samples are aligned to certain boundaries. These are: 256, 512, 1024, 2048, 4096, 8192, 16384 and 32768 bytes. The converter will take care of sample alignment, but this constraint further reduces the memory that you have available.

sample sizes

Like the boundaries above, ideal sample sizes are 256, 512, 1024, 2048, 4096, 8192, 16384 and 32768 bytes.

Other sample sizes are always possible, but they are wasting space due to the boundaries. So if your sample is 2060 bytes, it is treated like a 4096 byte sample. Try to remove some bytes to fit it into 2048 bytes.

Also, if your sample is not of an ideal size, 8 stopper bytes have to be appended, which may push the sample's size over the adjacent boundary.

looped samples

If your sample is looped, it has to be split into 2 samples: Header and loop. This is done by the converter automatically. But this means that to each, the sample size contraints from above apply.

Attention: There is a bug in the IIGS sound hardware that can create nasty clicks in a loop if they are not of an ideal size. NTP does some wild stunts to minimize the effect, but if you can, make sure the loop has an ideal sample size!


Keep your samples small so that they fit in 64k.

Make sure that the loops of your samples are exactly 256, 512, 1024, 2048, 4096, 8192, 16384 or 32768 bytes long. This will result in the best sound quality.


Using the 8 command, you can send sound from the track to one of 8 output channels that the Apple IIGS supports:

0= Front left
1= Front right
2= Surround left
3= Surround right
4= Front height left
5= Front height right
6= Surround back left
7= Surround back right

The 4soniq card supports all output channels.

On stereo systems, all "left" channels are sent to the left speaker. All "right" channels are sent to the right speaker.

On mono systems, all channels are sent to the one speaker available.

By default, the converter will set the tracks to use the classic output channels in this fashion:
Track 1 - Front right
Track 2 - Front left
Track 3 - Front left
Track 4 - Front right
-repeat for the remaining tracks-

supported effects

You probably know all Protracker effects. Most are supported by NTP:

[0]: Arpeggio
[1]: Slide up
[2]: Slide down
[3]: Slide to note
[4]: Vibrato
[5]: Continue 'Slide to note', but also Volume slide
[6]: Continue 'Vibrato', but also Volume slide
[7]: Tremolo
[8]: IIGS panning
[9]: NOT SUPPORTED: Set sample offset
[10]: Volume slide
[11]: Position Jump
[12]: Set volume
[13]: Pattern Break
[14][0]: NOT SUPPORTED: Set filter on/off
[14][1]: Fineslide up
[14][2]: Fineslide down
[14][3]: Set glissando on/off
[14][4]: Set vibrato waveform
[14][5]: Set finetune value
[14][6]: Loop pattern
[14][7]: Set tremolo waveform
[14][8]: -- Unused --
[14][9]: Retrigger sample
[14][10]: Fine volume slide up
[14][11]: Fine volume slide down
[14][12]: Cut sample
[14][13]: Delay sample
[14][14]: Delay pattern
[14][15]: NOT SUPPORTED: Invert loop
[15]: Set speed


For programmers

Example code, the full source for the player and the converter as well as example music files are available in the download section.

  • The player is written in assembly with Merlin 32.
  • The converter is written in PHP.
  • The 2MG disk image features example music.
  • Read the ninjatrackerplus.s source code to learn about the interface.
  • The music player uses the sound interrupt for timing purposes. Do not block interrupts for longer periods or the music will "hang".
  • If the music uses looped samples where the loops are not of an ideal sample size, additional interrupts are created. If you can, ask the musician to use loops of an ideal size (see tips above).


Comparison with NinjaTracker

NinjaTrackerPlus is a music player written from scratch. It features:

  NinjaTrackerPlus NinjaTracker
max. number of instruments 255 15
number of tracks 1-15 always 14
support for 4soniq card(s) yes yes
number of Protracker effects supported
(out of 31)
28 18 (and with bugs)
support Protracker note table yes no
support both Protracker tempo and speed both tempo only
improve quality with ideal samples
(256, 512, 1024, ...)
yes no
rotate loops to minimize DOC swap bug yes no
file format .NTP .SSM and .W ( like SoundSmith)




September 9, 2018 Initial release.
September 16, 2018 Bug fix:
+ The player now uses the system volume.
November 25, 2019 Bug fixes:
+ MODs with 1/2/3 or 15 channels were not converted correctly
+ The converter now rotates loops near a zero-crossing to reduce the swap bug
February 8, 2020 Bug fix:
+ portamento effects 1 and 2 no longer start at first tick
April 8, 2021 Added the ability to set volume during playing.
Bug fixes:
+ Some notes where not stopped resulting in "skipped" notes
+ Octaves 0 and 4 had wrong values