MIDI port vs MIDI Synthesizer (a.k.a. How NOT to play MIDI files!)

VirginSnow at vfemail.net VirginSnow at vfemail.net
Mon Mar 2 10:11:02 EST 2009


I just solved a really annoying Linux problem yesterday.  I'm posting
here in hopes that this will save someone else from having to go
through the same amount of trouble...

It all started when I downloaded a MIDI file and wanted to play it. :)
I installed a small "MIDI player" called "playmidi".  However, when
run, playmidi consistently failed, returning the error
"/dev/sequencer: no such device".  I checked my device files and
kernel config and confirmed that OSS emulation was properly set up and
that MIDI drivers *were* loaded into my kernel.

I knew that my SB sound card (with an ES1371 chipset) had "MIDI"
support, but hypothesized that the ES1371 driver might not be
presenting the MIDI device.  So I loaded the OPL3 driver just in case.
Even with the OPL3 driver loaded, cat'ting /proc/asound/oss/sndstat
contained the following:

  Synth devices: NOT ENABLED IN CONFIG

  Midi devices:
  0: ES1371

I saw that my ES1371 was showing up as a MIDI device, but the "NOT
ENABLED IN CONFIG" seemed a bit suspicious, and playmidi was still
returning the same error: no such device.

After spending WAY too much time slogging through ALSA documentation,
I found a command which can be used to load patches (variously called
soundfonts, sapmles, etc.) to the synth.  It's called sbiload.

# strace sbiload -p64:0 --opl3 std.o3 drums.o3

sbiload successfully opened and performed ioctls on /dev/snd/seq.  It
found and read /usr/share/sounds/opl3/std.o3.  It wrote to
/dev/snd/seq, but a subsequent read on /dev/snd/seq blocked, causing
sbiload to hang...

Could the MIDI on my sound card have simply be disabled?  I took a
look in /usr/src/linux/sound/pci/ens1370.c... it contained code
dealing with MIDI, but none of the MODULE_PARMs concerned MIDI.  So it
wasn't a simple matter of passing the module a parameter like
"enable_midi=1".

Eventually, I stumbled across /usr/src/linux/sound/oss/es1371.c, which
contained the following comment:

 *  /dev/midi   simple MIDI UART interface, no ioctl
 *
 *  NOTE: the card does not have any FM/Wavetable synthesizer, it is supposed
 *  to be done in software. That is what /dev/dac is for. By now (Q2 1998)
 *  there are several MIDI to PCM (WAV) packages, one of them is timidity.

Well, that would explain it!  The "MIDI" device on the sound card was
simply a MIDI port, and NOT a MIDI synthesizer.  That explains why,
when sbiload tried to read from the port, it just hung... because
there was nothing attached.

Resigning myself to the fact that the sound card I thought had a MIDI
synthesizer, after all, DIDN'T have one, I looked into timidity++.
For those of you who might be afraid of timidity (no pun intended),
fear not: timidity is small and can be used both from the command line
and as an X application.  The source tarball approixmately 1.5MB.  By
comparison, the patches run 10-30MB.

After installing timidity++ and a patchset, my MIDI file could be
played with a simple:

$ timidity file.mid

I tried configuring timidity as an ALSA sequencer (proving the -iA
switch to timidity and using aconnect on a pair of ALSA ports), but
playmidi kept returning "/dev/sequencer: no such device".  So, I
declared "playmidi" officially broken and uninstalled it. :)

It was really quite frustrating.  I spent several hours trying to
figure this out, only to find out "it's not possible".  It would have
helped alot if the ALSA utilities made a clearer distinction between
MIDI ports and MIDI synthesizers, if ALSA used a word other than
"port" to describe ALSA ports, if the card's manufacturer didn't claim
to support MIDI synth, if the external MIDI port didn't look so much
like a game port.  (And, yes, ens1370.c contained MODULE_PARMs for
joystick support.)

So, I'm hoping that some poor soul googling for help with his/her
cheapo "MIDI" sound card will come across my story, and discover (more
quickly than I did) the truth which nearly drove me mad: that a MIDI
"port" on a sound card isn't always a MIDI synth.  It could be just
that: a MIDI "port"!


More information about the gnhlug-discuss mailing list