I am taking a break from SoundManager to add a couple of "wish list" items to SoundSystem.
First of all, I have added support for MIDI to SoundSystem. Everything is stable, and there do not seem to be any problems. OpenAL does not have an interface for MIDI, so all MIDI playback must be done through Javasound. Since MIDI playback is done completely seperate from the Javasound Mixer, there are no conflicts when switching between libraries while using MIDI (i.e., you can play MIDI when either OpenAL or Javasound is active, it doesn't matter). Typically, MIDI plays through a seperate chipset on the soundcard (although a Windows software synthesizer is used for some low-end soundcards), so it shouldn't use up any of the soundcard voices used by other sources. The drawback is that only one MIDI file can be played at once, so what I had to do is create a new channel type specifically for MIDI playback. It is instantiated in the base Library class, so all extended libraries play the MIDI source through the same route.
I have SoundSystem taking care of all the messy details, so creating and playing a source using a .mid file is no different than when using a .wav or .ogg file, except that the file can not be pre-loaded. It makes no difference whether you specify the MIDI source as "Streaming" or "Normal", because MIDI playback involves things like "sound banks", "pressures", and "sequences", which is completely unlike other sound types (i.e., there is no "sound byte" data or stream-buffers involved). Only one MIDI source can exist at a time, so if multiple sources are created from .mid files, the newest MIDI source will automatically remove any previous one, to avoid conflicts. 3D position has no effect on the MIDI source, so MIDI is really only suitable for background music.
A couple of things about MIDI in Java. MIDI will not play from within an applet unless a "Soundbank" (.gm) file is specified. Also, I do not believe MIDI will work in an application if a soundbank is not installed. I know a sound bank is installed along with versions of the JDK, but of course you can not assume that your players will always have JDK installed on their machines. What I did is make SoundSystem smart enough to check if a sound bank exists, and if not it loads a default one automatically. I compiled a JAR called SoundSystemResources.jar (about 500KB), which contains the default soundbank file in package "paulscode.sound.resources". If your applet or application uses MIDI, you will want to link with that JAR at runtime (or compile that package and file in your own JAR). It is not necessary to link with SoundSystemResources.jar if your program does not use MIDI, or if you somehow know the end user already has a soundbank installed on their machine.
Also, if you prefer to use your own soundbank file rather than the one in SoundSystemResources.jar, you can use a method called SoundSystemConfig.setDefaultMidiSoundBank( String ). The string parameter is a package path (such as "pauscode/sound/resources/soundbank.gm"), or an online URL path (beginning with "http://").
One more thing about MIDI. I would eventually like to add my own software synthesizer to SoundSystem so that MIDI files could be loaded into an AudioInputStream context. That way you could play as many .mid files as you like simultaneously, and the 3D functions would work the same as any other source. Unfortunately, I have not been able to find any useful source code (other than GPL stuff), and it is simply too large a project for me to tackle myself at this time. Perhaps in the future.
I am looking into adding support for .mp3 files, but I will only add this if I can find freely usable source code, and that it is not GPL-licensed source code. Two reasons:
1) I do not want SoundSystem to be dependant on an external JAR.
2) GPL stuff can not be used in commercial applications ("free and open" does not mean "no-strings-attached").
Another thing I am looking into is manual volume manipulation, especially for the MIDI source (MIDI files tend to be quite loud, I've noticed). I haven't really decided the best way to do this yet. I would kind of like to make volume changes on a per-source basis as well as a "master volume". I am not sure how difficult that is likely to be (the code will of course be different between Javasound and OpenAL).