When I needed to convert some midis I used FluidSynth, because I was having trouble getting soundfont files to work on some other programs.
I saved an example command that I used:
fluidsynth.exe --gain 1 -F output.wav soundfont.sf2 input.mid
You can load them up in most DAWs. There are also a bunch of free soundfont players, although I don't know if they'll let you sequence things.
You can play with them with FluidSynth.
I assume that you are a software developer, and you know how to write apps.
FluidSynth is a library with its own API. The problem may be that FluidSynth MIDI API connects only a single MIDI device at a time as input. But nothing prevents you to handle MIDI input yourself and ignore the MIDI drivers from FluidSynth, using only the synthesizer API.
Thanks a lot for the tips!
Until your response, it didn't occur to me that in order to play any sound with Haskell, I could simply use an application of choice that provides a software MIDI instrument and use e.g. the PortMidi package to send MIDI events to it.
For the software instrument, I use Fluidsynth, which is able to play back soundfonts, i.e. sampled instruments. It actually creates a MIDI device and presents it to the system, so there is no need to create a virtual MIDI device like you did. You can write to this thing with PortMidi.
I think you might need additional dlls. Someone on youtube reported adding an openal32.dll fixed sound for him.
There's also a complaint in the log about missing fluidsynth dlls, so grabbing this http://www.fluidsynth.org/ might fix the music?