  The Linux MIDI-HOWTO
  By Phil Kerr, phil@plus24.com
  v1.20, May 2002

  This document describes the hardware, software and procedures needed
  to play and sequence using MIDI under Linux.
  ______________________________________________________________________

  Table of Contents



  1. Introduction.

  2. Copyright of this document.

  3. Where to get this document.

  4. Acknowledgments.

  5. Disclaimer.

  6. Background to MIDI.

  7. Configuring MIDI devices.

     7.1 ALSA 0.9 quick install
     7.2 Latency

  8. Software.

     8.1 Drivers
        8.1.1 Alsa Driver
        8.1.2 OSS
        8.1.3 Notemidi
     8.2 MIDI file players
        8.2.1 KMid
        8.2.2 Pmidi
        8.2.3 TiMidity++
     8.3 Sequencers
        8.3.1 Brahms
        8.3.2 Anthem
        8.3.3 Jazz++
        8.3.4 Linux Ultimate Music Editor
        8.3.5 Melys
        8.3.6 MidiMountain Sequencer
        8.3.7 MusE
        8.3.8 Rosegarden
     8.4 MIDI Trackers
        8.4.1 tektracker
        8.4.2 ShakeTracker
     8.5 Drum editors
        8.5.1 DrumPatterns
     8.6 Patch editors
        8.6.1 JSynthLib
     8.7 Software synths
        8.7.1 Spiral Synth
        8.7.2 UltraMaster Juno-6
        8.7.3 Pure-Data (PD)
        8.7.4 Csound
        8.7.5 Bristol synthesiser emulator
     8.8 Plugins
        8.8.1 xmms-midi
     8.9 Notation
        8.9.1 Mup
        8.9.2 Lilypond
     8.10 Development
        8.10.1 sfront
        8.10.2 jMax
        8.10.3 TSE3
        8.10.4 KeyKit

  9. MIDI Development.

     9.1 Example 1
     9.2 Example 2
     9.3 Example 3

  10. HOWTO Use MIDI Sequencers With Softsynths.

     10.1 Introduction
     10.2 Device Setup
     10.3 Routing MIDI Events
        10.3.1 aconnect
     10.4 Graphical MIDI Patch Bays
        10.4.1 aseqview
     10.5 Applications
     10.6 Sequencers
        10.6.1 MusE
        10.6.2 ttrk
        10.6.3 Shaketracker
     10.7 Software Synthesizer
        10.7.1 Pure Data
        10.7.2 Csound
        10.7.3 Conclusion
     10.8 Acknowledgments

  11. Useful Links.

  12. Feedback.



  ______________________________________________________________________

  1.  Introduction.

  It covers:

  ˇ  Configuring your MIDI interface

  ˇ  Configuring and using softsynths

  ˇ  Playing MIDI files

  ˇ  Sequencing

  ˇ  Controlling external MIDI equipment

  ˇ  MIDI controlled software based sound synthesis

  ˇ  Example MIDI code


  2.  Copyright of this document.


  This HOWTO is copyrighted 2002 Phil Kerr.


  The 'HOWTO Use MIDI Sequencers With Softsynths' is copyright 2002
  Frank Barknecht.'

  This document is distributed under the terms of the GNU Free
  Documentation License. You should have received a copy along with it.
  If not, it is available from:

  <http://www.fsf.org/licenses/fdl.html>.


  3.  Where to get this document.



  The official version of this document can be obtained from the Linux
  Documentation Project:  <http://www.tldp.org/>.

  The homepage for the most recent version of this HOWTO is:
  <http://www.midi-howto.com>


  4.  Acknowledgments.


  This HOWTO is an expansion of the MIDI-SB mini-HOWTO written by Hideki
  Saito.  Many thanks for his contribution to the Linux community.

  This HOWTO now contains Frank Barknecht's 'HOWTO Use MIDI Sequencers
  With Softsynths'.  Many thanks Frank.

  Many of the code samples contained in this HOWTO originated from the
  Linux Audio Developers (LAD) mailinglist.  Many thanks to them for
  allowing their inclusion.


  5.  Disclaimer.


  Use the information in this document at your own risk.

  I disavow any potential liability for the contents of this document.

  Use of the concepts, examples, and/or other content of this document
  is entirely at your own risk.

  All copyrights are owned by their owners, unless specifically noted
  otherwise.

  Use of a term in this document should not be regarded as affecting the
  validity of any trademark or service mark.

  Naming of particular products or brands should not be seen as
  endorsements.

  You are strongly recommended to take a backup of your system before
  major installation and backups at regular intervals.


  6.  Background to MIDI.


  MIDI is a set of hardware and software protocols used by electronic
  musical instruments to communicate.   It was first released in 1982
  and has become the de-facto communication standard between electronic
  musical instruments.  The protocol specifies the physical hardware
  parameters for the cable and interfaces, and provides a well defined
  set of communication protocols to exchange musical and timing data.

  Prior to MIDI there were several analog, and later basic digital,
  connection protocols.  The earliest, circa. 1974, would transmit note
  information as a voltage though a wire from one keyboard to another.
  Later, 1980 - 1981,  Roland created a basic digital protocol, DCB.
  The MIDI Manufacturers Association (MMA), working with the equipment
  manufacturers, defined a standard protocol and physical connection
  which allowed equipment from all complying manufacturers to connect
  and communicate with each other.

  >From 1985 MIDI interfaces started to appear on home computers and
  soon after sequencing programs appeared.

  7.  Configuring MIDI devices.


  MIDI devices can be integrated into the soundcard or be a separate
  device.  External MIDI interfaces may be attached to either the serial
  or USB port.

  The first *and most important* thing you should do is check if your
  card is supported!

  <http://www.alsa-project.org/soundcards.php3>

  <http://www.4front-tech.com/osshw.html>

  Configuring MIDI devices varies with Linux distributions.  A well
  supported card may be configured when you install the OS.

  The Linux kernel includes the OSS drivers and in the 2.5 kernel the
  ALSA drivers.  Most distributions provide a configuration tool (mostly
  for soundcards), but if you are using the MIDI port of a sound card it
  should be configured.  Under RedHat you would use sndconfig, under
  SuSE yast, and Mandrake, DrakConf.

  If none of the above tools will configure your MIDI interface, or you
  are experiencing problems, the following steps should be taken:

  Does lsmod show any MIDI related modules?  Here's a typical output
  from an OSS based system.

  ______________________________________________________________________
  [root@beatbox]# lsmod
  Module                  Size  Used by
  lockd                  32208   1  (autoclean)
  sunrpc                 54640   1  (autoclean) [lockd]
  autofs                  9456   2  (autoclean)
  usb-ohci               12624   0  (unused)
  usbcore                43632   1  [usb-ohci]
  hisax                 470096   0  (autoclean) (unused)
  isdn                  104208   0  (autoclean) [hisax]
  slhc                    4544   0  (autoclean) [isdn]
  eepro100               16144   1  (autoclean)

  #---- Soundcard modules
      opl3                   11376   2
      mad16                   7968   1
      ad1848                 16848   1  [mad16]
      sb                     34752   1  [mad16]
      uart401                 6384   1  [mad16 sb]
      sound                  58368   0  [opl3 mad16 ad1848 sb uart401]

  soundlow                 464   0  [sound]
  soundcore               2800   6  [sb sound]
  nls_cp437               3952   2  (autoclean)
  vfat                    9408   1  (autoclean)
  fat                    30432   1  (autoclean) [vfat]
  ide-scsi                7664   0
  ______________________________________________________________________



  Look for mpu401, olp3, uart401 and oss.

  If you are using USB devices don't forget to check if the USB modules
  are there.


  To check the config cat the sndstat file:


  ______________________________________________________________________
  [root@beatbox]# cat /dev/sndstat
  OSS/Free:3.8s2++-971130
  Load type: Driver loaded as a module
  Kernel: Linux mega 2.2.17-21mdk #1 Thu Oct 5 13:16:08 CEST 2000 i686
  Config options: 0

  Installed drivers:

  Card config:

  Audio devices:
  0: MAD16 WSS (82C930) (DUPLEX)

  Synth devices:
  0: Yamaha OPL3

  Midi devices:
  0: Mad16/Mozart

  Timers:
  0: System clock

  Mixers:
  0: MAD16 WSS (82C930)
  ______________________________________________________________________



  We see here that the MIDI device is a mad16 and this is listed in the
  lsmod output above.


  If you see nothing related to MIDI check the contents of your
  /etc/modules.conf file.


  ______________________________________________________________________
  [root@beatbox]# cat /etc/modules.conf
  alias net-pf-4 ipx
  pre-install pcmcia_core /etc/rc.d/init.d/pcmcia start
  alias usb-interface usb-ohci
  alias parport_lowlevel parport_pc
  alias block-major-11 scsi_hostadapter
  pre-install plip modprobe parport_pc ; echo 7 > /proc/parport/0/irq
  alias scsi_hostadapter ide-scsi
  alias eth0 eepro100
  alias eth1 hisax

  #---- Soundcard
      alias sound-slot-0 mad16
      options sound dmabuf=1
      alias midi opl3
      options opl3 io=0x388
      options sb support=1
      options mad16 io=0x530 irq=5 dma=0 dma16=1 mpu_io=0x300 mpu_irq=7 joystick=1
  ______________________________________________________________________



  Here's the output of /proc/modules to check to see if the MIDI modules
  are loaded into the Kernel.

  ______________________________________________________________________
  [root@mega /proc]# cat modules
  0000-001f : dma1
  0020-003f : pic1
  0040-005f : timer
  0060-006f : keyboard
  0070-007f : rtc
  0080-008f : dma page reg
  00a0-00bf : pic2
  00c0-00df : dma2
  00f0-00ff : fpu
  0170-0177 : ide1
  01f0-01f7 : ide0
  02f8-02ff : serial(auto)

  #---- MIDI device
      0300-0303 : MPU-401 UART

  0376-0376 : ide1
  0388-038b : Yamaha OPL3
  03c0-03df : vga+
  03f6-03f6 : ide0
  03f8-03ff : serial(auto)
  0530-0533 : MAD16 WSS config
  0534-0537 : MAD16 WSS
  de00-de1f : Intel Speedo3 Ethernet
  f000-f007 : ide0
  f008-f00f : ide1
  ______________________________________________________________________



  You should see something similar to the above.  If not you'll need to
  install MIDI drivers.

  If you are going to be using ALSA 0.5x divers, which you shouldn't do,
  I suggest a good read of Valentijn Sessink's Alsa-sound-mini-HOWTO
  which can be found at the link below:

  <http://www.linuxdoc.org/HOWTO/mini/Alsa-sound.html>

  You are strongly recommended to use ALSA greater than version 0.9.
  For ALSA drivers later than 0.9x you should have a good read of the
  ALSA-HOWTO by Madhu Maddy.

  <http://www.alsa-project.org/alsa-doc/alsa-howto/>


  7.1.  ALSA 0.9 quick install

  Below is a very quick install run-though for installing the ALSA 0.9
  drivers and libs which is a required configuration for most MIDI apps.



  ______________________________________________________________________
  [root@beatbox] # tar jxvf alsa-driver....tar.bz2
  [root@beatbox] # cd alsa-driver.....
  [root@beatbox] # ./configure

  messages - no errors

  [root@beatbox] # make

  messages - no errors

  [root@beatbox] # make install

  messages - no errors

  [root@beatbox] # ./snddevices
  ______________________________________________________________________



  Now you will need to edit /etc/modules.conf, or the ALSA file in your
  modules directory on some distributions.  There may be entries for
  other, non-MIDI, devices, so be careful when you are editing the file.

  A typical system may have old ALSA or OSS configurations in the file,
  you will need to remove, or better still comment them out.

  Below is a typical modules.conf file showing the ALSA config with OSS.


  ______________________________________________________________________
  alias char-major-116 snd
  alias char-major-14 soundcore

  alias snd-card-0 (MIDI/Sound card)
  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-12 snd-pcm-oss
  ______________________________________________________________________



  Change the (MIDI/Sound card) entry to that of your card.  This
  information can normally be found on the ALSA website.

  With the ALSA drivers installed, now you will need to install the
  header library files needed by ALSA based programs.  This is what is
  contained in the alsa-libs package.

  Make sure you have a matching pair of alsa-drivers and alsa-libs!



  ______________________________________________________________________
  [root@beatbox] # tar jxvf alsa-libs....tar.bz2
  [root@beatbox] # cd alsa-libs.....
  [root@beatbox] # ./configure

  messages - no errors

  [root@beatbox] # make

  messages - no errors

  [root@beatbox] # make install
  ______________________________________________________________________



  Your system should now be configured :)

  You can check this with a simple C program, if it compiles and can be
  executed then your system should be ok.


  ______________________________________________________________________
  // Compile this test program like so: gcc alsatest.c -o alsatest -lasound

  #include <stdio.h>
  #include <alsa/asoundlib.h>

  int main (int argc, char *argv[])
  {
    snd_seq_t *seq_handle;

    if (snd_seq_open(&seq_handle, "hw", SND_SEQ_OPEN_DUPLEX, 0) < 0) {
      fprintf(stderr, "Error opening ALSA sequencer.\n");
      exit(1);
    }

  printf("The ALSA libraries are installed.\n");
  return 0;
  }

  ______________________________________________________________________



  7.2.  Latency


  MIDI is a real-time protocol and latency issues are a serious problem.

  There are now several developers working on improving the latency
  times and improvements in the kernel are making Linux a fine platform
  for MIDI.

  Although stock Linux distributions may run fine, pro set-ups should
  apply low-latency patches.  More information can be found here:

  <http://www.gardena.net/benno/linux/audio/>

  <http://www.linuxdj.com/audio/lad/resourceslatency.php3>



  Low Latency Mini Howto

  <http://www.boosthardware.com/LAU/guide/Low_latency-Mini-HOWTO.html>


  8.  Software.


  Interest in Linux based MIDI is growing and this list will probably
  not reflect the true amount of MIDI software available, but should
  provide a reasonable selection of applications.

  If you are developing, or know of, any other MIDI apps not listed here
  please drop me a note.



  8.1.  Drivers



  8.1.1.  Alsa Driver


  The Advanced Linux Sound Architecture is composed of several parts.
  The first is a fully modularized sound driver which supports module
  autoloading, devfs, isapnp autoconfiguration, and gives complete
  access to analog audio, digital audio, control, mixer, synthesizer,
  DSP, MIDI, and timer components of audio hardware. It also includes a
  fully-featured kernel-level sequencer, a full compatibility layer for
  OSS/Free applications, an object-oriented C library which covers and
  enhances the ALSA kernel driver functionality for applications
  (client/server, plugins, PCM sharing/multiplexing, PCM metering,
  etc.), an interactive configuration program for the driver, and some
  simple utilities for basic management.

  <http://www.alsa-project.org/>


  8.1.2.  OSS


  OSS provides sound card drivers for most popular sound cards under
  Linux and FreeBSD. These drivers support digital audio, MIDI,
  synthesizers, and mixers found on sound cards. These sound drivers
  comply with the Open Sound System API specification. OSS provides a
  user-friendly GUI which makes the installation of sound drivers and
  configuration of sound cards very simple. It supports over 200 brand
  name sound cards, and provides automatic sound card detection, Plug-n-
  Play support, support for PCI audio soundcards, and support for full
  duplex audio.

  <http://www.opensound.com/>



  8.1.3.  Notemidi


  Notemidi is a device driver for MIDI output via the RS-232 serial port
  on notebook/laptop computers. Notemidi can be used with the MIDIator
  MS-124W interface, Roland Sound Canvas sound modules, or Yamaha MU-x
  series sound modules.

  <http://www.michaelminn.com/linux/notemidi>

  8.2.  MIDI file players



  8.2.1.  KMid


  KMid is an X11 / KDE based midi player for Linux and FreeBSD. It
  displays the text of karaoke files and changes its colour as it is
  being played so that the tune can be easily followed. KMid uses
  /dev/sequencer as output device supporting external synths, AWE , FM
  and GUS cards.

  <http://perso.wanadoo.es/antlarr/kmid.html>


  8.2.2.  Pmidi


  Pmidi is a straightforward command line program to play Midi files
  through the ALSA sequencer.

  <http://www.parabola.demon.co.uk/alsa/pmidi.html>


  8.2.3.  TiMidity++


  TiMidity is a MIDI to WAVE converter that uses Gravis
  Ultrasound(*)-compatible patch files to generate digital audio data
  from General MIDI files. The audio data can be played through any
  sound device or stored on disk. On a fast machine, music can be played
  in real time.

  <http://www.goice.co.jp/member/mo/timidity/>



  8.3.  Sequencers



  8.3.1.  Brahms


  Brahms is a sequencer and music notation program with several editing
  methods so far including Score-, Pianoroll-, Drum-, and Mastertrack
  Editors. For C++ programmers, it is easy to implement further editors
  by deriving from a general editor-class. MIDI Import and Export is
  also implemented. In combination with aRts-0.3.4, one can play wave-
  files and make use of the midibus to send midi-events to the software
  synthesizer.

  Formerly known as KooBase

  <http://brahms.sourceforge.net/>


  8.3.2.  Anthem


  Anthem is an advanced open source MIDI sequencer. Anthem allows you to
  record, edit and playback music using a sophisticated and acclaimed
  object oriented song technology.


  <http://anthem.sourceforge.net/>


  8.3.3.  Jazz++


  JAZZ++ is a full featured, audio capable midi sequencer for Linux and
  Windows.



  <http://www.jazzware.com/cgi-bin/Zope.cgi/jazzware/>


  8.3.4.  Linux Ultimate Music Editor


  UltiMusE-LX (the Ultimate Music Editor) is a composing program. No, it
  doesn't compose for you; it's a "word processor" for music.  You draw
  sheet music on the screen using the mouse and/or computer keyboard. Up
  to 16 parts or voices fit on up to seven staves (staffs).  Most
  standard musical notations are supported, as are MIDI instrument patch
  changes, events, and real-time clocks.

  <http://hometown.aol.com/knudsenmj/myhomepage/umuselx.htm>


  8.3.5.  Melys


  Melys is a Midi sequencer application for the Advanced Linux Sound
  Architecture (ALSA). Melys uses the sequencer support of ALSA, along
  with the GNOME libraries to produce a powerful and easy to use
  sequencer.


  <http://www.parabola.demon.co.uk/melys/>


  8.3.6.  MidiMountain Sequencer

  MidiMountain is a sequencer to edit standard MIDI files. Its easy-to-
  use interface should help beginners to edit and create MIDI songs
  (sequences), and it is designed to edit every definition known to
  standard MIDI files and the MIDI transfer protocol, from easy piano
  roll editing to changing binary system exclusive messages.


  <http://www.midimountain.com/>


  8.3.7.  MusE


  MusE is a Qt 2.1-based MIDI sequencer for Linux with editing and
  recording capabilities. While the sequencer is playing you can edit
  events in realtime with the pianoroll editor or the score editor.
  Recorded MIDI events can be grouped as parts and arranged in the
  arrange editor.


  <http://muse.seh.de/>



  8.3.8.  Rosegarden


  Rosegarden is an integrated MIDI sequencer and musical notation
  editor.


  <http://www.all-day-breakfast.com/rosegarden/>



  8.4.  MIDI Trackers



  8.4.1.  tektracker


  ttrk (tektracker) is a console MIDI sequencer with a tracker-style
  step editor. It is built for live playing, with convenient track mute
  buttons and loop control.  ttrk supports both sending and syncing to
  MIDI clock pulses.

  <http://div8.net/ttrk/>


  8.4.2.  ShakeTracker

  ShakeTracker aims to be a fully-featured MIDI sequencer with a tracker
  interface. It currently works well and supports most tracker effects.
  Anyone who has used Impulse Tracker before will feel at home, and for
  the new users, a simple but extensive help system is provided. Most
  commands and shortcuts resemble their tracker counterparts.

  <http://reduz.com.ar/shaketracker/>


  8.5.  Drum editors



  8.5.1.  DrumPatterns


  DrumPatterns is a free, open source, web oriented drum patterns
  generator, whose purpose is to help teach drum patterns. It can teach
  the rudiments as well as advanced rhythms. It can output characters,
  score, or Midi, and includes hours of samples.

  <http://www.linux-france.org/prj/drumpatterns/index-en.html>


  8.6.  Patch editors



  8.6.1.  JSynthLib


  JSynthLib is an Open Source Universal Synthesizer Patch Editor /
  Librarian written in the Java Language. The project aims to eventually
  provide support for all existing Synthesizers by providing methods and
  documentation which allow users to develop drivers and editors for
  unsupported synths and contribute them to the project.


  8.7.  Software synths



  8.7.1.  Spiral Synth


  Spiral Synth is a physically modeled polyphonic analogue synthesizer.
  It is capable of creating the kind of sounds made by hardware analogue
  synths, the noises used in electronic music. You can also use it to
  make stranger sounds too. MIDI is supported, and it uses the standard
  OSS/Free sound output (/dev/dsp).

  <http://www.pawfal.org/SpiralSynth/>


  8.7.2.  UltraMaster Juno-6


  UltraMaster Juno-6 is a faithful virtual reproduction of a Roland
  Juno-6 Polyphonic Synthesizer. It features realtime 64-bit internal
  ULTRANALOG wave synthesis, an early 80's style arpeggiator and chorus,
  and 100s of patches to save your own custom settings. All parameters
  can be controlled in realtime, via on-screen GUI or external MIDI
  controllers.

  <http://www.ultramaster.com/juno6/index.html>



  8.7.3.  Pure-Data (PD)


  "Pd" stands for "pure data". Pd is a real-time software system for
  live musical and multimedia performances. It is in active development
  by Miller Puckette , and perhaps others. The system is unfinished, but
  quite useable for sophisticated projects. It has been ported to Linux,
  IRIX, and many flavors of Windows.

  <http://www.pure-data.org/>


  8.7.4.  Csound


  Csound is a software synthesis program. But more than that, Csound
  doesn't suffer the same kinds of limitations that other software &
  hardware synthesizers have. There are no limits to the amount of
  oscillators or filters one can use. Csound is also completely modular,
  so that any function in Csound can be used in an array of ways.

  <http://www.csound.org/>


  8.7.5.  Bristol synthesiser emulator


  Bristol is a synthesizer emulation package. It includes a Moog Mini,
  Moog Voyager, Hammond B3, Prophet 5, Juno 6, DX 7, and others.

  <http://www.slabexchange.org/index.cgi?DOWNLOAD>



  8.8.  Plugins



  8.8.1.  xmms-midi


  Adds midi file support for x11amp (via timidity). A crude mixer
  interface is provided via the configuration dialog.

  <http://ban.joh.cam.ac.uk/~cr212/xmms-midi/>


  8.9.  Notation



  8.9.1.  Mup


  Mup takes a text file as input and produces PostScript output for
  printed music. It can handle both regular notation and tablature
  notation. (It can also produce MIDI output.)

  <http://www.arkkra.com/>


  8.9.2.  Lilypond


  LilyPond is a music typesetter. It produces beautiful sheet music
  using a high level description file as input. LilyPond is part of the
  GNU Project.

  <http://www.lilypond.org/>



  8.10.  Development



  8.10.1.  sfront


  Sfront compiles MPEG 4 Structured Audio (MP4-SA) bitstreams into
  efficient C programs that generate audio when executed. MP4-SA is a
  standard for normative algorithmic sound, that combines an audio
  signal processing language (SAOL) with score languages (SASL, and the
  legacy MIDI File Format). Under Linux, sfront supports real-time, low-
  latency audio input/output, local MIDI input from soundcards, and
  networked MIDI input using RTP and SIP. A SIP server hosted on the
  Berkeley campus manages sessions. The website includes an online book
  about MP4-SA.

  <http://www.cs.berkeley.edu/~lazzaro/sa/index.html>


  8.10.2.  jMax


  jMax allows one to interactively design dataflow circuits. The basic
  data types that can go through are integers, symbols, lists, etc. It
  is an event-driven system and has been used for MIDI processing. A
  second part of the system (DSP) allows a continuous signal to flow
  through a circuit, which is most useful for PCM sound (ie. microphone,
  sound files, etc). The system is extensible by using shared libraries,
  you may add data processor types, data types, GUI elements, device
  types, and more. Data processors may also be designed as circuits and
  reused.


  <http://www.ircam.fr/equipes/temps-reel/jmax/>


  8.10.3.  TSE3


  TSE3 is a powerful open source sequencer engine written in C++. It is
  a 'sequencer engine' because it provides the actual driving force
  elements of a sequencer but provides no form of user interface.
  Sequencer applications or multimedia presentation packages will
  incorporate the TSE3 libraries to provide a user with MIDI sequencing
  facilities.

  <http://TSE3.sourceforge.net/>


  8.10.4.  KeyKit


  KeyKit is a multi-tasking interpreted programming language (inspired
  by awk) designed exclusively for realtime and algorithmic MIDI
  manipulation. KeyKit's GUI provides several dozen tools for
  algorithmic music experimentation, including a multi-track sequencer
  and drum pattern editor. The GUI and all tools are completely written
  in the KeyKit language itself. This allows users to add new tools and
  operations to the existing tools, even while the system is running.

  <http://nosuch.com/keykit/>



  9.  MIDI Development.


  For those looking to develop MIDI applications, good examples are
  often needed to get you started.

  The following examples were posted to the LAD mailing list in a thread
  about examples and documentation/tutorials.


  9.1.  Example 1

  Below is a little sequencer routine from Dr. Matthias Nagorni.  More
  examples can be obtained from Matthias's site which is listed in the
  Links section.

  You compile it like so:



  ______________________________________________________________________
  [phil@beatbox] $ gcc seqdemo.c -o seqdemo -lasound


  #include <stdio.h>
  #include <stdlib.h>
  #include <unistd.h>
  #include <alsa/asoundlib.h>

  snd_seq_t *open_seq();
  void midi_action(snd_seq_t *seq_handle);

  snd_seq_t *open_seq() {

    snd_seq_t *seq_handle;
    int portid;

    if (snd_seq_open(&seq_handle, "hw", SND_SEQ_OPEN_DUPLEX, 0) < 0) {
      fprintf(stderr, "Error opening ALSA sequencer.\n");
      exit(1);
    }
    snd_seq_set_client_name(seq_handle, "ALSA Sequencer Demo");
    if ((portid = snd_seq_create_simple_port(seq_handle, "ALSA Sequencer Demo",
              SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE,
              SND_SEQ_PORT_TYPE_APPLICATION)) < 0) {
      fprintf(stderr, "Error creating sequencer port.\n");
      exit(1);
    }
    return(seq_handle);
  }

  void midi_action(snd_seq_t *seq_handle) {

    snd_seq_event_t *ev;

    do {
      snd_seq_event_input(seq_handle, &ev);
      switch (ev->type) {
        case SND_SEQ_EVENT_CONTROLLER:
          fprintf(stderr, "Control event on Channel %2d: %5d       \r",
                  ev->data.control.channel, ev->data.control.value);
          break;
        case SND_SEQ_EVENT_PITCHBEND:
          fprintf(stderr, "Pitchbender event on Channel %2d: %5d   \r",
                  ev->data.control.channel, ev->data.control.value);
          break;
        case SND_SEQ_EVENT_NOTEON:
          fprintf(stderr, "Note On event on Channel %2d: %5d       \r",
                  ev->data.control.channel, ev->data.note.note);
          break;
        case SND_SEQ_EVENT_NOTEOFF:
          fprintf(stderr, "Note Off event on Channel %2d: %5d      \r",
                  ev->data.control.channel, ev->data.note.note);
          break;
      }
      snd_seq_free_event(ev);
    } while (snd_seq_event_input_pending(seq_handle, 0) > 0);
  }

  int main(int argc, char *argv[]) {

    snd_seq_t *seq_handle;
    int npfd;
    struct pollfd *pfd;

    seq_handle = open_seq();
    npfd = snd_seq_poll_descriptors_count(seq_handle, POLLIN);
    pfd = (struct pollfd *)alloca(npfd * sizeof(struct pollfd));
    snd_seq_poll_descriptors(seq_handle, pfd, npfd, POLLIN);
    while (1) {
      if (poll(pfd, npfd, 100000) > 0) {
        midi_action(seq_handle);
      }
    }
  }
  ______________________________________________________________________



  9.2.  Example 2

  Below is a ALSA 0.9 MIDI redirector by Nick Dowell.



  ______________________________________________________________________
  /* ALSA Sequencer MIDI redirector.
     Redirects the input to outputs determined by the MIDI channel
     (as requested by Nathaniel Virgo on Linux-Audio-Dev ;-)
     based on Dr. Matthias Nagorni's ALSA seq example

     Nick Dowell <nixx@nixx.org.uk>
     */

  #include <stdio.h>
  #include <stdlib.h>
  #include <unistd.h>
  #include <alsa/asoundlib.h>

  int
  main()
  {
    snd_seq_t *seq_handle;
    snd_seq_event_t *ev;
    int i;
    int portid;              /* input port */
    int oportid[16];         /* output ports */
    int npfd;
    struct pollfd *pfd;
    char txt[20];

    if (snd_seq_open(&seq_handle, "hw", SND_SEQ_OPEN_DUPLEX, 0) < 0) {
      fprintf(stderr, "Error opening ALSA sequencer.\n");
      exit(1);
    }

    snd_seq_set_client_name(seq_handle, "MIDI Redirect");

    /* open one input port */
    if ((portid = snd_seq_create_simple_port
         (seq_handle, "Input",
          SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE,
          SND_SEQ_PORT_TYPE_APPLICATION)) < 0) {
      fprintf(stderr, "fatal error: could not open input port.\n");
      exit(1);
    }
    /* open 16 output ports for the MIDI channels */
    for (i=0; i<16; i++){
      sprintf( txt, "MIDI Channel %d", i );
      if ((oportid[i] = snd_seq_create_simple_port
           (seq_handle, txt,
            SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ,
            SND_SEQ_PORT_TYPE_APPLICATION)) < 0) {
        fprintf(stderr, "fatal error: could not open output port.\n");
        exit(1);
      }
    }

    npfd = snd_seq_poll_descriptors_count(seq_handle, POLLIN);
    pfd = (struct pollfd *)alloca(npfd * sizeof(struct pollfd));
    snd_seq_poll_descriptors(seq_handle, pfd, npfd, POLLIN);

    while (1)  /* main loop */
      if (poll(pfd, npfd, 1000000) > 0){
        do {
          snd_seq_event_input(seq_handle, &ev);
          snd_seq_ev_set_source( ev, oportid[ev->data.control.channel] );
          snd_seq_ev_set_subs( ev );
          snd_seq_ev_set_direct( ev );
          snd_seq_event_output_direct( seq_handle, ev );
          snd_seq_free_event(ev);
        } while (snd_seq_event_input_pending(seq_handle, 0) > 0);
      }
    return 0;
  }
  ______________________________________________________________________



  9.3.  Example 3

  Below is an example of writing data to the OSS /dev/midi interface by
  Craig Stuart Sapp.

  More examples can be found at Craig's site listed in the Links
  section.


  ______________________________________________________________________
  //
  // Programmer:    Craig Stuart Sapp [craig@ccrma.stanford.edu]
  // Creation Date: Mon Dec 21 18:00:42 PST 1998
  // Last Modified: Mon Dec 21 18:00:42 PST 1998
  // Filename:      ...linuxmidi/output/method1.c
  // Syntax:        C
  // $Smake:        gcc -O -o devmidiout devmidiout.c && strip devmidiout
  //

  #include <linux/soundcard.h>
  #include <unistd.h>
  #include <fcntl.h>
  #include <stdio.h>

  int main(void) {
     char* device =  "/dev/midi" ;
     unsigned char data[3] = {0x90, 60, 127};

     // step 1: open the OSS device for writing
     int fd = open(device, O_WRONLY, 0);
     if (fd < 0) {
        printf("Error: cannot open %s\n", device);
        exit(1);
     }

     // step 2: write the MIDI information to the OSS device
     write(fd, data, sizeof(data));

     // step 3: (optional) close the OSS device
     close(fd);

     return 0;
  }
  ______________________________________________________________________



  10.  HOWTO Use MIDI Sequencers With Softsynths.


  Frank Barknecht  <barknech@ph-cip.uni-koeln.de>


  <http://linux-sound.org/quick-toots/4-sequencers_and_softsynths/quick-
  toot-midisynth_howto.html>

  This HOWTO describes the needed setup to control a MIDI capable
  software synthesizer from a MIDI sequencer through a virtual MIDI
  connection under ALSA 0.9. This document can be freely translated and
  distributed. It's released under the GNU Free Documentation License.



  10.1.  Introduction


  Software synthesizers like Csound, PD, jMax or Spiral Synth Modular
  offer nearly endless freedom to create known or unknown, common or
  unusual sound experiences. They can also replace pricy hardware synths
  or the inexpensive, often bad-sounding MIDI synths on some soundcards,
  if these are supported under Linux at all. On the other hand,
  composing inside those softsynths can be a tedious task: in Csound for
  example one has to write endless rows of numbers in a spreadsheet-like
  manner - not a comfortable way to make music.

  MIDI sequencer applications are more suitable for this task. They
  provide an interface to insert notes and control data in convenient
  ways: as notes in a real score, as marks in a piano roll or as a list
  of MIDI events, if you prefer this view. Another kind of MIDI
  sequencers offer a tracker-like way of entering notes, like many
  people are used to from the good old days when that was the state of
  art in the Scene. Last but not least, some MIDI sequencers allow you
  to record your own playing on a keyboard or on another physical
  device, which is for many users the most natural way of writing music.

  But MIDI sequencers like to output their notes to MIDI devices that
  normally route their events to the outside world, i.e., to hardware
  synths and samplers. With virtual MIDI devices one can keep the MIDI
  data inside the computer and let it control other software running on
  the same machine. This HOWTO describes all that is necessary to
  achieve this goal.



  10.2.  Device Setup


  In our setup we use the ALSA library and driver modules, as this is
  (or should be) the standard way of doing serious audio and MIDI on
  Linux. The tutorial assumes that we are running the 0.9.0 branch of
  ALSA, but the virtual MIDI module was also present in ALSA 0.5.x so
  most of the following should apply for this as well. In the OSS/Free
  (the sound modules found in kernels previous to the 2.5.x track) and
  OSS/Linux sound architectures the v_midi module can be used, but this
  is beyond the scope of this document.

  To use ALSA's virtual MIDI card the snd-card-virmidi module must be
  present. In the most recent versions of ALSA (and in the 2.5.x
  development kernel) that module lost its '-card' middle-fix and was
  renamed to snd-virmidi. Make sure that you did build this module, it
  might be missing if you configured ALSA to build only the modules for
  your actual card(s).

  The virmidi module has to be loaded to make the virtual MIDI ports
  available. You can test-load it by hand with


  ______________________________________________________________________
   $ modprobe snd-virmidi snd_index=1

  ______________________________________________________________________



  where snd_index is set appropriately to the first free card index (=1
  if you have only one card that already has index 0), but it is more
  convenient to adapt your modules configuration to have it sitting
  around already when you need it.  For that we need to extend the ALSA
  section in /etc/modules.conf (or in another location, depending on
  your distribution) with the following:

  ______________________________________________________________________
   # Configure support for OSS /dev/sequencer and
   # /dev/music (aka /dev/sequencer2)
   # (Takashi Iwai advises that it is unnecessary
   # to alias these services beyond the first card, i.e., card 0)
   alias sound-service-0-1 snd-seq-oss
   alias sound-service-0-8 snd-seq-oss

   # Configure card 1 (second card) as a virtual MIDI card
   alias sound-slot-1 snd-card-1
   alias snd-card-1 snd-virmidi

  ______________________________________________________________________


  Now you have configured a virtual MIDI card as the second card with
  index 1, assuming you have one real soundcard (which would be very
  useful). If you have a second real card like I do, change the configu­
  ration above to read:

  ______________________________________________________________________
   # Configure card 2 (third card) as a virtual MIDI card
   alias sound-slot-2 snd-card-2
   alias snd-card-2 snd-virmidi

  ______________________________________________________________________


  If you have even more cards, well, you should know the deal by now...

  It might be necessary to restart the ALSA sound system, after which
  the virtual MIDI card should be seen in /proc/asound/cards:



  ______________________________________________________________________
  $ cat /proc/asound/cards
   0 [card0          ]: ICE1712 - M Audio Audiophile 24/96
                        M Audio Audiophile 24/96 at 0xb800, irq 5
   1 [card1          ]: EMU10K1 - Sound Blaster Live!
                        Sound Blaster Live! at 0xc800, irq 11
   2 [card2          ]: VirMIDI - VirMIDI
                        Virtual MIDI Card 1

  ______________________________________________________________________



  In this example of my own machine I have the VirMIDI card as third
  card, index 2. This setup results in the following raw MIDI devices,
  found in /proc/asound/devices [showing only the MIDI devices]:

  ______________________________________________________________________
   $ cat /proc/asound/devices
     8: [0- 0]: raw MIDI
    41: [1- 1]: raw MIDI
    42: [1- 2]: raw MIDI
    75: [2- 3]: raw MIDI
    74: [2- 2]: raw MIDI
    73: [2- 1]: raw MIDI
    72: [2- 0]: raw MIDI

  ______________________________________________________________________



  The devices starting with '2-' are my virtual MIDI devices. Yours
  would start with '1-' if you only had one physical card in your
  system.

  You can get a nicer listing with ALSA's own aconnect utility, which we
  will need anyway. Called with option -o (or -lo) it will show the MIDI
  devices capable of MIDI output, while a call with -i shows those with
  MIDI input capabilities:

  ______________________________________________________________________
   $ aconnect -o
   [...]
   client 80: 'Virtual Raw MIDI 2-0' [type=kernel]
       0 'VirMIDI 2-0     '
   client 81: 'Virtual Raw MIDI 2-1' [type=kernel]
       0 'VirMIDI 2-1     '
   client 82: 'Virtual Raw MIDI 2-2' [type=kernel]
       0 'VirMIDI 2-2     '
   client 83: 'Virtual Raw MIDI 2-3' [type=kernel]
       0 'VirMIDI 2-3     '
   $ aconnect -i
   [...]
   client 80: 'Virtual Raw MIDI 2-0' [type=kernel]
       0 'VirMIDI 2-0     '
   client 81: 'Virtual Raw MIDI 2-1' [type=kernel]
       0 'VirMIDI 2-1     '
   client 82: 'Virtual Raw MIDI 2-2' [type=kernel]
       0 'VirMIDI 2-2     '
   client 83: 'Virtual Raw MIDI 2-3' [type=kernel]
       0 'VirMIDI 2-3     '

  ______________________________________________________________________



  The devices shown correspond to ALSA's own OSS-compatible raw MIDI
  devices in the /proc/asound/dev directory tree. For example
  /proc/asound/dev/midiC2D0 is the first MIDI device of our virtual MIDI
  card at index 2, called Virtual Raw MIDI 2-0 by aconnect. In Debian
  those devices are available in /dev/snd/ as well, and they also are
  internally linked with the old OSS device locations: /dev/midiXX. To
  make sure that I can get the ALSA raw MIDI ports from /dev/midiXX I
  symlinked them with



  ______________________________________________________________________
   $ ln -s /dev/snd/midiC2D0 /dev/midi20
   $ ln -s /dev/snd/midiC2D1 /dev/midi21
   [...]

  ______________________________________________________________________



  but this should not be necessary, so don't do this at home, kids!

  Now that we have created and configured a VirtualMIDI card we can use
  it in our applications just like any other MIDI devices. Just insert
  the needed device, be it an OSS-compatible /dev/midi20 or an ALSA MIDI
  port like 80:0, at the correct configuration point of your favourite
  sequencer and synthesizer application.



  10.3.  Routing MIDI Events

  10.3.1.  aconnect


  Without further arrangements we will not be able to send the MIDI
  events from our sequencer to a softsynth. For that, we first need to
  connect two ports with (you guessed it) the aconnect utility. This
  tool connects two or more ports. Its -i and -o output above has
  already shown us the available ports, and with a simple syntax these
  can now be connected in a one-way fashion:

  ______________________________________________________________________
   $ aconnect [sender port] [receiver port]
   $ aconnect 80:0 81:0

  ______________________________________________________________________



  This routes all MIDI data sent to port 80:0 over to port 80:1. In our
  setup this means that every event coming in at /dev/midi20 gets sent
  to /dev/midi21, where it can be read ('received') by another
  application.

  If you had configured the VirMIDI card as your second card (with card
  index 1) you should have these ports:

  ______________________________________________________________________
   $ aconnect -lo
   client 72: 'Virtual Raw MIDI 1-0' [type=kernel]
       0 'VirMIDI 1-0     '
   client 73: 'Virtual Raw MIDI 1-1' [type=kernel]
       0 'VirMIDI 1-1     '
   client 74: 'Virtual Raw MIDI 1-2' [type=kernel]
       0 'VirMIDI 1-2     '
   client 75: 'Virtual Raw MIDI 1-3' [type=kernel]
       0 'VirMIDI 1-3

  ______________________________________________________________________



  Here you can connect for example port 72:0 (/dev/midi10) to port 73:0
  (/dev/midi11) with:

  ______________________________________________________________________
   $ aconnect 72:0 73:0

  ______________________________________________________________________



  aconnect can show us what was created with its -lo and -li options:

  ______________________________________________________________________
   $ aconnect -lo
   client 72: 'Virtual Raw MIDI 1-0' [type=kernel]
       0 'VirMIDI 1-0     '
           Connecting To: 73:0
   client 73: 'Virtual Raw MIDI 1-1' [type=kernel]
       0 'VirMIDI 1-1     '
           Connected From: 72:0
   client 74: 'Virtual Raw MIDI 1-2' [type=kernel]
       0 'VirMIDI 1-2     '
   client 75: 'Virtual Raw MIDI 1-3' [type=kernel]
       0 'VirMIDI 1-3

  ______________________________________________________________________



  You see that 'Virtual Raw MIDI 1-0' now is connected to 'Virtual Raw
  MIDI 1-1'. Now, depending on your applications, you can read MIDI data
  that was sent to 'Virtual Raw MIDI 1-0' from 'Virtual Raw MIDI 1-1',
  or in OSS-device speak: What was sent to /dev/midi10 gets routed to
  /dev/midi11 and can be read from there.

  You can also connect more than one port to a port. If you call
  aconnect twice like this:

  ______________________________________________________________________
   $ aconnect 72:0 73:0
   $ aconnect 72:0 74:0

  ______________________________________________________________________



  you can receive the same data send to /dev/midi10 at /dev/midi11 and
  at /dev/midi12 as well. And of course you can really hammer your
  machine if you create more VirMIDI cards and wildly connect these.
  There's no stopping us now...

  To disconnect all ports use

  ______________________________________________________________________
   $ aconnect -x

  ______________________________________________________________________



  or disconnect only one connection with:

  ______________________________________________________________________
   $ aconnect -d 72:0 74:0

  ______________________________________________________________________



  10.4.  Graphical MIDI Patch Bays


  Bob Ham's ALSA MIDI Patch Bay is a very useful graphic frontend to
  ALSA's MIDI connection setup. Usage is very simple and intuitive: On
  the left are the MIDI ports that are capable of sending MIDI events,
  while on the right you see the ports with receiving capability. If you
  click on a left-side port it gets selected for a new connection to the
  port on the right that you click next. Clicking on a right-side port
  will disconnect the port if it was connected. A clean and easy tool
  that has the potential to redundantize this HOWTO. ;)



  10.4.1.  aseqview


  Another useful tool for routing MIDI events is aseqview by ALSA
  developer Takashi Iwai. You can download it at Iwai-sama's homepage
  http//members.tripod.de/iwai/alsa.html, but it is also included in
  many distributions. This graphic utility was designed to view and
  change MIDI events as they pass through your computer, but it also has
  the capability to route events to different MIDI ports like aconnect
  does. This comes in handy when you have to deal with applications that
  use the OSS sequencer device, which aconnect is sometimes unable to
  reach. If you start aseqview without any options you get a nice GUI
  and a new MIDI port. The default is port 128:0, and it looks like
  this:

  ______________________________________________________________________
   client 128: 'MIDI Viewer' [type=user]
      0 'Viewer Port 0 '

  ______________________________________________________________________



  With this port all the aconnect tricks that we have seen by now are
  possible. But if you just need to connect the aseqview port to another
  port, aseqview can do this by itself with the -d option :


  ______________________________________________________________________
   $ aseqview -d 73:0 &

  ______________________________________________________________________



  This connects port 128:0 (if that was available) to port 73:0 right
  from the start of aseqview.



  There are some more graphical aconnect tools with very similar
  functionality.  Maarten de Boer used most af the original aconnect
  source code to write a graphical frontend called "aconnectgui" with
  the FLTK toolkit. It is available at
  <http://www.iua.upf.es/~mdeboer/>.  His software has the best looks,
  in my opinion.

  Personally I use kaconnect, maybe because it has the shortest name,
  that is the fastest to type. kaconnect was developed by Suse's own Dr.
  Matthias Nagorni as a part of his series of tools and softsynths for
  ALSA, the kalsatools. Don't let the "k" in the name fool you, the
  software does not require KDE, it uses the pure QT GUI libraries.
  kaconnect and more is available at
  <http://www.suse.de/~mana/kalsatools.html>.



  10.5.  Applications


  In this last section I will show some examples, how to use the virtual
  MIDI connections in various applications. I will assume a VirMIDI card
  as a third card in the system, using ALSA MIDI ports 80:0 to 83:0 that
  correspond to the raw OSS MIDI devices /dev/midi20 to /dev/midi23 and
  to the ALSA raw MIDI devices /dev/snd/midiC2D0 to /dev/snd/midiC2D3.
  Of these, the first two have been 'aconnected' with


  ______________________________________________________________________
   $ aconnect 80:0 81:0

  ______________________________________________________________________



  As shown, this means, that all MIDI data sent to /dev/midi20 (or port
  80:0 or /dev/snd/midiC2D0) can now be read at /dev/midi21 (or port
  80:1 or /dev/snd/midiC2D1)



  10.6.  Sequencers



  10.6.1.  MusE


  MusE is a full-featured MIDI sequencer written by Werner Schweer,
  available at http://muse.seh.de. We will need to configure the the
  virtual MIDI port as an output port in the section 'Config->MIDI
  Ports'. In MusE, the ports are named by their ALSA names 'VirMIDI X-
  X':

  Now make sure that the right port is selected as the output port for
  the channel on which you want the software synthesizer to listen to
  and play the MIDI events:



  For some reason I could not use 'VirMIDI 2-0' as output device in MusE
  0.4.9. That is the expected device when I wanted to receive on
  'VirMIDI 2-1' but I had to use it the other way around. I don't know
  why, I'm probably stupid, and you might have to experiment a bit. One
  could also use the midi02 or midi2 devices.



  10.6.2.  ttrk


  Billy Biggs's ttrk is a simple, quick and tight MIDI sequencer with a
  tracker interface. It can output its MIDI data to any MIDI port
  configured in the file $HOME/.ttrkrc.

  Put this line there to have ttrk write to /dev/snd/midiC2D0: and
  you're good to go...



  10.6.3.  Shaketracker


  Juan Linietsky's Shaketracker revives the MIDI tracker interface like
  ttrk, but it has a more complete translation of the classic tracker
  effects to MIDI data. Unfortunatly it uses the OSS sequencer device
  (/dev/sequencer) for its MIDI output, not the raw MIDI devices, and I
  could not get it to work with aconnect. But there is a workaround that
  involves aseqview. If we start aseqview before Shaketracker, the
  tracker will recognize and use the aseqview port. One just has to
  select it in the 'User Devices' section of Shaketracker, where it
  shows up by its ALSA name 'Viewer Port 0':



  It is convenient to give this User Device a good name instead of 'Null
  Output'.

  If we start aseqview without options we would need to aconnect the
  aseqview port with the softsynth port, but as shown previously we
  could also start aseqview directly with a destination port. Don't
  forget to use the new User Device in every track that should go to the
  softsynth. I always run Shaketracker with a little shell script that
  starts aseqview, waits for the creation of ports, and then starts
  Shaketracker:


  ______________________________________________________________________
   #!/bin/sh
   aseqview -d 81:0 &
   # sleep 2 seconds to let aseqview do its work:
   sleep 2
   shaketracker

  ______________________________________________________________________



  10.7.  Software Synthesizer



  10.7.1.  Pure Data


  Miller Puckette is the genius behind the open-source software
  synthesis and multimedia development environment Pure Data (PD), which
  evolved out of MAX and in turn was the basis for the MAX-extension
  MSP. PD can use raw MIDI devices to read MIDI events that are
  specified with the option '-midiindev <devnumber>' but it has an
  irritating way of specifying which device to use. The formula is as
  follows: To use /dev/midi0, start PD with 'midiindev 1', to use
  /dev/midi1 start it with '-midiindev 2' and so on. Got it? You must
  specify the real device number plus 1 here. Another example: For
  /dev/midi21 start PD with '-midiindev 22'

  PD has a help patch 'Test audio and MIDI', that is invaluable in
  locating the right MIDI device:



  10.7.2.  Csound


  Csound is the grandmother of most of todays software synthesizers, and
  it has learned MIDI as well. Running 'csound --help' shows where one
  has to configure the MIDI input device:

  -M dnam or --midieventdev=dnam ........ Read MIDI realtime events from
  device



  So in our example we need to start Csound as


  ______________________________________________________________________
   $ csound -M /dev/midi22 -o devaudio midi.csd
  ______________________________________________________________________



  10.7.3.  Conclusion


  By now you should know how to use a software synthesizer to
  orchestrate music composed in and played by a MIDI sequencer. Of
  course, tools like aconnect and aseqview don't need to be used with a
  MIDI software sequencer. You could also redirect events that come into
  your machine from an external sequencer or from an external MIDI
  keyboard directly to the software synth without the MIDI sequencer
  step. Just 'aconnect' the external MIDI device to your softsynth or to
  the on-board synth of your soundcard. Or go the other way around: PD,
  Csound or environments like KeyKit allow you to create MIDI events in
  algorithmic ways that are nearly impossible with classic Cubase-like
  MIDI sequencers. With aconnect you can route these events to any MIDI
  capable sound module you have.



  10.8.  Acknowledgments


  The author would like to thank Takashi Iwai for his technical
  assistance in preparing this article and for his invaluable advice
  regarding the Japanese language. Thanks, Takashi !



  11.  Useful Links.


  Below is a list of links to sites and resources covering MIDI and
  Linux.

  <http://www.linux-sound.org/> Sound & MIDI Software For Linux.  A huge
  resource of MIDI and Audio related information.


  <http://www.linuxdj.com/audio/lad/> Linux Audio Developers mailing
  list.  For developer related discussion.

  <http://www.linuxdj.com/audio/quality> The Linux Audio Quality HOWTO.
  A good section on MIDI cards, essential reading for building a Linux
  studio.

  <http://www.alsa-project.org/> Alsa Project - Audio/MIDI Driver

  <http://www.4front-tech.com/> OSS - Audio/MIDI Driver

  <http://www.gardena.net/benno/linux/audio/> Low Latancy patches

  <http://ccrma-www.stanford.edu/~craig/articles/linuxmidi/>
  Introduction to MIDI programming in Linux.  Craig Stuart Sapp covers
  writing basic MIDI utilities in C/C++ for the OSS driver.

  <http://www.suse.de/~mana> Excellent collection of ALSA 0.9 MIDI and
  PCM example C programs by Dr. Matthias Nagorni.


  12.  Feedback.


  As ever, a HOWTO is a work in progress.  You are encouraged to give
  feedback on new applications and other interesting developments with
  MIDI under Linux.

  MIDI cards are, by their wide variety, sometimes difficult to
  configure as they have various levels of driver support and
  configuration options.  Your best source of reference for problems are
  ALSA's and OSS's websites, newsgroups, and if you get stuck please try
  searching the Linux Audio mailing lists.



