ftp.nice.ch/pub/next/unix/music/cm.sd.tar.gz

README
 
README.AKCL
 
README.CLISP
 
README.MCL
 
README.SGI
 
README.WIN
 
amplitude-streams.lisp
 
build/
 
changes.text
 
common-music.lisp
 
constructors.lisp
 
contrib/
 
doc/
 
functions.lisp
 
interval-streams.lisp
 
item-streams.lisp
 
midi/
 
multiple-items.lisp
 
music-utilities.lisp
 
note-streams.lisp
 
number-streams.lisp
 
pathname-translations.lisp
 
rhythm-streams.lisp
 
scales.lisp
 
stella/
 
unix/
 
utilities.fn
 
utilities.lisp
 
utils/
 

README

This is the main README for Common Music. After reading this file, read:

if you use Macintosh with MCL:		README.MCL
if you use AKCL 6.15 on any machine:	README.AKCL 
if you use Windows with CL/PC:		README.WIN 
if you use Excl or Lispworks on SGI:	README.SGI
if you use CLISP on any machine:	README.CLISP
if you use DOS but not Windows:		README.WIN  (filename info)

The file build/README contains complete installation instructions for
Common Music, CLM and PCL.

The file changes.text contains a summary of the most recent enchancements
and bug fixes.

Documentation about Common Music is located in the subdirectory doc/.  

The tutorial is in stella/tutorial/stella.rtf.

Demo files are in stella/scripts and stella/examples/.

-------------------------------------------------------------------------------

Common Music is known to work in the following hardware/os/lisp configurations:

   Machine           OS               Lisps
   ----------------------------------------------------------
   NeXT              2.1,3.0          Franz ACL 3.1.2, 4.1
                                      AKCL 6.15
                                      CLISP
   Macintosh         System 7         MCL 2.0 (final release)
   SGI Iris          IRIX             Franz ACL 4.1
   Sun4              SunOS 4.1        AKCL 6.15
   486               Windows 3.1      Franz CL/PC
                     DOS              CLISP

-------------------------------------------------------------------------------

In addition to the source files located here, Common Music depends on two
lisp utilities which may or may not be provided by the lisp you are using.
The first of these utilities is the MIT or ANSI loop macro, which is widely
available and included in most lisp vendor's distribution software.  If you
are running in Allegro Common Lisp, MCL, Lucid or Symbolics your lisp 
distribution contains a copy of it.  If your lisp does not have the loop
macro, try the one in utils/loop.lisp.  The second utility you need is CLOS,
the Common Lisp Object System.  If your lisp does not contain CLOS, you may
use PCL, which is a portable public domain implementation available through 
anonymous ftp on
ftp.zkm.de
	pub/March-92-PCL-2c.tar.Z
parcftp.xerox.com:
	pub/pcl/September-16-92-PCL-f.tar.Z
ccrma-ftp.stanford.edu
	pub/Lisp/pcl.tar.Z
ma2s2.mathematik.uni-karlsruhe.de	   (CLISP)
	pub/lisp/clisp/packages/pcl.sept92f.clisp.tar.z

-------------------------------------------------------------------------------

Common Music directory structure:
   ./                - kernel
   build/            - build scripts. see build/README
   contrib/          - source files for extensions, tools, etc.
   doc/              - documention. see doc/README
   midi/             - source files for MIDI syntax
   midi/examples/    - example files for midi
   oldsys/           - old runtime system (defscorefile, etc)
   stella/           - composition editor
   stella/scripts/   - demo script files to load
   stella/tutorial/  - tutorial files 
   stella/examples/  - example files 
   stella/help       - long help files used by editor
   utils/            - external utilities used by Common Music

------------------------------------------------------------------------------

A mailing list cmdist@ccrma.stanford.edu has been established for
people interested in tracking Common Music, CLM and CMN. Send
request to cmdist-request@ccrma.stanford.edu

If you have any questions or comments please feel free to contact me:

Rick Taube
Zentrum fuer Kunst und Medientechnologie
Ritterstr. 42    7500 Karlsruhe 1    Germany
Net: hkt@zkm.de, hkt@ccrma.stanford.edu
Fax: +49 721 9340 39
Vox: +49 721 9340 300

README.AKCL

This file contains directions for building AKCL 615 on a NeXT (2.1 or 3.0) for use with Common Music and CLM.  You can get the sources to akcl via anonymous ftp from guido.zkm.de in the directory pub/akcl.
------------------------------------------------------------------------
1) On NeXT 3.0 systems, you'll need to get the dsp library from ccrma --
it's on the pub directory at ccrma-ftp.stanford.edu as: libdsp.a. 

2) After ftp-ing the AKCL sources, read the file NeXT-akcl-1-615.README to learn about general installation procedures for NeXT/akcl.  After following the instructions and restoring the tar files to their appropriate directories, read the file akcl.README.

Then, before you run add-defs edit the following two files.
In the file  <kcl-home-directory>/akcl/h/NeXT.defs change the line:

    LIBS = -lsys_s -lm -lg

to (NeXT 2.0 and 2.1)

    LIBS=	-u libdsp_s -ldsp_s -u _midi_set_owner -u _midi_get_out_timer_port -u _midi_get_xmit -u _midi_get_recv -u _midi_set_proto -u _midi_set_sys_ignores -u _midi_get_data -u _midi_timer_error -u _port_set_allocate -u _port_set_add -u _timer_start -u _midi_error -u _port_set_deallocate -u _timer_stop -u _timer_set_quantum -u _timer_set -u _timer_quanta_req -u _midi_timer_reply_handler -u _midi_send_cooked_data -u _midi_clear_queue -u _midi_reply_handler -lmidi -lsys_s -lm -lg

or to (NeXT 3.0)
 
    LIBS=	-u _SNDReadSoundfile -u _SNDStartPlaying -u _SNDWait -u _SNDFree -u _SNDStop -u _SNDSetHost -u _SNDAcquire -u _snddriver_get_device_parms -u _SNDRelease -u _snddriver_set_device_parms -u _snddriver_get_volume -u _snddriver_set_volume -u _snddriver_set_ramp -u _DSPOpenNoBoot -u _DSPClose -u _valloc -ldsp -u _mutex_try_lock -u _mutex_wait_lock -u _MIDIBecomeOwner -u _MIDIClaimUnit -u _MIDISetClockMode -u _MIDISetClockQuantum -u _MIDISetSystemIgnores -u _MIDIRequestExceptions -u _MIDIGetAvailableQueueSize -u _MIDISetClockTime -u _MIDIStartClock -u _MIDIReleaseOwnership -u _MIDIStopClock -u _MIDIGetClockTime -u _MIDISendData -u _MIDIRequestData -u _MIDIHandleReply -u _MIDIClearQueue -u _cthread_detach -u _port_set_allocate -u _port_set_add -u _port_set_deallocate -u _name_server_port -lsys_s -lm

These LIB entries must remain one line.

Edit the file <akcl-home-directory>/h/NeXT.h and replace the line
	ADD_FEATURE("NeXT"); \

with the following 2 lines (NeXT 2.1):

	ADD_FEATURE("NeXT"); \
	ADD_FEATURE("NEXT"); \

or the following 3 lines (NeXT 3.0)
	ADD_FEATURE("NeXT"); \
	ADD_FEATURE("NEXT"); \
	ADD_FEATURE("NEXT-3.0"); \

Replace the line:

	#define BIG_HEAP_SIZE   0x1000000

with the following three lines:

	#define BIG_HEAP_SIZE   0x2000000
	#undef MAXPAGE
	#define MAXPAGE (2*16384)

For NeXT 3.0 there there is one further change --
In akcl/c/NeXTunixsave.c, the declaration:

  extern struct section *getsectbyname(char *, char *);

causes a fatal compiler error.  The new declaration
(in /NextDeveloper/Headers/bsd/lib.h) is:

  extern const struct section *getsectbyname(
	 const char *segname, 
	 const char *sectname);
------------------------------------------------------------------------
3) Follow the directions in akcl.README and finish building akcl. This will take about 2 hours.
------------------------------------------------------------------------
4) If you will be using CM with CLM, comment out loading tl.lisp in the CLM build file all.lisp; CM will load the latest version from its utils directory.
------------------------------------------------------------------------
5) If you are building Common Music with the MusicKit, you should compile the sources in two passes. For the first pass, compile all the syntaxes EXCEPT the MusicKit.  In the second pass, compile ONLY the MusicKit syntax.  This gives the akcl compiler a fighting chance.  See build.lisp for more info.
------------------------------------------------------------------------
6) Other stuff:

You can get AKCL via anonymous ftp from sonata.cc.purdue.edu (128.210.15.30)
in the file pub/next/2.0-release/binaries/AKCL-1-586-NeXT.bin.tar.Z
The file akcl.README contains short directions on how to build kcl.

You can get PCL via anonymous ftp from parcftp.xerox.com (13.1.64.94)
in the tar file /pub/pcl/March-92-PCL-2c.tar.Z.  you should not use a pcl version earlier than March-92. Don't use PCL'S SHIPPED FROM FRANZ.

When an AKCL image with Common Music boots up it does not automatically
place you in either the Common Music package or in Stella's command interpreter.
To enter stella, type:
	(stella:stella)
To go to Common Music, type:
	(in-package :cm)
but you can reach everything in the Common Music package from the Stella 
package as well.
------------------------------------------------------------------------
7) Known problems in AKCL:

a) compiling fm2cnvimono and fm2pnvimono sometimes results in an error in the c compiler:
  Compiling /dist/cm/mk/fm2cnvimono.lisp.
  End of Pass 1.  
  End of Pass 2. cc: Internal compiler error: program cc1obj got fatal signal 11
  Correctable error: (SYSTEM "(cd /dist/cm/mk/ ;cc -DVOL=volatile   
 -fwritable-strings  -O -c -I. fm2cnvimono.c -w)") returned a non-zero value 1.

ive commented these two files out for akcl, but you might be able to compile them on your machine.

README.CLISP

This file contains information about running Common Music in CLISP

1) The system has been compiled and minimally tested in the NextStep
version of CLISP, using black hardware, NeXTStep 3.0, 16 Meg. 

2) You can use either PCL or CLISP's verion of CLOS. The choice is automatic;
if PCL is around, the build script prefers it to the native version. If you
use the native CLOS, there is a patch at the end of this README that must be
built into CLISP before building Common Music. Directions on how to perform
the patch are included.  If you use PCL, get the version conditionalized for
CLISP from:
	ma2s2.mathematik.uni-karlsruhe.de
in the file:
	pub/lisp/clisp/packages/pcl.sept92f.clisp.tar.z
note that the ".z" extension needs gzip, not uncompress. There are directions
for installing PCL in build/README.

3) MIDI real time is not implemented in this port. It might be possible,
but I don't yet understand the foreign function interface provided by CLISP.
And if you are using CLISP on DOS or Linux I don't even know if there are midi
drivers available for you.  At any rate, its no problem to write midi files,
or any other type of common music output file, which you can presumably then
listen to using some other app. Since there is no connection to a driver you
can't use Stella's PLAY command for midi files either, unless you
redefine it to call some external player via a shell call, which would
certainly be possible if you are on Unix.

4) To compile the system first add the CLOS patch to CLISP or install PCL.  
Then edit build/build.lisp and set the build parameters.  Here is an example
of what reasonable parameter settings might look like on a NeXT:

   (cm-directory                "/lisp/cm/")
   (cm-image-name               "/lisp/clisp/cm.mem") 
   (clm-directory               nil)
   (cmn-directory               nil)
   (pcl-directory               nil)
   (syntaxes                    '(:midi :csound :rt :musicKit))

[Also, if you are running under NextStep 2.1, search for next-3-0 in the same
file and set it to nil.]

On DOS it might look like:

   (cm-directory                "c:\\cm\\")
   (cm-image-name               "c:\\clisp\\cm.mem") 
   (clm-directory               nil)
   (cmn-directory               nil)
   (pcl-directory               nil)
   (syntaxes                    '(:midi ))

[Note that the DOS directory delimiter \ must be doubled in strings since
it is also a Lisp escape character]

Next, boot CLISP and load build.lisp. This will compile all the sources.
Compiling takes a long time in CLISP, so take a coffee break or two.

5) To save a final lisp image of Common Music, quit and restart Lisp, then
load build.lisp again. This will load all the .fas files and save an 
image. You will then probably want to make script that boots clisp using
your saved image. On Unix try something like:

	#/bin/csh -f
	/lisp/clisp/lisp.run -M /lisp/clisp/cm.mem $*

on DOS, a CM.BAT would look something like:

	c:\clisp\lisp.exe -M c:\clisp\cm.mem %1 %2 %3 %4 %5 %6 %7 %8 %9

USING STELLA:

To start up Stella, use the (stella:stella) function.  To resume from
error breaks, use the TL error command (see below). If you are new to
the system, probably the best place to start is with the tutorial in
stella/tutorial/stella.rtf. Other docmentation like the dictionary and
midi.rtf help are in the doc/ directory.


KNOWN PROBLEMS:

1) There is a low level CLISP readline bug that causes prompts to be
multiply printed when running CLISP from a terminal. I've believe I've
hacked around this problem. The real fix is to apply PATCH 2 below to
the CLISP's C source code and then recompile run.exe.

2) No Midi real time in any CLISP port. Might be possible on NeXT.

3) For some reason the R1 restart does not return to stella even though
it says it will. Use the TL break command instead, ie:

	Stella [Top-Level]: (car 1)
        *** - CAR: 1 is not a list
	The following restarts are available:
	R1 = Return to Top-Level.
	R2 = Exit Top-Level.
	1. Break> tl                              <<< use tl

	Stella [Top-Level]: 

4) Simple character printing to the terminal is slo-o-ow in CLISP, at least
in its NeXTStep incarnation.

5) Actually, everything in CLISP seems slow to me. Oh well, you get what you pay for. To make runtime execution as fast as possible I've made the default
setting for *compile-algorithms* T in CLISP (normally its nil). Since it
appears that CLISP's byte compiler can handle any sort of function object,
incuding lexical closures, there is really no reason to run interpreted.
If you have problems set it back to NIL. See doc/dictionary.rtf for more info
on *compile-algorithms* .


CLISP PATCH 1: Fix CLOS (ignore if using PCL)
-------------------------------closfix.lsp-----------------------------
;;;
;;; Fix CLISP to allow &optional and &key in methods. This patch must be
;;; built into CLISP before building Common Music. Do this by saving the
;;; code in a file called closfix.lsp, then executing two shell commands:
;;;	clisp -c closfix
;;; 	clisp -i closfix -x '(saveinitmem)'
;;; the first command compiles the patch file, the second loads it and
;;; saves a new initmem.mem image. see CLISP's man page for more info.
;;;

(in-package "CLOS")

(defun compute-effective-method (gf &rest args)
  (let* ((signature (gf-signature gf))
         (req-anz (first signature))
         (req-vars (n-gensyms req-anz))
         (req-args (subseq args 0 req-anz))
         (restp (or (third signature) (> (second signature) 0)))
         (rest-var (if restp (gensym)))
         (apply-fun (if restp 'APPLY 'FUNCALL))
         (apply-args `(,@req-vars ,@(if restp `(,rest-var) '())))
         (lambdalist `(,@req-vars ,@(if restp `(&REST ,rest-var) '())))
         (opt-vars '())
         (key-vars '())
         (lambdalist-keypart '())
         (arg-order (gf-argorder gf))
         (methods (gf-methods gf)))
    ; Determine the effective method:
    ; 1. Select the applicable methods:
    (setq methods
      (remove-if-not #'(lambda (method) (method-applicable-p method req-args))
                     methods
    ) )
    (when (null methods)
      (loop (apply #'no-applicable-method gf args))
    )
    ; 28.1.6.4., 28.1.6.5.: Keyword arguments in generic functions
    (when restp
      ; Die generische Funktion hat &REST oder &KEY, also auch alle Methoden.
      ; "If the lambda-list of ... the generic function definition contains
      ;  &allow-other-keys, all keyword arguments are accepted."
      (unless (fifth signature)
        ; "The specific set of keyword arguments accepted ... varies according
        ;  to the applicable methods."
        (let ((signatures (mapcar #'std-method-signature methods)))
          ; "A method that has &rest but not &key does not affect the set of
          ;  acceptable keyword srguments."
          (setq signatures (delete-if-not #'fourth signatures))
          ; Keine Methode mit &key -> keine Einschränkung der Argumente.
          (unless (null signatures)
            ; "If the lambda-list of any applicable method ... contains
            ;  &allow-other-keys, all keyword arguments are accepted."
            (unless (some #'sixth signatures)
              ; "The set of keyword arguments accepted for a particular call
              ;  is the union of the keyword arguments accepted by all
              ;  applicable methods and the keyword arguments mentioned after
              ;  &key in the generic function definition."
              (let ((keywords
                      (remove-duplicates
                        (append (fourth signature) (mapcap #'fifth signatures))
                        :from-end t
                   )) )
                 (setq opt-vars (n-gensyms (second signature)))
                 (setq key-vars (n-gensyms (length keywords)))
                 (setq lambdalist-keypart
                       `(&KEY
                         ,@(mapcar #'(lambda (kw var) `((,kw ,var)))
                                   keywords key-vars
                           )
                       )
    ) ) ) ) ) ) )
    ; 2. Sort the applicable methods by precedence order:
    (setq methods (sort-applicable-methods methods req-args arg-order))
    ; 3. Apply method combination:
    ; Nur STANDARD Methoden-Kombination ist implementiert.
    ; Aufspalten in einzelne Methoden-Typen:
    (multiple-value-bind (primary-methods before-methods after-methods around-methods)
        (partition-method-list methods)
      (when (null primary-methods)
        (loop (apply #'no-primary-method gf args))
      )
      ; Methoden zu einer "effektiven Methode" kombinieren:
      (labels ((ef-1 (primary-methods before-methods after-methods around-methods)
                 (if (null around-methods)
                   (ef-2 primary-methods before-methods after-methods)
                   (let* ((1method (first around-methods))
                          (1function (std-method-function 1method)))
                     (if (std-method-wants-next-method-p 1method)
                       (let ((next-ef
                                 (ef-1 primary-methods before-methods after-methods (rest around-methods))
                            ))
                         `(,apply-fun ',1function
                                      #'(LAMBDA ,lambdalist ,next-ef)
                                      ,@apply-args
                          )
                       )
                       `(,apply-fun ',1function ,@apply-args)
               ) ) ) )
               (ef-2 (primary-methods before-methods after-methods)
                 (let ((next-ef (ef-3 primary-methods after-methods)))
                   (if (null before-methods)
                     next-ef
                     `(PROGN
                        ,@(mapcar
                            #'(lambda (method)
                                `(,apply-fun ',(std-method-function method)
                                             ,@apply-args
                                 )
                              )
                            before-methods ; most-specific-first
                          )
                        ,next-ef
                      )
               ) ) )
               (ef-3 (primary-methods after-methods)
                 (let ((next-ef (ef-4 primary-methods)))
                   (if (null after-methods)
                     next-ef
                     `(MULTIPLE-VALUE-PROG1
                        ,next-ef
                        ,@(mapcar
                            #'(lambda (method)
                                `(,apply-fun ',(std-method-function method)
                                             ,@apply-args
                                 )
                              )
                            (reverse after-methods) ; most-specific-last
                          )
                      )
               ) ) )
               (ef-4 (primary-methods)
                 (let* ((1method (first primary-methods))
                        (1function (std-method-function 1method)))
                   (if (std-method-wants-next-method-p 1method)
                     (let ((next-ef-fun (ef-5 (rest primary-methods))))
                       `(,apply-fun ',1function ,next-ef-fun ,@apply-args)
                     )
                     `(,apply-fun ',1function ,@apply-args)
               ) ) )
               (ef-5 (primary-methods)
                 (if (null primary-methods)
                   'NIL ; keine Funktion, NEXT-METHOD-P reagiert darauf
                   `#'(LAMBDA ,lambdalist ,(ef-4 primary-methods))
              )) )
        (let* ((ef-form (ef-1 primary-methods before-methods after-methods around-methods))
               (ef-fun (if (and (eq (car ef-form) apply-fun)
                                (equal (cddr ef-form) apply-args)
                                (null lambdalist-keypart)
                           )
                         (cadr ef-form)
                         `#'(LAMBDA
                              ,@(if (null opt-vars)
                                  `(,(append lambdalist lambdalist-keypart)
                                    ,@(if key-vars `((DECLARE (IGNORE ,@key-vars))))
                                   )
                                  `(,lambdalist
                                    (APPLY #'(LAMBDA (&OPTIONAL ,@opt-vars ,@lambdalist-keypart)
                                               (DECLARE (IGNORE ,@opt-vars ,@key-vars))
                                             )
                                           ,rest-var
                                   ))
                                )
                              ,ef-form
                            )
              ))       )
          ; (eval ef-fun)                                 ; interpretiert
          ; (eval `(LOCALLY (DECLARE (COMPILE)) ,ef-fun)) ; compiliert
          (eval `(LET () (DECLARE (COMPILE) (INLINE FUNCALL APPLY)) ,ef-fun))
) ) ) ) )




CLISP PATCH 2 (DOS): Diff for Fixing STREAM.D (CLISP implementation file)

*** stream.d.orig       Sat Jan  8 14:45:35 1994
--- stream.d    Mon May  9 21:54:16 1994
***************
*** 3437,3444 ****
        }}
        # Wenn stdin und stdout beide dasselbe Terminal sind, kvnnen
        # wir davon ausgehen, da_ der Cursor in Spalte 0 steht.
!       if (eq(TheStream(stream)->strm_terminal_isatty,S(equal)))
!         { TheStream(stream)->strm_wr_ch_lpos = Fixnum_0; }
        # Nun fangen wir an, die Zeichen des Buffers zu liefern:
        goto restart_it;
      }}
--- 3437,3446 ----
        }}
        # Wenn stdin und stdout beide dasselbe Terminal sind, kvnnen
        # wir davon ausgehen, da_ der Cursor in Spalte 0 steht.
!       if (eq(TheStream(*stream_)->strm_terminal_isatty,S(equal)))
!         { TheStream(*stream_)->strm_wr_ch_lpos = Fixnum_0;
!           TheArray(TheStream(*stream_)->strm_terminal_outbuff)->dims[1] = 0; # Fill-Pointer := 0
!         }
        # Nun fangen wir an, die Zeichen des Buffers zu liefern:
        goto restart_it;
      }}





README.MCL

This file contains information about building Common Music in MCL 2.0 
(or higher) Lisp.


SYSTEM & HARDWARE REQUIREMENTS _____________________________________________

The system has been tested on a IIci, SE/30, PowerBook 170, Quadra 700, 840av,
Centris 650.  It should run on all Macintoshes with a hard disk and at least
6 megabytes of RAM and 8 megabytes of disk storage, running Macintosh System
Software 6.0.4 or later (including System 7) or A/UX 3.0 (but see the 'Known
Problems' section below concerning A/UX 3.0).  

Here is a system configuration known to run Common Music with midi 
real time on the Mac:

  1) System:                        System software v7.0 or later
  2) Extensions (required):         a)  Apple Midi Manager extension
                                    b)  Apple Midi Driver OR
                                        OMS Midi Manager Driver with 
                                        OMS Midi System extension OR
                                        Midi Time Piece II driver
  3) Memory:                        8 MB physical RAM
                                    32 bit addressing on
                                    Virtual memory on (12 MB logical RAM)
  4) Common Music Memory:           with MIDI syntax only:           6144 KB
      (the preferred image heap     with both MIDI and CMN syntaxes: 8192 KB
      size, as set in the Command-I 
      window)
  5) (optional:)                    MPW C v3.2.1 or higher

You must use the official MCL 2.0 release. The MCL 2.1 beta will not work.
If you plan to use midi, you must also have installed the Apple Midi Manager
and a midi driver (see (2) above) in your system folder.


BUILD DIRECTIONS: __________________________________________________________

1) If you are building Common Music with MIDI syntax, debinhex the
   already compiled object file midi/mcl-midi.c.o.hqx. Use Stuffit or
   Binhex.
  
2) Edit the file build.lisp in the build subdirectory and set the parameters.
   See the README in that directory for more information. Here is an example
   of what reasonable parameter settings in build.lisp might look like for MCL.
   The first two paramertes MUST be changed to reflect the actual Common
   Music source directory pathname on your machine.)

   (cm-directory                "Disk:CM:")
   (cm-image-name               "Disk:CM:CommonMusic") 
   (clm-directory               nil)
   (cmn-directory               nil)
   (pcl-directory               nil)
   (syntaxes                    '(:MIDI)) 

3) If you want to define logical pathnames for use in Common Music, edit the
   file pathname-translations.lisp in the common music directory and add 
   whatever pathnames definitions are appropriate for your situation. This
   step is optional. pathname-translations.lisp already contains two
   commented out logial pathnames that you might find useful: Home and CM. 
   To use these on your machine, first uncomment them out and then change
   the portions of their directory definintions before the ":**"

4) Boot up MCL 2.0 and load the build.lisp file. I do this by:
	(load "HD 160:Lisp:Common Music:Build:build.lisp")
   but you can also load by selecting "Load" under the Eval menu.

   By loading build.lisp all the sources will be compiled and loaded. 
   Ignore any warning messages.  To save a lisp image with Common Music loaded,
   first quit and then restart lisp, and then load build.lisp again.  The 
   script will save an application after it loads all the binaries (if nothing
   needed recompiling).



USING STELLA: ______________________________________________________________

To start up Stella, use the (stella) function.
To resume from error breaks, type Command-. (period) repeatedly until you are
back in Stella's top-level loop or select "Return to Top-Level" from the
restarts menu item.



MIDI USER VARIABLES: _______________________________________________________

   *midi-preferences*         <default value: '((:apple :oms :mtp) (:a :b))>
      A list of the known midi drivers and ports, sorted in descending
      order according to their relative preference.
      The variable's primary use is to provide midi-open with the means
      to discriminate between multiple possibilities, whenever it it is
      called withoput parameters (as done by the midi menu's open item).

   *midi-multitimbral-channels*                           <default value: 1>
      The number of available multitimbral channels.
      Used by the 'All Notes Off' and 'Test Midi' midi menu items and by
      the function ff-midi-all-notes-off. Midi data are only output within
      the range of channels from 0 to (*midi-multitimbral-channels* -1).

   *midi-flush-timeout*	                               <default value: 3000>
      The time in milliseconds, for which the queueing mechanism stays in
      flushing mode, therefore ignoring newly scheduled events.

      Since flushing is achieved by dumping all pending note-off messages, 
      it is possible for _huge_ amounts of buffered output to leave messages
      unprocessed. This may lead to hanging notes, if _very_ long notes 
      that are already turned on happen to have their note-off message 
      among this unprocessed chunk of midi data. Therefore, you may want to
      increase or decrease the value of *midi-flush-timeout*, depending on 
      the overall musical structure you tend to produce.
      Note, too, that this parameter is semi-global only. That is, any 
      changes to it come into effect only after the next time you open a 
      midi port.
      


KNOWN PROBLEMS: _____________________________________________________________

   o  When using OMS (Opcode Midi System) you will have to: 
        o  set its compatibility in the OMS MIDI Setup dialog to 
           'Use Apple Midi Manager', and
        o  make your connections to the OMS Midi Driver (or another 
           Midi application) manually using the PatchBay application.

   o  As of version 3.0, A/UX does not support the Apple Midi Manager.
      Hence you will be unable to perform Midi I/O when running A/UX 3.0.

  [o  For a more technical problem, see the file midi:mcl-midi.lisp.]

Bug reports, suggestions, etc. concerning midi (mcl-midi.lisp and mcl-midi.c)
are welcome. Please address electronic mail to tkunze@mvax.kgw.tu-berlin.de.

README.SGI

This file contains instructions for building Common Music with real time
midi on an SGI. It has been tested in ACL 4.1, 4.2 and Harlrquin LispWorks.
The midi realtime port was done by Fernando D. Mato Mira (matomira@di.epfl.ch).

ACL 4.1, 4.2:

1) In order to build a lisp image linked to the midi driver you need the
following G0 libraries: 
	libmidi_G0.a, libmalloc_G0.a, libC_G0.a, libmpc_G0.a
If you use CLM then you should get libaudio_G0.a as well.  Some of
these libraries may already be on your machine; look under /usr/lib.
Otherwise get what you need from SGI support.

2) It is currently impossible to link to libmpc_G0.a from the common
music build process, so you must rebuild the base cl image with a static
link to this lib. There are two ways to do this. (The first method doesnt
work on my machine.)

Method 1:
Complile <CMDIR>/midi/sgi/dummy.c and then rebuild cl by:
	sh config <CMDIR>/midi/sgi/dummy.o /usr/lib/libmpc.a

Method 2:
Edit cl/build Mf and add:
	-lmpc 
to the LIBRARIES statement, and:
	-u taskcreate
to the USYMS statement, and then rebuild cl by:
	sh config

3) Edit <CMDIR>/build/build.lisp and set the build parameters.  If your
G0 libraries aren't in /usr/lib then search for g0-directory and set
it to the proper directory.

4) That's it, now build common music as per normal building instructions.  

---------------
KNOWN PROBLEMS:

1) On the SGI you must actually start MIDI before attempting to open
a port to the driver from lisp. To start MIDI, type:
	startmidi -d /dev/ttyd1
to the unix shell, assuming you are using MIDI on serial port 1.

2) You might have a midilib.a without actually having the midi development
environment installed on your machine. If this is the case, the build.lisp
script assumes that you have midi verion 1.0.

README.WIN

This file contains information about using Common Music in Windows 3.1
and Franz ACLPC Common Lisp.

1) Common Music has been tested with the following system configuration:

	Intel 486 33 MHz with 16 Meg RAM
	MSDOS 6.0
        Windows 3.1
	Visual C++ 2.0
	Franz CL/PC Common Lisp with all patches loaded.

2) Some file extensions changed to accomodate DOS:

	Reasonable	DOS
	-------------------
	lisp		LSP
	fasl		FSL or FAS
	stella		STL
	midi		MID
	text		TXT

Because of DOS' max 8 character file name nonsense, many of the source files
have odd looking names, but the system can still find everything.  While I'm
grumbling about filenames, remember that in Lisp the directory character \ must be written \\ inside Lisp strings, so take care when setting the build
parameters in build.lisp...a source directory of "C:\CM\" would have to be
specified as "C:\\CM\\".

3) The only useful output syntaxs for the 486 at this time are probably
MIDI and Csound.

4) To compile the system, edit build\build.lsp and set the build parameters.
Then boot lisp and load build.lsp to compile all the sources.  Here is an 
example of what reasonable parameter settings might look like:

   (cm-directory                "c:\\cm\\")
   (cm-image-name               "c:\\cm\\cm.img") 
   (clm-directory               nil)
   (cmn-directory               nil)
   (pcl-directory               nil)
   (syntaxes                    '(:midi :csound))

5) To save a final lisp image of Common Music, quit and restart Lisp, then
load build.lsp again (you cannot save in the same session you compiled in)
This will load all the compiled files and save an image. You will then
probably want to make a "program link" in Window's Program Manager so that
you can double click on an icon to boot Common Music: 

  a) Go to Window's Program Manager
  b) Open the Franz CL/PC Application set.
  c) Select New under File
  d) Click on Program Item
  e) Set the Command Line field to something like:
	c:\allegro\lisp.exe c:\cm\cm.img
     depending on where your allegro and cm.img are.
  f) Click on OK.

USING STELLA:

To start up Stella, use the (stella:stella) function.
To resume from error breaks, select Abort in the debugger's window.


MIDI REAL TIME:

The midi connection was implemented by Joe Fosco, fosco@ils.nwu.edu.
Its .dll is supplied so you dont have to compile anything. The connection
currently supports a maximum of 4000 future messages.


KNOWN PROBLEMS:

1) Midi reading currently does't work because of a bug in ACLPC's foreign
function interface. Hopefully this will work some time in the future. 
2) The MIDI port must be specied as 0, ie (midi-open :port 0)
3) Only 4000 future messages can be written.
4) Some demo script files refer to .midi file extensions and midi port :A.
Change these to .MID and 0 before playing around with the scripts.
5) Simple string output to the terminal is incredibly slow in ACLPC.
6) Pasting to the Listener is sometimes problematic.


These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.