cmn-stream

[Class]
  `cmn-stream`

Implements CMN manuscript output to .eps files and .cmn source files. This class is automatically chosen when you specify a file with a .eps or .cmn extension to the events function.

`cmn-stream` supports the following slot initializations:

`:exact` boolean
  If true and all time values in the score are expressed as rational numbers (integer or ratio) then CMN's time-line parsing avoids rhythmic quantization problems caused by floating point round-off errors.
`:staffing` list
  A list of staff descriptions defining the attributes of the CMN manuscript staffs. Objects in the score set their staff by specifying the appropriate staff id (for example by using the `:channel` value of a midi object or the `:staff` value of a cmn object.) Each staff description in list is a list in the format:

  > `(id [:name string] [:clef symbol] [:meter list])`

  where id is an integer staff identifier followed by optional keyword and value pairs. The value of `:name` is a string name for the staff and defaults to "staff-n" where n is the staff id. The value of `:clef` is a keyword clef name: `:treble`, `:bass`, `:alto`, etc., or a list of clef names. If a clef not specified then CMN will choose whatever clef(s) it thinks best as it manuscripts the objects in the score. If the clef is `:both` then you get a grand staff. If the value is a list it these choices will limit CMN's clef choices to that list. The value of `:meter` is a meter list for the staff like (3 4), (7 8) and so on. See below for an example of a staffing list.

In addition to the initializations listed above, cmn-stream will pass on any CMN score attribute The most common of these are:

`:size` integer
  The overall (font) size of the score. Defaults to 40.
`:title` string
  The title of the score printed at top of page.
`:metronome` integer
  The tempo for parsing the time-line of score objects.

Consult the CMN manual for more information.

#### Examples:

Example 1. Outputting to CMN scores.

    (define (testit stf len nts)
      ;; midi channel numbers map to staves.
      (let ((nts (new heap :notes nts))
            (rhy (new random
                   :of (list 1
                             (new cycle :of '(1/2 1/2))))))
        (process while (< (now) len)
                 for n = (next nts)
                 for r = (next rhy)
                 output (new midi :time (now)
                             :duration r
                             :keynum n
                             :channel stf)
                 wait r)))

    ;;; define staff descriptions
    (define staffs
      '((0 :name "Viola" :clef :alto :meter (4 4))
        (2 :name "Flute" :clef :treble :meter (4 4))))

    ;;; generate an .eps file
    (events (list (testit 0 12 '(c3 d ef f g))
                  (testit 1 12 '(c5 d ef f g)))
            "testit.eps"
            :staffing staffs
            :size 24
            :exact true
            :title "Hiho!")

    ;;; another way to set score properties
    (io "duet.cmn" :staffing staffs :size 20
        :exact true :title "Duet")

    ;;; generate a .cmn file
    (events (list (testit 0 12 '(c3 d ef f g))
                  (testit 1 12 '(c5 d ef f g)))
            "duet.cmn")

#### See Also:

- `cmn``` [Class]
- `midi``` [Class]
- `io``` [Macro]