OK, kids!  Here's the history of DES-Tracker, throughout its many versions and
bug fixes, including notes on this release you now have (release 2.00).

My  usenet  address  is still dschebek@outb.wimsey.bc.ca.  Sorry to those
who e-mailed me while I was out of the country (and consequently did not
receive the mail).  I'm back now.  My serial port may be dead, but that
won't stop me. :)


  ENHANCEMENTS AND BUG FIXES FOR DESTRACKER REL 2.00 (Library version 3.0)
  ========================================================================

    I know, I know.  I said that release 1.64 of DES-Tracker was most
definitely the last release.  But then I found a bug, and I got more ideas
for cool new features.  What the hell. :)  Here's what's been fixed/added
for release 2.00 (tons and tons o' new features!):


- Well, I've gone and done it again (hopefully for the last time).  I had to
  add a field to the MODULESTATUS structure in the library base structure.
  As a result (you know what's coming, don't you?) this version of DES-Tracker
  is incompatible with previous versions of the library.  If you wish to use
  this new version, you'll have to recompile any applications that use it.
  Sorry about that.  I suppose that's what I get for instancing structures
  instead of pointing to them.  Damn.


- The library will now scan for the best available CIA timer to use.  If
  DES-Tracker manages to acquire a CIA A timer, then there will no longer be
  any serial and/or parallel contention (this only happens when DES-Tracker is
  running under CIA B, which has a higher priority than the serial/parallel
  interrupts and prevents them from happening when they need to).


- Note that as a result of internal enhancements, redesign and rewrites, the
  ms_NumPatterns field in the MODULESTATUS structure can actually be a value
  greater than 255.  Just in case you were thinking of assuming it could
  never be greater than 255.  I know I did. :)


- The library now no longer resets the elapsed play time when a song is
  stopped or unloaded.  The elapsed time is only reset when a play sequence
  begins.


- I'm now (finally) allocating audio channels using the audio device.


- The SetChannelEnable() function has been changed.  As input, it now
  interprets bits 0..3 of the input value as "selected channels".  Bit 7 of
  the input value is set to 1 to enable the selected channels, and set to 0
  to disable the selected channels.


- Dave Riley noticed that songs played too fast when a PAL screen was
  invoked while playing the music (My machine isn't PAL-capable so how was
  I to know?). :)  I fixed it.  I think.


- A new function was added called CalcElapsedTime().  You pass it a structure
  with several parameters in it and it will return the amount of time it will
  take to play 1 iteration only or, if you so desire, the length of time that
  consecutive iterations will take as well.  This function is a full
  simulation of playing the song (internally, as fast as possible, with
  fractional precision) so it may take a second or two on a 68000 to complete
  some scans.  The general rule is:  The more tempo changes in the song,
  the longer it will take.  Thanks to Gary Bonham at Oxxi for suggesting
  this function.  As far as I know, DES-Tracker is the only program (player,
  editor, or otherwise) that can do this.


- Three more functions were added called SetTemporalStart(), SetTemporalEnd()
  and SetTemporalPos().  These three functions allow you to set the start,
  end and current position for a play sequence based on time.  They take
  a slight bit of time to process, but nowhere near as long as CalcElapsedTime().
  Another fine suggestion by Gary at Oxxi.  I believe DES-Tracker is the only
  program that can do this as well.


- Three new ARexx functions were added called (oddly enough)
  DES_SETTEMPORALSTART, DES_SETTEMPORALEND and DES_SETTEMPORALPOS.

  I have decided not to bother adding corresponding ARexx functions for the
  elapsed time functions.  If enough people hound me to put them in, then
  I'll probably add them.


- Yet another function was added called CalcVolFadeTime().  You give this
  function a start volume, dest volume and a fade rate.  It will tell you
  how long (in 60ths of a second) the volume fade will take.  Sorry, no
  corresponding ARexx function for this.  See above point.


- The SetStartPosition() and SetCurrentPosition() functions are a lot smarter
  now.  When you invoke either one it will analyze the music to determine the
  proper tempo settings at the specified position.  Not even the Protracker
  editor does this.  These functions will also track other command parameters
  as well.  These functions may take a noticeable amount of time to complete,
  depending on the distance it must scan into the music and the number of
  tempo changes along the way.  You probably won't notice anything on a
  68020 (with fast mem) or higher.


- The fine tempo system has been completely redesigned.  As a result, the
  fine tempo value actually means something.  Each fine tempo unit is an
  increase (or decrease) of the overall song tempo by 0.078125Hz.  This
  means that a value of 127 is an increase of the overall tempo by 10Hz and
  a value of -127 is a decrease by -10Hz.  Or as close as fixed-point integer
  math can get, anyway.  Notice that fine tempo values are backwards from
  the way they were before (i.e. now positive fine tempo values speed up
  the tempo, etc).  Also note that the fine tempo affects the tempo of the
  entire song, even if it has BPM tempo changes in it (before, the first BPM
  tempo that came along wiped out the fine tempo setting).  DES-Tracker will
  recognize old fine tempo values in song files that contain them and will
  convert these to the new fine tempo system automagically.


- DES-Tracker now supports a new module format.  That format is, of course,
  DES-Tracker v1.0 format.  This is not an IFF format - rather, it's just 
  another file format to throw on the heap.  However, it's way more efficient
  than Noisetracker or Protracker format, and even more efficient than
  Soundtracker v2.6 format.  There is a description of the DES-Tracker v1.0
  file format in the file "DTL0_Format.TXT".  I added this file format when I
  found a Noisetracker song that, when converted to Soundtracker v2.6 format,
  had over 256 unique patterns.  Since the Soundtracker file format can't
  cope with that, I created the DES-Tracker v1.0 file format, which can.
  Easily.  However, I would advise against using it unless you have a Pro-
  Tracker song that can't be saved in SoundTracker v2.6 format because it
  would have too many patterns.  In that case, you can save it in DES-Tracker
  v1.0 format, and probably chop the file size down by about 30K in doing so.


- New fields were added to the library base structure:

  The "dtl_DefIterations" field holds the default number of iterations for
  the currently loaded song.  It will not change, even if you change the
  number of iterations after loading the song, until you save the song
  using the SaveModule() function.  This allows you to know the original
  number of iterations for a loaded song no matter what the number of
  iterations has been changed to since it was loaded.

  The "dtl_ElapsedTime" field holds the current elapsed time of a playing
  song in 60ths of a second.

  The "dtl_CurrentHertz" field holds the current frequency of the player
  interrupt in Hertz as a fixed-point integer (accurate to roughly 3
  decimal places).


- New fields were added to the CHANNELSTATUS structure.

  The "cs_RealVolume" field gives you the current channel volume with
  global volume applied to it.

  The "cs_SampleOffset" field holds a longword offset into the channel's
  current instrument sample data.  If you detect a note hit in a channel
  then this field will hold the offset from the beginning of the sample data
  at which the instrument began playing.  In other words, when the Sample Offset
  command is used to play a note, this field will hold the sample offset used.


- The "ms_Address" field in the MODULESTATUS structure no longer exists.  I
  had to redesign and rewrite all the file load and save code for all supported
  file formats (thanks a lot, Jason :) and now a loaded song module is so
  broken up in memory that there's really no single entity left to point to
  that could be considered the "address of the song in memory".  Also note
  that the ARexx function DES_GetSongAddress() no longer exists, since it
  merely returned the contents of the "ms_Address" field.


- The ms_Length field in the MODULESTATUS structure will now hold the size
  of the currently loaded song in DTL0 format.  That is, if you were to save
  the song in DTL0 format, the ms_Length field tells you how big the file
  would be.


- New fields have been added to the MODULESTATUS structure:

  The "ms_PlaySeqArray" field points to the play sequence array in memory.
  This is an array of double-longword elements; each element consists of
  four (word-length) pattern numbers to play (one for each audio channel).

  The "ms_PatternData" field points to the pattern data in memory (i.e.
  the note data).  All patterns are contiguous starting at this address.
  Patterns are 256 bytes long each.  So the first pattern is pattern #0,
  the next pattern (256 bytes further) is pattern #1, etc.

  The "ms_InstInfoBlocks" field points to an array of thirty-one instrument
  information blocks.  These are in exactly the same format as they appear
  in the song file (i.e. 22-byte name followed by sample length, fine tune,
  volume, repeat offset and repeat length).  Each info block is 30 bytes in
  length.


- The DTC program is now version 2.0 and has the following new commands:

        "CT"    Calculate play time for a play sequence (i.e. between the
                current start and end position) for however many iterations
                are currently set.
        "CF"    Followed by a destination volume, this will tell you how long
                a volume fade will take in seconds and jiffies (i.e. SS:JJ - 
                jiffies are units of 1/60 sec.) based on the current global
                volume and the currently set volume fade rate.
        "TS"    Followed by a time value (n) in units of 60ths of a second,
                this will set the start position to n 60ths of a second from
                position 0, note 0.  This will put you at the closest position
                and note for the specified time value.
        "TE"    Like "TS" above, this allows you to set the end position based
                on a given time value (again, specified in 60ths of a second).
        "TC"    Sets the current position in the song based on the given time
                value (specified in 60ths of a second).

  Also, the "CE" (Channel Enable) command in DTC has been changed.  It now
  wants input in the form "ssss", where the first "s" corresponds to the select
  status for channel #3, the next "s" for channel #2, etc.  If "s" is 1, then
  the corresponding channel is "selected".  By preceding the input with a "+"
  symbol, this says to enable the "selected" channels.  A "-" symbol means the
  "selected" channels are to be disable.  As an example, to enable channels 0
  and 2, you would invoke DTC as follows:

        DTC CE +0101

  Note that you must always specify four digits.  To disable channel 3, you
  would type:

        DTC CE -1000

  To enable all channels, use "DTC CE +1111", and to disable all channels, use
  "DTC CE -1111".

  This enhancement allows you to selectively enable/disable channels by only
  specifying the channels you want affected.


- LScope is now version 2.0 and is...  different.  The most significant
  difference is that LScope no longer runs solely out of a VBlank interrupt.
  It now has a very small and fast VBlank interrupt that merely signals the
  main code to redraw the display.  As a result, LScope runs at a high task
  priority (50) in order to maintain a stable display.  This is the proper way
  to write a program like LScope, although page flipping would have been a
  nice touch.

  The pitch bars along the top of the LScope display are gone.  They have been
  replaced by six oscilloscopes showing the realtime output of all four audio
  channels as well as the total left and total right output.  And, I might
  add, they are very accurate, unlike the oscilloscopes in the Protracker
  editor, which are garbage.

  Also, the left/right peak meters are actual peak meters now, in that they
  behave just like real peak meters (I used the peak meters on my tape deck
  for comparison and the similarity is striking).

  The height of the LScope screen has been reduced.  To do this, I got rid of
  the displays for number of positions and number of patterns.  The screen is
  now 200 lines tall, plus ten lines for the title bar (210 total).

  Also, instead of just showing 50 or 60 in the Timing Mode display field,
  it  now  displays the current player interrupt frequency in Hertz, to two
  decimal places (rounded).  BPM tempo changes will cause this field to
  change appropriately.

  LScope  now no longer shows the activity of audio channels that are disabled.

  Lastly, the elapsed time in the lower right corner now displays elapsed
  hours, minutes, seconds and jiffies (60ths of a second).


- MODInfo is now version 2.0, and has had the following enhancements made to
  it:

  I modified it to display the computed elapsed time for the module in
  question.  If the module's default iterations is 0 then the time displayed
  will be for 1 iteration plus a volume fade from 64 to 0 at a fade rate of
  10.  If the number of iterations is 1, then the time for 1 iteration only
  will be displayed.  If the iterations is 2 or greater, then the time
  displayed will be for that many iterations plaus a volume fade from 64 to 0
  at a fade rate of 10 (mJuke uses a fade rate of 10, so that's where that
  value came from).

  MODInfo is now much better at detecting sample-texts, and can now detect and
  display multiple sample-texts in a song file.

- mJuke is now version 2.0.  It now displays the elapsed time for each song
  that it plays.



  ENHANCEMENTS AND BUG FIXES FOR DESTRACKER REL 1.64 (Library version 2.5)
  ========================================================================

    Gee, once again I found something wrong with the library,  So, here's the
fixes.  This is the last release of DES-Tracker, since I have now moved on to
brighter ventures, such as implementing a standard IFF FORM TRKR file format
including player code, load & save code, file conversion software, and a brand
new music editor (absolutely *everything* designed and written from scratch).
So this is the last release of DES-Tracker.  Just so you know. :)

- There was a problem with Tone Portamento.  The rate was not being reset
  before playing a song, which caused problems with just one particular song
  I have (U4IA's 1992 tune).  So it took a while to find this one.  It's all
  fixed now.

- David Riley found yet another bug.  Since my Amiga is not PAL-capable, I
  would never have found it by now.  When running in PAL mode, the elapsed
  play time that the library keeps track of runs too slow.  Why?  'cause I
  scale the elapsed time between interrupts by .2 instead of 1.2 (silly me).
  I scaled it by 1/5 instead of 6/5.  Thanks, Dave.

- I wrote a little program called "MODInfo" for DES-Tracker so that the sysop
  of Wizard Online (the official support BBS of DES-Tracker), Roger, could
  wire it into his BBS.  Now people can get all kinds of information displayed
  to them about a module before they even download it.  Kewlies.  I'm
  including MODInfo in this release of DES-Tracker, along with the source code
  for it.  I'm really sorry that the source code is not terribly well
  commented and it's pretty sloppy.  I just don't have the time anymore to
  clean it up and comment it.  Oh well.

- The mJuke program had some bugs.  It tried to load and play directories that
  it found in the specified path.  I fixed it, but I never had time to fix the
  problem that occurs when you run mJuke when another copy is already running.
  Sorry.


  ENHANCEMENTS AND BUG FIXES FOR DESTRACKER REL 1.63 (Library version 2.4)
  ========================================================================

    Despite my insisting that release 1.62 would be the last for some time, I
do remember saying that this would not be the case if something was found to
be seriously wrong with the library.  Well, I found something serious enough
to warrant another release.  Oh, bloody hell.  Sorry, Jovian. :)

- There was a problem with saving modules without specifying a save filename
  (i.e. forcing the library to use the filename and path through which the
  module was loaded).  Sometimes it would chop the first couple of characters
  of the filename off when it saved it (thus saving as a different file).
  I've fixed this now, and I F***ING HATE BPTR'S!!!!!  Sometimes I'm so silly.

- The DF_MODULELOADED flag wasn't getting updated properly.  I've fixed this.


  ENHANCEMENTS AND BUG FIXES FOR DESTRACKER REL 1.62 (Library version 2.3)
  ========================================================================

    This release contains very minor fixes.  The kind of fixes that generally
aren't even worth thinking about in terms of severity, but the kind of things
that just bug me so much that I had to do something about it.  Unless something
really bad crops up in this package, this should be the last release for a
while.  Here's what's changed...

- I added another status flag.  This flag tells you whether or not a module has
  a PSC0 construct appended to it.  The flag is set (or cleared) when the module
  is loaded.  This solves some default timing problems with those of you writing
  players on top of DES-Tracker.

- I found a glitch in the arpeggio function.  Sometimes (but very rarely) the
  arpeggio wouldn't work at all if a module used a very short arpeggio duration
  (and even then only under certain circumstances - I could only find one single
  module that had this problem and it was SunWind).  I've fixed this.



  ENHANCEMENTS AND BUG FIXES FOR DESTRACKER REL 1.61 (Library version 2.2)
  ========================================================================

    This is a minor release that fixes some bugs that cropped up shortly
after release 1.6.  Please also read the history entries for releases 1.5 and
1.6.

- There were a few places in the docs that claimed that the maximum
  attainable volume was 63 instead of 64.  I think I've fixed all these
  references.  Other bits in the documentation were also clarified.

- The signal event SEF_START did not function.  I've fixed it, and I don't
  want to talk about it.

- If you loaded a module and then called ContPlaySeq() without first starting
  the song playing, the function would return a code indicating that a play
  sequence was already active.  I fixed this as well.

- A bug in mJuke resulted in it not detecting when a module was stopped while
  it was playing it.  I have fixed this.



  ENHANCEMENTS AND BUG FIXES FOR DESTRACKER REL 1.6 (Library version 2.1)
  =======================================================================

    This release of DES-Tracker (i.e. the library, all accompanying programs,
and include files) are incompatible with previous releases of DES-Tracker.
Please keep this in mind.

    *Many* bugs fixed in this release.  A lot of them were found by David
Riley, and one or two were found by me. :)  Please make sure you also read
the enhancements/bug fixes for release 1.5 below as well.

    Unfortunately, there were *several* stupidly rediculous problems with
release 1.5 of DES-Tracker.  I really can't believe I released it in the state
that it was in (I thought I'd tested the bloody thing thoroughly enough, but
many bugs and subtle design flaws cropped up while I was writing the "mJuke"
program.  This release consists mostly of bug fixes to release 1.5.  In fact,
it is highly unlikely that anybody ever even got to see release 1.5 of DES-
Tracker.  That's how fast it went by.  =u) Anyways...

- The PLAYSEQDONE signal event was never sent to any programs that wanted it,
  because (it's really true) I FORGOT TO PUT THE CODE IN TO DO IT!  Amazing,
  yes, but even *I* can have an off day or two (I must've been dreaming about
  glaaaaaazed hammmmm...). =u)

- The event signalling seemed to suffer from a delay between the time that the
  event occurred and the time that the user was signalled (especially when
  modules were loaded/unloaded).  The signalling only worked if you stuck a
  bunch of WaitTOF calls (O.S. Wait For Top Of Frame function) all over the
  place.  This has been fixed.  You now get signalled without delay.

- There were several flaws in the C include file DTL/include/libraries/dtlib.h
  which mostly consisted of semicolons for comments, and the odd
  assembly-specific pseudo-op.  I've fixed the known ones.  Thanks to David
  Riley for pointing these out to me.  I would've never found 'em. :)

- The LoadModule routine had two serious problems, both related to failure to
  load a module due to insufficient memory.  The first was that LoadModule()
  returned a success code if it failed from lack of memory.  The other bug was
  that, if LoadModule() ran out of memory while loading an instrument, it
  would free all the instruments it had loaded so far, but failed to free up
  the actual pattern data and header information.  Both of these bugs have
  been fixed.

- Another problem with the signalling was that if you were signalled on the
  completion of an ITERATION, subsequent examination of the library base
  structure indicated that the library was still playing the iteration it
  claimed it had just finished playing.  This bug has had its neck wrung with
  glee.

- If two programs in memory tried to do something stupid, like both calling
  LoadModule() at the same time, there were fireworks aplenty.  DES-Tracker
  now takes care of non-re-entrant situations such as this (even though one
  of those two programs should've locked the library :).

- A new function called StopPlaySeq() has been added to the library.  This
  function stops the current play sequence and resets to the start position of
  the play sequence.  Only BeginPlaySeq() will start it up again.

- Consequently, a corresponding ARexx function called DES_StopPlay() was also
  added.

- A new field was added to the library base structure to make it easier to
  determine just what the hell the library is doing.  The field is called
  "dtl_PlayStatus".  See the "Structures.DOC" file for more information.

- I modified LScope so that it would use the new "dtl_PlayStatus" field rather
  than trying to determine status from the various status bits in the
  "dtl_Flags" field.  LScope is now version 1.4.

- I found a bug in LScope (introduced in release 1.5, of course) that caused
  the four audio channel volume bars to misbehave.  This was due to an
  optimization attempt that looked good on paper.  Fiddlesticks.

- The PausePlaySeq() function would return a success code if a play sequence
  was not active.  This has been fixed.

- I've written an assembly language version of the ARexx JukeBox.rexx program.
  This program is called "mJuke" (short for "Micro-JukeBox" - the "m" in the
  name is supposed to be the Greek letter "mu", commonly used as a symbol for
  the prefix "micro".  Ha ha).  mJuke has been designed as possibly the
  lowest-memory jukebox program ever, and in fact, it's even smaller than the
  ARexx version.  Plus mJuke can process script files as well.  :) There's a
  blurb on mJuke in the DTLib.ReadMe file in the "DTL" directory.  Source code
  for mJuke is also included in the "DTL/code" directory, but it's not as
  heavily commented as LScope.S, that's for sure.

- I found a glitch in the processing of Vibrato when the selected waveform type
  was either Ramp-down or Square, and so Vibrato didn't work properly with those
  waveform types.  This has been fixed.

- DTC now has two new commands.  "KI" ("Kill Song") simply calls
  StopPlaySeq(), thus stopping the music.

- If you allocated event status signals (using AddStatusSignal()) and you
  closed the library without calling RemStatusSignal(), the library would fail
  to deallocate the signal events, resulting in the library eating 12 bytes
  of memory per signal.  I fixed this after painstakingly figuring out why
  the signals weren't being deallocated.  I hated this bug with a passion.

- More signal events have been added.  You can now selectively be signalled when
  one or more of the following events occur:

        - Whenever a play sequence starts playing.
        - Whenever a play sequence finishes playing.
        - Whenever a play is paused.
        - Whenever a play is continued (un-paused).
        - Whenever a play sequence is stopped (StopPlaySeq()).
        - Upon completion of playing an iteration.
        - Upon completion of playing a pattern.
        - Upon completion of a volume fade.
        - Whenever a new module is loaded.
        - Whenever a module is unloaded.
        - Whenever someone owns (locks out) the library.
        - Whenever the library has been disowned (un-locked).
        - Whenever a second of play time has elapsed.
        - Whenever a minute of play time has elapsed.

- I added another new function called InstallModule().  This function allows
  you to have DES-Tracker "load" a module that already resides in memory.
  See the LibFuncs.DOC file for more details on this new function.



              ENHANCEMENTS AND BUG FIXES FOR DESTRACKER REL 1.5
              =================================================

IMPORTANT: Some functions of release 1.5 are INCOMPATIBLE with previous
           versions of DES-Tracker!  Read on...

    This version consists of mostly enhancements.  It is incompatible with
previous versions of the library.  Sorry for the inconvenience.

- The assembly source code for both LScope and DTC is now included in the
  DES-Tracker package as of this version (nobody seemed to want to pay for it
  anyways).  LScope.S is extremely commented (perhaps overly so).  DTC.S
  makes up for that, but it shouldn't be too hard to follow.

- The DTC program had a bit of a problem understanding filespecs that were
  enclosed in quotes.  DTC now understands quotes around filespecs (make sure
  the quotes enclose the *entire* filespec, including path).  So now
  directories and files with spaces in them are not a problem.  Yay. :)

- DTC was also modified so that you can pause its output by pressing a key.
  This really bugged me, too. =u)

- The AddStatusSignal() function has been rewritten to allow you to be
  signalled when only certain specific events occur.  It's much more flexible
  as a result.  Please read about AddStatusSignal() in LibFuncs.DOC.

- You can now also be signalled upon completion of a pattern, completion of an
  iteration of a playing song, as well as completion of a volume fade.  See
  description of AddStatusSignal() in LibFuncs.DOC.

- The SetDefaultPath() function has been removed and replaced by the
  SetModulePath() function, which allows for multiple search paths when
  loading modules. See LibFuncs.DOC. (Note: DTC no longer has the "SD" (Set
  default path) command.  Instead, it now has the "SP" (Add/Remove search
  path) command).

- The Library's status structures have been modified.  Now LoadModule() will
  remember the path and filename of a loaded module.  This means that
  SaveModule() can be passed a NULL pointer and will use the original path and
  filename of the module automatically.  See description of SaveModule() in
  LibFuncs.DOC for more info.  See Structures.DOC for more info about the
  extra fields in the status structures.

- As a result of the previous enhancement, LScope had to be recompiled.  This
  package includes LScope v1.3.

- The Rexx function DES_DefaultPath() has been removed and replaced by the
  DES_ModulePath() function.  See RexxFuncs.DOC.



              ENHANCEMENTS AND BUG FIXES FOR DESTRACKER REL 1.4
              =================================================

    This release features two new functions that should come in quite handy
for those of you who are writing players/scopes on top of DES-Tracker.  The
first function is called "AddStatusSignal" and the other is called
"RemStatusSignal".  These two functions allow you to pass a signal bit to
the DES-Tracker library.  Then you can Wait() for that signal.  The library
will signal you automatically whenever the play status changes (e.g. pauses,
continues, starts playing, stops playing, module is loaded or unloaded).

    The other routine (RemStatusSignal) removes the signal bit from the
library's signal queue.  Any number of tasks can be waiting on the library
at the same time.  Also, you can call either of these two routines regardless
of whether you own the library or not!  So even a simple scope display can
use it, despite the fact that there might be another program running that has
a lock on the library!  Kewlies.  :)

    See the LibFuncs.DOC file for more information on these two new functions.



              ENHANCEMENTS AND BUG FIXES FOR DESTRACKER REL 1.3
              =================================================

    This release is only minor.  It fixes a bug that causes the player to
slightly misinterpret an extended Protracker command.  Plus I added a new
feature:

- A bug was fixed in the "Sample Offset" command that caused the player to
  "greatly exaggerate" the desired offset in the sample.  This has been
  fixed.  Now the Maruku Buranu mods play correctly (as will other Protracker
  modules).

- The PSC0 construct had a reserved byte field in it, which has now been given
  a legitimate meaning.  It now holds the default number of iterations for
  playing the song.  This was added so that you could set the number of
  iterations for a song, save it back to disk, and then simply play it from
  DTC and have it play for the correct number of iterations.  Bear in mind,
  though, that DTC does not fade the song out automatically.  It just starts
  it playing.

- Also, since the number of iterations is now part of the PSC0 construct, the
  number of iterations are now set automatically by DES-Tracker whenever it
  loads a song that contains a PSC0 construct.  If the song doesn't have a
  PSC0 construct attached to it, then the number of iterations are set to
  0 when the song is loaded.

  For more information on the PSC0 contruct, see the file "DTLib.ReadMe".

- I modified the JukeBox.rexx program somewhat to allow for the number of
  iterations now stored in a module's PSC0 construct (if the module has one).



              ENHANCEMENTS AND BUG FIXES FOR DESTRACKER REL 1.2
              =================================================

- This release of DES-Tracker includes the absolutely brand-spanking newest
  release of req.library (v2.7).  DES-Tracker is currently the only source of
  req.library v2.7 at the moment, so spread it around! :)

- A new flags field had to be defined for the library's base structure.  The
  upshot of this is the old LScope program will not work properly with the new
  library.  You will need the new one (v1.2) included in this version of
  DES-Tracker.  Also, any programs you may have written that read the library
  base structure directly will have to be recompiled with the new includes
  provided in this release as well.  Sorry for the inconvenience.

- DES-Tracker sometimes missed notes that it was supposed to play.  This has
  been fixed.  It was a problem with both the "Note Delay" command and the
  "Retrigger Note" command.

- A tiny little debugging remnant was left behind in the library code itself
  that did a longword write to location $0.  This has been removed. (Colin Fox
  found this one, 'cause he's got Enforcer and I'm still running on a 1 meg
  Amiga 500 with a lowly 68000). :(  This bug was found to be "mostly
  harmless".

- An actual bug (!) was discovered in the DTC program, appearing in the form
  of an Enforcer hit.  The bug caused a byte to be written to location 0.
  This has been fixed.  Again, "mostly harmless" (unless you're using
  DES-Tracker with Director II).  Thanks to Dave Knox for leading me on the
  warpath to find this one, and to Colin Fox who used Enforcer to help me
  track it down and throttle it.

- A serious Enforcer hit was discovered in LScope.  This has been fixed.

- The library had a problem with mods that referenced undefined instruments
  (also referred to as "blank" instruments).  Although I disagree with the
  idea of references to undefined instruments, I added support for this
  anomaly by creating a *real* blank sample in memory, and using it whenever
  an instrument is referenced that does not exist.

- If the LoadModule function encountered a file that was missing instruments,
  it would abort with an "insufficient memory" error, which is wrong.  Now, if
  such a file is loaded, it will abort with a "missing instrument(s)" error.

- The library did *not* like Protracker's interpretation of the tempo command
  (i.e. interpreting tempos greater than 31 as "BPM" tempos.  DES-Tracker now
  understands these tempos and interprets them properly, to the best of my
  knowledge).  I think that this BPM idea for the tempo command should win an
  award for the most stupid idea in the world of trackers.  First off, there's
  no such thing as a "beat" in a tracker module, and secondly, the author of
  Protracker should have MADE THE BPM TEMPO STUFF A SEPARATE TRACKER COMMAND!!
  Goodness, I'm ranting again...

  Anyways, if you play a Protracker song that uses these BPM tempos, you will
  notice the fine tempo now changes as a result to create the correct tempo.
  Also, notice that it doesn't matter what timing mode you're in (i.e. 50 or
  60Hz).  the correct fine tempo will be calculated taking the current timing
  mode into account.

- Some songs do not "use" BPM timing, i.e. they want tempos greater than 31
  to be interpreted as normal tempo values.  Therefore, the library now has an
  extra function called "SetTempoInt" (ARexx equivalent: DES_TempoInterp).
  This allows you to specify whether a loaded module will have its tempo
  commands interpreted as normal tempos in the range 1..255 or normal tempos
  in the range 1..31 with tempos 32..255 treated as "BPM" tempos.  The default
  setting is BPM tempos enabled.  This flag is saved with the module in the
  "PSC0" construct appended to the end of the song so that DES-Tracker will
  know how to interpret that song's tempo from now on.

- The DTC program has been modified to accept multiple commands in a single
  invocation (e.g. "DTC mf1 lm in:HamsterDance sm out:HamsterDance", not
  including the quotes of course.  This will load up the song called
  HamsterDance (in either Noisetracker 2.0 or Soundtracker v2.6 format) from
  the in:  directory and save it back to disk in Noisetracker v2.0 format in
  the directory called out:  ).  It should be noted that filenames that have
  spaces in them should be enclosed in double quotes (e.g. "in:Hamster
  Dance").

- The DTC program has had an extra command added to it called "LP", which
  means "Load & Play module".  You use it just like you'd use the "LM" command
  ("Load Module").  It will automatically start the song playing as soon as
  it's loaded.

- The DTC program has had another command added to it called "TI", which means
  "set Tempo Interpretation". "DTC TI 0" enables BPM tempo interpretation, and
  "DTC TI 1" disables it.

- The JukeBox.rexx program was modified.  A better shuffling algorithm was
  added.  This isn't terribly important, though. :)

                          --- End of History.TXT ---
