CM 2.7.0 o CM now supports "real time" scheduling and receiving in the following implementations: OpenMCL/OSX SBCL/Linux CMUCL/Linux See the documentation on RTS, SET-RECEIVER! and PORTMIDI for more information. o CM home page http://commonmusic.sf.net now reflects the CVS HEAD version and is updated every four hours. A nightly CVS snapshot is now available on the home page. o New class fomus-file supports generating output for notation packages such as lilypond, Sibelius and Finale using Fomus. See fomus-file dictionary entry and fomus project site: http://common-lisp.net/project/fomus/ o CM's Low level MIDI messages now documeted in main Midi topic page in dictonary. o New functions for getting and setting default input and output streams: current-input-stream, current-output-stream, set-current-input-stream! set-current-output-stream! o the output stream arg to events function is now optional if a default stream is set. o Support for MIDI input and output using PortMidi in OpenMCL, SBCL and CMUCL on OS X and Linux. Portmidi is a light-weight alternative to Midishare. See Portmidi topic page in dictionary for more info. o Ported CM to STklos 0.72. o New functions MAP-OBJECTS and FOLD-OBJECTS support object sequencing and editing. Args to existing functions SUBOBJECTS and LIST-SUBOBJECTS have changed to match MAP-OBJECTS. See dictionary entries for more information. o New slot macros SV+, SV* see dictionary for more information. o Previously undocumented macro SV now documented. See changes section for more information. o New function SUBOBJECTS returns all or just some subobjects of a seq. The former function with this name is now called CONTAINER-SUBOBJECTS, the renaming should be backwards compatible since calling SUBOBJECTS with none of its optional arguments calls CONTAINER-SUBOBJECTS. o cm.sh now Slime aware: if Slime is loaded then /etc/xemacs/cm.el uses Slime to implement lisp-listener, otherwise listener.el is used. cm.el also provides SLIME-EVAL-AT-MOUSE, a more powerful eval function than slime-eval-expression as it evals anything you point at: works after expr (like slime-eval-expression), at point, inside symbols, whole regions. On white space it evals toplevel defuns. On Darwin the command is bound to APPLE-E, [(alt e)] like the old MCL. On linux or window's you can bind it to slimes c-x c-e (or whatever) by doing: (define-key slime-mode-map "\C-x\C-e" 'slime-eval-at-mouse) o AMPLITUDE now handles lists of amplitudes. (Anders Vinjar) o New ':from' arg to KEYNUM converts an integer keynum from to its (possibly) floating point equivalent key number in the standard chromatic scale. In addition, :from converts from an integer modal keynum to the equivalent integer keynum in the mode's tuning. (this last option was, confusingly enough, called ':in' previously...) o MIDI events now treat rational keynums like floating point keynums instead of signaling an error. o Implemented missing meta events: midi-port-event, midi-chan-event o Updated documentation on PLAY and event stream classes. o Supercollider and Open Sound Control support by Todd Ingalls (work still in progress) o All files now support the following options, which can be set using the IO macro or passed to EVENTS: :versioning {bool} if true file versioning is on o IO initializations or keywords args to EVENTS that do not actaully have slots in the event stream are now allowed. these are collected and passed to PLAY after the file is written. PLAY supports the following keyword args: :play {bool} if true the file is played after it is written :verbose {bool} if true then play prints command as it happens. :wait {bool} if true play waits till end before returning o New PLAY function plays files .aiff, .wav, .snd, .mid, .sco, .osc etc. EVENTS now calls PLAY on files after they are written. o Variables *midi-player*, *audio-player* can be (re)set to external command strings to play midi and audio files; both default to something reasonable on all platforms: *midi-player* osx: qtplay, else open linux: timidity win32: windows media player *audio-player* osx: dac if clm is loaded, else sndplay, else qtplay, else open linux: dac if clm, else sndplay or nothing win32: windows media player o CM now sets file ouput hooks automatically. The default hooks are play-sco-file play-audio-file play-clm-file play-midi-file play-sc-fil o Added IO macro back. o Ported CM to Gauche Scheme, see: http://www.shiro.dreamhost.com/scheme/gauche/index.html o Ported CM to Lispworks (free Personal Edition) o Ported CM to Guile 1.7.1 --Changes: o Optional args to OUTPUT and SPROUT have been converted to keyword arguments. This is backwards compatible if you have been using the "clausal form" in process macro. o INCOMPATABLE MIDISHARE CHANGES: In order to host both Portmidi and Midishare some name changes have been made in the Midishare API Old Name New Name --------------------- sprout ms:sprout now ms:now output ms:output receive ms:receive receive? ms:receive? midi-open midishare-open midi-open? midishare-open? midi-close midishare-close *mp* *ms* Rationale: Midishare has its own way of implementing realtime processes, timing service, outtputing ev structs and receiving input that don't integrate well into the "regular" cm function names. The solution is to export the midishare implementations from the ms: pacakge so its clear to the caller what is being used. THe midi-port names no longer make sense since two independant MIDI systems are supported, each with its own idea of what a midi-port is. o (SETF SUBOBJECTS) accessor has been renamed (SETF CONTAINER-SUBOBJECTS). o SUBOBJECTS arguments have changed to match MAP-OBJECTS. o LIST-SUBOBJECTS renamed LIST-OBJECTS and arguments have changed to match MAP-OBJECTS. o Removed MAP-SUBOBJECTS and MAP-SUBCONTAINERS. Use FOLD-OBJECTS instead. o the SV macro now supports the keyword form for slot times, ie time or :time can be used. o renamed :in argument to KEYNUM to :from . :in will continue to work but has been removed from the documentation and shouldn't be used... o renamed event stream classes: midi-file-stream -> midi-file sco-file-stream -> sco-file clm-stream -> clm-file clm-audio-stream -> audio-file cmn-stream -> cmn-file o Removed osx-play-midi-file, linux-play-midi-file, win-play-midi-file o Removed the set-xxx-versions! functions o Event streams renamed: event-stream midi-port midi-file sco-file audio-file clm-file cmn-file osc-file o Removed set-{file}-versions!, use :versioning init to all files instead. Bugs: o THe cmio window doens interact welll with playback yet (it clears the hooks.._ Bug Fixes: o Fixed rewrite pattern bug that didn't parse * correctly o Fixed scheme bugs in test.cm CM 2.6.0 o ASDF loading and installing now supported (Thanks Greg Pfeil) See cm/cm.asd and http://www.cliki.net/asdf for more information. o New graphical interface tools in GTK2 added for x86/SBCL, x86/CMUCL and Darwin/OpenMCL: 1. Reimplemented PLOTTER graphics. See: doc/dict/plotter-topic.html etc/examples/plotter.cm 2. New CMIO window provides a "front end" to CM input/output. See: doc/dict/cmio-topic.html o Real-time MIDI process scheduling and interactive MIDI input/output now supported in OSX/OpenMCL. See the section "Low Level Support" in in the MIDI topic documentation for more information: doc/dict/midi-topic.html o New highlevel MIDI event classes replace the MIDIMSG class for generating events to MIDI files MidiShare streams 1. Channel Messages classes: midi midi-note-on midi-note-off midi-key-pressure midi-control-change midi-program-change midi-channel-pressure midi-pitch-bend 2. System Messages classes: midi-system-event 3. MIDI File Meta Message classes: midi-sequence-number midi-text-event midi-eot midi-tempo-change midi-smpte-offset midi-time-signature midi-key-signature midi-sequence-event o New spectral composition function RM-SPECTRUM generates a spectrum of notes/keynums using ring modulation. see: doc/dict/rm-spectrum.html o New chance composition function RANSEGS returns random segments from a specfied distibuition type. See: doc/doct/ransegs-fn.html o Major documentation upgrade (but still not complete...): 1. Added new Pattern overview topic page: doc/dict/pattern-topic.html 2. Rewrote all pattern class documention with new examples. 3. Added documentation for undocumented COPIER pattern: doc/dict/copier-cls.html 4. Added new main MIDI topic page: doc/dict/midi-topic.html 5. Added new documentation for all "high-level" midi classes, see links at the top of the main MIDI topic pages. 6. Rewrote documentation for all randomness functions with new examples, see dictionary entries on ransegs, pick, pickl, etc. 7. Added documentation on new chance function RANSEGS: doc/dict/ransegs-fn.html Added documentation for undocumented function FM-SPECTRUM: doc/dict/fm-spectrum.html 8. New summary tables list important commands in doc/emacs.httml 9. Updated cvs instructions in doc/install.html o Changes to pattern implementations: 1. Random patterns that contain only sub-patterns now have a default period length of 1, which causes the random pattern's period length to track the period lengths of its sub-patterns. 2. copier periods can now track sub-pattern periods using the new :repeat-for initialization 3. new function rewrite-generation returns the next full generation from a rewrite pattern. specify false to its optional second argument to return the current generation without recalculating it first. o MIDI write-event method for midi-files now treats events with zero amplitude as equivalent to events with keynums less than zero: nothing is written to the file and the file's output time is not updated. o Importing CLM score files now supported. o If Midishare is properly installed then CM autoloads it at load time. Untested in a saved image and recommend that you use bin/cm.sh without saving an image. o Common Music's "midi.port" is implemented by a subclass of midishare-stream. The midi-port represents the CM client appliation in Midishare. The following new functions and vars are defined and documented in midi-topic.html midi-open midi-open? midi-close *mp* o New 'cmn' object for generating CMN notes and CMN staff expressions (variables and function calls) to cmn-streams and midi files. See dict/cmn-cls.html for more information. o The calling syntax of the following functions have changed. (They all formerly mixed &optional and &key args.) (plotter-data plotter &key layer ...) (plotter-front-layer plotter) (plotter-property plotter prop &rest ...) (invert list &optional pc?) o The functions 'hertz', 'note' and 'keynum' have been reimplemented to provide additional functionality and to make these functions behave more uniformly. This has resulted in one incompatible change: the :HZ tag used by note and keynum is now a true keyword parameter: i.e. (note 440 :hz t) not (note 440 :hz) The :hz tag will continue to work for the time being but with a warning. Be sure to read the updated entries in the dictionary. o Modes can now be defined with more or fewer than 12 semitones per octave. This new functionality introduced an incompatible change in the syntax of mode definion: 1. To specify note names, use :degrees or :notes, not the :steps init. (Use :notes to create a mode with typed intervals that insure proper spelling when the mode is transposed. Use :degrees for notes or keynums if you do not care about preserving spelling or for any mode that does not use the chromatic scale as its tuning. 2. A :degree or :note list uses the last item to mark the octave: ie ':degrees (c d ef f fs g)' defines a 7-semitone octave. 3. Use the :steps init to specify the mode as a list of intervals between mode degress. the octave size of the mode will be set to the sum of the intervals: (2 1 2 1 1) = 7 semitone octave o Rhythmic symbols can now include a minus sign that negates their value, i.e. -q = -1.0. Such values can be interpreted as "resting" values. A minus sign prepended to a rhythmic expression negates the entire expression, not just the first symbol: -w-q = -(w-q) = -3.0 not -5.0. o new function linux-play-midi-file for playing .mid files on linux. uses a format string in *linux-midi=file-player* to exec an external player. by default this string is set to: "timidity --quiet=2 ~a &" o 'wait' now performs abs on wait values so that negative (rest) values are handled correctly o CM now looks for an init file ".cminit.lisp" in the user's home directory and, if it exists, loads it after loading the "sitewide" cminit.lisp sp the personal init file can override sitewide behavior. Put an explicit (use-package ...) at the top of the file to ensure that forms are evalled in a particular package. o make-cm has new :extensions parameter for loading extensions. see: doc/dict/make-cm-fn.html o Support for loading "sitewide" cminit.lisp files in CLISP 2.33 o CM ported to SBCL, a variant of CMUCL. BUG FIXES: 1. MIDI events with keynum < 0 no longer side effect the midi file. 2. Rewrite pattern now parses wildcard * token in rules correctly. 3. Quantize now rounds up or down the same for even or odd numbers. ---------------------------------------------------------------------- CM 2.4.2 Maintenance release o Fixed numerous formatting bugs reported by Nando. o Fixed make-cm to only check writability on actual file writes. o Fixed cmu.lisp to work with CMUCL 19 and gag their compiler. o Fixed pkg.lisp to not intern any symbols in cl-user package. o Fixed make.lisp to handle inconsistent implementation version strings provided in cmucl. o Fixed cm.sh to handle same cmucl issue, and bug in OX X. o Added link to Emacs doc on home page. o Added link to first mention of cm.sh in install.html o Fixed open-io to check for availability of MidiShare (Nando) o Added write-event method for midimsg objects. o Added more midishare tests to test.cm o Made midishare *dbg* trace a bit more intelligible CM 2.4.1 o CM's installation process has been completely rewritten to make it easier to install. See: http:/commonmusic.sf.net/doc/install.html http:/commonmusic.sf.net/doc/dict/make-cm-fn.html for more info. o a new shell script bin/cm.sh can be use to autoload CM. It works with every supported Lisp implementation and can start CM running in a terminal or under Emacs/XEmacs. type 'bin/cm.sh -h' in the terminal for more info. o CM now works more flexibly with CLM, CMN and Midishare. It is no longer necessary to save image files with these systems hardwired together. Instead, you can compile these systems seperately and then load them when you want to use them. This allows you to work with the most up-to-date versions of the software without have to rebuild images. o You no longer have to compile CLM insturments in the CM package to work with them in CM -- compiled instruments will create CM object definitions even if the ins was compiled without CM around. (You need to install the latest CLM-2 tarball for this to work.) o CM has a new test suite (etc/test.cm) that I use to check the system in its various configurations before releasing the software. o The main CM/readme.text has been updated with a new "matrix" of supported Lisps, OS, and tested features. o CM now works in the OpenMCL 0.14. ---------------------------------------------------------------------- CM 2.4.0 now supports a direct MIDI driver connection using Grame's Midishare real-time MIDI operating system. CM defines two new IO classes for working with Midishare: midishare-stream: interface to Grame's real-time MIDI library A midshare-stream is very similar to the old "midi.port" and how Mi_D handled things. You can define a "logical channel map" for routing MIDI to various Driver ports, and you can have multiple connections active at one time (well, as soon as Grame fixes this in OSX...) player-stream: interface to Grame's MIDI sequencer library A player stream lets CM process either "add" or "replace" events in tracks of a Midishare player (sequencer). Once CM outpus to a player you can use the following set of function interactively (in the lisp inpterpreter) to affect the playback behavior: player-start player-stop player-pause player-cont player-set-tempo player-mute player-unmute player-solo player-unsolo player-save-midifile player-load-midifile You can create midishare-stream or player-stream objects using 'new', 'io' or by including a ".ms" or ".mp" extension (for midishare-stream and player-stream, respectively) in its name. In addtion, for backwards compatibility the special name "midi.port" will open a Midishare stream whose client name is set to "Common Music". (events (foo) "midi.port") ; send events to Midishare (events (foo) "whatever.ms") ; send events to Midisahre (events (foo) "whatever.mp") ; send events to a Player track. ---------------------------------------------------------------------- Features and bug fixes in cm-2.4.0: o event output can now be sent to arbitrary streams in additin to files. All of the io classes that handle input/output have been renamed '-stream' to reflect this new generalization: sco-file -> sco-stream clm-file -> clm-stream audio-file -> clm-audio-file midi-file -> midi-stream cmn-file -> cmn-stream To output to a file just specify the filename as before. To output events to an arbitrary stream, create the event stream and use its :stream argument to pass it your Lisp stream destination. For example, to send CSound events to stdout: (define out (new sco-stream :stream *standard-output*)) (events (blur) out :header whatever) Note that some Lisp implementations provide special functions for specialized output to pipes and streams. For example in CLISP you can used the 'make-pipe-output-stream'. to pipe your output to some app. All of cm's event streams classes now have a new 'mime-type' property that is (currently) unused. o import-events for midi-streams has been completely reimplemented * tempo changes in level1 midi files is now handled correctly. * track zero is always parsed for a 'tempo map'. * tempo maps are applied to all imported tracks in a level1 file. * tempo and tempo maps in the file can be overridden using the new :tempo arg to import-events. * :time-format for importing is now either :beats or :ticks. The default is :beats, which causes tempo scaleing. If :ticks are specified then time values are imported using the raw tick values in the file. * the :note-type arg has been renamed :keynum-format and allows :hertz in addition to :keynum or :note. o function 'fm-spectrum' added to the sources (see chapter 23) o new function 'scale-order' puts a list of notes/keynums in some canonical order: (scale-order list [type] [unique?]) List is the list to order. Type is a keyword that specifies how the list is ordered, Possible values are :up :down or :random The default value is :up. If unique? is true then the list returned by scale-order will contain only unique frequency values. o CM's src/ subdirectory has TAGS file for searching using meta-. in Xemacs. Type: M-x visit tags file Then use M-. To view the cm sorces for a function or symbol at point. BUG FIXES: o 'keynum' and 'note' now correctly handle Lists of hertz values, o the 'with' operator in 'process' is now macroexpanded correctly. Features and bug fixes for CM 2.4.0: o new 'copier' pattern returns multiple copies of each period of a specified pattern. functions similar to the old 'repeat' macro. o 'Palindrome' is now a true pattern and the :elide value can change on each cycle of its data. o The 'join' pattern class made easier to use -- by default the first pattern listed in the join determines the period length of the join. o 'funcall' pattern now respects period length (bug fix). o 'heap' pattern now copies data before side affecting (bug fix) o new ':pickto' initialization for range pattern produces random selection a la between: (new range :from 10 :pickto 30) o patterns now have 'make-load-form' methods and can be saved to files. but patterns like funcall and pval that contain lexical closures will not save correctly. O CM's scheme-to-cltl translator (src/stocl.lisp) now works in all common lisps so anyone can generate the .lisp files from the .scm files. see the comments at the top of the file for more info. o CM now saves an 'xcm' script that automatically starts the saved image under Xemacs in a dedicated frame. xcm sets everything up for you, including a scratch buffer in Lisp Mode. The verion of Lisp-mode it provides includes a Lisp menu with easy evaluation rules (C-x/C-e at point, after point, on region) and some other stuff. CM now also makes the 'cm' and 'xcm' scripts executable for you when it generates them. o etc/xemacs/listener.el improved: 1. lisp-listener function takes optional second arg that specifies the implmentation of the inferior lisp. This optional arg allows commands to be made smarter. If the arg is not specified then the Listener attempts to determine the implementation from the program string you give it to run. Current implementations are "guile" "openmcl" "clisp" "cmucl" and "acl". 2. The command C-x C-. aborts to toplevel in the inferior Lisp buffer no matter what the Error level is or what Lisp you are running. C-x C-. can be issued from inside the edit buffer, ie you do not need to switch to the listener. 3. Background color of Listerner can be changed via: M-x set-listener-bgcolor Type Tab at the prompt for a list of possible colors. 4. Quitting Listener will quit Xemacs if its the only active frame. o the file etc/mtxt/mtxt.lisp contains the source code for the meta markup "language" that I use to generate CM's docs and book. mtxt.lisp works in any common Lisp, at some point ill move it to scheme. o *midi-gm-mode* is now back. if true (the default) then midi-print-message "pretty prints" GM midi messages. o Dictionary formatting improved. o CM now compiles and runs in MCL 5.0 beta on OSX. --------------------------------------------------------------------------- o cm.lisp now sets *readtable* to *cm-readtable* o build variable save-cm can be set to nil to stop cm from saving images. o #! is now #& to work in Guile. #! will continue to work in CLTL. o new 'each' iteration clause in process. see dictonary and last entry in intro.cm o new 'join' pattern implemented the old defmultiple-item from cm-1.4. see dictinary o added plotter back in macos 9.2/mcl o added midi user constants and data back (formally mu.lisp now midix.lisp) o added defprocess back o added copy-object back o fixed :channel-tuning bug in events o fixed :ratios tuning bug o improved dictionary (better layout, missing entries, bugs) readded sv macro fixed bug in events that didnt pass user args on to hooks. markov allows pattern of data. fixed :reflet mode in drunk add :stop mode to drunk, if bounds are exceeded then drunk returns false. added :avoid argument to drunk. If specified this value is precluded from being selected. fix bug in events that didnt pass on user args to hook function. Features and bug fixes for CM 2.4.0: o Fixed CMN clef printing bug. o Changed CMN staff layout to allow per score staffing like in cm-2.3.4 o import load-foreign for cmu o added i and f classes for csound. o added &rest parameter feature for csound see example at end of sco.scm o cm.lisp script now prints out better info. Features and bug fixes for CM 2.4.0: o ported CM to Open MCL/OSX o CMN supported again in Common Lisp. I think ive made it much easier to use. See example in intro.cmn for more info. Please send me feedback on this new method if you use CMN! o CLM2/audio supported again in Common Lisp CM. Ill add it scheme next. o CM now loads a scheme compatibilty file into Common Lisp unless you tell it not to. To block scheme symbols from being defined in the Common Music package do (push :no-scheme *features*) before you load cm.lisp o File versioning now supported by file type. To turn file versioning on/off you call the appropriate function: (set-midi-file-versions! #t) (set-clm-file-versions! #t) (set-audio-file-versions! #t) (set-sco-file-versions! #t) and so on. o Changed CD to behave like Linux CD -- calling CD without an arg now puts you in your home directory. This is incompatible with the last release -- sorry! o Added PWD function to print current working directory. o Added QUIT and EXIT functions to Common Music package. o Changed #i instance printing to show slot names rather than keyword initializations. o Added class for easy subclassing. o Fixed nasty while/until bug in process. o Fixed multiple transposer bugs. o Fixed multiple range bugs. o Ligeti example working. o Includes a nice cm script for clisp/Linux that Tobias Kunze wrote. The script even installs over the net if it has to! Changes to File and Port handling: o The CM logical host is no longer supported (or needed...) o The new 'cd' function can be used to get/set the "current working directory" for file io. This can be used instead of logical pathnames to write output to various locations without haveing to specify full pathnames. o Init files are no longer auto loaded (see next point). This only worked in MCL and ACL anyway. o CM now automatically saves a script file in the cm binary directory when it builds from sources. The script file is a shell command to start up CM once it has been saved. The shell command autoloads a cminit.lisp file located in the same directory as the image and script. You may have to set execute permissions on the script: chmod a+x bin/cm o The functions 'set-midi-file-hook!', 'set-sco-file-hook!' 'set-clm-file-hook!' and 'set-audio-file-hook!' can be used to auotmatically call a function when output of these types is generated. See etc/examples/intro.cm for examples. Three hooks are predefined for midi file playing: 'mac-play-midi-file' plays midi via QuickTime on MacOS 'oss-play-midi-file' uses /usr/bin/playmidi on Linux and 'win-play-midi-file' uses the Windows Media Player. o I havn't hooked audio files back into CLM's innards yet. For now just generate .clm files and load them into clm. You can use the function 'formals->defobject' to compute an object declaration given a CLM function spec. o Default tempo is now 60 bpm. o is not supported in this relase. Use midi files instead and set the output hook. o is not supported in this relase. This is next on my list. Changes to the CM object system: o CM classes are now represented by both variables and names. The class variable is consistently named , where class is the name of the class. For example the variable holds the pattern class named cycle. o 'defobject' now computes optimized write-event methods for any class declared with :parameters specified. This means that compiling defobjects may increase the speed at which they generate output. o There is no longer any root class or a required time slot. Any object can output to a cm port or file if it has a method defined on 'write-event'. (Defobject generates these methods automatically.) To designate a slot for holding the scheduling time value include ":accessor object-time" as part of the slot's definition. (Subclasses will inherit this accessor automatically.) o GOOPS is close to, but not the same as CLOS. In order to get CM working in both systems I made some compromises: 1. Initargs are internally always keywords. 2. The 'new' macro allows initargs to be specified as symbols or keywords. 'new' signals an error if an initarg is not recognized for the specified class. 3. 'make-instance' only supports keyword initargs. make-instance may not signal an error if the initarg is unrecogonized. The following are equivalents: (new cycle of (list 1 2 3)) (make-instance :of (list 1 2 3)) o There is no longer a process object class and the 'defprocess' macro has been removed. it was really just sugar coating for a function anyway so just use define or defun instead. For example, (defprocess foo (a b) (process ...)) is now either: (define (foo a b) (process ...)) (defun foo (a b) (process ...)) o The 'subobjects' slot of now holds a flat list of subobjects. (These were previously held in a specialized structure. o Any object can output to a midi file if it has a method defined on 'object->midi'. the method should return a midi object or list of midi objects. Changes to patterns: o The 'next' function no longer returns a second value along with the element read from the pattern. To get the current state of a pattern use the 'pattern-state' function on the pattern itself. To test if a pattern is at end-of-period use the 'eop?' predicate on the pattern object. o The ':returning' option to patterns expects a function of one argument and is passed the value read from the pattern. o The ':of' option to the 'funcall' pattern now expects a thunk (function of no arguments) as its value. o The syntax (new pval {expr}) is no longer supported. Instead use the new 'pval' macro or supply a function of no arguements to the pval's ':of' option: (pval {expr}) (new pval of (lambda () {expr})) Changes to printing and read macros: o The #n, #k and #h and [] read macros have been removed. o #i is a read-macro for instances and it is defined for all objects. If you don't want this behavior set *print-object* to #f. Code Portability o the 'define' special form is implemented in CLTL. define can be used to define both variables and functions. define does not return a value o the CM variables 'true' and 'false' can be used instead of nil/t or #f/#t. This allows your code to be source porable between CL and Scheme. o The 'process' macro supports a 'set' clause that assigns BUT DOES NOT BIND the variable: (let ((foo 1)) (process repeat 10 set foo = (list j) ...)) This lets you write code without setf or SET!. o The file src/scheme.lisp contains some additional scheme definitions you can use in CL. Ill add more over time. Please send me any that you find yourself implementing! o loop.scm provides an implementation of the CLTL2 loop macro. Some cursory tests indicate that the speed of this loop is equivalent to Guile's 'do' macro. o cltl.scm contains functions and macros that provide some compatibility with cltl2. The file includes find, position, byte, ldb, dpb among others. It also provides a macro callewd with-args that implements required, &optional, &key, &rest and &aux parameter binding given a list of argument values. For example, the CL defun: (defun foo (a b &key (c 1) (d c)) ...) can be implemented in Scheme as: (define (foo . args) (with-args (args a b &key (c 1) (d c)) ...)) o There are also a number of CL compbabilty modules for Guile. I deliberatly decided to not require these because when I started this Scheme port I wanted to maximize the ability of moving CM to other Schemes (Bigloo?). If I had to do it over again, I'd use Guile's goodies! CM only uses Goops and pretty-print from Guile's modules. Miscellaneous changes: o CM documentation now in dictonary format. The entry point is doc/dict/dictionary.html o 'shuffle' now only accepts lists o Keyword arguments to 'markov-analyze' changed: (markov-analyze list &key order print? pattern? sort? print-decimals key) o CM no longer requires or assumes CL case insensitivity. o The file listener.el implements an XEmacs Lisp listener window that will work with guile and cltl2. See the comments in the file for information on how to use it. o Michael Klingbeil fixed 'vary' to work with negative values. Known Problems: o the 'system' call does not seen to work in Window/Guile so currently setting output hooks doesnt work. ____________________________________________________________________ Features and bug fixes for CM 2.3.4: o CM ported to SBCL Common Lisp 0.7.2 o New RANGE pattern enumerates numbers in a range. Can also be used for creating cycles and bounded random walks. o New TRANSPOSER object replaces the hackish intervals macro. TRANSPOSER is not itselef a pattern but allows patterns in its data. The object also supports 12-tone manipulations like inversion, retrograde, retrograde-inversion and multiplicative and modulus from an offset. o DEFPROCESS can now return a list of processes. See the new file "cm:examples;reich.cm" for an example of this. The file "cm:examples;ligeti.cm" also contains process lists as well as uses of the new RANGE and TRANPOSER objects. o The SPROUT and OUTPUT process clauses now allow lists of objects to be sprouted or output. o New "typed" pattern inits can be used in place of OF: NOTES KEYNUMS RHYTHMS AMPLITUDES INTERVALS These all cause data specified as their value to be parsed according to the function for which the init is named. For example, the following two are equivalent: (new cycle of '(c5 d e) parsing #'note) (new cycle notes '(c5 d e)) o KEYNUM and NOTE now support an explicit :TO scale. o New tuning entries in cm:etc;examples;scales.cm for Sargam, Just, Meantone, Werckmeister 3, and Wendy Carlos' Alpha scale. o New LOOKUP function performs non-interpolating x-to-y lookup. Y values do not need to be numbers. o New RESCALE-ENVELOPE rescales an envelope according to new upper and lower bounds on either axis. o New SCALE-MOD function performs modulus operations on notes. o DEFOBJECT now defines slot accessors for slot discriptions that don't explicity provide them. The name of the accessor will be - where is the name of the object being defined and is the name of the slot. To declare a slot without any accessor specify :ACCESSOR NIL in its description. o Examples of pattern definitions like: (new cycle a b c) have been removed from documentation. Examples now always show explicit OF initializations like: (new cycle of '(a b c)) o The (new pattern ... in ...) hack has been removed from documentation but continues to work. o TRANSPOSE now accepts note names in its second arg. o New contrib file: cm:etc;contrib;bezier.lisp implements bezier curves in Plotter thanks to Bret Battey. o More example tunings and modes added to "cm:examples;scale.cm" o cm:ect;contrib;cm.el supports easy point and region evaluation for inf-lisp in XEMACS. also supples an inferior lisp that runs in its own frame and key bindings that allow APPLE commands for eval, copy, paste etc. o Lots of mode/tuning bugs fixed, thanks to Bret Battey for finding them! ____________________________________________________________________ Features and bug fixes in CM 2.3.3 o CM ported and tested in: * ACL 6.1 Windows/Linux/OSX. (You can get a free, renewable license for ACL 6.1 from http://www.franz.com.) * CLISP 2.28 Windows/Linux. o Improved CLM support: * New IMPORT-EVENTS method for .clm files parses instrument calls into CM objects and returns them in a list or seq. * CM now passes _all_ with-sound options to CLM. * All file and dac io now handled direclty by CLM. the CLM entries in cm:etc;handlers.lisp have been removed. * New :TRACE-OUTPUT option for AUDIO-FILE (.aiff, .wav .snd) causes CLM events to print their instruments and start times as they are output to the open audio file. * INS subclasses now inherit default values for &optional instrument args. * Parameter decimal formatting in CLM score files removed. * CM filenames with "wav", "snd" or "aiff" extensions now pass default :TYPE and :FORMAT args to CLM:INIT-WITH-SOUND so the sound file's type and data format agree with the file's extension. this behavior can be overridden woth explicit :TYPE and :FORMAT values. o Tunings and modes are fully implemented. * Tunings can now be defined with note tables. * Mode steps can now be defined in terms of "typed intervals" (see discussion below) so notes returned in the mode agree with the mode's current tonic + step spellings. * Modes can now be defined on any tuning, not just the standard chromatic scale. * Tuning keynums are "unbounded" so hertz <-> keynum conversion can be calculated in any octave. (Tuning note tables are only defined over a specified number of octaves, default is 10.) * New file cm:examples;scale.cm contains some example tunings and mode definitions. o Arguments to NOTE, KEYNUM, HERTZ have changed to allow new functionality. The most important changes are: * Specific tunings and modes can bw specied to the functions using the new :IN and :FROM argument. :IN specifies the scale to use, and defaults to *SCALE*. The :FROM argument allows keynums and notes in one scale to be converted from one scale to their equivalents in another scale. * New :ACCIDENTAL argument to NOTE causes the note returned to agree with the specified accidental. The value of :ACCIDENTAL can also be a list, in which case the list specifies a preference ordering of possible note spellings. ? (note 60 :accidental 's) BS3 * Hertz values input to NOTE and KEYNUM must be explicitly "tagged" by adding :HERTZ or :HZ (symbol or keyword) after the value. This behavior is not "backward compatible". ? (note 60) ; return note name of keynum 60. ? (note 60 :hz) ; return note name of frequency 60. * The variable *NUMERICAL-FREQUENCY-FORMAT* has been removed. o New "typed interval" preserves note spelling in transposition. Typed invervals are created using the new INTERVAL function and can be decoded using DECODE-INTERVAL. See the new section about type intervals in the standard scale documentation in "scales.html". o TRASPOSE now allow the transpostion amount to be either the integer half steps or a "typed interval". o New global variable *SCALE* holds the default scale (tuning or mode) used by functions like NOTE, HERTZ, KEYNUM and TRANSPOSE. *SCALE* is initialy set to the standard chromatic scale. o New global variable *STANDARD-CHROMATIC-SCALE* holds an instance of the standard chromatic scale. o The functions CENT->SCALER and SCALER->CENT have been renamed to CENTS->SCALER and SCALER->CENTS. o The function OCTAVE has been renamed OCTAVE-NUMBER. o The functions MODEIFY and UNMODEIFY have been removed. The same functionality can be achieved by using the :FROM and :IN scale arguements to KEYNUM and NOTE. o THe macro INTERVALS is no longer documeted and will dissapear in an upcoming releawse. I will replace this messy hack by a new object class that implements complex pattern transposition. _____________________________________________________________________ Features and bug fixes in CM 2.3.2 o tuning steps can be specified using cents or ratios and the step values can be incremental or absolute. If absolute steps are specified then the "octave width" is set to the last entry: (new tuning cents (loop repeat 12 collect 100)) (new tuning cents (loop for i to 1200 by 100 collect i) (new tuning ratios '(1 9/8 3/2 27/16 2) o intervals macro supports MODE arg. if specified the intervals returned from the pattern are mapped from the mode into their equivalents in the standard chromatic scale. this o MODEIFY and UNMODEIFY now take optional arg to coerce calues to/from mode degees to keynums, hertz values or note names. o aiff-file renamed AUDIO-FILE. by default the audio-type of an audio-file is determined from the file's extension (aiff, snd, wav). o new CHANNEL-TUNING initialization for midi port and midi files supports both pre-tuneed equal division channel tuning or tuning as needed on a per note basis. The changes are as follows: 1. the DIVISIONS-PER-SEMITONE initarg to midi files and ports has been renamed CHANNEL-TUNING 2. if the value of CHANNEL-TUNING is a number between 1-16 then midi channels are pretuned to that number equal semitone divisions. This is how DIVISIONS-PER-SEMITONE worked. 3. If the value of MICROTUING is T then floating point key numbers trigger pitch bends to be sent before each key number. 4. In either case the midi note is routed to a channel determined by the system. See the documentation on MIDI-PORT for more information. o markov-analyze now supports :sort and :decimals arguments. the :print? arg has been renamed to :print (sorry!) o new contribuation file cm/etc/contrib samples.cm implement a software sampler using CLM's Mix object. it creates a "sample database" from a directory of sample files and provides some useful functions to work with samples and CLM's MIX instrument. The function FIND-SAMPLE finds the closest sample to a floating point keynum. The function TUNE-SAMPLE srates shifts the sample to correspond to the same freqency as the the floating point keynumber you specify. the function DEGREE->MIXAB translates a panning position in degress to MIX's panning :AB channel scalers. o new example file cm/etc/examples/sinewave.ins is a simple clm instrument you can use to learn about envelopes, glissando and panning. o new PLAY function for playing files. methods are currently defined for midi-file and audio-file. _____________________________________________________________________ Features and bug fixes in CM 2.3.1 o New MODE and TUNING classes support user defined scales. The functions MODEIFY, UNMODEIFY and FILTER-MODE allow conversion between modes/tunings and the standard chromatic scale. See new section 4.1.2 "Modes and Tunings" in doc/ref/tools.html for more information. o PROCESS macro completely reimplemented, new clauses added: OUTPUT {object} [INTO ] WAIT {value} WAIT-UNTIL {value} SPROUT {object} [AT {time}] INITIALLY {expr} IF {expr} {clause} {AND {clause}}* [ELSE {clause} {AND {clause}}*] WHEN {expr} {clause} {AND {clause}}* UNLESS {expr} {clause} {AND {clause}}* PROCESS error messages now contain a clause context string. PROCESS now warns if non-terminating algorithm is defined. Examples in process.cm reflect new process syntax. See doc/ref/processes.html for updated description. o CHORD object reimplemented, now always return a LIST of chord members, ie (next [c4 e4 g4]) => (C4 E4 G4) See section 4.1.3 "Chords" in doc/ref/tools.html for more information. o new MIN and MAX options to the INTERVALS macro. o new DOEACH macro. o (NEXT {thing} T) now returns a list even if {thing} is not a pattern. o New example file "ligeti.cm" has Tobias Kunze's modeling of Ligeti's first piano etude (Disordre). Incompatible changes: - MARKOV-ANALYZE arguments simplified and the return value changed. Its now possible to return a markov pattern object from the function. See new documentation in doc/ref/tools.html - SPROUT now requires its time arg. This arg was previously optional. Documentation for sprout was incorrect and has been fixed, see doc/ref/process.html - TRANSPOSE now returns note names if either argument is a note. - SCALER-TO-CENTS renamed SCALER->CENT - CENTS-TO-SCALER renamed CENT->SCALER - SUBHOLDERS has been renamed SUBCONTAINERS. - CHORDING? function removed. - FLAGS slot removed from all objects. - Some system class names and class organization has changed to accomodate Scheme port. This should not affect anyone. Bug FIxes: - KEYNUM now rounds instead of trucnating. - INTERVALS with STEP option fixed to postincrement the transposition offset. To get the former behavior (preincrement the transpositino use the new PRESTEP option. _____________________________________________________________________ Features and bug fixes in CM 2.3 o Updated documentation with new sections, examples and entries. Greatly improved formatting and appearance thanks to Tobias Kunze, who also designed a really cool new splashscreen for CM: http://www-camil.music.uiuc.edu/software/cm/splashscreen.gif Reference manual also has new entries, examples, and sections. o Plotter enhancements: - Added "Import..." item to File menu. Copy/Paste calls Import automatically if the clipboard contains coordinate lists. - Export dialog now lets you select floating point resolution. - Added "Delete Plot" to Plot menu. - Removed "New" from File menu. - Removed "Default" item and renamed "New Default..." item to "Point Size..." in the slot menu. - Removed assorted debugging trace messages. o Two new contrib files: - cm;contrib;cm.el: an EMACS edit mode for XEMACS with the same key bindings for LISP evaluation and Copy/paste as MCL (It defines the ALT key next to the Spacebar as the Mac's COMMAND key). The CM mode also runs a Lisp Listener in a separate XEMACS frame and provides much better mouse evaluation support that inf-lisp. CM mode also has indentation rules defined for CLM, CM and CMN. See the comments at the top of the file for more information. - cm;examples;ring.cm: some rotation patterns for change ringing. o On the Macintosh CM is now saved as a true application with its own Finder icons, splashscreen and a new Mac "creator" type CM-2. If you dont want the splashscreen (but cripes it only lasts 2 seconds) then put (setf *cm-splashscreen* nil) in your cminit.lisp file. If you want to continue to save CM as a MCL application (the old way) then set new build parameter CM-APP-TYPE to :LISP. CM-APP-TYPE can be: :CMDEV save cm as its own app including compiler. :CM save cm as its own app no complier (binary release). :LISP save cm as lisp image. The default is :CMDEV. o The HELP function supports a new keyword :TYPE that controls what types of entries are listed. Can be :all :class :clause :function :macro :menu or :variable. On the Macintosh the Help Worksheet allows the help entry types to be specified using the new pop-up menu of Help types. o Removed the MIDIT object. The MIDI object now outputs microtonal keynums (Michael Klingbeil) so MIDIT is no longer necessary. o New microtonal support in MIDI. New options to MIDI port and files: :DIVISIONS-PER-SEMITONE (defaults to 1) :PITCH-BEND-WIDTH (defaults to 2) If :divisions-per-semitone is more than 1 then that many channels are claimed by CM and returned to produce microtonal output at the resolution of :divisions-per-semitone. MIDI events with floating point key numbers kkk.cc will automatically be routed by the system to the proper channel to produce the cent portion of the keynum (cc) at the resolution of :divisions-per-semitone. o Removed the RELEASE slot from MIDI objects o New #E read macro for creating musical events. #E is similar to Lisp's #S read macro except that #E creates EVENT instances. o PRINT-OBJECT now prints events as #E expressions. o New *E-FORMAT* variable controls how event slots in #E expressions are printed: T - print all slots with values. :TERSE - print all slots with non-default values. :PARAMETERS - print all parameter slots with values. :TERSE-PARAMETERS - print all parameters with non-default values. The default value is T. o The OF option to patterns now accepts non-lists as data so the forms (new pattern of 'x) and (new pattern of '(x)) are equivalent. o INTERPL and TENDENCY now allow the :SCALE and :OFFSET args to be alternately specified as :MIN an :MAX. In this case :offset is set to :min and :scale is set to (max-min). o CM ported to MCL 4.3.1 and ACL 6.1 BUG FIXES: o rewrite pattern ignored INITIALLY arg. o palindrome pattern ignored ELIDE arg. o SAVE in plotter wrote temporary cache values to files. o PASTE in plotter updated the incorrect view when the destination view was not the same as the source view. o EXPORT in plotter always exported selection to window. o Plotter error when no coords defined in new plot. o Plotter error when all coords at time 0.0. _____________________________________________________________________ Features and bug fixes in CM 2.2.1 o Ported CM to CMUCL and CLISP 2.27. o Updated documentation and etc/emacs sample init file. o SAVE-OBJECT saves seqs to files. o Process objects to be created using new. o CM now appends the version number to the default image name. Bug Fixes o Fixed bug in set-cm-host-dir that ignored :wild-inferiors o Handlers for midi and clm files fixed to allow :PLAY NIL o insert-object now works with null subs. o fixed parse-parameter-specs to add keyword args for CLM. o removed parameter checks for csound's F class and I class. _____________________________________________________________________ Features and bug fixes from CM 2.2. I've listed the changes that affect all ports first: o New support for CSOUND courtesy of Donald Craig at CARTAH. The changes require that you recompile any csound object definitions. 1. New F class implements dynamic ftable statements in .sco files. See the entry in the cm reference and the example file "cm:examples;ftable-demo.lisp" for more info. 2. New *PRINT-DECIMALS* variable controls the default number of decimal places a parameter value is rounded to when printing. The value of *print-decimals* should be an integer between 0 and 7. The default value is 3. 3. New :DECIMALS keyword option to parameter declarations in DEFOBJECT allows decimal precision to be controlled on a per slot basis. See cm:examples;beep.lisp for an example. 4. The :header option to sco-file can now be a string or list of strings. If the latter, each string in the header list will be printed on a new line. 5. defobject no longer checks parameter ordering for csound objects. o Reorganized the Common Music Reference into a number of chapter files and improved the overall appearance. I also changed the format of the entries to agree more closely with the format of entries in CLtL2. The main file for the reference is cm-2.2/doc/ref/cmr.html o EVENTS now allows objects to be referenced by name, ie (events "foo") is equivalent to (events #!foo ) o New FINALLY clause for the process macro executes a form when the process has finished. The FINALLY form can be used to "clean up" or to sprout to a new process without having to know when the current process actually ends. o DEFPROCESS now always creates a function defintion. Previously, a function was only defined if the defprocess had lambda args. Now a process can be referenced three ways, depending on your preference: #!foo (foo) "foo" o Process objects now have an :args slot initialization whose value can be an argument list to pass to the process when it is scheduled to run. The net result is that a process can be manipulated as function or as an object; which style to use is simply a matter of preference. o Added back the AMPLITUDE function from cm 1.4. Its syntax has slightly changed, see cmr.html for more information. o New INVERT function inverts a list of freqs. The inversion can be either strict or "mod 12". See cmr.html for more info. o VARY function changed to accept an optional argument that places the variant value either :around, :above or :below the specified value. The default is :around (vary 100 .05 :above) => 100-105 (vary 100 .05 :below) => 95-100 (vary 100 .05 :around) => 97.5-102.5 This is an incompatible change since the former definition calculated value +- variance. o TRANSPOSE now transposes both note sets and interval sets, ie both of these are now possible: (transpose '(0 1 2 3) 'g4) (transpose '(c4 cs d ef) 7) o New INTERVALS macro, see docs for more info. o ODDS changed to accept an optional random state object. o New F rhythm qualifer for quituplets, ie F16 for quituplet sixteenths. Courtesy of Hans Peter Kyburg. o New contrib file cm:contrin;abbrev.cm contains numerous macros for easily specfiying various types of patterns. (Hanspeter Kyburz) o New contrib file cm:contrib;sampler.cm provides an object for working with large collections of aiff files using CLM1's mix function. I used it extensivly when composing Aeolian Harp on a collection of plucked piano samples in aiff files parsed from the McGill CD. sample.cm also has other support functions for cutting samples out of audio files and so forth. sampler.cm has received additional modifications from Michael Klingbeil. o The [] chording read macro has been added back. o New :exact-rhythms option for CMN streams. PLOTTER: o Plotter's interface made sleeker by replacing the rename buffer with a rename menu item. o Edit Object worksheet now supports expressions and slot references in value typeing fields. If more than one object is edited the worksheet expressions are evaluated for each object in the selection. Edit Object now basically has the same functionallity of Stella's old MAP commands. o New Find worksheet Finds and selects all object in which a given query expression is true. Querys are fomulated graphically in the Find window. A single query can consist of multiple tests connected by AND or OR. o New Edit menu command Quantize Quantizes selection to grid or to a specified resolution. o New Edit menu command Select Selects points or region withing the specified boundaries. o New Edit menu command Rescale Proporitionally rescales selected points to lie withing new minimum and maximum boundaries. By reversing the values in the min and max fields the rescale dialog can also be used to effect retrograde and inversion in point data. o New Edit menu command Set Mouse Hooks Calls a user specified function whenever the appropriate mouse event occurs. THere are currenlly two types o hooks: :add-point-hook and :selection-hook. o Grid drawing for Keynum and note axis marks c e g with darker lines so you can tell more clearly what notes are being plotted. o A new main Plot menu encorporates the functionality of the old Plot pop-up menu o Cosmetic changes to home page cm.html. o Lisp code for examples in in plotter.html can be found in cm:examples;plotter.cm o When a new graphing slot is specified on the Vertical dimension a new display axis is automatically created if the current axis is not approportate for the new variable. This will be the last release with new "features" for a while as I try to port the kernel and Plotter to Guile... _____________________________________________________________________ Features and bug fixes from CM 2.1 o Plotter, a new GUI tool. Check out the cool gifs! http://www-camil.music.uiuc.edu/software/cm/installed/cm-2.1/doc/plotter.html - Lets you display any set of CLOS objects in four different graphings styles: line, scatter, piano roll and histogram. - Up to 5 dimenensions in your data sets can be simultaneously displayed. - Sound output to any cm destination. Mix output from multiple plots, play single plots or play selected points in a plot. - Multiple plotter windows and multiple plots per window, Copy/Paste between plotter windows, load/save, export. - Editor supports point and region selections, edit marks, axis sweeping. - GUI fully integerated into CM2. plot is subclass of Seq, plotter windows can be output destination for process events. - Superfast Scrolling/Zooming courtesy of Michael Klingbeil. - GUI layout and nice html menu help ideas stolen from Snd. o New MIDIT object (Tuned Midi) for working with microtonal tunings. MIDITs do not send pitch bends, they distribute microtones across a range of channels you initialize using SETBEND and CLEARBEND processes or the Tune Channels dialog window (MIDI menu on Mac). MIDITs support up to 16 divisions per semitone, rougly 6 cents per division. MIDIT comes courtesy of Michael Klingbeil. see docs and "cm:examples;processes.cm" for more info. o New contrib function FM-SPECTRUM in "cm:etc;contrib;fm.lisp". This is the main function I used to write Aeloian Harp. It will return an fm "spectrum" as note sets, floating point keynums or hertz values. The amplitudes of the spectral components can optionally be included in the spectrum. FM-SPECTRUM can also invert the spectrum and fit it within high and low boundaries. The last example in process.cm use the function with the chord and funcall patterns to output fm pseudo-jazz harmonies. o CHORD pattern added back to Cm-2. The new CHORDING? function tells you if a pattern is chording or not. Note that in Cm-2 a chord does not automatically stop time from incrementing so you can now strum chords, for example. See the docs and "cm:examples;processes.cm" for several examples. o New RAN function supports many different types of random distributions: uniform, beta, gaussian, exponential, cauchy high-pass, low-pass, band-pass, poisson and gamma. See docs for more information. o New CM menu, dialogs and worksheets on the Mac. o KEYNUM no longer rounds Hz values so keynums now accurately encode Hertz values. Use with MIDIT divisions to quantize Hz values to a very fine accuracy. o New functions CENTS-TO-SCALER and SCALER-TO-CENTS. o New HISTOGRAM function creates a histogram from a data list. (Michael Klingbeil) o New HISTO macro creates a histrogram by executing a form some number of times. o OUTPUT now takes optional stream argument so a process can now output to more than one destination. o Standard scale now defined to just above 22050, includes entries for double sharps and double flats. o MAP-SUBOBJECTS now also maps subholders by default. o FIT, SCALE<, SCALE<=, SCALE=, SCALE>=, and SCALE> functions added back into CM-2. sorry! o Tons of bug fixes, tons of new bugs added. I anticipate that the next release will happen fairly quickly as i add things to Plotter. Please send suggestions and bug reports. I intend to port Plotter to linux later this Spring. _____________________________________________________________________ Features and bug fixes from CM 2.0 Common Music 2.0 is a complete rewrite of the system. Version 2.0 is smaller, faster, more powerful and (I hope) simpler to use than earlier versions. The major new piece of functionality is a new mechanism for defining algorithmic processes called defprocess. defprocess replaces algorithm, generator and mute in earlier releases of CM, but unlike these earlier forms it places no restrictions on how many or what types of events are output each pass. Defining a process is as simple as writing a Lisp loop, which defprocess deliberatly resembles. All of loop's iteration clauses are supported by defprocess. See http://www-camil.music.uiuc.edu/software/cm/doc/api.html#Musical_Processes.chapter for more information. Other main features of CM 2.0: o New consless scheduler runs six times faster than the previous scheduler. It also runs without side effects so multiple instances of the same object can execute concurrently. o Revised object system is smaller and simpler. o File and Port input/output has been completely reimplemented, file output now includes optional versioning. o user defined handlers can be associated with files for arbitrary post-processing of results. o Improved csound support, revised I event class, new function IMPORT-EVENTS translates csound scores into data sequences in CM. Importing supports sorting and most .sco file "carry" features. o New generalized PATTERN class replaces item streams. o New reference manual http://www-camil.music.uiuc.edu/sotware/cm-2.0/doc/api.html o Top level lisp functions replace command interpreter. o Simpler installation. o System is now released under the GNU Copyright license. _____________________________________________________________________ Features and bug fixes from CM 1.4 Most of the changes in 1.4 affect the Macintosh port of Common Music. These changes are too numerous to account here -- suffice it to say that CM's GUI interface underwent a drastic revision! New features include Enved, a graphical editor for displaying and editing musical data, a new Common Music menu design, and new dialogs, including Mix Output (COMMAND-U) and the MIDI setup connection dialog. New Dictonary entries: enved.html *MIDI-OPEN-AUTOMATICALLY* _____________________________________________________________________ Features and bug fixes from CM 1.3 o New tempo objects side effects output streams for dynamic global tempo changes. Tempo objects can also be written to output files. See new Timing and Tempo entries in the dictionary. o New class Multi-Stream supports multiple file and file types being managed simultaneously during output processing o New VRML output syntax. This is as of yet experimental and not a syntax option but the file can be compiled/loaded by hand. Feedback is greatly appreciated. See cm/kernel/vrml.lisp. o New Meter and Key classes implement meter changes and key signatures, useful for working with output syntaxes like CMN and MIDI. See dictionary entries for more information. o midifile-import completely rewritten to better support Level 1 MIDI files. midifile-import now allows data to be imported either in logical or raw time formats, allows any subset of tracks to be imported at once, allows any set of channel and/or meta opcode types to be skipped on a per channel basis, etc. See the new entry in the dictionary. o All MIDI messages types are now supported, as are constants for General MIDI patch changes, drum kit specifications, manufacturer ID codes, SMTP time coding, controller definitions, etc. o New variable *midi-gm-mode* may be set to T in order to enable printing of GM patches and drum kit names. o New system patch facility automatically loads system patches. o New functions note-class, interval-class, and prime-form for working with note sets. See new entries in dictionary. o New interval type preserves note spelling during transposition and note generation within the intervals macro. All intervals up to doubly-augmented and doubly-diminshed within an octave are predefined. See the dictionary entry on definterval [Macro] for more information. o Interval streams now automatically coerce the "return values" to be the same type as the transposition offset specified to the pattern. o *chromatic-scale* now supports double sharps and flats. o New Parameters commmand in Stella displays object parameters. o New :clm-bin-directory and :cmn-bin-directory arguments to make-cm for loading binary files kept apart from sources. If not specified, these arguments default to :clm-directory and :cmn-directory, respectively. o markov-analyze now allows a null stream to be specfied, in which case the lisp expression that creates the markov pattern is returned (contributed by Jim Meehan). Changes: o Mac lib "Mi_D Library PPC (MCL)" has been renamed "libmi_d.so" o Keyword arguments to midifile-import have changed. o With the introduction of the Tempo, Key and Meter classes, CM no longer writes a time signature or tempo change in a midifile unless you explicitly set its Tempo and Timesig slots. o Modes are no longer side-effect by interval streams. o DEFMDDE has been renamed MODE. o the Intervals macro no longer takes a "returning" argument. Bug fixes: Lots. Really. _____________________________________________________________________ Features and bug fixes from CM 1.2 (27.3.98) o New version of Mi_D support. 1 *midi-preferences* is superceded by *midi-default-connections* 2 see the new MIDI documentation, in particular the entries on - *midi-default-channel-map* and *midi-default-route-map* - *midi-default-max-logical-channels*, *midi-default-max-routes*, *midi-default-max-connections*, *midi-default-max-mappings* and *midi-default-queue-size* o Dictionary has been completely reorganized and is now frame based. o New macro DEFMULTI supports sending packets of MIDI program changes. o New option :NOTE-OFF-STACK to midifile-import. If true (the default) then multiple note offs are paired to note ons with the same channel using a FIFO scheme, otherwise FILO. o New *midifile-player* var, can be used to play midifiles in ports of CM that do not support a direct connection to the MIDI driver. Bug fixes: _____________________________________________________________________ Features and bug fixes from 1.1.0 (18.11.97) Features: o Low level MIDI completely reimplemented to use Tobias Kunze's portable MIDI library. o MIDI Meta Messages can now be imported. o Introducing Mindy, a graphic front end (MCL) to designing networks of CLOS objects. To learn more about Mindy, load doc/tutorials/mindy/*.cm o New document doc/contrib/loop.html discusses iteration and loop. o New help facility: HELP command and "Help..." menu item now try to use Netscape to display text. Help also supports topic searching. The CM Dictionary has been reworked to hold all documentation for the system including stella command documentation, midi message documentaton (formerly midi.html) and the api (formally api.text). o MIX and SEQ now allow the optional specification of an output stream, which defaults to the the currently open stream. mix 1,2 0 play nil ; mix to currently open stream. mix 1,2 0 test.midi play nil ; mix to test.midi o New ! command for history execution. ! repeats a previous input line. use ! ? to print the current history. type DOC ! for more information. o defobject now creates CLM objects without definstrument definitions. o New containers INFILE and MIDI-INFILE produce output events from a file. o new MUTE and UNMUTE commands for making objects silent or sounding. muted objects dont produce output but still increment time. o OPEN {thread} creates a "copy stream" that caches all output to {thread}. o #! (find-object) now works with streams as well as objects. to ensure case sensitivity put the file name inside "" , ie #!"test.midi" o Commands REHASH, LISTEN, SYNTAX, SLISTEN, SWRITE and WRITE have been removed. o parse-rhythm now takes optional errorp argument. default is t. Bug fixes: o CENTS now coerces to float to avoid fixnum overflow o Added RHYTHM method to return item streams unparsed. o CLM streams now post-process specified options correctly. o MIDI real-time scheduling now handles time incrementing correctly o undefined excl::variable-globally-special-p fixed. o timeing bug on midi-messages to files fixed. o fixed print-object bug that omitted spaces before pointer display. o fixed load-cm to not load clm or cmn if directory set but not on the syntax list. _____________________________________________________________________ Features and bug fixes from 1.0.0 (15.7.96) The main focus for this release has been in adding real time support to Common Music. Most of this effort has been in optimizing the scheduler and eliminating all non-explicit memory allocation in the run time system. This work has necessitated the addition of several major new features and the reworking many of existing primitives: o New "Working with Algorithms in Real-time" chapter in Stella Tutorial. o The scheduler has been optimized and rewritten to use resources and now runs conless. See build/benchmarks.text for more information. o Two system clock modes are now supported: :SECONDS and :MILLISECONDS. When the clock mode is :seconds (the default), values for rhythm, start, duration, etc. may be expressed as rational or floating point time values. If the clock mode is :milliseconds, time value must be expressed in integer milliseconds. :Millisecond time mode is consles" and may result in much faster system time calculation. o The new function CLOCK-MODE returns or resets the system clock mode. The clock mode defaults to :SECONDS. o New CLOCK and SCHEDULING options to the OPEN command in stella. o Rhythm streams now produce integer millisecond values if the clock mode is :milliseconds. If clock mode is :seconds, the values returned are now dependant on the tempo factor: an integer tempo produces rational rhythmic values, a floating point tempo produces floating point values. o *standard-tempo* now defaults to 60.0 not 60, so by default the system still produces floating point seconds. 0 :return-type made more general and now applies to many functions: interp, rescale, expl, explseg, explsegs, tendency, fit. If :return-type is not specified, the value returned depends on the type of value produced by the calculation iteself so if all X and Y values are rational than rational values will be returned. If X or Y values are floating point then floating point values are returned. :return-type '(float n) rounds the value to n digits. o New functions EXPLSEG and EXPLSEGS o *random-range* variable controls how the random pattern calculates probabilities. Set to most-positive-fixnum to enable conless probability calculation. Other new features: o 32 logical channels of MIDI now supported. Each logical channel can be individually routed to 2 ports, 16 channels per port. o New function MIDI-RECEIVE for MIDI processing. In MCL 3.0 and ACL the processing happens asynchronously. See the RECEIVE command in stella or the new "Receive..." window in Capella. o definstrument supports new :printer argument for specialized printing, and :time-parameter for specifying the parameter to pass time in. o New features for midi-note objects: 1) Duratation is optional, if unset it defaults to rhythm. 2) Amplitude and Release values have been made consistent: Amplitudes >1 are assumed to be integer midi velocities <128 Releases <1 are assumed to be logical amplitudes. 3) Amplitude default to 64. o New rhythm characters: M=Maximum (w*8), L=Long (w*4), B=Breve (w*2) The rhythm character D=Double has been removed. o New macro MESSAGE-CASE for message type conditionalization. o New function SHUFFLE o New function SCALE-MEMBER for testing scale reference membership. o New output syntax M4C (Music 4C). o New initializer and finalizer slots for event streams. if specified they are invoked just before/after streams are opened/closed. o Removed *compile-algorithms* added compile-algorithm o DEFMODE now allows modes to be specified by note names. o Funtions MODE-NOTE, MODE-DEGREE and MODE-PITCH documented. o TENDENCY allows alternative random generators to be specified. Bug Fixes: o Fixed command parser to read strings inside of lists. o Fixed interval streams to allow rests. o Fixed real time scheduling to not ignore rests. o Added fheader back in the system. o Sprout fixed in Clisp. o notes default to the middle octave for each substream steam o unbounded number streams no longer break and have a period of 1. o MIDI-NOTEs now signal error for out of bounds keynums. o *standard-chromatic-scale* now defined to 131 notes. o *rest-pitch* now most-negative-single-float. _____________________________________________________________________ Features and bug fixes from 2.2.96 o Added Timesig and Tempo slots to midi-file streams. Default Timesig is 4/4, 24 clocks, 8 32nds Default Tempo is 120, as specified by MIDI spec. o Added Scaled-to slot for clm-sound-file streams. Bug Fixes: o Fixed various pathname problems in CLISP DOS port. o fixed retrograde to handle :chording states o fixed transpose to handle rests, _____________________________________________________________________ Features and bug fixes from 26.1.96 o dictionary.html and stella.html split into smaller files for easier web browsing. all docs now pass HTML error checks. o Added OS/2 and WIN32 as features for CLISP. File extensions are currently still handled like dos -- LSP and FSL. o moved cm.el from examples/ directory to site/ directory. Bug Fixes: o Rewrote clm.lisp to not use a class allocated par slot. clm-note now uses normal object parameters. o If bin-directory and cm-directory are the same, the fasl files are now stored with the sources instead of in the main directory. o Fixed build bug in mcl 2.0.1 that didnt require :resources properly o Fixed CLISP port to load cminit.lisp o Fixed mk2stella.m to handle score files without info tags (Leigh Smith) _____________________________________________________________________ Features and bug fixes from 11-1-96. o All documentation converted to html format. doc/cm.html is the Common Music home page. o make-cm prompts for a site directory for locally customized files. If you specify anything other than cm/site, you must move any of the scripts you use from cm/site to your site directory. o transpose and invert now work on lists of notes. if the inversion point is NIL then the list is inverted such that it occupies the same range as the prime. o new functions scale-max and scale-min return the highest and lowest note referneces in specified notes. o New slot chanmap for Midi streams allows channel maps to be specified. A channel map is a 16 element vector that is indexed by midi-note channel to return the actual channel for the midi data. A :chanmap argument may also be specified to midifile-play. o new note-type option to import command with midi files. Value can be note, pitch, or degree. defaults to degree. o Midi Play window now uses streams menu. o CSound Improvements (Tobias Kunze) 1) added variables *csound-command-string* and *soundfile-play-command-string*. this seems much more useful, since people can customize what to use. I reinitialize them to "/usr/local/bin/csound" and "/usr/sbin/sfplay -nice", respectively 2) added "args" slot to the csound-score-file class to be able to pass options on the command line, ie: Stella [Top-Level]: mix foo 0 args "-o newtest.aiff -A -m0 -d" 3) play-using-syntax is much more powerful in output file handling. options in the args slot override the output slot. 4) print-object and write-event always output ins slots. makes much more sense than adding the ins slot everytime. BTW: csound ist 500% mehr efficient with the "CYNTHIA" editor von Jean Piche at U MOntreal. Changes: o Source directory structure has changed. o Stella and CM packages have been merged. o .stella extension has been renamed .cm Bug Fixes: o print-object for midi notes now tests to see if the channels slot has a value before attempting to print it. _____________________________________________________________________ Features and bug fixes from 23-11-95. New Ports: o MCL 3.0. o CLISP 1995-08-12, including real time midi on NeXTStep. (Thank you Leigh Smith) Capella: o New main Common Music menu. o COMMAND-U keystoke sends musical output from any window to the current output stream. Streams are made current either by creating them or selecting them from the Streams submenu. Holding the command key down when selecting a stream brings up an info browser on the stream o New output editor replaces Seq and Mix worksheets. (Tobias Kunze). o Info browsers now support output stream editing. o Single clicks now collapse multiple selections in listings. o Capella tutorial rewritten. Stella: o New CSOUND note class Csound-note implements scorefile output for all subclasses. If your note objects inherit from Csound-Note then you dont have to define any output methods. See CSOUND entry in dictionary.rtf for more information. o Importing Csound .sco files implelemented. Only straight scores at the moment -- no dot-pfields, no octcps statements, no nothing, just blanco absolute values. (Thank you Anders Vinjar.) See Csound entry in dictionary.rtf for more information. o New Mix and Seq commands replace Listen, Slisten, Write Swrite. Avoid using Listen and SListen, they will disappear in a later release. o Open sets the current output stream to the open file or port. o New Duplicate command does Copy/Paste for you. o $ notation no longer necessary in command expressions. o New streams no longer prompt for modification. o Stella tutorial updated. General: o Streams completely reimplemented o Documentation and READMEs updated. o new function EXPL returns exponential values optionally scaled and offset. o new constructor macro PATHNAMES creates item streams of file names. Useful for creating complex patterns in sound file mixes (Anders Vinjar). See dictionary.rtf for more information. o Replaced system's few explict evals with funcalls. o Music Kit scorefile importing fixed and improved (Leigh Smith). Importing now automaticall creates output stream in stella with header slot containing the header of the imported score file. Music Kit midi objects named MkMidi in Stella, and now have tempo and timeSignature slots. BUG FIXES: o Code walker package bugs in ACL4.2/SGI fixed. _____________________________________________________________________ Features and bug fixes from 8-Aug-95. GENERAL: o build.lisp script can now save image on first pass. o stella.rtf tutorial updated and revised. o contrib/ directory updated. goodies.lisp holds a number of new utility functions. automata.lisp implements 1 and 2D cellular autmomata with many examples including Conways's "Life" game and a graphic visualizer for MCL. random.lisp implements various non linear random number generators. o New macro DEFMODE creates transposable musical scale modes. All system functions now work transparently with modes as well as scales. see dictionary.rtf. o New function RESCALE maps a specified value to a new domain. see dictionary.rtf o New function FIT returns shifted value lying between an upper and lower bounds by either wrapping or reflecting the value mod the boundart range. see dictionary.rtf. o New macro WITH-VARS-SNAPSHOTTED creates lexical closures over loop variable values. See stella.rtf and dictionary.rtf. o New algorithm macro WITH-PAST-VALUES implements variable value histories. See dictionary.rtf and chapter 7 in stella.rtf o Algorithm slot names may appear as expressions in item streams. o New #e read macro expands to (expr ...) o The system now warns only if the class of the object changes when an object is redefined. o Output errors no longer use modal warnings anymore. o FUNCTION-VALUE renamed to INTERP but old name continues to work. o New function TENDENCY implements tendency masks. see dictionary. o New comment object displays text and may be placed inside threads and merges along with musical data. o DEFMULTIPLE-ITEM now returns the first non-nil substate encountered when :all was specified as the :element-period. this allows useful state information to be returned from the item when it is not at end-of-period. o Import now accepts Name argument. Importing midi files accepts the additional arguments: Channels, Start, End o The "named" item stream constructor option now evaluates its value. o The "min" and "max" random item options may now be item streams or exprs. CLM: o stella:definstrument automatically defines an object class for the clm instument it creates. see dictionary.rtf. o New trace option for CLM soundfile streams. If true, instrument begin times are printed as the soundfile is written. MIDI: o MIDI realtime and file output reimplemented, now several time faster. o MIDI level 1 files can now be read, most midifile functions support new keyword arguments :start, :end and :track. o New "release" slot for Midi-notes defines note off velocity. o Midi-notes with R as a note value are interpreted as rests. SGIMIX: o revised implementation of sgimix syntax. CAPELLA: o Envelope editor now allows pasted expressions interp, interpolation, list and quote expressions. o Time is now optionally displayable in listing browsers o Window positioning code in capella now made smarter. Bug Fixes: o Pick checks length of sequence. o Playscore looks under /usr/local/bin for music kit. o Importing midi files now preserves all midi information in the file. o Importing midi files now can use a preallocated container. o Play-file now parses its options correctly. o Interval streams now handles gapped scales correctly _____________________________________________________________________ Features and bug fixes from 24-Mar-95. 1) CM ported to CMU CL/SGI. Should work in any CMU CL port. 1) CM (re)ported to NeXT/Intel/GCL1.1 and suports midi realtime with MusicKit 4.1 thanks to Leigh Smith (leigh@psychokiller.dialix.oz.au) 2) New :MIX syntax for Oyvind Hammer's (oyvindha@notam.uio.no) realtime mixing program "mix" on the SGI. Implemented by Anders Vinjar (anders.vinjar@notam.uio.no). Get mix from notam.uio.no:/pub/sgi. 3) Capella improvements: a) New graphic envelope editor, supports copy/paste and various output formats. Look under Utilities in the Stella menu. b) Controls, Icons and Listing views completely reimplemented. Listing views are now higly optimized and work well with very long sequences of data (2000+ subobjects). Controls now work better with color and are more dynamiclly responsive. c) New "Play..." option in MIDI submenu for playing Midifiles. d) New "Move" Worksheet for positional editing: swapping, rotating, shuffling and reversing. Bug Fixes 1) show-documentation in Stella now fixed. Broken by last release. 2) import-file doesnt drop channel messages. NOT FIXED 3) midifile routines no longer insist on .midi extensions. _____________________________________________________________________ Features and bug fixes from 24-Jan-95. 1) First release of Capella, a graphical interface for Common Music. Capella currently runs only on the Macintosh under MCL 2.0 or higher. Just build the system as usual; the saved image will contain a Stella menu and you can take it from there. See the Help menu under Capella for more information. Select Load Example to load a little tutorial on Capella. Capella is jointly implemented by Tobias Kunze (tkunze@ccrma.stanford.edu) and myself. 2) MIDI on the Mac now supports QuickTime MIDI, send problems/suggestions to tkunze@ccrma.stanford.edu 3) Midi data now prints with one less space and now memory pointer tag. Bug Fixes: 1) Fixed bug in archive-object that caused error when time slot unbound. _____________________________________________________________________ Features and bug fixes from 8-Nov-94. 1) The documentation files under doc/ have been completely reworked, examples checked, etc. item-streams.rtf has been completely rewritten. dictionary.rtf has new format and new entries: defmultiple-item, find-item-stream, midi-note, multiple-item-bind, mute, rewrite, sprout and standard-chromatic-scale. scales.rtf and most of the stuff under doc/contrib have been thrown out. 2) New REWRITE pattern provides a general term rewriting facility. Useful for implementing finite automata, l-systems, etc. See dictionary.rtf for more information. See stella/examples/rewrite.lisp for example. 3) Most examples under stella/examples have been checked and updated. 4) GRAPH pattern now warns if you supply a list of ids rather than a random item stream of ids. 5) Rhythms and note names now work as default node ids. 6) #i has new pattern char W for rewrite pattern. 7) The LINKED-TO option now evaluates its argument. This is an incompatible change. Bug Fixed 1) *cm-state*, find-item-stream. map-dta exported from common music package. 2) number streams now use local random-states. ___________________________________________________________________ Features and bug fixes from 11-Oct-94. 1) Pathnames may be delimited by "" in commands. 2) New Emacs customization file contrib/cm.el defines indentation for Common Music forms. 3) MCL printing-random-thing prints hex. 4) note objects can now be placed directly inside merges. 5) find-object and #! automatically append the found object to the current container when used as top level forms in the body of a thread, merge or heap definition, 6) The syntax of PICK changed. Pick now works with any type of Lisp sequence or subrange of a sequence, and can avoid direct reselection of an element. See dictionary for more information. The old version of PICK is now called PICKL (for pick list) 7) heaps may now be specified to layout Bug Fixes: 1) fixed contrib/naturalize.lisp to use map-object not mapref. 2) fixed spelling of sequential-amplitude-stream. 3) exprs now allowed in note, rhythm and ampliutude streams. 4) double definition of csound-sound-file fixed. ___________________________________________________________________ Features and bug fixes from 10-Aug-94. 1) CMusic and CMix syntaxes implemented by Charlie Baker (baker@polka.ccmrc.ucsb.edu). The file cm/stella/examples/ks.lisp contains an example cmusic object implementation. 2) New RETROGRADE macro returns the reverse of an item stream period. 3) New documetation files: doc/lispintro.rtf provides an overview of the most important characteristics of lisp. doc/lispstyle.rtf is a compendium of lisp programming tips. 4) The Run command now takes an INTO {thread} option. If INTO is specified, all events produced by Run will be appended to the contents of {thread}, which is the name of a preexisting or a new thread. 5) SListen now allows rests to be placed between the repititions of a single object. 6) Formatting-slots has two new directives. 1) :decimals formats floating point values to some number of places. use :decimals 0 to coerce to integers. 2) :print-if :always causes unbound slots to appear as "-unset-" in the formatting display. this is better than explicitly providing a :default-value of +slot-unset+. 7) New PICK function randomly selects from a series of choices. 8) Absolute time values can now be specified to musical notes. any object that inherits from Element can now have its time set absolutely in one of two ways: 1) specify the time via the "start" initialization arg, ie: (object midi-note start 10 rhythm 2) 2) set the time slot, then IOR the objects flags using the the system constant +absolute+, ie: (setf (slot-value x 'time) 23) (setf (slot-value x 'flags) (logior (slot-value x 'flags) +absolute+)) 9) Standard scale now has 10 octaves. 10) Algorithm macroexpansion is improved. Walked code now uses symbol-macrolet instead of with-slots, item streams definitions can now reference slot values in the running algorithm, vars declarations can reference algorithm slot values in binding expressions, and warnings are printed for local let variables that shadow slot names. Bug Fixes: 1) A bug in the Map command that ignored generators has been fixed. 2) Midifile-play now sends sysex messages. 3) Midi-message objects now send sysex messages properly. __________________________________________________________________ Features and bug fixes from 29 April 1994. 1) Same features as last release, but system has been ported to CLISP, sans midi real time. See README.CLISP for more info. 2) Build parameters also simplified. There is no more default-syntax to set: the first syntax listed in syntax automatically becomes the default syntax when the system boots up. ___________________________________________________________________ Features and bug fixes from 24 April 1994. 1) Full port of CM to Windows/ACLPC, including real time midi implemented by Joe Fosco (b38669@anl.gov). 2) New mapping operator Analyze performs statistical analysis on a per slot basis. For each slot, analyze first displays global statistics on the number of descrete values, their min, max and average, and then prints a breakdown for each value found its count, percentage and positions. The position information shows consective values using a ":" delimiter between the positions. 3) New mapping operators Quantize, Quantize! and Round size slot values. Round rounds values to n digits. Quantize fits values to be a multiple of a certain step size, Quantize! is like Quantize but uses log scaling. Bug fixes: 1) :TL appears on *features* list. 2) midifile-parse no longer signals an error if it cannot find a note on for a given note off. Instead, the note off is simply ignored. ___________________________________________________________________ Features and bug fixes from 30 March 1994. 1) Item streams have been completely reimplemented to support a number of new features: a) Period lengths of 0 now supported. if an embedded stream sets its period to 0 it "disappears" in its superior's pattern until its reselected and it sets its period greater than 0. 0 length periods permit all sorts of interesting patterns that were formally either impossible or exceedingly difficult to describe. here is a very simple example of a cycle whose inner 2 elements occur just every third cycle: (setf x (items A (items B C for (items 2 0 0)) D)) (read-items x 20) (A B C D A D A D A B C D A D A D) b) New pattern type ROTATION rotates its elements according to an optional "change value" supplied via the CHANGE option. See dictionary.rtf for more info. The file stella/examples/change-ringing.lisp contains definitions that implement various types of change ringing rotations. c) New constructor option COUNTING controls whether a period counts subperiods or values. If COUNTING is PERIODS (the default) then the number of elements returned in a period is the sum of all the subperiod lengths encountered in the period. this has been the normal behavior for item streams in the past. if COUNTING is VALUE, the number of elements returned in a period is exactly equal to the period length. d) New constructor option TRAVERSING controls whether a stream visits its subitems in depth first or breadth first mode. If TRAVERSING is DEPTH (the default) then the pattern is only incremented when the current element has returned end of period. this has been the normal behavior of item streams in the past. if TRAVERSING is BREADTH, then the pattern is incremented after each value has been read, regardless of whether or not the subelement is at end of period. (another, less efficient way to impleement traversing breadth would be to set the period lengths of all substreams to 1.) e) All constructor macros now expand directly to make-instance instead of to intermediate constructor functions. f) ITEM is roughly 25% faster on the NeXT, depending on pattern and datatype. Its only about 5% faster on a MAC IIci. g) Palindrome and amplitudes are now represented by true classes. Incompatible changes: a) VOICINGS removed. Instead, both INTERVALS and STEPS will increment their offset in parallel with the pattern if the offset is specified using a new ON option instead of FROM. In other words: (VOICINGS ... FROM ...) = (INTERVALS ... ON ...) b) SERIES are implemented as a subclass of cyclic-interval-stream, so the offset changes once each period. (form, modulus and multiple change each time the series repeats) c) FIRST, INITIALLY and REINITIALLY options removed. This affects random, heap and graph patterns. d) Default period length for graphs are now the number of nodes. e) All constructor functions except make-item-stream removed. f) DECRESCENDO renamed DIMINUENDO. 2) Defscale now supports the creation of gapped and general scales in addition to equal-tempered. See dictionary.rtf for more info. Examples of various types of scales can be found in examples/defscales.lisp 3) New output syntax RT writes input files for Paul Lanske's RT sound file mixing program (NeXT only). Stella also provides a a PlayNote object to output rt file statements. See the implementation file stella/rt.lisp for more information. The file stella/examples/rt.stella contains an example algorithm. 4) New global variable *compile-algorithms* controls if stella should try to compile the code for an algorithm or generator as it is being defined. defaults to nil. see dictionary.rtf for more info. 5) algorithms now have initialzer and finalizer slots to hold functions that you want funcalled just before and just after the algorithm has been scheduled. Bug fixes: 1) Mirror and repeat macros now work properly. 2) cmn output method for midi data now coerces midi notenums to frequency. 3) The Load command doesn't automatically try to compile .lisp files when it loads them. if you want this use Load with compile t option. 4) defobject only adds :initargs when necessary. 5) importing music kit scorefiles now works properly. _____________________________________________________________________ Features and bug fixes from 4-Feb-93. 1) Markov selection using graphs now possible via new item stream option PREVIOUS and new function IDSEL. See entries in dictionary.rtf; the file stella/examples/markov has the Stephen Foster example from Dodge-Jerse chapter 8. 2) defmultiple-item takes new keyword argument :element-state, for selecting which element's state to return as the state of the multiple item when its not :end-of-period. this allows tracking the state of chords,etc inside the multiple-item. 3) new #i read macro for shorter item stream definition, see dictionary.rt for more info. _____________________________________________________________________ Features and bug fixes from 2-Feb-93. 1) New command RUN executes the specified objects and updates their time values without producing any output. Current time values may then be referenced in editing operations, ie run foo,bar map foo while (< $time 50) when (> $time 20) transpose note -3 set bar amp (interpl $time 0 .1 50 .3) 2) clm interface improved: a) all sound file attributes now specifiable via Open, ie open foo.snd verbose t srate 44100 play nil b) envelope processing for .snd and .clm files now made easier by using the new (:format :careful) option in formatting-slots and collecting-slots. see dictionary for more info. 3) formatting-slots now handles &rest arguments. 4) defobject now takes an optional :parameters argument for declaring certain slots to be "parameters". the system does not yet automatically write output methods. Bug fixes: Many clm/stella interface bugs solved. catch/throw problems in map fixed map operators while and until now print their results. formatting-slots no longer prints double seperators between values _____________________________________________________________________ Features and bug fixes from 2-Nov-93. 1) Command prompting and processing has changed. Main prompting improvements: 1) All commands are now fully specifiable from the command line. A new global variable *command-prompting* controls whether or Stella prompts for missing or illegal command arguments. The default value of *command-prompting* is T, so by default stella behaves as it has in the past. If nil, missing or illegal command line arguments result in an error/syntax message and an immediate return to the main prompt. Set to nil if you like a terser input style. 2) Help texts completely rewritten. New tutorial sections: 2.4.2, 2.4.3 New dictionary entries: FHEADER, REPEAT, *command-prompting*, *mapping-mode*, *mapping-depth, *listing-length* 3) Underlying lisp functions cleaned up, renamed and made "public". See stella/api.text for a list of these functions and variables. 4) New type of command argument called "pairs" is similar to Lisp's &keywords args except: 1) you dont need to precede name with a colon (but you can). 2) their values are "carefully" evaluated, ie as Map evaluates. 3) underlying api functions all use pairs not keywords. Main Syntax Changes: 1) Object reference parsing is now stricter: a reference to a series of objects ment as a single command argument MUST include commas between the individual references, or the entire reference must be delimited within []. So "Listen 1 2 3 4" will no longer work but "Listen 1,2,3,4" or "Listen [1 2 3 4]" or "Listen 1 , 2 , 3 , 4" will work. The main commands affected by this change are LIST and LISTEN, WRITE, SWRITE and SLISTEN. More than one offsets for LISTEN and WRITE can be givin on the command line delimited with comma. See help text. 2) The specification of container positions has been simplified. To append, just give the name or position of the container. Otherwise, specify the insertion point as a positional reference: add bar,baz[32] foo ; append Bar and Baz[32] to Foo add bar,baz[32] foo[4] ; insert Bar and Baz[32] at Foo[4] 3) Pathnames with spaces can now be specified if the entire pathaname is delimited within "", Summary of changed commands. See help text for more info: ADD now accepts optional pair arguments. ARCHIVE now accepts optional pair arguments. CL now accepts line of input to process. DELETE now accepts optional pair arguments. LIST now more compact. LISTEN now accepts optional pair arguments. LOAD now accepts optional pair arguments. PASTE now can paste to range and point, optional name. PLAY now accepts optional pair arguments PARAMETERS removed. REHASH obsolete. REMOVE now works for multiply linked conatiners. RETROGRADE works for subranges as well as containers. SHUFFLE works for subranges as well as containers. SLISTEN now accepts optional pair arguments. SWRITE now accepts optional pair arguments. TLIST now accepts optional pair arguments. WRITE now accepts optional pair arguments. 2) The following are new functions, variables and macros. See the dictionary for more information: Function FHEADER sets file headers via Lisp. Macro REPEAT repeats the current period of an item stream zero or more times. User variables: *post-process*, *command-prompting*, *listing-length*, *mapping-mode*, *mapping-depth* 3) New system containers: TOC (Table Of Contents), the container of all system containers Syntaxes, the container of all currently loaded syntaxes. 4) Functional item streams and read items now optionally pass not only the values of the current period, but the states as well. see dictionary. Bug Fixes: 1) Tlist on algorithms now works. 2) midifile-parse now handles tracks without an initial tempo change. 3) datatype integer and voicing exported from common music. 4) functional streams now have "prop" option exported _____________________________________________________________________ Features and bug fixes from 15-Sep-93. 1) By default, defscorefile and with-part are not built into the cm image, and the top level package is set to Stella when Lisp boots up. If you still want to use defscorefile, set the defscorefile parameter in build.lisp to T. 1) Output streams now have three additional slots: Start, End and Timescale. Only events >= start and <= end are output. Timescale scales values related to time by that amount, but since time scaling generally involves slots other than just Time (for example, duration), it is left up each method on write-event to perform time scaling or not. All Midi and Music Kit classes support times scaling for start and duration values. 2) The Open command now allows slots to be unset by specifying Unset or None (or :none or :unset if you are a real lisper) as their "value". Examples: open test.midi start 10 end 40 timescale 2.5 open test.midi timescale none 3) New Map operators List and Show. Similar to Find, but they list or show each referenced object. 4) The $slot notation no longer returns 0 if the slot is unbound or does not exist. Instead, it throws out of the current object. Throwing allows operators like Minimize or Lowest to avoid calculating with bogus 0 values when the currently mapped object does not have a value for the specified slot, or is of a completely different class. 5) Thanks to Tobias Kunze, Stella now functions similar to the normal lisp listener in MCL: 1) brings the selected text to the active spot 2) no longer rubs out the prompt 3) Command-. pops the error stack instead of throwing immediately to the top level. 6) New global variable *default-midi-pathname* holds the default midi output file pathname. All midi output functions merge the supplied pathname with the default pathname to form the fully specified output file pathname. The initial value of *default-midi-pathname* is "test.midi" in the user's home directory. Bug Fixes: 1) Aborting from the file prompt in Write and SWrite now works. _____________________________________________________________________ Features and bug fixes from 5-Aug-93. 1) New support for CMN syntax: a) Chapter 12 in tutorial "Manuscripting data using CMN" rewritten to include new sections 12.5.1 "The open command" and 12.7 "Advanced CMN stream customizations" b) Staffing in CMN may now be by container, midi channel, or user specified. A new staffer slot for CMN streams holds a function reponsible for mapping objects in stella to their proper CMN staves. By default this staffer function is container-staff, which groups objects in staves according to their containers in stella. By setting staffer to the function channel-staff, midi data can be organized in CMN staves according to midi channel. See tutorial for more information. c) New marker slot in CMN streams may hold a function for adding cmn directives just after each note has been sent to CMN. Use a marker function to progrmatically send marking information to CMN, for example, to add a wedge to each note if the amplitude is above .4, etc. See tutorial for more information. d) New staves macro allows staffing information to be easily supplied. See dictionary.rtf for more information. Removed the old STAFF command from Edit when editing CMN staves. Now just use the staves macro to set the staves slot. e) If the system is built with MIDI syntax, the CMN object now also receives a channel slot. f) See also: entry on Open below, newly rewritten CMN chapter in the tutorial; new additions to appendix A in tutorial; dictionary entry on staves; channel.tl script in the stella/scripts directory. 2) new variable *respect-note-spelling* decides if the notes macro should keep note names the same as specified by the user. If common music is built with CMN, the defult value of *respect-note-spelling* is true, which makes manuscript output from algorithms, etc much more friendly. If CMN is not built into the system, the default value is nil, which preserves the original behavior of the notes macro 3) the pitches macro no longer quantizes floating point data to fit in a scale. 3) new variable *syntaxes* holds the list of syntaxes currently loaded into Common Music. 4) The directory stella/examples/blee contains new composition examples by Brent Lee. 5) Tutorial may now be used in conjunction with the Music Kit simply by switching syntax. The midi objects will then output to music kit, with midi channel info selecting various preset synthpatches in the MusicKit. Music Kit data may also output to CMN for manuscripting. 6) CSound syntax fully implemented in Stella. See stella/examples/i1.lisp for an example of declaring csound objects and output methods. 7) New Heap container class and constructor. A heap is a subclass of thread, but shuffles its material each time it is initialized for outputting, which allows score structure to involve random permutation. 8) New macros defobject and formatting-slots simplify defining new classes of objects and new output methods. Chapter 9 in tutorial rewritten and simplified. See tutorial and dictonary.rtf for more information. 9) Show command now prints definition code for algorithms and generators. 10) Reloading material from an archive now warns about redefining objects. 11) New examples files from CCRMA workshop in stella/examples. 12) New Unset command for unbinding slots. Also available as an operator in MAP. 13) New Change command for changing the class of objects. Allows optional slot initialization in redefined objects according to a {newslot oldslot}* list. Also available as an operator in MAP. 14) Open now allows files and listeners to be initialized, ie open test.score header *header* would create or update a music stream for test.score and set its header attribute to the value of *header*. See appendix ??? in the tutorial for detailed information about streams attributes. 15) new build.lisp parameter "defscorefile" will allow the optional inclusion of the the old runtime system of common music (defscorefile, with-part, defpart, etc. For this release only, the default value will be T (in fact, don't set it to nil); thereafter it will default to NIL, which means that the old system will not be loaded into common music and the default package will become stella. 16) cm.tar.Z is now much smaller becuase I remove a ton of old/stale documentation. Ive also removed dictonary entries to defscorefile, with-part, defpart etc. If you want them keep an old dictionary around. 17) To accomodate an upcoming port to DOS, a few file names have been changed to insure unique names within 8 characters. stella/tutorial/: stella-tutorial.rtf stella.rtf midi/examples/: real-time.lisp rt.lisp real-time-examples.lisp rtexamp.lisp doc/: item-stream-examples.rtf combined with item-streams.rtf mk/examples/: DBWave1vi-1.lisp DBWave1A.lisp DBWave1vi-2.lisp DBWave1B.lisp DBWave1vi-3.lisp DBWave1C.lisp DBWave2vi-1.lisp DBWave2A.lisp DBWave2vi-2.lisp DBWave2B.lisp DBWave2vi-3.lisp DBWave2C.lisp Note that untarring the new cm.tar into your old source directory will not remove the old files. 18) :MIDI pushed on feature list Bug fixes: 1) Fixed bug that caused algorithms to not increment themselves after the last note. This change may cause existing code to run slightly differently! 2) Fixed superfluous warnings in MCL when defining algorithms and generators. 3) Fixed status updating bug that cause an algorithm's status to get improperly updated if the algorithm reads from multiple item streams. 4) Fixed Go bug that caused an error upon moving focus to an algorithm. _____________________________________________________________________ Features and bug fixes from 14-Jun-93: 1) New SCRIPT command in Stella reads editor input from a specified file, which may contain both lisp and command expressions. Script files have a default extention of ".tl" to distinguish them from normal lisp files, which cannot contain command expressions. Scripts are handy for storing complicated editing sequences, or commands that you issue repeatedly. In addition, I am building up a library of scripts that place Stella in "automatic pilot mode" to demonstrate various simple command sequences. These demos can be found in the directory stella/scripts. Be sure to read README in that directory before loading any of these files. I will continue to update and add to this directory. 2) Tobias Kunze has implemented some really nice editor extensions in MCL to support Stella input and command evaluation from other windows and buffers. See contrib/mcl-stella.lisp for more info. 3) The MAP command operators sum, collect, maximize, minimize, lowest, highest, and count now support an optional "global result variable", which will receive values that the operator produces. Result variables are updated each time an operator's clause is processed so other clauses may reference the current value in their expressions. To specify a results variable use the INTO option. For example: map * sum $rhythm into timesum and collect timesum into timelist would define a global variable timesum to hold the total of all rhythm slots and a variable timelist to hold the list of all summed start times. 4) New MAP operators UNTIL and WHILE allow processing to terminate before all objects have been mapped. Until terminates mapping as soon as its expr returns true. While terminates as soon as its expr returns false. For example, map * while (< $duration 1.2) increment rhythm .3 would process the objects in * until a duration >= 1.2 was encountered. 5) Commands may now span more than one line of input if the entire command is delimited by a pair of curly brackets {}, ie: {map t2 collect $note into mynotes when (member $note '(c4 c5 c6)) transpose note (between 1 11)} 6) New item constructors EXPR and FN. Expr creates an item out of lisp code (variables, expressions, etc). The ITEM function is then used to evaluate and return the value of an EXPR. The FN constructor is like EXPR, but creates an item from a function object. (setf s (let ((x 0)) (items 1 (expr (incf x)) for 20 ))) # (read-items s) ; works even though x no longer exists (1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10) see dictonary.rtf for more information. 7) New OPEN command in stella opens a listener for the specified syntax, if possible. Bug fixes: 1) the :KILL value to item inside with-part or algorithm may now be specified as a variable 2) Numbers macro fixed to supply correct limit value. 3) Numbers documented in dictionary.rtf 4) mcl-midi.lisp fixed to work with opcode midi tools. 5) doitems item variable now properly bound. _____________________________________________________________________ Features and bug fixes from 11-May-93: 1) Macintosh mididriver routines and interface reimplemented by Tobias Kunze (tkunze@mvax.kgw.tu-berlin.de). a) you no longer need anything from MPW, just debinhex the supplied midi/mcl-midi.c.o.hqx file and away you go. Although it has only be tested on a IIci, SE/30, a PowerBook 170, and a Quadra 700, 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. b) "unlimited" midi message writing is supported by managing the mididriver's buffers dynamically. CM now allows about @40000 future unblocked messages; once all buffers are full the system drops into blocking mode so you can still send more data. c) A handy Midi utility menu is provided. 2) New item stream constructor macro NUMBERS creates number streams for cyclic or random number generation. numbers is similar in spirit to Lisp's loop iteration macro, with the essential difference that numbers is used in conjunction with item to return the next number, and numbers permits any numeric option value to be replaced by an item stream of values, ie: (numbers to 10) (numbers from 1 below (items 5 10) in random) (numbers by (items .1 .2) below 1) (numbers from (items 0 1) to (numbers 10 to 20 in random)) Only the cyclic and random patterns are currently implemented. See doc/dictonary.rtf for more information. 3) midifile-play reimplemented by Tobias Kunze to use the open midi port rather than an external program. This allows you to play midifiles directly from Lisp without any ancillary program, which avoids blocking on NeXT 3.0 because playmidifile isnt used, and allows midi files to be played on the Mac without leaving lisp. Play-midifile now supports the optional specification of :start :end times in the file, and a :timescale factor for "zooming" in and out of the sound. See doc/midi.rtf for more information. 4) Site initialization file. If a file called cminit.lisp or cminit.fasl exists in either *common-music-directory* or the directory containing the booted common music image, then it is loaded when common music boots up. This can be used to automatically load patch files and system extensions, or to reset system variables like *common-music-directory* in the event that the image is run on a filesystem other than the one it was created on. Site initialization does not work in AKCL. 5) The FOR option to item stream constructors now permits the period length to be specified as a function which will be funcalled to return the length of the next period. This feature can be used, for example, to keep two item streams "in parallel", ie: (items (items A for (items 5 6 7 in random) named Foo) (items Z for #'(lambda () (period-length #@Foo)))) would cause the item Z to be generated as many times as the item A, no matter what the current period length of Foo actually is. Bug Fixes: 1) Staff command for CMN output streams now allows renaming. 2) Midi files written in MCL now have their macintosh file types set to Midi. 3) tl.lisp no longer clobbers ccl:show-documentation in MCL. _____________________________________________________________________ Features and bug fixes from April 5, 93: 1) New CMN output syntax in Stella for postscript output via CMN. Chapter 12 "Manuscripting data using CMN" in stella-tutorial.rtf has documentation and examples. 2) New LAYOUT macro for organizing musical material. See chapter 13 "Describing musical layout" for documentation and examples. 3) Mutes and algorithm sprouting implemented. See section 7.10 "About Algorithms" and new section 7.11 "Creating structure dynamically" for documentation and examples. 4) Much work finishing/debugging Macintosh port, which now functions as well as the NeXT port. 5) New VARS declaration for algorithms and generators declares variables that are local to the object and reinitialized every time the object begins output processing. See section 7.10.2 for more details. 6) The DOITEMS iteration varible may now be either a single variable, or a list of two varibles, (var1 var2), where the var1 is the iteration varible and var2 is the state variable. Supplying a state variable allows forms in the body of doitems to access the current state of the stream. For example: (doitems ((i s) (notes [c3 e g] [c3 e g] [c3 e g] [c3 e g] [c3 e g] [c3 e g])) (element midi-note note i amplitude .5 duration .15 rhythm (if (eq s ':chording) 0.0 .5))) 7) SListen now prompts for the number of times to sequence if just one selection is specified to the command. Note that a single selection can itself be a subrange, ie: Stella [Top-level]: Slisten foo Stella [Top-level]: Slisten foo[1:5] 8) The initially option to random, heap and graph streams now accept the value ANY, which causes the stream to randomly select its initial datum. 9) Variable *pprint-archive* controls whether or not objects are pretty printed when archived. Pretty printing takes slightly longer than normal printing, put produces a more legible result. Pretty printing is only important if you want to list or edit a .stella file. Bug Fixes: 1) Fixed pathname problem in MCL that caused file extensions to appear twice. 1) Read macro #@ in MCL now handles both ccl's and cm's meaning. 1) Fixed referencing bug that didn't parse names starting with a number. 2) Fixed bug that still added containers with id NIL to table. 3) All known problems with symbol export/import between the common-music and stella packages are fixed. 5) Fixed even more timing bugs fixed with respect to merges. 6) New bug: In NeXTStep 3.0, midi output sometimes dies during output processing when using Listen. Try again after issuing the Close command, or simply use the Write command to generate a midi file. The system will automatically prompt for a midi file to be played after it is written. _____________________________________________________________________ Features and bug fixes from Feb 15, 93: 1) Port of Common Music to SGI Iris under Franz Allegro 4.1. (Midi real time not yet completed) 2) Fixed Stella run in MCL. Editor now supports copy/paste and buffer evaluation via Command-E. Command-. now aborts back to the Editor, rather than the Lisp Listener. _____________________________________________________________________ Features and bug fixes from Jan 1, 93: 1) New referencing scheme in Stella makes it possible to reference groups of objects in parallel. This allows comparative querying to be supported. For example the command: map :::2 find (eq $note[1] $note[2]) would map pairwise over all the objects in the current focus container and return the starting positions of each pair of object that had identical values in their note slots. For more information, see the tutorial section 2.5, or the 'help referencing' topic in the editor. 2) New output syntax CMN allows postscript output using Bill Schottstaedts Common Music Notation package to be produced. Stella must be built with CMN loaded for this to work. Once syntax is set to cmn, either postscript or a cmn input file can be generated bu specifying the appropriate file extension to the write command. 3) Many new mapping operators added: find, count, delete, undelete, insert, append, append-at insert-at. For more information, see the tutorial section 9.1 or the 'help map' topic in the editor 4) New system container called Io-Streams holds all currently defined output streams. To change the characteristics of stream that already exsts, list the contents of io-streams to find the stream in question, then used the edit command. For example: edit io-streams[2] would edit the 2nd stream object in io-streams. 5) New :element-period options for defmultiple-item have been implemented by Fernando Lopez Lezcano: :ANY --> any element that reaches end of period returns end of period :ALL --> only returns end of period when all elements agree on end of period at the same time. :ANY C1 ... CN --> any followed by some component streams, same as any but only taking into account the C1...CN components :ALL C1 ... CN --> :all followed by some component streams, same as :all but only taking into account the C1...CN components. C1 ... CN --> component streams: same as :ALL C1...CN 6) Fixed bug in common music's restp function that caused it to fail with floating point argument. _____________________________________________________________________ Features and bug fixes from Sept 30, 92. Much work in implementing and debugging Stella. There is a brand new tutorial about composing in Stella in stella/tutorial/stella-tutorial.rtf new option "initially-from" for interval streams. The initially-from option is similar to the from option, except that it supplies the offset for the initial period of the interval stream only. Subsequent periods use the last computed value from the stream as the offset value for the current period, causing the new period to start wherever the last period left off. from, initially-from and linked-to are mutually exclusive options. new option "linked-to" for interval streams. The linked-to option may be used in conjuntion with a named item steam to link the offset of the current period to the last value that the named stream returned. The name of the stream to link to should not be quoted. from, initially-from and linked-to are mutually exclusive options. new scale reference predicates: scale=, scale<, scale>. the new functions provide predicate testing for scale degree references. references may be note, pitch or degree. new :play command for Franz Lisp. the :play command plays .snd, .score, .midi or .clm files using the appropriate methods. default file to play is the last generated score file. new iteration macro: doitems. The doitems macro is like Lisp's dotimes and dolist interation macros, but provides iteration over items read from a suppied item stream. ____________________________________________________________________ Features and bug fixes from July 19, 92. Change to defscorefile by default, the item function used inside with-part will notice rests and chords in any type of item stream, not just in note streams. Change to the in-tempo function: in-tempo (and the tempo macro) now support an optional second argument, beat, that specifies a pulse value for the tempo. If no beat is specified the default value of quarter note is used: Example: (in-tempo 60 'q.) Fix to the decrescedo macro Fixed the bug that caused only crescendos to be made... Change to the intervals and steps macro rests inserted in either the interval specification or the offset stream will have their intended effect, but remember that the offset is reread just once every period. Change to the graph pattern type The to id descriptions for each graph node may now be item streams of id's. This is a simple way of implementing some pattern type other than the default random selection. Example: (items (a to (items b c)) (b to (a)) (c to (items a b c in palindrome)) in graph) Change to the palindrome pattern type The elided option to the palindrome pattern type now supports a variety of elision values: nil, no no elision at end points of palidrome t, yes elision at both start and end of palinrome start elision at just the start of the palidrome end elision at just the end of the palindrome Example: (items a b c in palindrome elided start) Tempo scaling in nested rhythm streams now works. The system returns an inner stream's rhythm without rescaling it by the outer streams own tempo factor. another way to look at this is that, for a given stream, its tempo factor is only applied to elements in the stream that are actually rhythmic data. elements that came from embedded streams remain in the embedded stream's own tempo, whatever that might happen to be: