Converting MOD to PC Speaker
By David Hammond

If done properly, MOD music files can be converted fairly well into ZZT-playable PC Speaker beeps. This is a short guide on how to do that.

First, open the MOD in a MOD tracker, like ModPlug Tracker or something similar. Determine a "main" channel by listening to each one solo and determining which one sounds best alone. That will be the tune of the converted song.

Open up a ZZT editor and make an object. Assuming that the MOD runs at the default speed, you should use "s" note length in the PC Speaker music. If it is about double the speed of normal, use "t", and if it is about half the speed, use "i".

Now you are ready to being converting. Type the note length letter, and then begin scanning down the series of notes in the MOD. For each position, if there is a note there, type the note, and if there isn't, put an "x" there.

For more advanced converters, you probably want to take into account the length of the note that depends on the instrument. If it is running at normal speed and in the MOD you can plainly here the instrument cover two note positions, you should put an "i" directly before the note, remove one following "x", and put an "s" after the note. Similarly, if it is running at half the speed and the note only lasts for half of a note position, you should place an "s" before the note, and an "x" after it, and then an "i" after that.

If you want the conversion to be more exciting, you might want to include some beats as well. It is recommended that you put in the beats as you go rather than putting them in afterward, since it is easy to get lost in the end.

The next step is summarizing the "x"s. In many songs, you will be left with large, ugly blocks of rests that can take up quite a bit of space. Remember that you can summarize 4 "x"s in a row by deleting them and replacing them with "qxs" in normal speed, "ixt" in double speed, and "hxi" in half speed. Here is a table to help you know what to replace with what:

Number of "x"s in a Row|Double Speed|Normal Speed|Half Speed
-----------------------|------------|------------|----------
           4           |    ixt     |     qxs    |    hxi
           6           |    i.xt    |    q.xs    |   h.xi
           8           |    qxt     |     hxs    |    wxi
          12           |    q.xt    |    h.xs    |   w.xi
          16           |    hxt     |     wxs    |   wxxi
          24           |    h.xt    |    w.xs    |   w.xxi
          32           |    wxt     |    wxxs    |  wxxxxi
          48           |    w.xt    |    w.xxi   |  w.xxxxi

Finally, you should add idles between patterns so the music doesn't skip. For a pattern running at normal speed, 64 idles at cycle 1 are needed. That would leave quite a big mess, so I recommend setting the object to cycle 4 and putting in 16 "/i"s in between each pattern. If it is running at double speed, 8 are needed, and if it is running at half speed, 32 are needed.

Now, test out your skills. Try converting the included mwenc.mod into ZZT-playable PC Speaker music. Part of the end result, if you exclude the beats, should be the code in the "D" of "David Hammond" on the Encyclopedia title screen.

Here is an example of a MOD (CS_TANK from Greg Janson's Chronos Stasis) converted to PC Speaker:

#cycle 4
#play scxccd#hxsxxxd#xcd#fhxsxxxfxffg#hxsx
#play sxxg#xg#xa#hxsxgx
/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i
#play s+cx-c-a#x+cd#xcxc-a#x+cd#xg#xd#cxd#
#play sg#xa#xfdxfa#x
/i/i/i/i/i/i/i/i
#play s+cx-c-a#x+cd#xcxc-a#x+cd#xg#xd#cxd#
#play sg#xa#xfdxfa#x
/i/i/i/i/i/i/i/i
#play s+cx-c-a#x+cd#xcxc-a#x+cd#xg#xd#cxd#
#play sg#xa#xfdxfa#x
/i/i/i/i/i/i/i/i
#play s+cx-c-a#x+cd#xcxc-a#x+cd#xg#xd#cxd#
#play sg#xa#xfdxfa#x
/i/i/i/i/i/i/i/i
#play sxxx+cx-a#x+cxd#xcqxsxg#xxgfd#xxdq.x
#play sx
/i/i/i/i/i/i/i/i
:loop
#play sxx+cx-a#x+cxd#xgqxsxg#xxgg#+cxx-a#
#play qxtx+g#gfd#d
/i/i/i/i/i/i/i/i
#play s+cxcx-a#x+cxd#xcqxsxg#xxgfd#xxdq.x
#play sx
/i/i/i/i/i/i/i/i
#play sxx+cx-a#x+cxd#xgqxsxg#xxgg#+cxx-a#
#play qxsx+a#x
/i/i/i/i/i/i/i/i
#play s+g#qxsxg#xa#xxxgxxxd#qxsxdxd#xxxgxx
#play sx
/i/i/i/i/i/i/i/i
#play s+g#qxsxg#xa#xxxgxxx+chxsxxxtc-a#g#g
#play t+fd#dc
/i/i/i/i/i/i/i/i
#play s+g#qxsxg#xa#xxxgxxxd#qxsxdxd#xxxgxx
#play sx
/i/i/i/i/i/i/i/i
#play s+g#qxsxg#xa#xxxgxxx+chxsxxxtxc-a#g#
#play t+gfd#d
/i/i/i/i/i/i/i/i
#play s+cxcx-a#x+cxd#xcqxsxg#xxgfd#xxdq.x
#play sx
/i/i/i/i/i/i/i/i#loop