| Examples |
|
beet.c
This example opens MIDI, initializes the environment using standard maps (16 MIDI channels, 1 route), connects to the interface passed as argument, and finally plays Beethoven's Ninth (4th movement) before closing MIDI again. To avoid "hick-ups" introduced by start-up delays, the timer is reset to zero immediately before output begins. Basic error checking and reporting is done.
#include <stdio.h>
#include "../../include/mi_d.h"
void main(int argc, char* argv[]) {
int res, i;
int qtr = 350; /* quarter note tempo (in ms) */
unsigned long time = 0; /* note time stamp */
int dur; /* note duration */
short notes[] /* the melody */
= {64, 64, 65, 67, 67, 65, 64, 62, 60, 60, 62, 64, 64, 62, 62};
/* make sure we've got exactly one argument */
if (argc != 2) {
fprintf(stderr, "Usage: %s interface\n", argv[0]);
return;
}
/* Open MIDI for 16 channels, 1 route and connection, 16+1 */
/* mapping cells and allocate a small queue of 100 or so events */
res = mi_dOpen("Hello Mi_D", 16, 1, 1, 17, 100);
if (res != mi_dNoErr) {
fprintf(stderr, "Can't open MIDI (%d)\n", res);
} else {
/* use standard channel and route maps */
mi_dStandardMaps();
/* connect to the given interface */
res = mi_dConnect(0, argv[1], mi_dOutput);
if (res 1= mi_dNoErr) {
fprintf(stderr, "Can't connect to \"%s\" (%d)\n", argv[1], res);
} else {
/* reset timer */
mi_dSetTime(0UL);
/* play the melody */
for (i = 0; i < 15; i++) {
dur = qtr * (i == 12 ? 1.5 : i == 13 ? .5 : i == 14 ? 2 : 1);
mi_dWriteNote_3c(0, notes[i], 64, 64, dur, time);
time += dur;
}
}
}
mi_dClose();
return;
}
Compile with cc -o beet beet.c -lmi_d or whatever is necessary on your system and call with, for instance, ./beet "Software Synth" on an SGI.
beet.lisp
Here the same example in Lisp. In Lisp, we wrap the code in a function
beet and call the function instead of writing and executing a
stand-alone C application with main entry point.
(defun beet (interface) (let (res (qtr 350) ; quarter note tempo (in ms) (time 0) ; note time stamp dur ; note duration (notes ; the melody '(64 64 65 67 67 65 64 62 60 60 62 64 64 62 62))) ;; Open MIDI for 16 channels, 1 route and connection, 16+1 ;; mapping cells and allocate a small queue of 100 or so events (setf res (mi_d:open-midi "Hello Mi_D" 16 1 1 17 100)) (if (/= res mi_d:+no-err+) (error "Can't open MIDI (~d)" res) (progn ;; use standard channel and route maps (mi_d:standard-maps) ;; connect to the given interface (setf res (mi_d:connect 0 interface :mi_d-output)) (if (/= res mi_d:+no-err+) (error "Can't connect to ~s (~d)" interface res) (progn ;; reset timer (mi_d:set-time 0) ;; play the melody (dotimes (i 15) (setf dur (floor (* qtr (case i (12 1.5) (13 .5) (14 2) (t 1))))) (mi_d:write-note_3c 0 (elt notes i) 64 64 dur time) (incf time dur)))))) (mi_d:close-midi)))
Make sure the Mi_D shared library is loaded or otherwise accessible to
the Lisp image, then load mi_d.lisp and whatever
implementation-dependent interfaces there are for your Lisp (see the
comment at the beginning of beet.lisp). Then call it by
evaluating, for example, (beet "Software Synth") on the SGI.
| ©1998-2001 by Tobias Kunze Briseņo. All Rights Reserved. | Last Modified: 07-Mar-2001 |