669 and Extended 669 file format:

offset         |length&type    |description
---------------+---------------+----------------------------------------------
0              |2 bytes        |marker, 'if' for 669, 'JN' for Extended 669
2              |108 bytes      |song message
0x6e           |1 byte         |NOS = number of samples saved (0-64)
0x6f           |1 byte         |NOP = number of patterns saved (0-128)
0x70           |1 byte         |loop order number
0x71           |0x80 bytes     |order list
0xf1           |0x80 bytes     |tempo list for patterns
0x171          |0x80 bytes     |break location list for patterns
0x1f1          |NOS*size struct|sample data
              | samp          |
+--------------+---------------+
|struct samp {
|  13 bytes ASCIIZ filename of instrument
|  1 dword length of instrument
|  1 dword offset of beginning of loop
|  1 dword offset of end of loop
|} smp[NOS]
+--------------+---------------+----------------------------------------------
0x1f1+         |NOP*0x600      |patterns
(NOS*0x19)     |               |
+--------------+---------------+
|this is repeated 8 times for every row and the array of 8 of these is
| repeated 64 times for each pattern.
|
| bits:
|   BYTE[0]:             BYTE[1]:            BYTE[2]:
|  aaaaaaaa             bbbbbbbb            cccccccc
|  +----++-----------------++--+            +--++--+
|  |     |                  |               |   |
|  |     |                  4 bit volume    |   command value
|  |     |                                  |
|  |     aabbbb = 6 bit instrument number   command:
|  |                                         0 = a
|  note value = (12*oct)+note                1 = b
|                                            2 = c
|  special values for byte 0:                3 = d
|    0xfe = no note, only volume change      4 = e
|    0xff = no note or volume change         5 = f
|
|                                           special value for byte 2:
|                                             0xff = no command
|
+--------------+---------------+----------------------------------------------
0x1f1+         |rest of file   |samples
(NOS*0x19)+    |               |
(NOP*0x600)    |               |


 There are six special commands you can enter. To enter a special command hit
 Backspace in the pattern edit screen, enter a letter (a-f) then a number
 (1-F). The first 5 commands alter the way the note will be played, the
 sixth, 'f', changes the tempo in the pattern and has no effect on the note
 being played. All commands except 'c' can be specified as part of a note or
 alone. If they are specified alone, their effect starts where they were
 placed, not when the note was struck. If no instrument is playing on the
 channel where the command was encountered, there will be no effect (except
 for command 'f', it always changes the tempo). The commands continue to
 affect the way the instrument is played untill another note or command
 is encountered in the pattern (an 'f' command will cancel the effects of
 any previous command, but nothing cancels the effect of the 'f' command).
 The format of the commands is c#, where c is the command and # is the
 command value which is the user defined parameter for how much the command
 will affect the instrument.


669 Commands:
=============

   a - Portamento up - This command will cause the frequency of the note to
       increase over time, the command value indicates how fast the pitch
       will increase. (For those of you who know what this means, the port
       is linear, not logarithmic).

   b - Portamento down - Same as 'a' but in the other direction.

   c - Port to note - This is the only command that requires there to be a
       note on the same line. This commands sets the note to portamento at
       the speed defined by the command value towards the note on the line.
       The instrument value of the note is ignored, but the volume is set
       to the volume in the note on this line. When the note reaches the
       destination note, the portamento is stopped and it continues playing
       at the destination note frequency.

   d - Frequency adjust - This command adjusts the frequency of the note
       currently playing a little bit. This is useful for when you have 2
       notes playing at the same pitch using the same instrument, use this
       command to adjust the frequency of one of the notes to make it sound
       a little more harmonic.

   e - Frequency vibrato - This command sets the frequency of the note that
       is playing to vibrate. The command value specifies how much to
       vibrato the note by.

Note: A command value of 0 on any of the previous commands cancels the effect
 of any previous command and sets the note to play normally.

   f - Set tempo - Usually you will set the tempo for the patterns through
       their basic tempo. But there are times when you may want to change
       the tempo within a pattern. Use this command to do it. The tempo will
       remain at this tempo untill another set tempo command or untill
       another pattern is reached in the order list (even the same pattern
       that is playing now).


Extended 669 Commands:
======================

   f0 - Super Fast Tempo. In COMPOSD1, this tempo is unused,
        in UNIS 669 Extended mode, this is a super fast tempo.

   g  - G of Commands
        Subcommand:
        0 - Balance fine slide Left        8 - Unused
        1 - Balance fine slide Right       9 - Unused
        2 - Unused                        10 - Unused
        3 - Unused                        11 - Unused
        4 - Unused                        12 - Unused
        5 - Unused                        13 - Unused
        6 - Unused                        14 - Unused
        7 - Unused                        15 - Unused

   h  - Slot Retrig. This command rapidly fires 4 slots.
        The command parameter specifies the speed at which to do it.
        The speed difference across the values is exponential.

Info from: - 669.DOC and COMPOSD.DOC by Tran
          - UNIS669.HLP by Jason Nunn


Prime/Inertia <[email protected]>