2001-08-06 -Changed note player and display routines to read directly from
            DSP buffer, instead of first translating a secondary note buffer.
        07 -Added forward/backward seeking by one second.
        08 -Fixed backwards playing.
        09 -Changed keys: BkSpc=reverse direction, Home=seek beginning
        15 -Fixed problem of keys being turned on that are already on, and
            keys being turned off that are already off. Why do games do that?
           -Verified in SpcTool some games do indeed set voices pitch to 0!?
        22 -Add filters to BRR decompression (sounds much better!)
           -Increased sample detection significantly, random data not
            mistaken for samples as often. More accurate than SpcTool. Have
            yet to see if any games violate the detection conditions.
           -Change sample buffering, so that samples are completely checked
            first for validity, rather than checking as decompressing.
            Removes random junk from buffer.
           -Lowered sound buffer dump from 11khz to 8khz.
        23 -Added sample attribute matching routine and name creation.
        24 -Added routines for SB DSP init/read/write
           -Added DMA transfer code. So far only silence??
2001-09-01 -Added 16bit output and triple fault in SoundHandler because of
            not acknowledging the interrupt to the soundcard.
        18 -Fixed high IRQs (8-15) by enabling cascaded IRQ 2 in master PIC.
        21 -Substitute IRQ 9 for IRQ 2 after finding they are one and the same
2001-10-04 -Added sample playing
        05 -Added DMA resynchronization (in case the sound gets out of sync)
        07 -Added simple voice emulation (ADSR/Gain unimplemented)
        08 -Eliminated delay in voice output when rewinding
           -Fixed decompression of loop portion to use previous values from
            starting sample (eliminates several spurious click sounds).
           -Modified sample validation to include slightly wider range after
            finding a sample StarFox that used shift range 13
        11 -Increased timing accuracy perfectly (or at least, as close as I'll
            ever get) by putting Spc2Midi and the real SNES side by side
        12 -Finalized how main GUI screen should look.
        13 -Improved DMA synchronization greatly.
           -Verified pitch is correct (with my SNES two feet away)
           -Added left+right volume averaging (instead of mono left only)
           -Set initial key on
        23 -Forgot to record tick times of pitch slides :/
           -Added pitch sliding to note display
        25 -Separated SetVoices from SeekSongPos
           -Added end of buffer key off to stop notes at end of song
            (like the FF6 snowy intro)
           -Support pitch sliding in FM
        29 -Fixed bug that happened when end of buffer was reached.
        30 -Added MPU emulation of DSP. Now I just need a MIDI cable to
            connect to my Roland, or a wavetable sound card to test it on.
            MPU output is currently disabled, because on my card, it causes
            the pc to freeze hard.
           -Separated DSP synthesis routines from DSP emulation.
2001-11-05 -Changed DMA synchronization to stay ahead 1.25 buffer ahead of
            the sound card, for the sake of the dumb Crystal Audio (too much
            static). Unfortunately, it allows slightly more than 1/30th second
            between FM and DA, but not much can be done about it.
        14 -Added specific EOI after FM detection for TeleSOUND 3D card. No
            other tested card to date does this, but apparently the TeleSOUND
            generates an IRQ after the OPL2 synthesizer times out. The Windows
            driver (unsurprisingly) doesn't know how to handle this unexpected
            interrupt, and from then on, loops audio infinitely.
        17 -Added sine wave synthesis (for cards lacking FM).
        19 -Eliminated clicking from sine wave synthesis by not stopping a
            wave until the end of its cycle.
        20 -Added command line parameter parsing to program, to set sampling
            rate, mix rate, bits, and play mode.
2001-12-07 -Changed DMA synchronization from fixed size to variable.
           -Filename is shown in Windows titlebar. Can't get the close button
            to work though.
           -Changed DMA synchronization yet again. Latest method seems to
            work best so far. Instead of fixed size buffers, it uses variable.
           -Added current/total time display in non-GUI mode.
        12 -Improved sample validation slightly by ensuring the loop portion
            of a sample is indeed looped (loop bit set in last header byte).
2002-03-01 -Significantly changed method of compilation for portability to
            Windows. Although NASM and WDOSX are still used for the DOS
            verion, rather than compiling into an RDOFF (which limits the
            number of section types to only the standard three), the code is
            output into an MS COFF, which is then linked using ALINK into a
            PE. That PE can either then be run directly as a Windows program
            (once I've finished the code changes) or stubbed with WDOSX to
            run in plain DOS. Ironic that for the DOS version, the program is
            first compiled into a Windows program, then reverted back to an
            earlier OS. Also amazing to me, since Windows programs are almost
            always bloatedly larger, the Win version is 60% the size.
        13 -Currently the Windows version of the program does absolutely
            nothing but display a message and return to caller.
2002-08-01 -Seriously start porting to Windows. Now command line parsing and
            status message output works for Windows console version. My GUI
            is still too unfinished to consider implementing it.
        05 -Choppy, but audio audible in Windows.
        06 -Terrible, but MIDI output in Windows
        09 -Figured out why notes were not coming on, pitches were not
            sliding. and instruments were wrong. You NEVER send delta times
            to the Windows MIDI driver because it interprets them as running
            status of the previous command.
        10 -Just when I think I have it fixed, it works fine on one sound
            card and terribly on another.
        12 ->:| Had to finally abandon all previous attempts using
            waveOutGetPosition because of its inaccuracy and fickle return
            values. Seems the time returned was often incorrect, causing my
            sync routine to overcompensate, which then required it the next
            frame to undercompensate for its previous overcompensation. The
            DOS version was almost easier, and definitely more accurate.
        13 -Audio finally doesn't skip with SB16 Windows driver - only took 7
            different attempts. This latest one, a hybrid of previous
            techniques, counts how many blocks are free by testing the
            WH_DONE flags, then ensures exactly two are playing and two free.
        14 -Copy routine for GM output to FM and MPU too (Windows version).
        15 -Added dynamic initialization of sound outputs, so if a sound
            output is toggled on that was not originally specified on the
            command line, it will initialize the hardware even while playing.
        22 -Changed wave audio to use 8 blocks, progressively buffering ahead
            of the sound card 3 blocks. Hopefully large enough to prevent
            skipping while other programs are active, and small enough to
            minimize delay between the user action and hearing it.
           -Wrap cycle counter now so songs can play more than 28 minutes,
            stopping only when the buffer is filled.
        27 -Add percussive instruments to GM/FM playing.
            First successful MIDI export.
        29 -Release Windows console version with MIDI export.
        30 -Build first Windows GUI version. Can start songs from command
            line or drag & drop, but the d&d only works every other time!?
2002-08-01 -Special filename 'bios' to load console with no filename, only
            the 64 byte BIOS ROM.
           -'r' parameter now sets the ADPCM buffer dump sample rate in
            addition the sample play rate.
           -Shows opcode at instead of opcode next.
           -Fixed reload problem loading from drag&drop. Was calling DSP key
            on before SpcEmu was completely reset.
         4 -Changes to attribute list values affect playing.
           -DOS GUI version added. Now exists WinCon, WinGui, DosCon, & DosGui.
           -Program size >100k
         5 -Learned CreatePalette writes back to YOUR palette in a program,
            so palettes must be in a writeable data segment. How nice of the
            documentation to not say that.
           -Added default drum & bank parameters ("dd" "db")
           -Learned that Rudora no Hihou actually executes code in the BIOS
            region @FFC0h.
           -Modified visualizations for GUI version and added wave view.
         6 -Add function keys F5,F6,F8 to play/pause/stop.
           -Visualizations are paused when you switch away to give more CPU
            time to other programs. Gave a smaller pointer to vis window to
            more easily see the notes behind the cursor.
           -Add expandable menu. Choices don't do anything yet though.
           -Added start and finish loop points to repeat a section. Can use
            Insert/Delete keys to set.
         9 -Fixed stupid bug when writing to control register F1 :/
        10 -Figure out why "Star Wars ROTJ" is playing only silence. Is it too
            logical to expect that the same sample would be the same sample.
            The game code permanently assigns each channel a sample number
            and modifies the source directory entries to point accordingly.
            May need to rewrite whole approach for using samples.
        11 -Changed '[ ]' keys to ', .' for the sake of international
            keyboards.
        12 -Fix shift+arrow keypress in DOS version by ignoring the retarded
            fake shift codes sent by the keyboard.
           -Fixed another stupid typo. Was reading echo delay reg 7D from
            SPC ram not DSP ram. Corrected unusual pause in SMRPG child
            playing just before main loop.
           -Add hacks for both "Sailor Moon RPG" and "Super Puyo Puyo 2" but
            I'm unsure yet what method would best detect when those loaded.
            Header game name would work, but only if a header was present and
            wouldn't work with savestates.
        15 -Attribute list values can also be changed with + - and * /
        16 -Begin changing DSP emulation/simulation to use absolute samples
            rather than the source directory, which games like "Secret of
            Evermore", "Return of the Jedi", and "DOOM" change while playing.
        17 -Add faded wave and ocean wave visualizations.
           -Add right click/app key menu popup for vis selection, in addition
            to the main menu.
        19 -Stop now stops emulation too, when before emulation would
            continue. Pause still continues preemulate.
        21 -Emulation and simulation use uniquely identified samples, rather
            than sample numbers from the source directory, which some games
            remap while playing. SOE and DOOM sound correct (no longer the
            wrong instruments) and ROTJ is finally audible. Also should fix
            the rare case of an SPC state captured while the game code begins
            to play but is still setting up the table.
        22 -Sine wave synthesis uses base frequency and volume of each sample.
           -Figured out why it was playing a sample from SoulBlazer and
            ActRaiser from the seemingly wrong RAM offset, and yet still
            sounded correct. It WAS playing the correct sample, but the
            exact same sample was loaded into RAM at two different offsets,
            very much confusing me.
        23 -Implement drums and banks in all MIDI sound and file outputs.
           -Added sound output toggles to main menu.
           -Added pitch deviation to voice information vis.
           -Can load sample settings from INI file including length, looplen,
            checksum, pitch, volume, patch, drum, & bank. But, no save yet...
