home *** CD-ROM | disk | FTP | other *** search
/ Large Pack of OldSkool DOS MOD Trackers / it_211.zip / ITTECH.TXT < prev    next >
Text File  |  1996-12-28  |  46KB  |  894 lines

  1.  
  2.                              Impulse Header Layout
  3.  
  4.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  5.       ┌───┬───┬───┬───┬───────────────────────────────────────────────┐
  6. 0000: │'I'│'M'│'P'│'M'│ Song Name, max 26 characters, includes NULL   │
  7.       ├───┴───┴───┴───┴───────────────────────────────────────┬───┬───┤
  8. 0010: │.......................................................│ x │ x │
  9.       ├───────┬───────┬───────┬───────┬───────┬───────┬───────┼───┴───┤
  10. 0020: │OrdNum │InsNum │SmpNum │PatNum │ Cwt/v │ Cmwt  │ Flags │Special│
  11.       ├───┬───┼───┬───┼───┬───┼───────┼───────┴───────┼───────┴───────┤
  12. 0030: │GV │MV │IS │IT │Sep│(0)│MsgLgth│Message Offset │   Reserved    │
  13.       ├───┴───┴───┴───┴───┴───┴───────┴───────────────┴───────────────┤
  14. 0040: │ Chnl Pan (64 bytes)...........................................│
  15.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  16.  
  17.       ├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
  18. 0080: │ Chnl Vol (64 bytes)...........................................│
  19.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  20.  
  21.       ├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
  22. 00C0: │ Orders, Length = OrdNum                                       │
  23.       ├───────────────────────────────────────────────────────────────┤
  24. xxxx: │ 'Long' Offset of instruments, Length = InsNum*4 (1)           │
  25.       ├───────────────────────────────────────────────────────────────┤
  26. xxxx: │ 'Long' Offset of samples headers, Length = SmpNum*4 (2)       │
  27.       ├───────────────────────────────────────────────────────────────┤
  28. xxxx: │ 'Long' Offset of patterns, Length = PatNum*4 (3)              │
  29.       └───────────────────────────────────────────────────────────────┘
  30.  
  31.       (1) Offset = 00C0h+OrdNum
  32.       (2) Offset = 00C0h+OrdNum+InsNum*4
  33.       (3) Offset = 00C0h+OrdNum+InsNum*4+SmpNum*4
  34.  
  35.         Note that if the (long) offset to a pattern = 0, then the
  36.         pattern is assumed to be a 64 row empty pattern.
  37.  
  38.       Cwt:      Created with tracker.
  39.                  Impulse Tracker y.xx = 0yxxh
  40.       Cmwt:     Compatible with tracker with version greater than value.
  41.                  (ie. format version)
  42.       OrdNum:   Number of orders in song.
  43.       InsNum:   Number of instruments in song
  44.       SmpNum:   Number of samples in song
  45.       PatNum:   Number of patterns in song
  46.       Flags:    Bit 0: On = Stereo, Off = Mono
  47.                 Bit 1: Vol0MixOptimizations - If on, no mixing occurs if
  48.                        the volume at mixing time is 0 (redundant v1.04+)
  49.                 Bit 2: On = Use instruments, Off = Use samples.
  50.                 Bit 3: On = Linear slides, Off = Amiga slides.
  51.                 Bit 4: On = Old Effects, Off = IT Effects
  52.                         Differences:
  53.                        - Vibrato is updated EVERY frame in IT mode, whereas
  54.                           it is updated every non-row frame in other formats.
  55.                           Also, it is two times deeper with Old Effects ON
  56.                        - Command Oxx will set the sample offset to the END
  57.                          of a sample instead of ignoring the command under
  58.                          old effects mode.
  59.                        - (More to come, probably)
  60.                 Bit 5: On = Link Effect G's memory with Effect E/F. Also
  61.                             Gxx with an instrument present, the envelopes
  62.                             will be retriggered. If you change a
  63.                             sample on a row with Gxx, it'll adjust the
  64.                             frequency of the current note according to:
  65.  
  66.                               NewFrequency = OldFrequency * NewC5 / OldC5;
  67.  
  68.       Special:  Bit 0: On = song message attached.
  69.                        Song message:
  70.                         Stored at offset given by "Message Offset" field.
  71.                         Length = MsgLgth.
  72.                         NewLine = 0Dh (13 dec)
  73.                         EndOfMsg = 0
  74.  
  75.                        Note: v1.04+ of IT may have song messages of up to
  76.                              8000 bytes included.
  77.  
  78.                 Bits 1-15: Undefined, will always be safe to ignore.
  79.  
  80.       GV:       Global volume. (0->128) All volumes are adjusted by this
  81.       MV:       Mix volume (0->128) During mixing, this value controls
  82.                 the magnitude of the wave being mixed.
  83.       IS:       Initial Speed of song.
  84.       IT:       Initial Tempo of song
  85.       Sep:      Panning separation between channels (0->128, 128 is max sep.)
  86.       Chnl Vol: Volume for each channel. Ranges from 0->64
  87.       Chnl Pan: Each byte contains a panning value for a channel. Ranges from
  88.                  0 (absolute left) to 64 (absolute right). 32 = central pan,
  89.                  100 = Surround sound.
  90.                  +128 = disabled channel (notes will not be played, but note
  91.                                           that effects in muted channels are
  92.                                           still processed)
  93.       Orders:   This is the order in which the patterns are played.
  94.                  Valid values are from 0->199.
  95.                  255 = "---", End of song marker
  96.                  254 = "+++", Skip to next order
  97.  
  98.  
  99.                   Old Impulse Instrument Format (cmwt < 200h)
  100.  
  101.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  102.       ┌───┬───┬───┬───┬───────────────────────────────────────────────┐
  103. 0000: │'I'│'M'│'P'│'I'│ DOS FileName (12345678.123)                   │
  104.       ├───┼───┼───┼───┼───┬───┬───┬───┬───────┬───┬───┬───────┬───┬───┤
  105. 0010: │00h│Flg│VLS│VLE│SLS│SLE│ x │ x │FadeOut│NNA│DNC│TrkVers│NoS│ x │
  106.       ├───┴───┴───┴───┴───┴───┴───┴───┴───────┴───┴───┴───────┴───┴───┤
  107. 0020: │ Instrument Name, max 26 bytes, includes NUL...................│
  108.       ├───────────────────────────────────────┬───┬───┬───┬───┬───┬───┤
  109. 0030: │.......................................│ x │ x │ x │ x │ x │ x │
  110.       ├───────────────────────────────────────┴───┴───┴───┴───┴───┴───┤
  111. 0040: │ Note-Sample/Keyboard Table, Length = 240 bytes................│
  112.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  113.  
  114.       ├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
  115. 0130: │ Volume envelope (200 bytes)...................................│
  116.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  117.  
  118.                                       ├───┴───┴───┴───┴───┴───┴───┴───┤
  119. 01F8:                                 │ Node points (25x2 bytes)......│
  120.                                       └───────────────────────────────┘
  121.  
  122.         Total length of old instrument header is 554 bytes.
  123.  
  124.       Flg:      Bit 0. On = Use volume envelope
  125.                 Bit 1. On = Use volume loop
  126.                 Bit 2. On = Use sustain volume loop
  127.       VLS:      Volume loop start (node number)
  128.       VLE:      Volume loop end (node number)
  129.       SLS:      Sustain loop start (node number)
  130.       SLE:      Sustain loop end (node number)
  131.       FadeOut:  Ranges between 0 and 64, but the fadeout "Count" is 512.
  132.                 Fade applied when:
  133.                 1) Note fade NNA is selected and triggered (by another note)
  134.                 2) Note off NNA is selected with no volume envelope
  135.                    or volume envelope loop
  136.                 3) Volume envelope end is reached
  137.  
  138.       DNC:      Duplicate note check (0 = Off, 1 = On)
  139.       NNA:      New note action:
  140.                         0 = Note cut
  141.                         1 = Note continue
  142.                         2 = Note off
  143.                         3 = Note fade
  144.  
  145.       TrkVers:  Tracker version used to save the instrument. This is only
  146.                 used in the instrument files.
  147.       NoS:      Number of samples associated with instrument. This is only
  148.                 used in the instrument files.
  149.  
  150.       Note-Sample/Keyboard Table.
  151.        Each note of the instrument is first converted to a sample number
  152.        and a note (C-0 -> B-9). These are stored as note/sample pairs
  153.        (note first, range 0->119 for C-0 to B-9, sample ranges from
  154.        1-99, 0=no sample)
  155.  
  156.        Volume envelope: Values from 0->64, 0FFh indicating end of envelope.
  157.        (after which note fade applies)
  158.  
  159.       Node data: Tick THEN magnitude
  160.  
  161.  
  162.  
  163.                            Impulse Instrument Format
  164.  
  165.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  166.       ┌───┬───┬───┬───┬───────────────────────────────────────────────┐
  167. 0000: │'I'│'M'│'P'│'I'│ DOS FileName (12345678.123)                   │
  168.       ├───┼───┼───┼───┼───────┬───┬───┬───┬───┬───┬───┬───────┬───┬───┤
  169. 0010: │00h│NNA│DCT│DCA│FadeOut│PPS│PPC│GbV│DfP│RV │RP │TrkVers│NoS│ x │
  170.       ├───┴───┴───┴───┴───────┴───┴───┴───┴───┴───┴───┴───────┴───┴───┤
  171. 0020: │ Instrument Name, max 26 bytes, includes NUL...................│
  172.       ├───────────────────────────────────────┬───┬───┬───┬───┬───┬───┤
  173. 0030: │.......................................│ x │ x │MCh│MPr│ x │ x │
  174.       ├───────────────────────────────────────┴───┴───┴───┴───┴───┴───┤
  175. 0040: │ Note-Sample/Keyboard Table, Length = 240 bytes................│
  176.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  177.  
  178.       ├───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┤
  179. 0130: │ Envelopes.....................................................│
  180.       ├───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┤
  181.  
  182.         NNA = New Note Action
  183.                 0 = Cut                 1 = Continue
  184.                 2 = Note off            3 = Note fade
  185.  
  186.         DCT = Duplicate Check Type
  187.                 0 = Off                 1 = Note
  188.                 2 = Sample              3 = Instrument
  189.  
  190.         DNA: Duplicate Check Action
  191.                 0 = Cut
  192.                 1 = Note Off
  193.                 2 = Note fade
  194.  
  195.       FadeOut:  Ranges between 0 and 128, but the fadeout "Count" is 1024
  196.                 See the Last section on how this works.
  197.                 Fade applied when:
  198.                 1) Note fade NNA is selected and triggered (by another note)
  199.                 2) Note off NNA is selected with no volume envelope
  200.                    or volume envelope loop
  201.                 3) Volume envelope end is reached
  202.  
  203.         PPS: Pitch-Pan separation, range -32 -> +32
  204.         PPC: Pitch-Pan center: C-0 to B-9 represented as 0->119 inclusive
  205.  
  206.         GbV: Global Volume, 0->128
  207.         DfP: Default Pan, 0->64, &128 => Don't use
  208.         RV: Random volume variation (percentage)
  209.         RP: Random panning variation (panning change - not implemented yet)
  210.  
  211.         MCh = MIDI Channel
  212.         MPr = MIDI Program (Instrument)
  213.  
  214.       TrkVers:  Tracker version used to save the instrument. This is only
  215.                 used in the instrument files.
  216.       NoS:      Number of samples associated with instrument. This is only
  217.                 used in the instrument files.
  218.  
  219.       Note-Sample/Keyboard Table.
  220.        Each note of the instrument is first converted to a sample number
  221.        and a note (C-0 -> B-9). These are stored as note/sample byte pairs
  222.        (note first, range 0->119 for C-0 to B-9, sample ranges from
  223.        1-99, 0=no sample)
  224.  
  225.                                 Envelope layout
  226.  
  227.         Envelopes: 3 structures, first for volume (130h), second for
  228.                    panning (182h), third for pitch (1D4h).
  229.  
  230.                    Each is structured as such:
  231.  
  232.         0   1   2   3   4   5   6.......
  233.       ┌───┬───┬───┬───┬───┬───┬───────────────────────────────────┬───┐
  234. xxxx: │Flg│Num│LpB│LpE│SLB│SLE│ Node points, 25 sets, 75 bytes....│ x │
  235.       ├───┼───┼───┼───┼───┼───┼───┬───┬───┬───┬───┬───┬───┬───┬───┼───┤
  236.  
  237.         Flg: Bit 0: Envelope on/off, 1 = on, 0 = off
  238.              Bit 1: Loop on/off, 1 = on, 0 = off
  239.              Bit 2: SusLoop on/off, 1 = on, 0 = off
  240.  
  241.         Num = Number of node points
  242.  
  243.         LpB = Loop beginning            SLB = Sustain loop beginning
  244.         LpE = Loop end                  SLE = Sustain loop end
  245.  
  246.         Node point = 1 byte for y-value
  247.                         (0->64 for vol, -32->+32 for panning or pitch)
  248.                      1 word (2 bytes) for tick number (0->9999)
  249.  
  250.         Total length of an instrument is 547 bytes, but 554 bytes are
  251.         written, just to simplify the loading of the old format. (Hence
  252.         there are 7 'wasted' bytes per instrument)
  253.  
  254.  
  255.  
  256.                              Impulse Sample Format
  257.  
  258.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  259.       ┌───┬───┬───┬───┬───────────────────────────────────────────────┐
  260. 0000: │'I'│'M'│'P'│'S'│ DOS Filename (12345678.123)                   │
  261.       ├───┼───┼───┼───┼───────────────────────────────────────────────┤
  262. 0010: │00h│GvL│Flg│Vol│ Sample Name, max 26 bytes, includes NUL.......│
  263.       ├───┴───┴───┴───┴───────────────────────────────────────┬───┬───┤
  264. 0020: │.......................................................│Cvt│DfP│
  265.       ├───────────────┬───────────────┬───────────────┬───────┴───┴───┤
  266. 0030: │ Length        │ Loop Begin    │ Loop End      │ C5Speed       │
  267.       ├───────────────┼───────────────┼───────────────┼───┬───┬───┬───┤
  268. 0040: │ SusLoop Begin │ SusLoop End   │ SamplePointer │ViS│ViD│ViR│ViT│
  269.       └───────────────┴───────────────┴───────────────┴───┴───┴───┴───┘
  270.  
  271. The cache file has the following pieces of information added on:
  272.  
  273.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  274.       ┌───────────────┬───────┬───────┬───┬───────────────────────────┐
  275. 0050: │ File Size     │ Date  │ Time  │Fmt│...........................│
  276.       └───────────────┴───────┴───────┴───┴───────────────────────────┘
  277.  
  278.         Fmt. 0 = unchecked. 1 = directory, 2 = it sample, 3 = st sample
  279.  
  280.  
  281.       GvL:      Global volume for instrument, ranges from 0->64
  282.       Flg:      Bit 0. On = sample associated with header.
  283.                 Bit 1. On = 16 bit, Off = 8 bit.
  284.                 Bit 2. On = stereo, Off = mono. Stereo samples not supported yet
  285.                 Bit 3. Reserved
  286.                 Bit 4. On = Use loop
  287.                 Bit 5. On = Use sustain loop
  288.                 Bit 6. On = Ping Pong loop, Off = Forwards loop
  289.                 Bit 7. On = Ping Pong Sustain loop, Off = Forwards Sustain loop
  290.       Vol:      Default volume for instrument
  291.  
  292.       Length:   Length of sample in no. of samples NOT no. of bytes
  293.       LoopBeg:  Start of loop (no of samples in, not bytes)
  294.       Loop End: Sample no. AFTER end of loop
  295.       C5Speed:  Number of bytes a second for C-5 (ranges from 0->9999999)
  296.       SusLBeg:  Start of sustain loop
  297.       SusLEnd:  Sample no. AFTER end of sustain loop
  298.  
  299.       SmpPoint: 'Long' Offset of sample in file.
  300.  
  301.       ViS:      Vibrato Speed, ranges from 0->64
  302.       ViD:      Vibrato Depth, ranges from 0->64
  303.       ViT:      Vibrato waveform type.
  304.                         0=Sine wave
  305.                         1=Ramp down
  306.                         2=Square wave
  307.                         3=Random (speed is irrelevant)
  308.       ViR:      Vibrato Rate, rate at which vibrato is applied (0->64)
  309.  
  310.         The depth of the vibrato at any point is worked out in the following
  311.         way:
  312.           Every processing cycle, the following occurs:
  313.                 1) Mov AX, [SomeVariableNameRelatingToVibrato]
  314.                 2) Add AL, Rate
  315.                 3) AdC AH, 0
  316.                 4) AH contains the depth of the vibrato as a fine-linear slide.
  317.                 5) Mov [SomeVariableNameRelatingToVibrato], AX  ; For the next
  318.                                                                 ; cycle.
  319.  
  320.         For those that don't understand assembly, then the depth is
  321.         basically the running-sum of the rate divided by 256.
  322.  
  323.         Sample vibrato uses a table 256-bytes long
  324.  
  325.    Convert - bits other than bit 0 are used internally for the loading
  326.              of alternative formats.
  327.         Bit 0:
  328.          Off: Samples are unsigned   } IT 2.02 and above use signed samples
  329.           On: Samples are signed     } IT 2.01 and below use unsigned samples
  330.         Bit 1:
  331.          Off: Intel lo-hi byte order for 16-bit samples    } Safe to ignore
  332.          On: Motorola hi-lo byte order for 16-bit samples  } these values...
  333.         Bit 2:                                             }
  334.          Off: Samples are stored as PCM values             }
  335.           On: Samples are stored as Delta values           }
  336.         Bit 3:                                             }
  337.           On: Samples are stored as byte delta values      }
  338.               (for PTM loader)                             }
  339.         Bit 4:                                             }
  340.           On: Samples are stored as TX-Wave 12-bit values  }
  341.         Bit 5:
  342.           On: Left/Right/All Stereo prompt
  343.  
  344.    DfP - Default Pan. Bits 0->6 = Pan value, Bit 7 ON to USE (opposite of inst)
  345.  
  346.  
  347.  
  348.                              Impulse Pattern Format
  349.  
  350.         0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
  351.       ┌───────┬───────┬───┬───┬───┬───┬───────────────────────────────┐
  352. 0000: │Length │ Rows  │ x │ x │ x │ x │ Packed data................   │
  353.       ├───┬───┼───┬───┼───┼───┼───┼───┼───┬───┬───┬───┬───┬───┬───┬───┤
  354.  
  355.       Length:   Length of packed pattern, not including the 8 byte header
  356.                 Note that the pattern + the 8 byte header will ALWAYS
  357.                 be less than 64k
  358.       Rows:     Number of rows in this pattern (Ranges from 32->200)
  359.  
  360.       Patterns are unpacked by the following pseudocode... (this may look
  361.       horrible, but in practise, it's just as convenient as the S3M
  362.       pattern format for playback (but not for display))
  363.  
  364.       GetNextChannelMarker:
  365.         Read byte into channelvariable.
  366.         if(channelvariable = 0) then end of row
  367.         Channel = (channelvariable-1) & 63              ; Channel is 0 based.
  368.         if(channelvariable & 128) then read byte into maskvariable
  369.           else maskvariable = previousmaskvariable for current channel
  370.  
  371.         if(maskvariable & 1), then read note. (byte value)
  372.                 // Note ranges from 0->119 (C-0 -> B-9)
  373.                 // 255 = note off, 254 = notecut
  374.                 // Others = note fade (already programmed into IT's player
  375.                 //                     but not available in the editor)
  376.  
  377.         if(maskvariable & 2), then read instrument (byte value)
  378.                 // Instrument ranges from 1->99
  379.  
  380.         if(maskvariable & 4), then read volume/panning (byte value)
  381.                 // Volume ranges from 0->64
  382.                 // Panning ranges from 0->64, mapped onto 128->192
  383.                 // Prepare for the following also:
  384.                 //  65->74 = Fine volume up
  385.                 //  75->84 = Fine volume down
  386.                 //  85->94 = Volume slide up
  387.                 //  95->104 = Volume slide down
  388.                 //  105->114 = Pitch Slide up
  389.                 //  115->124 = Pitch Slide down
  390.                 //  193->202 = Portamento to
  391.                 //  203->212 = Vibrato
  392.  
  393.                 //  213->255 WILL probably be assigned meanings too..
  394.                 //           text mode editor restrictions make it hard tho.
  395.  
  396.         Effects 65 is equivalent to D0F, 66 is equivalent to D1F -> 74 = D9F
  397.         Similarly for 75-84 (DFx), 85-94 (Dx0), 95->104 (D0x).
  398.  
  399.         (Fine) Volume up/down all share the same memory.
  400.  
  401.         Pitch slide up/down affect E/F/(G)'s memory - a Pitch slide
  402.         up/down of x is equivalent to a normal slide by x*4
  403.  
  404.         Portament to (Gx) affects the memory for Gxx and has the equivalent
  405.         slide given by this table:
  406.  
  407.         SlideTable      DB      1, 4, 8, 16, 32, 64, 96, 128, 255
  408.  
  409.         Vibrato uses the same 'memory' as Hxx/Uxx.
  410.  
  411.         if(maskvariable & 8), then read command (byte value) and commandvalue
  412.                 // Valid ranges from 0->31 (0=no effect, 1=A, 2=B, 3=C, etc.)
  413.  
  414.         if(maskvariable & 16), then note = lastnote for channel
  415.         if(maskvariable & 32), then instrument = lastinstrument for channel
  416.         if(maskvariable & 64), then volume/pan = lastvolume/pan for channel
  417.         if(maskvariable & 128), then {
  418.                 command = lastcommand for channel and
  419.                 commandvalue = lastcommandvalue for channel
  420.         }
  421.         Goto GetNextChannelMarker
  422.  
  423.  
  424.  
  425.                                   Mathematics
  426.  
  427. Abbreviations:
  428.  FV = Final Volume (Ranges from 0 to 128). In versions 1.04+, mixed output
  429.       devices are reduced further to a range from 0 to 64 due to lack of
  430.       memory.
  431.  Vol = Volume at which note is to be played. (Ranges from 0 to 64)
  432.  SV = Sample Volume (Ranges from 0 to 64)
  433.  IV = Instrument Volume (Ranges from 0 to 128)
  434.  CV = Channel Volume (Ranges from 0 to 64)
  435.  GV = Global Volume (Ranges from 0 to 128)
  436.  VEV = Volume Envelope Value (Ranges from 0 to 64)
  437.  
  438. In Sample mode, the following calculation is done:
  439.  FV = Vol * SV * CV * GV / 262144               ; Note that 262144 = 2^18
  440.                                                 ; So bit shifting can be done.
  441.  
  442. In Instrument mode the following procedure is used:
  443.  
  444.  1) Update volume envelope value. Check for loops / end of envelope.
  445.  2) If end of volume envelope (ie. position >= 200 or VEV = 0FFh), then turn
  446.         on note fade.
  447.  3) If notefade is on, then NoteFadeComponent (NFC) = NFC - FadeOut
  448.         ; NFC should be initialised to 1024 when a note is played.
  449.  4) FV = Vol * SV * IV * CV * GV * VEV * NFC / 2^40
  450.                                                 ; Note that 8589934592 = 2^33
  451.  
  452. Linear slides work like this:
  453.  Final frequency = Original frequency * 2^(SlideValue/768)
  454.  
  455. (I used a lookup table for the multipliers here)
  456.  
  457. For command Exx, SlideValue = -4*EffectValue
  458. For command EEx, SlideValue = -EffectValue
  459. For command Fxx, SlideValue = 4*EffectValue
  460. For command FEx, SlideValue = EffectValue
  461.  
  462. Note that sample vibrato always uses Linear slides.
  463.  
  464. Notes about effects (as compared to other module formats)
  465.  
  466. C               This is now in *HEX*. (Used to be in decimal in ST3)
  467. E/F/G/H/U       You need to check whether the song uses Amiga/Linear slides.
  468. H/U             Vibrato in Impulse Tracker is two times finer than in
  469.                 any other tracker and is updated EVERY tick.
  470.                 If "Old Effects" is *ON*, then the vibrato is played in the
  471.                 normal manner (every non-row tick and normal depth)
  472. E/F/G           These commands ALL share the same memory.
  473. Oxx             Offsets to samples are to the 'xx00th' SAMPLE. (ie. for
  474.                 16 bit samples, the offset is xx00h*2)
  475.                 Oxx past the sample end will be ignored, unless "Old Effects"
  476.                 is ON, in which case the Oxx will play from the end of the
  477.                 sample.
  478. Yxy             This uses a table 4 times larger (hence 4 times slower) than
  479.                 vibrato or tremelo. If the waveform is set to random, then
  480.                 the 'speed' part of the command is interpreted as a delay.
  481.  
  482. If you read through this document and there are ANY points which you have
  483. troubles with (and have to try out), then let me know - because someone
  484. else will have the same questions - and I'd like to make this DOC as easy
  485. to understand as possible.
  486.  
  487. For Panning....
  488.  Here's the rough procedure used:
  489.  
  490.   NotePan = ChannelPan
  491.   if InstrumentPan=On then NotePan = InstrumentPan
  492.   NotePan = NotePan+(InstrumentNote-PPCenter)*PPSeparation/8
  493.  
  494. Pitch Envelopes
  495.  Each value on the envelope equates to half a semitone. This is interpolated
  496.  64 times for smooth pitch sliding. Positive values indicate a pitch variation
  497.  UP of x semitones, negative values indicate a pitch variation down.
  498.  
  499.                                   General Info
  500.  
  501. The player in Impulse Tracker 'allocates' channels to notes whenever they
  502. are *PLAYED*. In sample mode, the allocation is simple:
  503.                Virtual Channel (number) = 'Host' channel (number)
  504.  
  505. In instrument mode, the following procedure is used:
  506.  
  507.     Check if channel is already playing ---Yes--> set 'background' flag on.
  508.                 |                                 'Trigger' NNA. If NNA=cut,
  509.                 No                                then use this virtual
  510.                 |                                 channel.
  511.                 |                                          |
  512.                 |<------------------ else -----------------/
  513.                 |
  514.                 v
  515.     Search and find the first non-active virtual channel.
  516.                 |
  517.     Non-active channel found? ----Yes----> Use this for playback.
  518.                 |
  519.                 No
  520.                 |
  521.                 v
  522.    Search through and find the channel of lowest volume that is in the     #
  523.    'background' (ie. no longer controlled directly)                        #
  524.                 |                                                          #
  525.    Background channel found? ----Yes----> Use this for playback.           #
  526.                 |                                                          #
  527.                 No                                                         #
  528.                 |                                                          #
  529.                 v                                                          #
  530.    Return error - the note is *NOT* allocated a channel, and hence is not  #
  531.    played.                                                                 #
  532.  
  533.    This is actually quite a simple process... just that it's another of
  534.    those 'hassles' to have to write...
  535.  
  536.    ### Note: This is by far the simplest implementation of congestion
  537.              resolution. IT 2.03 and above have a greatly enhanced
  538.              method which more selectively removes the most insignificant
  539.              channel. Obviously, there is no best way to do this - I
  540.              encourage you to experiment and find new algorithms for
  541.              yourself.
  542.  
  543.  
  544.  
  545.                                 Internal Tables
  546.  
  547. FineSineData       Label   Byte
  548.         DB       0,  2,  3,  5,  6,  8,  9, 11, 12, 14, 16, 17, 19, 20, 22, 23
  549.         DB      24, 26, 27, 29, 30, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44
  550.         DB      45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59
  551.         DB      59, 60, 60, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 64, 64
  552.         DB      64, 64, 64, 64, 64, 64, 63, 63, 63, 62, 62, 62, 61, 61, 60, 60
  553.         DB      59, 59, 58, 57, 56, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46
  554.         DB      45, 44, 43, 42, 41, 39, 38, 37, 36, 34, 33, 32, 30, 29, 27, 26
  555.         DB      24, 23, 22, 20, 19, 17, 16, 14, 12, 11,  9,  8,  6,  5,  3,  2
  556.         DB       0, -2, -3, -5, -6, -8, -9,-11,-12,-14,-16,-17,-19,-20,-22,-23
  557.         DB     -24,-26,-27,-29,-30,-32,-33,-34,-36,-37,-38,-39,-41,-42,-43,-44
  558.         DB     -45,-46,-47,-48,-49,-50,-51,-52,-53,-54,-55,-56,-56,-57,-58,-59
  559.         DB     -59,-60,-60,-61,-61,-62,-62,-62,-63,-63,-63,-64,-64,-64,-64,-64
  560.         DB     -64,-64,-64,-64,-64,-64,-63,-63,-63,-62,-62,-62,-61,-61,-60,-60
  561.         DB     -59,-59,-58,-57,-56,-56,-55,-54,-53,-52,-51,-50,-49,-48,-47,-46
  562.         DB     -45,-44,-43,-42,-41,-39,-38,-37,-36,-34,-33,-32,-30,-29,-27,-26
  563.         DB     -24,-23,-22,-20,-19,-17,-16,-14,-12,-11, -9, -8, -6, -5, -3, -2
  564.  
  565. FineRampDownData   Label   Byte
  566.         DB      64, 63, 63, 62, 62, 61, 61, 60, 60, 59, 59, 58, 58, 57, 57, 56
  567.         DB      56, 55, 55, 54, 54, 53, 53, 52, 52, 51, 51, 50, 50, 49, 49, 48
  568.         DB      48, 47, 47, 46, 46, 45, 45, 44, 44, 43, 43, 42, 42, 41, 41, 40
  569.         DB      40, 39, 39, 38, 38, 37, 37, 36, 36, 35, 35, 34, 34, 33, 33, 32
  570.         DB      32, 31, 31, 30, 30, 29, 29, 28, 28, 27, 27, 26, 26, 25, 25, 24
  571.         DB      24, 23, 23, 22, 22, 21, 21, 20, 20, 19, 19, 18, 18, 17, 17, 16
  572.         DB      16, 15, 15, 14, 14, 13, 13, 12, 12, 11, 11, 10, 10,  9,  9,  8
  573.         DB       8,  7,  7,  6,  6,  5,  5,  4,  4,  3,  3,  2,  2,  1,  1,  0
  574.         DB       0, -1, -1, -2, -2, -3, -3, -4, -4, -5, -5, -6, -6, -7, -7, -8
  575.         DB      -8, -9, -9,-10,-10,-11,-11,-12,-12,-13,-13,-14,-14,-15,-15,-16
  576.         DB     -16,-17,-17,-18,-18,-19,-19,-20,-20,-21,-21,-22,-22,-23,-23,-24
  577.         DB     -24,-25,-25,-26,-26,-27,-27,-28,-28,-29,-29,-30,-30,-31,-31,-32
  578.         DB     -32,-33,-33,-34,-34,-35,-35,-36,-36,-37,-37,-38,-38,-39,-39,-40
  579.         DB     -40,-41,-41,-42,-42,-43,-43,-44,-44,-45,-45,-46,-46,-47,-47,-48
  580.         DB     -48,-49,-49,-50,-50,-51,-51,-52,-52,-53,-53,-54,-54,-55,-55,-56
  581.         DB     -56,-57,-57,-58,-58,-59,-59,-60,-60,-61,-61,-62,-62,-63,-63,-64
  582.  
  583. FineSquareWave     Label   Byte
  584.         DB      128 Dup (64), 128 Dup (0)
  585.  
  586. EmptyPattern            Label
  587.         DW      64, 64, 0, 0
  588.         DB      64 Dup (0)
  589.  
  590. ;───────────────────────────────────────────────────────────────────────────────
  591.  
  592. PitchTable              Label   DWord   ; Values are 16.16 bit
  593.    DW      2048, 0,   2170, 0,   2299, 0,   2435, 0,   2580, 0,   2734, 0 ; C-0
  594.    DW      2896, 0,   3069, 0,   3251, 0,   3444, 0,   3649, 0,   3866, 0 ;>B-0
  595.  
  596.    DW      4096, 0,   4340, 0,   4598, 0,   4871, 0,   5161, 0,   5468, 0 ; C-1
  597.    DW      5793, 0,   6137, 0,   6502, 0,   6889, 0,   7298, 0,   7732, 0 ;>B-1
  598.  
  599.    DW      8192, 0,   8679, 0,   9195, 0,   9742, 0,   10321, 0,  10935, 0
  600.    DW      11585, 0,  12274, 0,  13004, 0,  13777, 0,  14596, 0,  15464, 0
  601.  
  602.    DW      16384, 0,  17358, 0,  18390, 0,  19484, 0,  20643, 0,  21870, 0
  603.    DW      23170, 0,  24548, 0,  26008, 0,  27554, 0,  29193, 0,  30929, 0
  604.  
  605.    DW      32768, 0,  34716, 0,  36781, 0,  38968, 0,  41285, 0,  43740, 0
  606.    DW      46341, 0,  49097, 0,  52016, 0,  55109, 0,  58386, 0,  61858, 0
  607.  
  608.    DW      0, 1,      3897, 1,   8026, 1,   12400, 1,  17034, 1,  21944, 1
  609.    DW      27146, 1,  32657, 1,  38496, 1,  44682, 1,  51236, 1,  58179, 1
  610.  
  611.    DW      0, 2,      7794, 2,   16051, 2,  24800, 2,  34068, 2,  43888, 2
  612.    DW      54292, 2,  65314, 2,  11456, 3,  23828, 3,  36936, 3,  50823, 3
  613.  
  614.    DW      0, 4,      15588, 4,  32103, 4,  49600, 4,  2601, 5,   22240, 5
  615.    DW      43048, 5,  65092, 5,  22912, 6,  47656, 6,  8336, 7,   36110, 7
  616.  
  617.    DW      0, 8,      31176, 8,  64205, 8,  33663, 9,  5201, 10,  44481, 10
  618.    DW      20559, 11, 64648, 11, 45823, 12, 29776, 13, 16671, 14, 6684, 15
  619.  
  620.    DW      0, 16,     62352, 16, 62875, 17, 1790,  19, 10403, 20, 23425, 21
  621.    DW      41118, 22, 63761, 23, 26111, 25, 59552, 26, 33342, 28, 13368, 30
  622.  
  623. FineLinearSlideUpTable  Label ; Values are 16.16 bit
  624.         DW      0, 1,     59, 1,    118, 1,   178, 1,   237, 1    ; 0->4
  625.         DW      296, 1,   356, 1,   415, 1,   475, 1,   535, 1    ; 5->9
  626.         DW      594, 1,   654, 1,   714, 1,   773, 1,   833, 1    ; 10->14
  627.         DW      893, 1                                            ; 15
  628.  
  629. LinearSlideUpTable      Label ; Value = 2^(Val/192), Values are 16.16 bit
  630.         DW      0,     1, 237,   1, 475,   1, 714,   1, 953,  1  ; 0->4
  631.         DW      1194,  1, 1435,  1, 1677,  1, 1920,  1, 2164, 1  ; 5->9
  632.         DW      2409,  1, 2655,  1, 2902,  1, 3149,  1, 3397, 1  ; 10->14
  633.         DW      3647,  1, 3897,  1, 4148,  1, 4400,  1, 4653, 1  ; 15->19
  634.         DW      4907,  1, 5157,  1, 5417,  1, 5674,  1, 5932, 1  ; 20->24
  635.         DW      6190,  1, 6449,  1, 6710,  1, 6971,  1, 7233, 1  ; 25->29
  636.         DW      7496,  1, 7761,  1, 8026,  1, 8292,  1, 8559, 1  ; 30->34
  637.         DW      8027,  1, 9096,  1, 9366,  1, 9636,  1, 9908, 1  ; 35->39
  638.         DW      10181, 1, 10455, 1, 10730, 1, 11006, 1, 11283,1  ; 40->44
  639.         DW      11560, 1, 11839, 1, 12119, 1, 12400, 1, 12682,1  ; 45->49
  640.         DW      12965, 1, 13249, 1, 13533, 1, 13819, 1, 14106,1  ; 50->54
  641.         DW      14394, 1, 14684, 1, 14974, 1, 15265, 1, 15557,1  ; 55->59
  642.         DW      15850, 1, 16145, 1, 16440, 1, 16737, 1, 17034,1  ; 60->64
  643.         DW      17333, 1, 17633, 1, 17933, 1, 18235, 1, 18538,1  ; 65->69
  644.         DW      18842, 1, 19147, 1, 19454, 1, 19761, 1, 20070,1  ; 70->74
  645.         DW      20379, 1, 20690, 1, 21002, 1, 21315, 1, 21629,1  ; 75->79
  646.         DW      21944, 1, 22260, 1, 22578, 1, 22897, 1, 23216,1  ; 80->84
  647.         DW      23537, 1, 23860, 1, 24183, 1, 24507, 1, 24833,1  ; 85->89
  648.         DW      25160, 1, 25488, 1, 25817, 1, 26148, 1, 26479,1  ; 90->94
  649.         DW      26812, 1, 27146, 1, 27481, 1, 27818, 1, 28155,1  ; 95->99
  650.         DW      28494, 1, 28834, 1, 29175, 1, 29518, 1, 29862,1  ; 100->104
  651.         DW      30207, 1, 30553, 1, 30900, 1, 31248, 1, 31599,1  ; 105->109
  652.         DW      31951, 1, 32303, 1, 32657, 1, 33012, 1, 33369,1  ; 110->114
  653.         DW      33726, 1, 34085, 1, 34446, 1, 34807, 1, 35170,1  ; 115->119
  654.         DW      35534, 1, 35900, 1, 36267, 1, 36635, 1, 37004,1  ; 120->124
  655.         DW      37375, 1, 37747, 1, 38121, 1, 38496, 1, 38872,1  ; 125->129
  656.         DW      39250, 1, 39629, 1, 40009, 1, 40391, 1, 40774,1  ; 130->134
  657.         DW      41158, 1, 41544, 1, 41932, 1, 42320, 1, 42710,1  ; 135->139
  658.         DW      43102, 1, 43495, 1, 43889, 1, 44285, 1, 44682,1  ; 140->144
  659.         DW      45081, 1, 45481, 1, 45882, 1, 46285, 1, 46690,1  ; 145->149
  660.         DW      47095, 1, 47503, 1, 47917, 1, 48322, 1, 48734,1  ; 150->154
  661.         DW      49147, 1, 49562, 1, 49978, 1, 50396, 1, 50815,1  ; 155->159
  662.         DW      51236, 1, 51658, 1, 52082, 1, 52507, 1, 52934,1  ; 160->164
  663.         DW      53363, 1, 53793, 1, 54224, 1, 54658, 1, 55092,1  ; 165->169
  664.         DW      55529, 1, 55966, 1, 56406, 1, 56847, 1, 57289,1  ; 170->174
  665.         DW      57734, 1, 58179, 1, 58627, 1, 59076, 1, 59527,1  ; 175->179
  666.         DW      59979, 1, 60433, 1, 60889, 1, 61346, 1, 61805,1  ; 180->184
  667.         DW      62265, 1, 62727, 1, 63191, 1, 63657, 1, 64124,1  ; 185->189
  668.         DW      64593, 1, 65064, 1, 0,     2, 474,   2, 950,  2  ; 190->194
  669.         DW      1427,  2, 1906,  2, 2387,  2, 2870,  2, 3355, 2  ; 195->199
  670.         DW      3841,  2, 4327,  2, 4818,  2, 5310,  2, 5803, 2  ; 200->204
  671.         DW      6298,  2, 6795,  2, 7294,  2, 7794,  2, 8296, 2  ; 205->209
  672.         DW      8800,  2, 9306,  2, 9814,  2, 10323, 2, 10835,2  ; 210->214
  673.         DW      11348, 2, 11863, 2, 12380, 2, 12899, 2, 13419,2  ; 215->219
  674.         DW      13942, 2, 14467, 2, 14993, 2, 15521, 2, 16051,2  ; 220->224
  675.         DW      16583, 2, 17117, 2, 17653, 2, 18191, 2, 18731,2  ; 225->229
  676.         DW      19273, 2, 19817, 2, 20362, 2, 20910, 2, 21460,2  ; 230->234
  677.         DW      22011, 2, 22565, 2, 23121, 2, 23678, 2, 24238,2  ; 235->239
  678.         DW      24800, 2, 25363, 2, 25929, 2, 25497, 2, 27067,2  ; 240->244
  679.         DW      27639, 2, 28213, 2, 28789, 2, 29367, 2, 29947,2  ; 245->249
  680.         DW      30530, 2, 31114, 2, 31701, 2, 32289, 2, 32880, 2 ; 250->254
  681.         DW      33473, 2, 34068, 2                               ; 255->256
  682.  
  683. FineLinearSlideDownTable Label ; Values are 0.16 bit
  684.         DW      65535, 65477, 65418, 65359, 65300, 65241, 65182, 65359 ; 0->7
  685.         DW      65065, 65006, 64947, 64888, 64830, 64772, 64713, 64645 ; 8->15
  686.  
  687. LinearSlideDownTable    Label ; Values are 0.16 bit
  688.         DW      65535, 65300, 65065, 64830, 64596, 64364, 64132, 63901 ; 0->7
  689.         DW      63670, 63441, 63212, 62984, 62757, 62531, 62306, 62081 ; 8->15
  690.         DW      61858, 61635, 61413, 61191, 60971, 60751, 60532, 60314 ; 16->23
  691.         DW      60097, 59880, 59664, 59449, 59235, 59022, 58809, 58597 ; 24->31
  692.         DW      58386, 58176, 57966, 57757, 57549, 57341, 57135, 56929 ; 32->39
  693.         DW      56724, 56519, 56316, 56113, 55911, 55709, 55508, 55308 ; 40->47
  694.         DW      55109, 54910, 54713, 54515, 54319, 54123, 53928, 53734 ; 48->55
  695.         DW      53540, 53347, 53155, 52963, 52773, 52582, 52393, 52204 ; 56->63
  696.         DW      52016, 51829, 51642, 51456, 51270, 51085, 50901, 50718 ; 64->71
  697.         DW      50535, 50353, 50172, 49991, 49811, 49631, 49452, 49274 ; 72->79
  698.         DW      49097, 48920, 48743, 48568, 48393, 48128, 48044, 47871 ; 80->87
  699.         DW      47699, 47527, 47356, 47185, 47015, 46846, 46677, 46509 ; 88->95
  700.         DW      46341, 46174, 46008, 45842, 45677, 45512, 45348, 45185 ; 96->103
  701.         DW      45022, 44859, 44698, 44537, 44376, 44216, 44057, 43898 ;104->111
  702.         DW      43740, 43582, 43425, 43269, 43113, 42958, 42803, 42649 ;112->119
  703.         DW      42495, 42342, 42189, 42037, 41886, 41735, 41584, 41434 ;120->127
  704.         DW      41285, 41136, 40988, 10840, 40639, 40566, 40400, 40253 ;128->135
  705.         DW      40110, 39965, 39821, 39678, 39535, 39392, 39250, 39109 ;136->143
  706.         DW      38968, 38828, 38688, 38548, 38409, 38271, 38133, 37996 ;144->151
  707.         DW      37859, 37722, 37586, 37451, 37316, 37181, 37047, 36914 ;152->159
  708.         DW      36781, 36648, 36516, 36385, 36254, 36123, 35993, 35863 ;160->167
  709.         DW      35734, 35605, 35477, 35349, 35221, 35095, 34968, 34842 ;168->175
  710.         DW      34716, 34591, 34467, 34343, 34219, 34095, 33973, 33850 ;176->183
  711.         DW      33728, 33607, 33486, 33365, 33245, 33125, 33005, 32887 ;184->191
  712.         DW      32768, 32650, 32532, 32415, 32298, 32182, 32066, 31950 ;192->199
  713.         DW      31835, 31720, 31606, 31492, 31379, 31266, 31153, 31041 ;200->207
  714.         DW      30929, 30817, 30706, 30596, 30485, 30376, 30226, 30157 ;208->215
  715.         DW      30048, 29940, 29832, 29725, 29618, 29511, 29405, 29299 ;216->223
  716.         DW      29193, 29088, 28983, 28879, 28774, 28671, 28567, 28464 ;224->231
  717.         DW      28362, 28260, 28158, 28056, 27955, 27855, 27754, 27654 ;232->239
  718.         DW      27554, 27455, 27356, 27258, 27159, 27062, 26964, 26867 ;240->247
  719.         DW      26770, 26674, 26577, 26482, 26386, 26291, 26196, 26102 ;248->255
  720.         DW      26008                                                  ; 256
  721.  
  722. ;───────────────────────────────────────────────────────────────────────────────
  723.  
  724.                                   Effect Info
  725.  
  726. Here's about all the info I can think of for effects. "Process" variables are
  727. variables used internally by effects to control the direction of playback..
  728. This section has not been completed yet.
  729.  
  730. First, here is the rough flow chart for processing information, it's not fully
  731. detailed, but all of the important steps are outlined.
  732.  
  733.        ┌─────────────────────────────────────────────────────────┐
  734.        │ Set note volume to volume set for each channel          │
  735.        │ Set note frequency to frequency set for each channel    │
  736.        └────────────┬────────────────────────────────────────────┘
  737.                     │
  738.        ┌────────────┴────────────┐
  739.        │ Decrease tick counter   │        Yes
  740.        │  Is tick counter 0 ?    ├─────────────────────────┐
  741.        └────────────┬────────────┘                         │
  742.                     │                                      │
  743.                 No  │                ┌─────────────────────┴──────────────────┐
  744.        ┌────────────┴────────────┐   │ Tick counter = Tick counter set        │
  745.        │ Update effects for each │   │                  (the current 'speed') │
  746.        │  channel as required.   │   │      Decrease Row counter.             │
  747.        │                         │   │        Is row counter 0?               │
  748.        └───┬─────────────────────┘   └────────────┬──────────┬────────────────┘
  749.            │                                  No  │          │
  750.            │                ┌─────────────────────┘          │ Yes
  751.            │                │                                │
  752.            │  ┌─────────────┴──────────────┐ ┌───────────────┴────────────────┐
  753.            │  │ Call update-effects for    │ │  Row counter = 1               │
  754.            │  │ each channel.              │ │                                │
  755.            │  └──────────────┬─────────────┘ │ Increase ProcessRow            │
  756.            │                 │               │ Is ProcessRow > NumberOfRows?  │
  757.            ├─────────────────┘               └────────┬──────────────────┬────┘
  758.            │                                      Yes │                  │ No
  759.            │         ┌────────────────────────────────┴──────────────┐   │
  760.            │         │  ProcessRow = BreakRow                        │   │
  761.            │         │  BreakRow = 0                                 │   │
  762.            │         │  Increase ProcessOrder                        │   │
  763.            │         │  while Order[ProcessOrder] = 0xFEh,           │   │
  764.            │         │                         increase ProcessOrder │   │
  765.            │         │  if Order[ProcessOrder] = 0xFFh,              │   │
  766.            │         │                         ProcessOrder = 0      │   │
  767.            │         │  CurrentPattern = Order[ProcessOrder]         │   │
  768.            │         └─────────────────────┬─────────────────────────┘   │
  769.            │                               │                             │
  770.            │                               ├─────────────────────────────┘
  771.            │                               │
  772.            │         ┌─────────────────────┴──────────────────────────┐
  773.            │         │ CurrentRow = ProcessRow                        │
  774.            │         │ Update PatternData (includes jumping to the    │
  775.            │         │  appropriate row if required, and getting the  │
  776.            │         │  NumberOfRows for the pattern)                 │
  777.            │         └─────────────────────┬──────────────────────────┘
  778.            │                               │
  779.            ├───────────────────────────────┘
  780.            │
  781.        ┌───┴───────────────┐       Yes        ┌───────────────────────────────┐
  782.        │ Instrument mode?  ├──────────────────┤ Update Envelopes as required  │
  783.        └───┬───────────────┘                  │ Update fadeout as required    │
  784.            │                                  │ Calculate final volume if req │
  785.            │ No (Sample mode)                 │ Calculate final pan if req    │
  786.            │                                  │ Process sample vibrato if req │
  787.        ┌───┴─────────────────────────────────┐└───────────────┬───────────────┘
  788.        │ Calculate final volume if required  │                │
  789.        │ Calculate final pan if requried     │                │
  790.        │ Process sample vibrato if required  │                │
  791.        └───┬─────────────────────────────────┘                │
  792.            │                                                  │
  793.            │                                                  │
  794.            └─────────────────────────┬────────────────────────┘
  795.                                      │
  796.                     ┌────────────────┴──────────────────┐
  797.                     │ Output sound!!!                   │
  798.                     └───────────────────────────────────┘
  799.  
  800. Axx     Set Tempo
  801.  
  802.         if (xx != 0) {
  803.                 Maxtick = xx;
  804.                 Currenttick = xx;
  805.         }
  806.  
  807. Bxx     Jump to Order
  808.  
  809.         ProcessOrder = xx - 1;
  810.         ProcessRow = 0xFFFE; // indicates new pattern internally for IT...
  811.  
  812. Cxx     Break to Row
  813.  
  814.         BreakRow = xx;
  815.         ProcessRow = 0xFFFE;
  816.  
  817. Dxx     Volume slide down
  818.  
  819.         if (xx == 0) then xx = last xx for (Dxx/Kxx/Lxx) for this channel.
  820.  
  821.         Order of testing: Dx0, D0x, DxF, DFx
  822.  
  823. Dx0     Set effect update for channel enabled if channel is ON.
  824.         If x = F, then slide up volume by 15 straight away also (for S3M compat)
  825.         Every update, add x to the volume, check and clip values > 64 to 64
  826. D0x     Set effect update for channel enabled if channel is ON.
  827.         If x = F, then slide down volume by 15 straight away also (for S3M)
  828.         Every update, subtract x from the volume, check and clip values < 0 to 0
  829. DxF     Add x to volume straight away. Check and clip values > 64 to 64
  830. DFx     Subtract x from volume straight away. Check and clip values < 0 to 0
  831.  
  832. Hxy     Vibrato
  833.  
  834.         if (x != 0) {
  835.                 speed = 4*x;
  836.         }
  837.         if (y != 0) {
  838.                 depth = y * 4;
  839.                 if(OldEffects) depth <<= 1;
  840.         }
  841.         Set effect update for channel enabled if channel is ON.
  842.         Goto InitVibrato (explained later)
  843.  
  844. Ixy     Tremor, ontime x, offtime y
  845.  
  846.         if (x != 0) {
  847.                 ontime = x;
  848.                 if (oldeffects) ontime++;
  849.         }
  850.         if (y != 0) {
  851.                 offtime = y;
  852.                 if (oldeffects) offtime++;
  853.         }
  854.  
  855. Nxx     Channel volume slide down
  856.  
  857.         if (xx == 0) then xx = last Nxx for this channel.
  858.  
  859.         Order of testing: Nx0, N0x, NxF, NFx
  860.  
  861. Nx0     Set effect update for channel enabled.
  862.         Every update, add x to the volume, check and clip values > 64 to 64
  863. N0x     Set effect update for channel enabled.
  864.         Every update, subtract x from the volume, check and clip values < 0 to 0
  865. NxF     Add x to volume straight away. Check and clip values > 64 to 64
  866. NFx     Subtract x from volume straight away. Check and clip values < 0 to 0
  867.  
  868. Uxy     Fine Vibrato
  869.  
  870.         if (x != 0) {
  871.                 speed = 4*x;
  872.         }
  873.         if (y != 0) {
  874.                 depth = y;
  875.                 if(OldEffects) depth <<= 1;
  876.         }
  877.         Set effect update for channel enabled if channel is ON.
  878.         Goto InitVibrato (explained later)
  879.  
  880. Wxx     Global volume slide down
  881.  
  882.         if (xx == 0) then xx = last Wxx for this channel.
  883.  
  884.         Order of testing: Wx0, W0x, WxF, WFx
  885.  
  886. Wx0     Set effect update for channel enabled.
  887.         Every update, add x to the volume, check and clip values > 128 to 128
  888. W0x     Set effect update for channel enabled.
  889.         Every update, subtract x from the volume, check and clip values < 0 to 0
  890. WxF     Add x to volume straight away. Check and clip values > 128 to 128
  891. WFx     Subtract x from volume straight away. Check and clip values < 0 to 0
  892.  
  893. .. sorry this is incomplete..
  894.