[CM] Using MidiShare with CM and Linux: A brief tutorial

Dave Phillips dlphillips@woh.rr.com
Mon, 28 Mar 2005 09:40:34 -0500


  I've been experimenting with CM's use of GRAME's MidiShare interface 
and I thought I'd share my successes with anyone else on the list who 
might want to explore this aspect of CM a bit further.

  First, it seems that there are problems building MidiShare on some 
distros, notably the current AGNULA/Demudi distro but possibly others. I 
can successfully build and install MidiShare from CVS on a Planet CCRMA 
RH9 system with GCC 3.2.2. I suspect there may be compiler and kernel 
incompatibilities that await being addressed by the MidiShare 
developers. My apologies, I can't directly help anyone having such 
troubles, but I do suggest that you write to the developers for a patch 
to update the sources.

  After building and installing the MidiShare system you'll probably 
need to manually install the driver module. This command does the trick:

    modprobe MidiShare

  If it fails you may have a module installation problem. Review your 
build and installation steps, and make sure the MidiShare.o module is 
present in /lib/modules/your-kernel-here/misc (or similar path). If you 
continue to have problems contact the MidiShare developers.

  MidiShare includes a number of helpful GUI and command-line 
components, including a graphic patch bay for connecting MidiShare 
sources, apps, and targets. Start the msConnect patch bay with this command:


  You should see entries only for MidiShare (0) and msconnect (1).

  Now launch CM in your usual fashion. If the MidiShare module has been 
correctly installed you should see a check mark by the MidiShare name on 
the Systems tab in the cmio GUI (btw, the Load button doesn't seem to 
work for loading MidiShare). However, by itself the presence of the 
module does nothing. You must open a MidiShare port by either clicking 
on the port Open button on the MidiShare tab or issue this command at 
the Lisp prompt:


You can close the port by clicking the Close button or by issuing this 


  When you open a MidiShare port you should see an instance of "Common 
Music" appear in the msConnect GUI. If you don't see it you may need to 
check whether you've correctly installed MidiShare. See the MidiShare 
documentation for more information regarding its configuration and 
troubleshooting procedures.

  You can query CM for an opened port by issuing the (midi-open?) 
command, but it has caused problems for me with subsequent calls to 
(midi-open). That bug may be fixed by now. You can also ask CM for the 
ID of its MidiShare port with this command from the Lisp prompt (without 
parentheses!) :


  It should return the same slot number for Common Music as seen in the 
msConnect panel.

  Now start an instance of fluidsynth with the following options:

    fluidsynth --midi-driver=midishare --audio-driver=alsa -C0 -R0 -g3 

  Of course you'll want to substitute your own path and soundfont. The C 
and R options turn off chorus and reverb, the g option sets the gain 
(it's too low by default, IMO). The MIDI and audio driver selections 
should be obvious. The msConnect GUI should now include an entry for 
fluidsynth. If you have problems with fluidsynth, see the fluidsynth 
documentation for more information regarding fluidsynth's options and 
realtime performance controls. Btw, typing 'man fluidsynth' in an xterm 
or at the console prompt will open the very informative fluidsynth 
manual page.

  Return to the msConnect GUI and connect the Common Music entry in the 
Applications column to the fluidsynth entry in the Destinations column. 
At this point you're ready to run some MidiShare-capable code. Try the 
following simple example as a test:

(define (ms-test1)
(process repeat 200
  output (new midi :time (now)
                   :duration (pick .1 .2 .3 .2 .1 .1 .2 .3 .2 .1)
                   :amplitude (between 40 60)
                   :keynum (pick 58 60 62 64 65 67 68 70 72 73 75 76 79 80))
  wait (pick .1 .2)))

(define (ms-test2)
(process repeat 200
  output (new midi :time (now)
                   :duration (pick .1 .2 .3 .2 .1 .1 .2 .3 .2 .1)
                   :amplitude (between 40 60)
                   :keynum (pick 36 38 41 43 48 50 53 55 60 62 65 67 70 72))
  wait (pick .1 .2)))

;;; (events (list (ms-test1) (ms-test2)) "midi.port")

  To run this example from the GUI, simply save it as a file (e.g. 
ms-test.cm) and load it either via the CM Lisp prompt or the cmio 
interface. If you are not using the GUI just enter the events line at 
the prompt. For the GUI just put this line in the Events entry dialog:

    (list (ms-test1) (ms-test2))

For some reason the action will replace the filename in the Execute 
entry box (i.e. "ms-test.cm") with "midi.port". This is a bug, but it's 
a helpful one: if it doesn't appear then you'll know that there's 
something wrong with your code or system setup.

  If all the parts are correctly in place you should hear the process 
begin immediately.

  Please note that this process applies *only* to the CM's high-level 
MIDI objects. The low-level objects are not currently usable in such 
processes under Linux, although you can test the examples from the MIDI 
topic page by entering them at the prompt. Note that some examples will 
not work as expected, but in fact the low-level objects are not 
particularly necessary if you have no need for MidiShare's more 
specialized services.

  Improvements I'd like to see include a start/stop/pause/continue 
control for realtime playback and some further explication regarding the 
MidiShare MIDI file player (as seen in the cmio MidiShare tab). In other 
respects this system appears to be working well under Linux and is a 
valuable addition to CM's output targets.

  Feel free to notify me of any corrections to this brief tutorial. I 
also welcome any other examples that show off CM's MidiShare support.

  Rick: Btw, did CM at one time support Cmix as an output target ? If 
so, is there any chance that it could be revived for RTCmix someday ?