Midi with alsa

ArticleCategory: [Choose a category, do not translate this]


AuthorImage:[Here we need a little image from you]

[Photo of the Author]

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in en Guido Socher

AboutTheAuthor:[A small biography about the author]

Guido loves Linux not only because it is fun to discover the great possibilities of this systems but also because of the people involved in its design.

Abstract:[Here you write a little summary]

Midi is a file format which does not contain sampled digital sound but contains a description on how to make the sound. This is similar to sheet with notes where each note is a symbolic representation of a tone. Midi files are therefore very small in size compared to e.g wav files.

To convert midi to actual sound you need a midi synthesizer. This is a piece of hardware or software which uses a number of digital sound samples from an instrument (e.g piano) to generate the tones. These sound samples are known as "soundfont".

This article will explain how to use Alsa (advanced linux sound architecture) as a midi synthesizer interface.

ArticleIllustration:[This is the title picture for your article]


ArticleBody:[The article body]


Just a few years ago you could find famous sound cards like the "Gravis UltraSound" or "SoundBlaster Gold" in any computer shop. Both cards had internal hardware midi synthesizer. Unfortunately you can't buy these cards anymore. Even if you could they would not fit into a modern computer because they were ISA bus cards. Today's computer use the PCI bus and have often already a sound chip in the chipset on the motherboard. Hardly any of these chipsets supports midi synthesis. If you look at the list of alsa supported soundcards you will probably wonder which of these cards should I now buy. The decision is unfortunately easier than it looks. There is today only one card which supports midi synthesis that you can actually buy in the normal computer shops: Soundblaster live.

If you do not own a Soundblaster live card then you can emulate midi synthesis in software and I will explain how to do that.

What you need

Alsa is currently in a transition phase. The stable release 0.5 is aging and 0.9 is still under development. If you actually want to use midi applications with alsa then you need 0.5 because there are hardly any applications for 0.9 and the interfaces between 0.5 and 0.9 are incompatible (note: PCM sampled sound, wav files, and applications basing on sampled sound are not a problem with 0.9. I am talking about midi.)
The packages for 0.5 are: Information on how to compile alsa can be found in the alsa howto (see references). Basically you need to run

tar jxvf alsa-driver-0.5.12a.tar.bz2
cd alsa-driver-0.5.12a
./configure --with-sequencer=yes --with-oss=yes --with-isapnp=no
make install

for the driver and "./configure;make;make install" for the rest.

After installation you can load the modules into your kernel. For soundblaster live (=emu10k1 chip) this is:

modprobe snd-card-emu10k1
modprobe snd-synth-emu10k1
modprobe snd-seq-midi
modprobe snd-pcm-oss
modprobe snd-mixer-oss
modprobe snd-seq-oss

For other cards just replace the first two lines with the module for your card (e.g snd-card-via686a for an internal soundcard bases on the via 686 chip). Mandrake and Suse support alsa and there you can also use the hardware detection and configuration program from the linux distribution (harddrake and yast2). If you have absolutly no idea what kind of chip you have then run "lspci -v" (the lspci command belongs to a package called pciutils).

Now it is time to test that sound works. Run the program
and type "m" to un-mute the master and pcm volume and then use the arrow keys to change the volume. Hit Esc to exit alsamixer when done.


To store the settings in /etc/asound.conf run the command

/usr/sbin/alsactl store

Now run

play flute.wav

and you should hear some sound. If not go to /proc/asound and check /proc/asound/devices and /proc/asound/oss-devices. There should be "mixer" and "digital audio" (my files).

This was the test that the pcm oss emulation and sound in general works. Further down I will explain what to add in /etc/modules.conf to do everything automatically but the next step is to get midi to work.


If you have a sound card with internal midi synthesizer (sound blaster live) then you need to load the "soundfont" (the sound samples) into the chip of your soundcard. If you do not have such a card then you can install timidity (see references for url to download) and use it as a alsa midi synthesizer. Programs running on top of alsa will not notice the difference.

Loading the soundfont

Check that you have the program sfxload (/bin/sfxload) installed. If not install it. It is part of a package called awesfx (check the CDs of your linux distribution or http://mitglied.lycos.de/iwai/awedrv.html). Next copy the file 8MBGMSFX.SF2 from your Soundblaster Live CD (/mnt/cdrom/AUDIO/Common/SFBANK/8MBGMSFX.SF2) to /etc/midi/8MBGMSFX.SF2. To load the soundfont run the command:

/bin/sfxload /etc/midi/8MBGMSFX.SF2

A good test program is pmidi (see references). Run
pmidi -l
This should produce the printout:

Port Client name Port name
64:0 External MIDI 0 MIDI 0-0
65:0 Emu10k1 WaveTable Emu10k1 Port 0
65:1 Emu10k1 WaveTable Emu10k1 Port 1
65:2 Emu10k1 WaveTable Emu10k1 Port 2
65:3 Emu10k1 WaveTable Emu10k1 Port 3

Now run

pmidi -p 65:0 test.mid

and you should hear midi sound. Cool!

Using TiMidity as a software synthesizer

Download the TiMidity++-2.11.3.tar.gz package (see references at the end) unpack it (tar zxvf TiMidity++-2.11.3.tar.gz) and edit the file common.makefile.in. Here you uncomment the CFLAGS line for pentium gcc:

CFLAGS = -O3 -mpentium -march=pentium -fomit-frame-pointer \
-funroll-all-loops -malign-double -ffast-math

Now you can configure timidity with many nice grapical interfaces but we are primarly interressted in the " --enable-alsaseq" option. Still it does not harm to enable some GUI stuff:

./configure --enable-ncurses --enable-xaw --enable-spectrogram --enable-xaw=dynamic --enable-audio=oss,alsa --enable-alsaseq --prefix=/usr/local/timidity-2.11.3
make install

This installs timidity into /usr/local/timidity-2.11.3/bin to not overwrite an already existing timidity installation from your linux distribution. We install timidity because I have not seen a single linux distribution where the alsaseq interface was enabled.
For timidity you need also soundfonts. They are called this time instrument files. A good and complete set of instrument files is quite big (about 10Mb). The fastest way to get them is therefore to install the timidity++ from your distribution (CDrom) and copy the files from there (e.g timidity++-2.11.3-1.i386.rpm download for redhat 7.3). To copy the files from /usr/share/timidity/instruments to /usr/local/timidity-2.11.3/share/timidity/instruments run:

cd /usr
find share/timidity -print | cpio -dump /usr/local/timidity-2.11.3

Now we are ready to test our installation and start timidity as root:

/usr/local/timidity-2.11.3/bin/timidity -iA -B2,8 -Os -EFreverb=0
TiMidity starting in ALSA server mode
Opening sequencer port: 128:0 128:1

then pmidi -l:

Port Client name Port name
128:0 Client-128 TiMidity port 0
128:1 Client-128 TiMidity port 1

Voila, we have 2 ports with the TiMidity synthesizer.
Now run

pmidi -p 128:0 test.mid

and you should hear midi sound.


For automatic configuration and module loading add this to your /etc/modules.conf if you have a soundblaster live card:

alias char-major-116 snd
alias char-major-14 soundcore
alias snd-card-0 snd-card-emu10k1
alias sound-slot-0 snd-card-0
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss
alias midi snd-synth-emu10k1
below snd-seq-oss snd-synth-emu10k1
post-install snd-synth-emu10k1 /bin/sfxload /etc/midi/8MBGMSFX.SF2 ; alsactl restore
# uncomment to save volume settings at shutdown:
#pre-remove snd-synth-emu10k1 alsactl store

For a different card without midi synthesizer, e.g internal via686:

alias char-major-116 snd
alias char-major-14 soundcore
alias snd-card-0 snd-card-via686a
alias sound-slot-0 snd-card-0
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-12 snd-pcm-oss
# restore original mixer:
post-install snd-card-via686a alsactl restore
# uncomment to save volume settings at shutdown:
#pre-remove snd-synth-emu10k1 alsactl store

To start timidiy automatically at startup I suggest to add the following line to /etc/init.d/alsasound (this script gets installed with the driver but is not active. To activate use the command chkconfig)

echo "starting timidity"
timidiy=/usr/local/timidity-2.11.3/bin/timidity # do not forget the "&" in the next line:
$timidity -iA -B2,8 -Os -EFreverb=0 > /dev/null &

Using alsa and midi

[kmid] You have used the pmidi program above to play midi files. KDE includes a very nice player called kmid (not to be confused with kmidi). Kmid can be compiled with or without alsa support. Redhat has it compiled for OSS. Mandrake and Suse use Alsa. It is possible to use the Mandrake binaries with Redhat.
This article is also meant to explain the alsa installation which is needed for other programs that will be explained in future articles. We will e.g have an article on Jazz. Jazz is a mide sequencer and and midi file editor. At the end of the article you find also references to other applications.

There are also programs like timidiy (timidity -ig will start the gtk GUI) or kmidi (not kmid) which already include the midi synthesizer in software. In these cases you do not need kernel internal midi capabilities whether supported by hardware or emulated in timidity software. In general it is however better to have a common midi api than to re-implement a midi synthesizer in every software.

Alsa is currently undergoing big changes. As said earlier version 0.9 does not work with most applications however the version 0.5 as discussed in this article has also its problems. The OSS sequencer emulation (/dev/sequencer) does not work (it works only with old soundblaster awe cards which you can't buy anymore). That means only alsa aware midi programs will work. This will hopefully change with version 0.9. This article is however also useful in the future when version 0.9 will have more support since only "small" things such as the names of modules have changed between 0.5 and 0.9. The basic principles will still be the same.