  - Fix: Throw IllegalArgumentException Exception on
         invalid soundbank to:
         SoftSynthesizer.unloadAllInstruments(Soundbank soundbank)
         SoftSynthesizer.unloadInstruments(Soundbank soundbank, Patch[] patchList)
         just like done in:
         SoftSynthesizer.unloadInstrument(Instrument instrument).
  - Change: SoftMainMixer, SoftVoice optimized for mono voices.
  - Change: SoftFilter optimized. 
  - Fix: Turn SoftJitterCorrector, SoftAudioPusher threads into a daemon threads.
         These threads prevented the VM to exit when synthesizer was open.
         See: http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=213 
  - Add: More JTreg tests added:
           EmergencySoundbank
           SoftFilter
           AudioFloatConverter.ToFloatArray (improved)
  - Change: SoftReverb optimized, about 2 times faster.
  - Fix: ModelByteBuffer.skip called super.skip
         instead to call to RandomAccessFile directly.
         JTreg tests added: ModelByteBuffer/RandomFileInputStream/*.java
         
Version 1.0.2 (released in OpenJDK 6 b12)   
  - Fix: ModelByteBuffer.len was being modified in inner
         class RandomFileInputStream. The variable was made final
         and RandomFileInputStream.read methods where fixed.
  - Fix: ArrayOutOfException error in ModelInstrument.getKeys(),
         Keys array was to small, it couldn't
         hold all possible midi notes (0..127).

Version 1.0.1 (released as 1.0)
  - Fix: Created dummy SourceDataline so that following 
         jtreg test can be tested without using
         a real Audio Device SourceDataLine.  
            javax/sound/midi/Gervill/SoftAudioSynthesizer/Open.java
            javax/sound/midi/Gervill/SoftSynthesizer/GetLatency.java
            javax/sound/midi/Gervill/SoftSynthesizer/GetReceiver.java
            javax/sound/midi/Gervill/SoftSynthesizer/GetReceiver2.java
            javax/sound/midi/Gervill/SoftSynthesizer/GetReceivers.java
            javax/sound/midi/Gervill/SoftSynthesizer/GetTransmitter.java
            javax/sound/midi/Gervill/SoftSynthesizer/GetTransmitters.java
            javax/sound/midi/Gervill/SoftSynthesizer/ImplicitOpenClose.java
            javax/sound/midi/Gervill/SoftSynthesizer/Open.java
  - Fix: Make open SoftSynthesizer garbage-collectable
         when user don't have reference to it and it is not
         producing any sound.
  - Fix: SoftReverb silent detection improved.
  - Added: SoftSynthesizer.getPropertyInfo returns
           current properties values if it is open.        
  - Fix: Restrict input values in SoftChannel to 7 and 14 bit in these methods:
            noteOn 
            noteOff
            setPolyPressure
            setChannelPressure
            controlChange
            programChange(program)
            programChange(bank, program)
            setPitchBend
  - Fix: Store generated soundbank to disk for faster future use.         
  - Cleanup: Make inner classes static 
              AudioFloatFormatConverter.AudioFloatFormatConverterInputStream
              AudioFloatFormatConverter.AudioFloatInputStreamChannelMixer
              AudioFloatFormatConverter.AudioFloatInputStreamResampler
              SimpleInstrument.SimpleInstrumentPart
              SoftChorus.VariableDelay
              SoftChorus.LFODelay
              SoftMixingDataLine.AudioFloatInputStreamResampler
              SoftMixingSourceDataLine.NonBlockingFloatInputStream
              SoftReverb.AllPass
              SoftReverb.Comb
              SoftReverb.Delay
  - Cleanup: Remove unused fields in:
              SoftSincResampler.din, SoftLanczosResampler.din, 
              SoftMainMixer.finetuning,  SoftMainMixer.coarsetuning
              SoftJitterCorrector.JitterStream.nullbuff, 
              SoftAbstractResampler.ModelAbstractResampler.loopread
              SoftAbstractResampler.ModelAbstractResampler.streammarked
  - Cleanup: Remove dead code from FFT.
  - Cleanup: Make constant fields in SoftFilter final.
  - Cleanup: Let SoftSynthesizer.info be final.
  - Cleanup: Let SoftProvider.info be final.
  - Fix: Unnecessary call to sourceDataLine.drain() in SoftSynthesizer 
         causes random hangs in SoftSynthesizer.open jtreg test.
         This happens when the synthesizer is opened and right after closed.
         This will not happen if there is a delay between open and close call.
  - Fix: ModelByteBufferAudioFileSoundbankReader, 
         SoftAudioPusher, SoftJitterCorrector
          don't ignore stream.read return value.
  - Fix: NullPointerException in 
         SoftSynthesizer.unloadInstrument if instrument = null       
  - Fix: SoftJitterCorrector.getSoundbank(URL) may fail to close stream.
  - Fix: Futile attempts to guard buffers variable in SoftJitterCorrector.
  - Fix: RiffReader/SF2SoundbankReader/DLSSoundbank should use readfully instead of read 
         when reading from stream.
         JTreg tests where created to test for this.
  - Added: Software Mixing Mixer
  - Removed: PATSoundBankReader removed because no format license is available.
             It is also undocumented format. 
  - Added: AudioFloatFormatConverter, used to convert 
           between PCM_SIGNED, PCM_UNSIGNED, PCM_FLOAT in 8/16/24/32 bit (big/little endian),
           and resample using (linear/cubic/sinc...) if needed.
  - Fix: AudioFloatFormatConverter.getTargetFormats(Encoding, AudioFormat)         
         returned audio formats in encoding not asked for.
  - Added: WaveExtensibleReader, used to read WAV files using WAVE_FORMAT_EXTENSIBLE format.
  - Added: WaveFloatFileWriter, used to writing WAV files with PCM_FLOAT encoding.
  - Change: Make SoftAudioProcessor (limiter, reverb, chorus, agc) more general.
  - Fix: Don't restrict reading dls/sf2 soundbank to only files with .dls and .sf2 endings.
  - Fix: AudioFloatConverter tests incorrectly AudioFormat frameSize against SampleSizeInBits
         Support for 64-byte float added, and support for 32+ bit PCM samples.  
         SampleSizeInBits  not dividable by 8 are now handled correctly.
  - Fix: DLSID(GUID) values incorrectly read from files in DLSSoundBank.
  - Fix: WaveFloatFileReader incorrectly sets framrate.
  - Fix: DLSSoundbank writes avgBytesPerSec incorrectly if SampleSizeInBits is not dividable by 8.
  - Fix: SoftChannel didn't reset concept of LSB control to 0 when MSB control value is set
         (according to MIDI 1.0 Detailed Spec. page 12)
  - Fix: SoftChannel, added check for illegal noteNumbers.
         If illegal notenumber was used in NoteOn/NoteOff
         a ArrayOutOfIndex exception was thrown.
         
Version 1.0 (released in OpenJDK 6 b10)
  - Fix: Default tempo in SoftMidiFileReader was supposed to be 500000 mpq or 120 bpm
  - Fix: Change type of info variable in SoftSynthesize into MidiDevice.Info
  - Fix: Fix instanceof check of p1 variable in ModelInstrumentComparator
  - Fix: Remove redundant constant variable in ModelByteBufferWaveTable

Version 0.9
  - Fix: JTreg SoftSynthesizer\ImplicitOpenClose.java
         did not test correctly.
  - Fix: SoftSynthesizer.isSoundbankSupported
         now only returns false if
         there is any instrument which is not supported.
  - Fix: SoftSynthesizer.remapInstrument
         did not work correctly.
  - Fix: SoftSynthesizer.loadInstrument
         SoftSynthesizer.loadInstruments
         SoftSynthesizer.loadAllInstruments
         SoftSynthesizer.unloadInstrument
         SoftSynthesizer.unloadInstruments
         SoftSynthesizer.unloadAllInstruments
         SoftSynthesizer.getAvailableInstruments
         SoftSynthesizer.getLoadedInstruments
         now throws IllegalArgumentException
         if instrument is not supported
         and false if instrument can't be loaded
         for some other reason.
  - Fix: SoftSynthesizer.getReceivers()
         SoftSynthesizer.getMicrosecondPosition()
         SoftSynthesizer.getVoiceStatus()
         SoftSynthesizer.getChannels()
         SoftMidiAudioFileReader.getAudioInputStream(Sequence seq)
         now no longer throw IllegalStateException.
  - Fix: SoftSynthesizer.getChannels() and
         SoftSynthesizer.getVoiceStatus()
         now no longer return internal array. 
  - Fix: CPU spiking caused by denormal floats in SoftReverb.
  - Fix: Calling getReceiver before opening the synthesizer results in NullPointerException.
    JTreg test added: SoftSynthesizer/GetReceiver2
  - Fix: Removed checksum check on
           BULK TUNING DUMP (NON-REAL-TIME)
         Because MIDI Tuning Spec was ambigous about
         how to calculate the checksum
         and different programs tested calculated 
         different checksum.       
         JTreg test SoftTuning/Load1 fixed.

VERSION 0.8
  - Fix: Active Sense Messages where incorrectly handled.
    JTreg test: SoftReceiver/Send_ActiveSense.java
  - Fix: SoftAudioPusher doesn't longer try to prevent blocking.
  - Added: SoftJitterCorrector added to fix jitter on long buffers.

VERSION 0.7
  - Fix: General MIDI mode,
    and voice_allocation_mode flag wasn't reseted on open/close cycle.     
  - Fix: Added support for implicit open/close    
    (as described in http://java.sun.com/javase/6/docs/api/javax/sound/midi/MidiDevice.html)
    (JTreg test also added)
    This done by implementing com.sun.media.sound.ReferenceCountingDevice interface.
  - Fix: SoftReceiver.close doesn't throw exception if closed.
    (now behaves like SoftSynthesizer.close)
  - Fix: Close variable wasn't accessed in Thread safe way in: 
    SoftReceiver, SoftSynthesizer.
  - Fix: Hang in SoftSynthesizer.close.
	SoftAudioPusher must not be closed synchronized against control_mutex			
	this may result in synchronized conflict between pusher and caller thread.
  - Fix: Bad handling of mono output in SoftVoice.processAudioLogic,
    this error was found running the new SoftSynthesizer/TestRender1 jtreg test.
  - Added: ModelDirector to support conditional layers/performers.   
  - Added: ReleaseTrigger property to ModelPerformer.
  - Added: ModelAbstractOscillator to simplify creation custom oscillators.
  - Added: ModelChannelMixer to support for example non-voice oriented instruments.
  - Added: Support for more than 16 midi channels.
  - Added: JARSoundBankReader.
  - Change default latency from 400 to 200 mec.
  
VERSION 0.6
  - Added RIFFWriter(OutputStream) constructor.
  - Added save(OutputStream out) to DLSSoundbank and SF2Soundbank.
  - Renamed :  isAddDefaultConnections   to  setDefaultConnectionsEnabled
  - Renamed :  getAddDefaultConnections  to  isDefaultConnectionsEnabled
  - Created JTreg Unit Tests   
  - Fixed error found in Unit Tests
      * AudioFloatConversion8U.toFloatArray, did not convert correctly
      * SoftSynthesizer.remapInstrument did not work
          The error was in ModelMappedInstrument
      * SoftSynthesizer.getMaxReceivers did not return -1
      * SoftTuning.checksumOK calculated incorrect checksums.
      * RIFFReader.close didn't work
      * AudioFloatInputStream.getFrameLength returned incorrect value.
      * ModelByteBuffer.writeTo didn't work when ModelByteBuffer uses file pointer.
      * ModelIdentifier.equals, didn't compare the variable "instance".
      * SimpleSoundbank.removeResource did not remove resource.
      * RIFFWriter.close never closed underlying stream.

VERSION 0.5
  - New instruments in Emergency Soundbank:
	  * Acoustic Grand Piano
  	  * Bright Acoustic Piano
	  * Honky-tonk Piano
	  * Guitar 
	  * Distortion Guitar
   	  * Trumpet
   	  * Trombone
	  * Brass Section
  	  * Horn
  	  * Sax
  	  * Oboe
  	  * Bassoon
	  * Clarinet
	  * Flute
	  * Timpani
	  * Melodic Toms
	  * Reverse Cymbal
	  * Orch Hit
  - Faster Linear Interpolation
    with no float to int casting.
      Thanks to Bruno Schoedlbauer for
      pointing out that float to int casting
      can be costly.
  - LargeSoundBankReader removed,
    Loading soundbank in large mode using urls removed.
  - Soundbank aren't loaded into memory
    until loadInstrument/loadAllInstrument
    is called in SoftSynthesizer.
    This enable loading only single instrument
    from soundbank collection into memory.
  - New "large mode" property added to SoftSynthesizer.    
  - "getInstrument" method in DLS/SF2/SimpleSoundbank
    now returns ordered list by program,bank,percussion.
  - Fix AccessControlException in "SoftSynthesizer.getDefaultSoundbank",
    which occurred when using SoftSynthesizer in Applets.
     
VERSION 0.4
  - Fixed ArrayOutOfBoundsException in SoftAbstractResmpler.
  - Fixed NullPointerException in SoundFont.save(File).
    Saving global zone for layers resulted in NullPointerException.
  - Fixed PATSoundbankReader.getInputStream
    so it doesn't throw InvalidFormatException.
    This prevented use of MidiSystem.getSoundBank(InputStream).
  - Fix: Delay wasn't implemented in AHDSR envelopes.
  - Loading soundbank in large mode supported using
    MidiSystem.getSoundBank(URL)
    Where url is on the form:
    file:/C:/soundbank.sf2?largemode=true
  - Reverb,Chorus,AGC can be turned on/off.
  - MIDI files can be opened as audio streams
    thru javax.sound.sampled.spi.AudioFileReader.
  - Optimizations, rendering is up to 50 percent faster.
  - Emergency SoundBank.

VERSION 0.3
  - SoftSynthesizer doesn't implement mixer interface anymore,
    instead the method "openStream" has been added.    
  - New AudioSynthesizer interface.
  - SoftSynthesizer.getVoiceStatus() is now thread-safe.
  - SoftAudioFeeder renamed to SoftAudioPusher
    and made more generic.
  - Support for multi-receiver in SoftSynthesizer.
  - More cleanup in SoftSynthesizer.
  - Fixed loops in large soundbanks.
  - WaveFloatFileReader added to META-INF/services

VERSION 0.2
  - Large format support see: LargeSoundbankReader
  - Fix soundfont modulator mapping
    direction mapping was wrong
  - Fix handling of unsigned 16 bit streams
  - Improved GUS patch support
  - Add support for ping-pong/bi-directional and reverse loops

VERSION 0.1 
  - Downloadable Sound Level 2.2.
  - SoundFont 2.04 (24 bit)
  - Gravis Ultrasound-compatible patches
  - Use Audio files (AIFF, AU and WAV) as SoundBanks
  - General Midi Level 2
  - MIDI Tuning Standard
  - Drumkits can be used on any channel
  - Sinc interpolation with anti-aliasing