Game Music System changelog
---------------------------

For the curious: The dates listed here reflect when a modification completed
the testing phase and was declared debugged. I often work on several things
at once, and sometimes they all get finished at about the same time. That's
why it can seem that incredible amounts of work are being done in a single
day.

May-15-1996: GMS 1.0 released to the public.

May-20-1996: Made GMS work with the DJGPP protected mode compiler. (It still
compiles under Borland, too.)

May-22-1996: Added some compiler auto-detection to globals.h.

May-23-1996: Made all of the functions in the song and music_driver classes
static. Should make the player a little faster (no more this pointer
passing).

May-30-1996: Whew. GMS can now play samples in parallel with the FM music. A
few details remain to be taken care of (mostly protected mode stuff) but for
the most part it's done.
  A number of functions were added to support this. The ones that are
important to the end user are set_up_driver(), prepare_samples(), and
unprepare_samples() in music_driver.
  WAV instrument format is now supported.

Aug-14-1996: New editor files "msonly.cpp" and "msonly.h" which contain fake
versions of functions found only under MS-DOS. These files let me remove
many of the #ifdef TARGET_MSDOS checks found in the source code, which is
useful since I do most code development under Linux, only transferring it
over to MS-DOS for testing.
  All header files can now be included as many times as desired, the same
way the system header files can.

Aug-16-1996: Finished up the code in the driver that dealt with samples in
protected mode.

Aug-19-1996: Added a lot of gadgets to the editor's INST menu and a few to
the MISC menu to control sample playing.
  Instruments can now have a "synth" or a "sample" component, or both, or
neither. Not too useful at the moment, but it will be when GMS has true
sample-tracking capability.
  Raw data files can now be loaded as samples.
  Forgot to turn on the interrupts for the DSP, fixed.
  The status bar now shows instrument number digits as 0-9 and A-Z.

Aug-21-1996: Removed the "Add" and "Delete" gadgets from the INST menu since
the component system makes them unnecessary. The editor now starts up with
the maximum possible number of instruments available. Adding or deleting
instruments is now a matter of adding or deleting the appropriate
components.
  Updated the load/save GMS/GMI routines to deal with the new changes.
  Took the DSP handler setup/removal code out of wedge_player() and
remove_player(), and put it in new functions wedge_dsp_handler() and
remove_dsp_handler(). People who are handling their own timer interrupts
will need this change.
  Added cancel_sample_playback() to music_driver.
  Added start_subroutine() and cancel_subroutine() to the song class. "Music
subroutines" temporarily stop the main tune, play a subtune, and then resume
the main tune. Useful for things like extra life music.

Aug-27-1996: Found a bug in update() in music_driver. The if statement that
checks forbid_count is enclosed in an #ifdef EDITOR_HOOKS; it should not be.
This bug was present in the 1.0 release.

Aug-28-1996: Added start_effect(), cancel_effect(), and cancel_all_effects()
to the song class. Effects (which can be anything that can be scored in GMS)
can now be played in parallel with the main tune/subtune.

Sep-17-1996: High speed mode wasn't being handled properly, and neither was
stereo mode. Fixed.
  Fixed problems with WAV file parsing.

Sep-21-1996: Changed a number of functions to return values of type
gms_function_return_codes (a global enumeration) instead of the unintuitive
ints they were returning before.

Sep-24-1996: Player program updated.
  Updated the main documentation with the changes since 1.0.

Oct-07-1996: The editor now uses the curses library I/O routines when
compiled under Linux. It's slow and looks terrible, but it works, and should
make debugging a lot more convenient.

Oct-08-1996: Restructured the popup class. It is now derived from the
interface class (as it should be) and works a lot better than it did before.

Oct-10-1996: Requesters implemented. These are pop-ups that present the user
with a list of options, one of which he must choose.

Nov-17-1996: Added trigger_sample() to the music_driver class.
  Some small changes to the main documentation.
  Discovered a serious bug in the GMS 1.0 release. It appears that either
the load or save routines can sometimes corrupt the module. Since those
routines are going to have to be substantially rewritten as part of the next
major editor change, I decided not to bother tracking down this bug.

Nov-22-1996: Added safety requesters to: load song, save song, exit program.
  New gadget "Saves To Existing Files" on MISC menu to control the save song
requester.
  Began a major change to the editor internals. Previously, music was stored
in memory for editing in a compressed form similar to the way it is stored
on disk. This was necessary because the 1.0 editor was compiled for real
mode, which put some severe restrictions on the amount of memory it could
use. Since the editor is now being compiled with DJGPP, those restrictions
have vanished. The new system will have a fixed (but user-settable) number
of effect slots attached to each note during editing, which makes a lot of
code a lot simpler.
  Added "Max Effects Per Note-Line" gadget to the MISC menu.
  Changes to trackdis and block classes to implement the new storage system.
  Pressing backspace while the cursor is on top of an effect now zeroes out
that effect.

Nov-23-1996: Changed load_gms() and editor_reformat() to use the new system,
also some changes to the block class.

Nov-24-1996: save_gms() updated for the new system. Some code was moved from
save_gms() into the block class. The load/save bug appears to be gone.
  load_rad() updated for the new system. Noticed a few bugs while changing
it, and fixed them.

Nov-25-1996: The insert and delete keys can now be used in the track
display. They shift all notes and effects on the current track from the
cursor position to the end of the block. Insert shifts them down, delete
shifts them up.
  New gadget on the block menu, "Add Block". The old "Add Block" gadget was
renamed to "Add Block Here". The new "Add Block" gadget adds blocks at the
end of the block list, which is often desirable.
  Fixed the Default Block Lines gadget to have a max of 256 (instead of 255
as it had before).
  Updated all the editing functions to the new system. Changed the
implementation of the clipboard from a static object to a pointer. Changed
code in the Tracks and Max Effects gadgets. Fixed up the slide making
functions.
  The transition to the new storage system is complete.

Nov-26-1996: It's now possible for me to define cursor key mapping tables
for some gadgets, instead of having to overload cursor_key(). Unfortunately,
this cannot be done for all gadgets, but it helps. gadget::cursor_key() was
added to support this.

Nov-28-1996: The page up/down keys, when used in the track display, now move
the cursor up or down multiple lines.
  When the cursor is in the track display, shift+insert now inserts an empty
track where the cursor is, moving the track under the cursor and those to
the right of it towards the right. Shift+delete deletes the track under the
cursor and moves the tracks to the right of it in to fill the gap.
  Added four gadgets to the block menu: "Trans. Block +", "Trans. Block -",
"Trans. Track +", "Trans. Track -". These gadgets transpose all of the notes
in the current block or track up or down by one half-step.
  "Split Block" and "Join Block" gadgets added to the block menu. They split
the current block into two, or join the current block with the next block,
respectively.

Nov-29-1996: Due to problems with the order of constructor calls for global
objects, removed the constructor and destructor from the song class.
song::set_up_class() and song::shut_down_class() now hold the code from the
old constructor and destructor.

Dec-03-1996: The Select File popup now shows file size or <DIR> and sorts by
name.
  The cursor now behaves a little bit differently in the play sequence
gadget. It advances when a number is changed, and the right and left cursor
keys can move it up or down a line.
  Added "Clear Note Effects" gadget to the block menu.
  Four new gadgets on the block menu: "Cut Note", "Copy Note", "Paste Note",
"Swap Note".

Dec-04-1996: Added default update() and return_key() functions to the
numeric_gadget class; they let me remove the overloaded functions from some
of the numeric gadgets.
  New editor functions bring_focus_to_element() and redraw_visible_window().

Dec-05-1996: Updated the manual with the recent changes.
  GMS 1.1 BETA1 released.

Dec-11-1996: For some odd reason, cx and dx in the REGS struct are defined
as long under DJGPP, and this was messing up the mouse code. Fixed.
  Fixed the requester to actually pick the response clicked on with the
mouse, instead of just selecting it.

Jan-01-1997: The AMD module format is now supported.
  Graphical mouse pointer implemented. Setting Graphical1 is for people with
slow computers and Graphical2 for those with faster ones.

Jan-02-1997: Whoops. If a channel is using additive synthesis (instead of
frequency modulation), both operators need to have their output level
adjusted when a volume change occurs. Fixed.
  An error in one of the calculations in load_instrument() was preventing
tracks 10-18 from being audible in sbpro2 mode. Fixed.
  Global volume added. A new gadget on the MISC menu can be used to control
this during editing, and a new function set_global_volume() can change it
during playback. Much volume-related code was cleaned up also.
  Lowest stereo right implemented.

Jan-03-1997: Vibrato command (4) changed. The old implementation used a
sawtooth algorithm. The new method uses a sine table and sounds quite a bit
better.

Jan-30-1997: Changed some of the loops in the song and music_driver classes
to go from a number to zero, instead of from zero to a number. This is less
intuitive, but a teensy bit faster.
  New function compute_tempo_milliseconds() in music_driver. This is used by
the Win95 player program, since Windows requires the timer message interval
to be specified in milliseconds.

Feb-01-1997: Added TARGET_WIN95 to the player code, and wrote a simple Win95
program for a graphical interface. It doesn't work very well.

Feb-02-1997: The BLOCK menu is full! New menu SPECIAL created to handle the
excess functions.
  New gadgets: Mark Range Start, Mark Range End, Hide Range, Cut Range, Copy
Range, Paste Range, and Swap Range. These gadgets handle rectanglar regions
of music data. Currently they reside on the SPECIAL menu.

Feb-03-1997: Percussion mode implemented. There seem to be some problems
with it, probably due to the lack of documentation on this mode.
reset_card() doesn't work properly on the percussion tracks, and when used
in sbpro mode it locks up the percussion tracks until soundsystem is changed
back to adlib. Oh well.

Feb-04-1997: Arpeggio implemented. You can use arpeggio together with a
frequency slide, and it will work, but the results will not be strictly
correct. Making them correct would have taken too much CPU power.
  The right mouse button can now be used to select a range in the track
display.

Feb-06-1997: MIDI files can now be loaded.
  New gadget MIDI Quantize on the MISC menu. I would rather have had a
requester window pop up to ask this at load time, but certain design
limitations make that impossible without some rather messy kludging which I
don't want to do.
  Updated load_config() and save_config() to handle the new stuff on the
MISC menu.

Feb-10-1997: Added keyboard shortcuts for some of the new stuff.
  Documentation updated.
  GMS 1.1 released to the public.
