
Future work (user requests):
X.  Add tool to SWAP channels
X.  Add system resources page
X.  Warp function (like caliope)
X.  Allow editing of the info field
X.  On AVG funciton, allow combination based on percentages
X.  Find a way to remove the notebook pages for the major tabs
    (Idea:  Remove the NOTEBOOK tabs and make the notebook a
    regular dialog which has all of the pages hidden.  Add a
    menu to let the user select which page is displayed.)
X.  Integrate MMPM into the editor dialog (maybe)
X.  Display multiple channels on the edit display.
X.  Add RECORD capability for REXX command scripts
X.  Make an EFFECTS.DLL and an IO.DLL so that PMsndX can share
    the same code with new applications that share the same code.
X.  Add menu to the editor

Revision history:
2.0 Make the Editor the central point of control
    Create Multiple Document Interface
    Integrated Editor and AUDIO windows into the same window
    Fixed major bug in the MMPM/2 code which crashed the program
    Added tons of new stuff
    Created PlSndX to provide commandline playback capability
    Created EdSndX to replace PMsndX.EXE

Revision history:
Version 1.38
1.  Rewrote the FILE dialog box from scratch rather than using
    WinDefFileDlgProc as in previous versions.  I made this
    very generic and more easily expandable.  It is also a bit
    more compact so it saves some screen space.  The biggest
    addition is the file history which stores a cache of the
    last files accessed.  This cache is saved between sessions
    if the "Save file XXXX path" options are set.

Version 1.37b:
1.  Added capability to pull the sound out of an AVI movie

Version 1.37:
1.  Added expiration date to registration information

Version 1.36b-d:
1.  Corrected simple bugs and changed email address of author

Version 1.36a: (9 Dec 94)
1.  Added an option to the MISC Properties to warn the user
    when a .AU file is created which is not ULaw format.
2.  Added functions to query and set the tristate property
    for forcing ULaw format

Version 1.36:  (8 Dec 94)
1.  Added option to the properties box to enable or disable
    the footnote display.
2.  Animated the Pause button
3.  Fixed a problem with the help to conform with the recommended
    usage of the F1 key (from the CUA guidelines).
4.  Added rexx functions to query and set the new Properties
    for sharing the audio device and creating the footnote
    on the main control panel.
5.  Enabled UL for the unregistered version of PMsndX.

Version 1.36 (beta 2):  (27 Nov 94)
1.  Recompiled with IBM CSet++ to solve a problem with crashing
    under OS/2 3.0 (Warp) GA.
2.  Oops...I forgot to update the version text to indicate that
    the first beta was actually a beta.
3.  Corrected a major oversight in the MMPM code which prevented
    PMsndX from playing sounds after the 12 sample was loaded.
4.  Added option to use the audio device without sharing.

Version 1.36 (beta 1):  (16 Nov 94)
1.  Fixed the HELP so that the standard F1 key is now supported
2.  Added TOOLPAGE AND PROPPAGE features to the REXX scripts to
    change pages of the Toolbox and the Properties notebook.
3.  Modified parsing of the RECORD command so that the keywords
    can be specified in any order.  Previously, the limit had to
    be specified after the rate and channels and PMsndX would
    crash if it was not in this order.
4.  Bug:  When AVERAGING channels, if the average was to the
    CENTER, the result would be random.
5.  Modified the AVERAGE 4TO1 REXX syntax to allow the specification
    of the FROM channels.
6.  Changed the memory allocation scheme.  Now, the limit specified
    represents the total amount of OS/2 memory that can be allocated
    by the program and can be set to as many as 32767 4k pages.  The
    AUTO settings essentially places no limit on the amount of memory
    that the program will attempt to take.  You better have a big
    swap file if you plan on using AUTO and large samples!
7.  Bug:  Previously MMPM would refuse to play a sample which had
    more channels that the audio device supported regardless of the
    channel selection setting.  Now, if the channel selection is
    set and a channel has been selected, the audio device will play
    the specified channel.
8.  Changed the REXX syntax for the EDITOR.  The editor is no longer
    displayed when data is manipulated.
9.  Finished the REXX implementation.

Version 1.35:  (6 Nov 94)
1.  Removed all "Cancel", and "Dismiss" buttons from all
    dialogs.  The system menu for the dialogs is used to
    close the boxes.  A new button "RESET" has been created
    for the dialogs which have an "APPLY" button.
2.  Added an option to the AUDIO Properties to play on Command line
    load.  This allows sounds to be played from the command line
    without setting the PLAY ON LOAD setting.  The PLAY ON LOAD
    still operates as it did before.
3.  When PMsndX is registered and a file is specified on the command
    line, the ABOUT dialog box is not displayed.
4.  Added volume control to the AUDIO and QUERY parts of the REXX
    syntax to let the REXX set the initial volume.
5.  Added keyboard input through the REXX OUTPUT window.  Handles
    STDIN (e.g. PULL) but not CHARIN.
6.  Modified and implemented the MESSAGE portion of the REXX
    scripts.  (Changed the MESSAGE subcommands to functions so
    that they can return the status of the buttons.  Also, added
    an array of capabilities to match all possible combinations that
    OS/2 offers).
7.  Changed FILE subcommands to functions to allow for better
    processing of arguments and to allow PMsndX to return the
    fully qualified filename.
8.  Added command to suppress the display of the PMsndX REXX
    commands in the output window.
9.  Fixed the RECORD portion of the REXX scripts so that they work!
10. Added a REXX page to the Properties Dialog.  Also moved the
    REXX Lines to the REXX page and added 4 spinbutton type windows
    to let the user choose the colors of the REXX display.
11. Added the EDITOR functions to the REXX scripts.
12. Added DISPLAY section to the REXX

Version 1.34:  (1 Nov 94)
1.  All dialogs now use the following buttons:
    APPLY  means "do it", "apply", "save changes" or whatever I use to use
    CANCEL means "dismiss", "close", "get this damn window off my screen"
         without recording any changes made.
    ABORT  (where applicable) "stop that task from taking up my CPU!"
    (A description of the major buttons has been added to the HELP file)
2.  Added CANCEL button to the play options dialog
3.  The checkboxes for "Auto Dismiss" and "Save Directory" are
    only saved when a file is successfully loaded.  (Why not when
    the window dismisses?  Well duh!  If you don't set the "Auto
    Dismiss" the only way to get rid of the box is with the Cancel
    button.  So, I save the status after a file is successfully loaded.
4.  Added item to the MISC Properties page to specify the location
    of the PMsndX.ini file.
5.  CRITICAL CHANGE!!!!  While starting to implement the REXX
    processing I found that I had overlooked an important problem.
    With all the ownerships of C++, I could not manipulate all of
    the private variables without the dialog boxes.  All of the
    functions had to be modified to allow a "back door" for the
    rexx scripts.  This could bring in new errors.  Look out!
6.  Modified the Clipboard routines so that they do not clear
    the clipboard when data is pasted.
7.  When a file is loaded, the UNDO is updated if it is enabled.
8.  When a file is aborted, and UNDO is enabled, the old data
    is automatically restored.
9.  When an error occurs when loading a file and UNDO is enabled,
    the previous data is restored.
10. Implemented the FILE portion of the REXX scripts
11. Modified the REXX output so that all commands are displayed
    before the command is executed.  Also, when an error occurs,
    the command is now displayed before the error is displayed.
12. When command line playback is used, the AUDIO dialog box is
    displayed.
13. Rewrote the commandline playback section so that a REXX script
    can be played.  (Commandline playback will stop after the
    first rexx script that is encountered.)  Previously, playback
    was hit or miss because I did not expand filenames properly.
    It is fixed in this version.
14. Implemented the MISC portions of the REXX scripts
15. Implemented the AUDIO PLAY support in the REXX scripts
16. Added MMPM_DEVICE, MMPM_INI_PATH, and MMPM_PLAY_16ON8 to the
    REXX script syntax.
17. Implemented the PROPERTIES portion of the REXX script.
18. Modified the syntax of the RECORD command
19. Changed the QUERY commands from subcoms to functions
20. Added option to the PROPERTIES to play headerless .AU
    files automatically

Version 1.33:  (24 Oct 94)
1.  Bug:  The Drag/Drop routines did not check to see if PMsndX was
    currently processing data before the drop operation started.
    (When the F1 key is pressed during this condition, a dialog
    box displays the problem.)
2.  Added option to the AUDIO page of the settings dialog to
    let 16 bit samples play on 8 bit cards.  (Someone with an 8
    bit card needs to test this!)
3.  Added option to ignore unknown header blocks when loading a file
    (if the result of the unknown header block makes the file unloadable
    an error will be displayed.  This only disables the warnings.)
4.  Bug:  Drag/Drop previously concatenated successive drag/drop
    names together because I did a strcat instead of a strcpy.
5.  Added option to let the .AU file extension override the header
    information.  Essentially, by default, if a file with an extension
    of .AU is opened and it does not contain a header, it will be
    forced to be interpreted as ULAW with standard characteristics of
    1 channel, and 8012 Hz sampling rate.  By turning this option on
    the operation requires that all .AU files contain a valid header.
6.  Changed the "Settings..." menu item to "Properties..."
7.  When a command script (REXX) is opened, the name on the control
    panel is not changed.
8.  When a command script (REXX) is opened, the REXX output window
    will have the title of the file that is running.
9.  Added a series of QUERY commands to the REXX syntax to allow
    information about both PMsndX properties and file properties.

Version 1.32:  (30 Sep 94)
1.  Bug:  Fixed bug in writing 16 bit .WAV files.  (I was writing
    a FormatTag of 0x02 instead of 0x01.)

Version 1.31:  (28 Sep 94)
1.  Removed Help, Exit, and Settings from the control panel
2.  Moved the Playback options to a dialog from the
    SysMenu of the AUDIO dialog
3.  Changed the Settings to a Notebook
4.  Completed the following REXX commands:
        PMSNDX EXIT
        PMSNDX CLOSE
5.  Fixed bug in REXX display window

Version 1.3:   (never released)
1.  Added footnote window to main control panel
2.  Added REXX hooks
3.  Added a display window for the REXX output

Version 1.2:   (16 Sep 94)
1.  Fixed bug with semaphores in MMPM which caused the data to
    become locked.

Version 1.2:   (8 Sep 94)
1.  Drag and Drop functionality added
    - Accepts Files for dropping.
    - When sending a file, if it is not a OS/2 file, it must
      be rendered into a file by the source first
2.  When registering, the current password is not displayed
3.  Fixed bug in writing .VOC files

Version 1.1:   (4 Sep 94)
1.  Previously, REMOVE in the editor did not utilize the UNDO
    feature.
2.  Added recording capability for the MMPM Player.
    - Records directly to memory
    - Records till a specified limit or till STOP is pressed
    - Detects current AUDIO capabilities
3.  Added VOLUME control for both playback and record
4.  Changed the name of the MMPM/PLAYBACK button to AUDIO
5.  Changed over to MUTEX semaphores to limit access to the
    sample data between tasks
6.  Added a semaphore to the MMPM copy of the data (This
    was necessary to avoid conflicts between play and
    record)

Version 1.0:   (22 Aug 94)
1.  Modified Copy command to only copy a single channel when
    a single channel is selected.
2.  Renamed class to "PMsndX 1.00" (This will have the effect
    of forcing beta testers to recreate the pmsndx.ini file)
3.  Bug.  Previously, the length of the start was always added
    to the end when the clipboard was merged.
4.  Bug.  Previously, no matter if a selection was specified
    for a channel or ALL was selected, REMOVE would remove
    from all channels.
5.  Changed the profile operation so that the os2.ini file is
    only modified when the program is registered.
6.  Added examples of the user interface to the help file.
7.  Created two help files.  The larger file is the default
    and contains examples of the user interface.
    smallhlp.hlp is the version of the help without the
    examples.  To use the smaller version, copy it to
    pmsndx.hlp.

Version 0.88:  (16 Aug 94)
1.  Bug.  Oh hey, secondary windows receive a WM_QUIT message
    when they exit!  That caused PMsndX to exit too!  The solution?
    Remove the CLOSE item from the MMPM system menu.
2.  Bug.  When using the VIBRO function, if the speed was left
    at zero (0), PMsndX would hang.
3.  AUTO DISMISS is now the default for the OPEN and SAVE dialogs.
4.  The MMPM button has been renamed to PLAYBACK.
5.  Added more updates to the CLOCK pointer so that it does
    not hang at positions when operations end prematurely.
6.  If MMPM is installed it is automatically enabled in the
    settings box.
7.  The default is to save the window positions and the last
    directory accessed.
8.  Removed the REWind button from the MMPM player and reorganized
    the buttons.
9.  Bug.  The horizontal sides of the control panel would allow
    the panel to resize smaller without resizing the buttons.
    Now, resizing using the horizontal sides just moves the box.

Version 0.87:  (14 Aug 94)
1.  Bug.  The average function did not work for 4 channels.
2.  Bug.  The rate and speed dialogs did not properly manipulate
    the mouse pointer and it would go from 0 to 2 but no further.
    Note that there was nothing wrong with the operation other
    than the mouse pointer did not get updated properly.
3.  Bug.  When a range was selected for the REVERSE tool, the
    actual data reversed would be incorrect if the beginning
    was not at 0.0 offset.
4.  Add tool to invert a waveform
5.  When PASTING from the clipboard, if the SHIFT key is held down
    while pressing the PASTE button, the data on the clipboard will
    be merged instead of pasting.  (merge = average 50/50).
6.  Bug.  When pasting, the old bug for Signed/Unsigned WAV
    data was found again.

Version 0.86:  (11 Aug 94)
1.  Bug.  The Lowpass dialog would not redraw itself after it is
    uncovered by another window.
2.  Bug.  If a .WAV file was loaded which contained a bad header,
    the READ task would hang.
3.  If very small files were loaded (e.g. under 100 samples) the
    clock pointer would stick at the 11:00 position and the open
    dialog did not receive the signal to close.  It appears that
    the system receives too many posts to the pointer queue and
    as we all know, OS/2 deletes posts that are duplicated.  The
    solution...force a .1 second delay after the read before sending
    the update information.
4.  Previous versions just BEEPed when an operation was attempted
    while the current sample was being manipulated.  That has been
    changes so that if an operation is attempted while the data
    is "busy" an error is displayed.
5.  Bug.  If the MMPM dialog was dismissed while the MMPM buffers
    were being loaded, the "busy" flag would not be cleared
    and no further operations could be done.

Version 0.85:  (9 Aug 94)
1.  Edited virtually all of the dialogs so that they would
    appear correctly when VGA fonts are used with SVGA displays.
    (Note, this may be an odd combination, but people use it
    and I had to make sure that PMsndX displays correctly).

Version 0.84:  (8 Aug 94)
1.  Resized the MMPM dialog (moved the group box, added space
    between the checkboxes, and increased the width and height
    of the overall box)
2.  Widened the OPEN and SAVE dialog boxes and moved things
    over to the right to add more space to avoid clipping
3.  Bug.  When the editor display is updated with a new file,
    the Vertical Scroll bar (Zoom) would be set to maximum but
    the actual zoom would be minimized.
4.  Bug.  When the redraw button on the editor was pressed, the
    horizontal scroll bar would revert to the leftmost position
    but the display would remain unchanged.  Pressing an arrow
    would return it to the correct position.
5.  The Tools box size has been increased to allow more space
    between the controls to avoid clipping.  On a 1024x768 display
    the controls looked fine but at VGA resolution they were clipped.
    a.  The Type page previously clipped the IRACAM and SMPVS
    b.  The Average Channels page had the checkboxes touching
    c.  The band-pass filter page clipped the "Add filter noise"
    d.  The low-pass filter page clipped the slider at the top
    e.  The Vibro-champ page had the sliders clipped
    f.  The Fade page was clipped on the right side
    g.  The Limit page clipped the sliders

Version 0.83:  (7 Aug 94)
1.  Fixed up the bitmap displays.
2.  PMsndX now checks the MMPM parameters to verify that the sound
    card can play 16 bit sound samples.  If the sound card cannot
    play 16 bit sounds, then the MMPM player will not load its buffers
    and will just refuse to play.

Version 0.82:  (7 Aug 94)
1.  In previous versions, if a file was being saved and the program
    exited, the program would wait indefinitely till the save completed.
    This could prevent killing PMsndX and would lock the message queue.
2.  The MMPM player now displays "Loading Data" when it is filling
    the data buffers.
3.  PMsndX now exits correctly when Ctrl-C is pressed from a command
    window or when PMsndX is terminated from a task manager.
4.  PMsndX now properly terminates all tasks (save and MMPM) when
    the program exits.  In previous versions, the MMPM task for
    loading buffers was not killed when the program exited or when
    the MMPM dialog was destroyed.
5.  In previous versions I did not save the last position of the
    windows if the program exited while the windows were open.  This
    was because I saved settings stuff before closing the windows and
    the windows did not save their positions till they closed.
6.  The Toolbox now sets the tabs size based on the resolution of
    the monitor.  This should avoid problems with clipping of text
    found in previous versions.  (David Charlap showed me how to do
    this effectively)
7.  Added hotkeys to the Tools notebook
8.  Moved the registration information out of the pmsndx.ini file
    and into the system user ini file so that a user may use the
    pmsndx.ini file on any computer or on a network.

Version 0.81:  (17 Jul 94)
1.  Bug.  The MMPM reloaded its buffers when the channel to manipulate
    was changed regardless of the checkbox for global channels
2.  Bug.  The MMPM reloaded its buffers when the range to manipulate
    was changed regardless of the checkbox for global range
3.  Bug.  (Well, not really) The error boxes were not application
    modal.  They are now.
4.  A few fixups on the help text.
5.  Dialog windows do not move with the main control panel.
6.  The welcome dialog box has been changed so that the standard
    text is greyed and the new stuff is dark to make it easier to
    read.
7.  If the current sample in memory has been modified and the
    EXIT button is pushed, the program will tell the user that
    modified buffers exist and verify that the user wants to continue.
8.  The Registration box now has the capability to read a file
    and find the registration information if it has the proper
    keywords (i.e. if it was a password that I emailed you).
9.  Fixed bug in .WAV reader in which an the header was not checked
    for invalid data and a "divide by 0" error could occur.

Version 0.8:  (17 Jul 94)
1.  Added a menu item to the main control panel to reset the size
    of the main control panel to the default
2.  Bug.  When a sample is very short, the Display was not cleared
    beyond the end of the sample.
3.  Bug.  When "Play on load" was selected, the new MMPM thread
    would get triggered by window updates.
4.  Bug.  The Repeat button on the MMPM box could not be cleared
    once set without closing down the box and reopening it.
5.  Resizable main control panel (what a bear!!!)
6.  Fixed windows so that they cannot fall outside of the viewable area
7.  Fix the file wildcard usage
X.  Added HOTKEYS for the main control panel

Version 0.7:  (13 Jul 94)
1.  Added a REGISTRATION button the to Welcome box
2.  Completed a little tool (which you will never see) to
    automatically generate the passwords and store them in
    a database.  This illustrates the power of OS/2 because
    I completed a fully functional editor in about 1 day.
3.  Edit confirmation to the EXIT button
4.  .WAV files now skip unknown keywords rather than reporting errors
5.  Added another thread to the MMPM player for loading the
    buffers.
6.  Added new BITMAPs for the main control panel when MMPM
    is not installed.
7.  Added a Repeat function to the MMPM playback
8.  Finished the BALANCE tool
9.  Fix all tasks so that sounds cannot be operated on while
    another a task is modifying the buffers (i.e. while the
    buffers are loading for the MMPM, the range selections
    cannot be made)
10. Added a redraw button the the editor
11. Bug fixed.  When the display box was previously selected, the
    display would receive the mouse movements, but the window would
    not become the active window.
12. Add the ability to UNDO the last command.  This will double
    the memory requirements and should be in the settings page
    to disable for users who don't want to lose the memory.
13. The letters "I" and "O" were removed from the passwords to prevent
    confusion over the number 1 and the letter I and the number 0 and
    the letter O.
14. Fixed window locations so that they can never fall off the
    screen.
15. Added MINIMIZE button to the dialogs
16. Bug fixed.  VOC files with a type 0x0a marker were not
    read.  Unknown markers are skipped now.
17. Bug/oversight.  The Cut button was disabled for ranges
    even if the program was registered.

Note 1: For Beta Testing purposes, use the following to enable
all functions
    Name:               "Beta Version Registration"
    Through Version:    0.99
    Password:           "cHLttnr0sqypjc2e"
To enter the password, select REGISTER on the ABOUT or
WELCOME boxes (accessed from the system menu).

Version 0.6:  (6 Jul 94)
1.  Renamed the initialization file from pmsndx03.ini to pmsndx.ini
2.  Removed QUALITY factor from the SAMPLING RATE tool
3.  Set up a global object which is shared between all dialogs
    to allow the editor to be the central point of control for
    selecting the range and channels for operations.
4.  Added checkbox to let the user select if he wants to automatically
    dismiss the save/open dialogs
5.  Add "Global range selection" checkbox to MMPM Player
6.  Use "Global channel selection" for MMPM player (add checkbox)
7.  Add version indicator in the .ini file - (current version)
8.  Setup timer to MAIN control panel which propagates to the dialogs
9.  Check the size of the clipboard data and warn if it is
    dissimilar to memory (use smaller of the two after paste)
10. Check the rate of the clipboard data and warn if it is
    dissimilar to memory
11. When a version is run for the first time, a Welcome dialog is
    displayed in place of the About box with information about the
    current version.  (The welcome can be redisplayed from the main
    menu.)
12. Change initial ABOUT box so that it doesn't block the message
    queue
13. Added info box to indicate whether each tool uses the global objects
14. Use "Global range selection" in place of local display for tools
15. Use "Global channel selection" for the tools
16. Add registration stuff (after 15 minutes of use, guilt!)
    - Disable all formats except .WAV and .AU if registration fails
    - Disable individual channel selection on the editor
    - Disable Range selection for Copy and Cut on the editor

Note 1: For Beta Testing purposes, use the following to enable
all functions
    Name:               "Beta Version Registration"
    Through Version:    0.99
    Password:           "cHLttnr0sqypjc2e"

Note 2:  The format of the .ini file has not changed.  Rename
pmsndx03.ini to pmsndx.ini and you will not have to recreate
the window locations and settings.

Version 0.5:  (8 June 94)
1.  Finished the Editor
2.  Added page in notebook for swapping channels
3.  Fixed an error when writing WAVE files with multiple channels

Note:  The big addition of the editor was a lot of work and is
probably not perfect for everyone's needs.  Handling of multiple
channels is awkward at best, but I think that I have made the
most of it.  Opinions for improvement are welcome.  Read the
help page to understand the PASTE operation before using it!
The editor has been written such that it does not use the MMPM
libraries for the sound manipulations in order to allow it to
work on any system.

Note 2:  The global channel selection is not implemented across
all the tools yet.  That will be in the next release.

Version 0.4a:  (4 June 94)
1.  Finished the Dupe dialog box in the tools box.
2.  Fixed an error with processing the Rate effect when
    multiple channels are present.
3.  Fixed Echo effect to work with multiple channels
4.  Fixed Fade effect to work with multiple channels

Version 0.4*:  (22 May 94)
1.  Added support for the MAC HCOM format.  Unfortunately the only
    portions of the header that are implemented are the ones that
    SOX implements because I could not find examples of the HCOM
    format and had to create a sample file from a .WAV file using
    SOX.
2.  Added support for the IRCAM format.  Again, like the HCOM
    format, I could not find samples in this format and had to
    use SOX to create samples for testing.  As a result, only
    the header fields supported by SOX are enabled.
3.  Added support for SampleVision (.smp) format.  WARNING:  This
    is a wierd format in which the RATE is stored at the end
    of the file.  You may find that when loading this type of
    file no error is produced but an absurd rate may be displayed
    in the Info tool page.  (Some reasons...SOX10 for OS/2 replaces
    every CR return (char 13) with a CRLF.  I think that the output
    file was not set to RAW so the file functions were fixing the
    data up for DOS.  By the way, you can fix this up by changing
    the playback speed (not the rate!!!) to something logical.)
4.  Reorganized the toolbox (again) and added place holders for
    fading and balancing in a sample.  This will be added later.
5.  Added the user interface for the editor.  It is non-functional,
    but is intended to get feedback on the functions that it will
    be provided.  If you don't like it, now is the time to change
    it!
6.  *** BUG:  Fixed bug in display routines for graphs when an absolute
    value was entered into the start and end fields for the reverse
    effect.
7.  Added fading to the tool box under the major header of VOLUME.
    Samples can be faded in or out and at different rates.

*   Note:  With this version, all of the functionality of SOX has
    been completed.  From here on out, we are breaking new ground.
**  Note:  Space is reserved for the Dupe, Fade, and Balance effects,
    but they have not been implemented and the DOIT button is
    never enabled.
*** The size of the executable is about 300k right now.  The good
    news is that the only major additions will be the code for
    the clipboard stuff.  The program currently has about 18000
    lines of C code.  I could change over to DLLs to make the
    actual executable smaller, but the way DLLs work with OS/2,
    there is no memory savings.  If you hate 300k for a program
    like this, then go back to SOX.

Version 0.3e:  (27 March 94)
NOTE:  Since the size of the Open dialog box has changed, PMsndX
    will not use the window positions or settings from the .ini
    file.  This is to prevent the Open dialog box from being
    positioned off the screen.

1.  Multithreaded the command line playback functions.  Previous
    versions shared the message queue through threads for playback
    when the control panel was used, but when a sound was played
    from the command line, all message processing would stop till
    the file had been played.
2.  Fixed the .WAV read/write routines to handle the LIST fields
    correctly.  Previous versions could not deal with the LIST
    field and returned a error indicating that the file was in
    a bad style.
3.  Changed the .VOC to be able to store the ASCII text string
    in the info field.
4.  Added support for .IFF formats (Amiga).  This format has a
    couple of fields that need mention here.  If you read a file
    in, the ANNO field is discarded and the NAME field is used
    for the Comment data retained in the files.  If a file is
    written to disk, PMsndX arrogantly writes the "PMsndX ..."
    into the ANNO field (... is replaced by the version number).
5.  The Version number has been changed to reflect the alpha version
    of the program.  In the past changes to the version number
    changed the name of the profile and resulted in loss of the
    window positions and settings from previous versions.  This has
    been changed such that the window positions and settings remain
    active unless a major change is made in the profile information.
6.  Added user overrides for the file types when opening files.
    When a file is opened, if the user specifies a specific filetype
    (other than Auto), the program will try to open the file in
    that format.  In the event that the filetype is not the
    type specified, the PMsndX will attempt to determine the
    file type as if the user had selected "Auto".
7.  When the file type is changed through the Tools notebook, the
    output type is then specified and selected in the file type
    area of the SAVE dialog box.
8.  The default format for saving a file is the same as the input
    format.
9.  A field called "AUTO" has been added to the filetypes.  When
    this button is selected, the file will be saved based on the
    filename alone.
10. If the filename field is changed, the "AUTO" button will
    automatically be selected.  This is because the file type
    specified in the buttons will override the extension.  As
    a result, if the user changes the filename and assumes that
    the file would be saved based on the filename extension,
    the file could be saved in a different format than the
    extension indicates.
11. The filename used to load a sample into memory is automatically
    used as the default filename when saving a file.  The path
    for saving the file remains the last path used for saving
    the file.
12. Added the .sb (Signed Byte) format.  This is a headerless
    format.  If the user selects to load this format, the program
    must ask the user for the sampling rate before the file
    can be loaded.  Each byte of the file is treated as an 8
    bit signed sample.
13. Added the .sw (Signed Word) format.  This is a headerless
    format and the program will request a sampling rate when
    the user loads this file format.  Each word (2 bytes) is
    treated as a signed word in little endian order.
14. Added the .ub (Unsigned byte) format.  This is a headerless
    format and the program will request a sampling rate when
    the user loads a file of this format.  Each byte is treated
    as a unsigned byte.
15. Added the .uw (Unsigned word) format.  This is a headerless
    format and the program will request a sampling rate when
    the user loads a file of this format.  Each word (2 bytes)
    is treated as a unsigned word in little endian order.
16. Added the .ul (Ulaw) format.  This is a headerless format
    and the program will request a sampling rate when the user
    loads a file of this format.  Each byte is treated as a
    ULAW encoded sample.  This format is the same format used
    for .AU files.
17. The file Open dialog box does not close when the operation is
    completed.
18. Multithreaded the file open operations.  When a file is being
    read, the user may press the Abort button on the file open
    dialog box to stop the read process.  If the program exits
    before a file read thread has completed, the read thread is
    terminated.
19. Multithreaded the file save operations.  There is no means
    provided to abort a save operation.  If the program exits when
    the file is saving, the program will wait till the save operation
    has completed before exiting.
20. Added support for the Amiga/SGI .aif format.  Documentation
    for this format was hard to find.  The only chunk formats
    I could find were for COMM, and SSND.

Version 0.3d:
1.  Added use of the second mouse button (usually the right
    mouse button) for the reverse effect and removed the
    dynamic sorting of the start and end so that the numbers
    don't jump back and forth when the user is entering
    the endpoints.
2.  Added support for .VOC file formats.
    Note:  I don't know what the hell SOX is doing, but it does
           not seem to produce a useable file.
    I always add an Extended data block to the file.  I don't
      know if this will cause problems, but the extended part
      contains the number of channels.
    I don't know what to do with Repeat/End Repeat information
      so I am currently ignoring it.  Any ideas?
    I currently dump (on the floor) any ASCII text.  Anyone want
      me to keep the stuff in the info field?
    I currently only load 8 bit data.  I cannot deal with packed
      data right now.  It is 1:00am and I am tired.
    Some programs seem to expect the first block to be the
      DATA block so I write this first always.

Version 0.3c:
1.  Added Speed Effect
2.  Reorganized the Tools notebook.  There were too many
    tools to display the tabs on the notebook so major and
    minor pages were created to group the tools.
3.  Modified the MMPM support to use a separate region of
    memory than the samples are stored in.  Previously, the
    memory for storing the playlist was taken out of the
    pool for storing the samples for the effects.  As a
    result, if you started the MMPM box an performed a
    effect that took up more memory, a hole would be left
    such that another block of memory could not be
    allocated.  This method prevents creating the holes.
4.  Added Reverse Effect.

Version 0.3b:
1.  Fixed a big bug in the Bandpass filter.  If a sample
    had multiple channels, it would only bandpass on the
    first channel.
2.  Fixed a big bug in the Lowpass filter.  If a sample
    had multiple channels, it would only lowpass on the
    first channel.
3.  Added the little clock pointer to indicate how much
    work has been completed.
4.  Removed the requirement for the audio device to be a
    form of WaveAudio??.  Any string will work as long as
    the device really exists.
5.  Multi-threaded all of the effects so that the program
    is not a system hog.  The file read/write functions
    are not multi-threaded.  Should they be?

Version 0.3a:
1.  Fixed the Play button so that it is animated when the
    sample is played as it is loaded.  (What is the longest
    record for staring at a code before you realize that it
    is so late that you have been staring at the bug all
    night and just did not recognize it?...What a dumb error
    on my part!!!)
2.  Fixed the dynamic linking so that DosLoadModule is used
    rather than linking with the dynamic libraries.  Version
    0.3 would refuse to run on machines without MMPM
    installed because the libraries were loaded even if the
    MMPM support was not enabled.
3.  Changed to using SW.DLL for the buttons of the MMPM
    dialog box.  This guarantees that the program will use
    the latest formats for the buttons.
4.  Added command line playing.  I the PLAY_ON_LOAD option
    is selected, any filenames which appear on the command
    line will be played.  If a file is not found, the
    program will signal an error and continue to the next
    command line file.  If EXIT_AFTER_PLAY is not selected,
    the last file that was successfully loaded will be
    the current file in memory.
5.  Enabled the EXIT_AFTER_PLAY feature and modified the
    behaviour such that the MMPM dialog is not displayed
    during the playback.

Version 0.3:
1.  Removed the RECORD button (now just a blank button until
    I can think of something)
2.  Changed PLAY button to MMPM and added basic play
    capabilities (i.e. Play, Stop, Rewind, Pause).
3.  Updated Settings dialog to reflect options for the MMPM
    stuff.

Version 0.2: (20 March 94)
1.  Fixed error with memory settings.  In version 0.1 if you
    opened the Settings box and then applied it by pressing
    the DOIT button it sould clear the data samples even if
    the memory configuration had not changed.
2.  Fixed bug in version 0 in which the data was cleared
    when the memory configuration was changed, but the
    sample header was not cleared.  This led to th dialogs
    trying to access data that had been released causing a
    protection violation.
3.  Added the Bandpass notebook page.  This is probably one
    of the most complex user interfaces in the notebook.
4.  Added the Echo effect.  This is the most complex
    programming challenge for a useable user interface.
    (Note, the echo only works for single channel samples).
5.  Fixed bug.  In version 0.1, the lowpass function did not
    take into account the number of channels.  This has a
    significant impact on the FFT operation.  This is fixed
    in 0.2.
6.  Fixed bug.  In version 0.1, the Vibro effect did not
    take into account multiple channels in a sample.  As a
    result, the vibro was not continuous on individual
    channels.

Version 0.1:  (13 March 94)
1.  Added Channel Averaging (0.1a)
2.  Added Vibro effect
3.  The .ini file are automatically located in the same directory
    as the executable.
4.  Individual tool pages no longer have separate HELP buttons
5.  A HELP button has been added to the tool box for all pages.
    When pressed, the help page for the page shown in the tools
    dialog box will be displayed.
6.  A DISMISS button has been added to the tools dialog box for
    a more consistent approach to dismissing.  The user can still
    depress the tools button on the main control panel to dismiss
    any tool dialog.
7.  Rearranged the buttons on the main control panel and added
    two new buttons for Playing and Recording samples (not implemented
    in this release...just placeholders)
8.  Changed the memory storage requirements so that data takes
    half as much memory.  Each sample is stored as a signed SHORT
    regardless of the sound type.
9.  Corrected major memory bug which resulted in a memory leak.
10. The echo effect presents an interesting challenge to the
    user interface.  How do you provide the user with an
    intuitive method to set the echo locations and the
    strength of the echo from a dialog box?  My first
    attempt was to try to display the waveform in a window
    and then to let the user set the echo points, but the
    problem of setting the echo strength is still difficult.
    This operation may have to wait for another revision
    after I have had some time to "sleep" on it.  The effect
    itself is very simple, but the interface is much more
    difficult.

0.1a - SOX can averages 4 channels to 1 by putting all four
       channels into 1.  4 channels to 2 is done by
       averaging the left channels and the right channels
       together.  PMsndX allows the user to select any
       combination of the source channels.

Version 0.0 (initial release):
1.  6 buttons and associated dialog boxes created
1.  Ability to load and save .au files
2.  Ability to load and save .wav files
3.  Tool for changing the sampling rate (0.0a)
4.  Display of information about the current sample

0.0a - SOX appears to use linear approximation to create the
       new sample.  PMsndX provides for quality which allows the
       approximation to be adjusted.


