Version 0.2.11
Table of Contents
List of Examples
FOMUS (FOrmat MUSic) is a music notation tool for computer music composers. It is written in the Lisp programming language, and has been tested in the following interpreters: CMUCL (version 19), SBCL (version 0.9.4), OpenMCL (version 1), CLISP (version 2), Allegro (version 7) and LispWorks (version 4). As the program becomes more stable, it will also be tested in other lisp implementations. Supported operating systems are Linux, Max OS X and Windows. The purpose of it is to facilitate the conversion of "raw" algorithmic output data into readable music notation, a process that can be frustrating and time consuming since it often requires dumping data into some intermediary format (such as MIDI) and importing it into a notation program that only does a mediocre job of conversion. FOMUS attempts to remove this frustration by making a reasonably intelligent attempt at spelling notes, quantizing offsets and durations into readable rhythms, laying out the information into voices and staves, and other tasks (such as where to include clef changes or ottava markings). The user may also specify extra information such as articulations, text markings, time signature changes, notational details of musical instruments, etc.. When the program is run, it outputs a file suitable for importing straight into a notation program, after which a small amount of editing and layout work should be required to create a finished musical score.
Following is a list of some of the tasks FOMUS is designed to automate:
The following output formats are supported:
MusicXML files will import (more or less) into popular notation programs like Finale and Sibelius.
FOMUS integrates with Common Music, using some of its functionality if present and also functioning as a backend. FOMUS has also been designed to allow selection of plugin modules that use different algorithms to perform the same tasks. As new functions are added, users can select the ones that give them the best results. These will be added to the program over time.
FOMUS is still in its initial (alpha) development stage, so please expect many bugs.
If you wish to report one, please look at the DEBUG-FILENAME
setting to see how to create a debug file and e-mail it to <dpsenick(at)uiuc(dot)edu>.
Please send me suggestions and comments if you have any.
Thanks to Rick Taube, Kilian Sprotte, Mika Kuuskankare and Rob Canning for their help and suggestions.
Also thanks to Kilian Sprotte for developing code for the test suite, available in the SVN repository as fomustest.
Table of Contents
FOMUS is available in tarball form here. Download the latest version and type something similar to the following at a UNIX prompt:
Example 2.1. Unzipping the Tarball
cd path_to_install_directory
tar -zxf path_to_tarball/fomus-0.2.0.tgz
The current version is also available via Subversion, hosted at Common-Lisp.net. Type the following command at a UNIX prompt to download the latest version (you must have Subversion installed on your machine):
Example 2.2. Downloading from Subversion Repository
mkdir fomus
svn checkout svn://common-lisp.net/project/fomus/svn/fomus/tags/current fomus
The development/unstable version can be downloaded as follows:
Example 2.3. Downloading the Development Version from Subversion Repository
mkdir fomus
svn checkout svn://common-lisp.net/project/fomus/svn/fomus/trunk fomus
Future updates will then only require typing svn update in the FOMUS directory.
The program may be compiled and loaded by loading the file load.lisp.
Example 2.4. Compiling and Loading
CL-USER> (load "path_to_fomus_directory/load.lisp")
...
CL-USER> (use-package :fm)
The package name is FOMUS, and can also be referred to with the abbreviations FMS and FM.
A system definition file fomus.asd is also provided for use with ASDF.
To use it, make sure ASDF's central registry parameter contains the necessary path information and
load it using the OPERATE function (see the ASDF documentation for more information).
The script file install.sh can be run at a UNIX command prompt to install FOMUS as a command-line
executable program. At this point, this can only be done with SBCL, CMUCL, CLISP and
OpenMCL in a UNIX environment (it's been tested in OS X and Linux), though a look at the script should show how
to install it with other Lisps in any other environment.
Type the following to get a list of installation options:
By default, the script tries to install the program into the subdirectories in /usr/local. The commands for a default installation using SBCL
would look like this:
Example 2.6. Running the Installation Script 2
su - cd path_to_install_directory ./install.sh --sbclThere is also an option for uninstalling. To see how to use as an executable, see Command Line Interface and Text File Interface.
By default, FOMUS compiles and loads all of the backends listed in this documentation. You
can leave any one of these out by adding noe the following keywords to the *FEATURES* list (using PUSH
or PUSHNEW):
:FOMUS-NOCMN |
:FOMUS-NOLILYPOND |
:FOMUS-NOMUSICXML |
:FOMUS-NOMIDI |
These must be added before loading or compiling.
If you are recompiling with different keywords, be sure to delete all .fasl files first to insure
that all parts of the program are consistent.
Here are a few simple lines that you can put in your .emacs file. They associate .fms files
with Lisp (actually, this example assumes SLIME is being used) and bind the key sequence "\C-c\C-o" to run the
FOMUS command-line program.
Example 2.7. Emacs Init Lines 1
;; fomus extension--editing works well enough in lisp mode (add-to-list 'auto-mode-alist '("\\.fms$" . lisp-mode)) ;; save buffers & invoke fomus (setq fomus-args "") (defun run-fomus () (interactive) (save-some-buffers) (let ((a (read-from-minibuffer "FOMUS arguments: " fomus-args))) (setq fomus-args a) (shell-command (format "fomus %s %S" a buffer-file-name)))) ;; add slime mode hook (defun custom-slime-mode-hook () (local-set-key "\C-c\C-o" 'run-fomus)) (add-hook 'slime-mode-hook 'custom-slime-mode-hook)(I'm not sure why the lines are all run together. FIXME)
Another option would be to use SLIME's SLIME-INTERACTIVE-EVAL function instead of
SHELL-COMMAND:
Example 2.8. Emacs Init Lines 2
;; save buffers and invoke fomus in the default Lisp (setq fomus-args "") (defun run-fomus () (interactive) (save-some-buffers) (let ((a (read-from-minibuffer "FOMUS arguments: " fomus-args))) (setq fomus-args a) (slime-interactive-eval (format "(fomus %S %s)" buffer-file-name a))))
Table of Contents
Using FOMUS requires defining at least one part, filling these parts with events, then calling FOMUS's main function to process everything and output a score file for importing. There are several ways of doing this. The following sections explain these different approaches:
The first approach involves creating all the necessary objects and assembling lists, then calling FOMUS's
main function to process everything.
The main function is FOMUS and has the following format:
(FOMUS &key setting value ...)
setting above is one of the setting keywords listed in chapter Settings, and
value is its value.
Every piece of information FOMUS needs can be included in this function call.
The most important settings are GLOBAL, PARTS
and EVENTS, which contain all of the PART,
TIMESIG, NOTE,
REST and other objects that directly affect what appears on the score.
See the individual documentation for these for an explanation of how to use them.
A few examples are given below (illustrations are "raw" output processed with LilyPond version 2.4.2):
Example 3.1. FOMUS Usage 1
(fomus
:output '(:lilypond :view t)
:ensemble-type :orchestra
:parts
(list
(make-part
:name "Piano"
:instr :piano
:events
(loop
for off from 0 to 10 by 1/2
collect (make-note :off off
:dur (if (< off 10) 1/2 1)
:note (+ 48 (random 25))
:marks (when (<= (random 3) 0)
'(:staccato)))))))
Output
Example 3.2. FOMUS Usage 2
(fomus :output '(:lilypond :view t) :ensemble-type :orchestra :default-beat 1/4 :global (list (make-timesig :off 0 :time '(3 4)) (make-timesig :off 7 :time '(5 8))) :parts (list (make-part :name "Piano" :instr :piano :events (loop for basenote in '(54 42) nconc (loop for off = 0 then (+ off dur) and dur = (/ (1+ (random 4)) 2) while (< (+ off dur) 12) collect (make-note :voice '(1 2) :off off :dur dur :note (+ basenote (random 25))))))))
Output
Example 3.3. FOMUS Usage 3
(fomus :output '(:lilypond :view t) :ensemble-type :orchestra :beat-division 4 :quartertones t :parts (list (make-part :partid 'flute :name "Flute" :instr :flute) (make-part :partid 'tuba :name "Tuba" :instr :tuba)) :events (loop repeat 5 for off = (random 1.0) then (+ off (1+ (random 1.0))) and dur = (random 1.0) and inst = (if (eq inst 'flute) 'tuba 'flute) collect (make-note :partid inst :off off :dur dur :note (+ (case inst (flute 72) (tuba 36)) (/ (random 25) 2)) :marks (case (random 3) (0 '(:accent)) (1 '(:staccato))))))
Output
All of these settings are also present as special variables (see chapter Settings). The following example accomplishes exactly the same thing as example FOMUS Usage 1 above:
Example 3.4. FOMUS Usage 4
(setf *output* '(:lilypond :view t))
(fomus
:ensemble-type :orchestra
:parts
(list
(make-part
:name "Piano"
:instr :piano
:events
(loop
for off from 0 to 10 by 1/2
collect (make-note :off off
:dur (if (< off 10) 1/2 1)
:note (+ 48 (random 25))
:marks (when (<= (random 3) 0)
'(:staccato)))))))
Specifying keywords in the FOMUS function always overrides what is contained in the special variables.
Also, FOMUS accepts one additional key, :ALLOW-OTHER-KEYS.
Passing a value of T to this argument allows other keys that FOMUS doesn't recognize
to be present in the call.
By default, FOMUS accepts only keywords listed in Settings.
FOMUS also provides several functions that are wrappers to the first method described above. They create and store the objects internally so the user doesn't have to maintain lists of objects and data. The functions are:
(FOMUS-INIT
&key setting value ...)
(FOMUS-NEWPART
partid &key slot value ...)
(FOMUS-NEWTIMESIG
partids &key slot value ...)
(FOMUS-NEWNOTE
partid &key slot value ...)
(FOMUS-NEWREST
partid &key slot value ...)
(FOMUS-NEWMARK
partid &key slot value ...)
(FOMUS-EXEC
&key setting value ...)
The user first calls FOMUS-INIT, which initializes settings and insures that FOMUS is ready to
accept new data.
Setting values may be passed to this function in exactly the same way as the FOMUS
function above, though it isn't necessary in this case to include GLOBAL,
PARTS
or EVENTS.
The functions FOMUS-NEWPART,
FOMUS-NEWTIMESIG,
FOMUS-NEWNOTE,
FOMUS-NEWREST and
FOMUS-NEWMARK are then used to create and store all of the
objects that are normally included in the GLOBAL,
PARTS
and EVENTS settings.
The required partid or partids arguments correspond directly to the
slots of the corresponding objects (see the documentation for each of these in Objects for more information).
The PARTID argument to FOMUS-NEWPART
must be unique or objects that use them to refer to parts will refer to more than one.
The slot keywords can be any of the constructor slot keywords in the corresponding object, and the value
argument is the appropriate value for that slot.
Internally, FOMUS stores all TIMESIG objects
in the GLOBAL setting list, all
PART objects in the PARTS
list and all other objects (NOTE,
REST and MARK)
in the EVENTS list.
This means that the user may specify NIL or a list of part IDs in the PARTID/PARTIDS
slots of TIMESIG and MARK objects.
When the user is finished calling the FOMUS-NEW functions, the last thing to do is call
FOMUS-EXEC.
This again accepts setting keywords and values (overriding any previous setting values) and passes all information to the
FOMUS function which does the rest of the processing.
After FOMUS-EXEC is called, all internal data is reinitialized as if
FOMUS-INIT were called with no arguments.
Following are the interface 2 equivalents to some of the examples above:
You may also create a text file where each line of the file executes one of the commands listed in Interface 2. A simple example file is given below:
Example 3.7. FOMUS Text Input File
init :output (:lilypond :view t)
(init
:filename "outfile"
:quality 2)
;; remark
part 1 :name "Piano" :instr :piano
note 1 :off 0 :dur 1 :note 60
note 1 :off 1 :dur 1 :note 62 \
:marks (:accent) ; remark
(note 1
:off 2
:dur 1
:note 64
:marks (:marcato (:textnote "Text")))
off +2
note 1 :off 2 :dur 1/2 :note c4 ; actual offset is 4
off -1
note 1 :off 10 :dur 1/2 :note c4 ; actual offset is 9
off
note 1 :off 20 :dur 2 :notes (c4 e4 g4 c5)
Each element is read using the Lisp READ command (nothing is evaluated), with the exception of expressions that begin with
MAKE-. These are evaluated to avoid having to specify FOMUS classes and/or structures with
#S or #Z syntax (the Z reader macro is defined by FOMUS).
INIT lines specify values for FOMUS settings and can contain multiple keyword/arguments on a line.
As many INIT lines as needed may appear.
The \ character may be used at the end of a line to concatenate it with the following line.
Also, as shown in the example above, any "entry" may be surrounded by a set of parenthesis to indicate that all elements inside them are read/parsed together
(like an ordinary Lisp expression)--this can also be used to spread entries across several lines.
A few extra things are possible with input files to facilitate editing. Any section of the file may contain an OFF
tag optionally followed by a number. This tag shifts the offsets of everything that follows by the specified amount.
An OFF tag with no number resets the offset shift to 0. Also, a :NOTES keyword is available
for specifying chords. A chord is then specified as a list of notes as shown above. When FOMUS
reads this it creates a separate note object for each note in the list.
To process this file, use the FOMUS command as follows:
(FOMUS filename &key value ...)
Keyword/argument pairs passed to this function override the settings stored in the input file.
The FOMUS-FILE function may be used to parse an input file and return the objects specified in that file without processing them:
(FOMUS-FILE filename &key value ...)
Four return values are returned: a list of PART objects, a sorted list of
NOTE, REST and
MARK objects, a list of TIMESIG
objects (and KEYSIG objects when implemented),
and a list of keyword/argument pairs representing the keywords and values found in the INIT lines.
The following example show how you can edit and resave data using these files:
Example 3.10. FOMUS Usage 9
(multiple-value-bind (parts events globals args)
(fomus-file "/directory/myfomusfile.fms")
;; user processing...
(apply #'fomus "/directory/myfomusfile.fms"
:global globals :parts parts :events events
args))
FOMUS may be executed as a backend to Common Music using
CM's EVENTS function.
Appending a ".ly" or ".xml" extension to the filename routes the processing to
FOMUS. Parts and time signatures may also defined in CM
with the NEW macro and passed with all of FOMUS's settings to EVENTS.
A description of this interface is given
here in the
Common Music online documentation. Several examples are given below:
If installed as a command-line executable program (see Installing as an Executable), FOMUS can be invoked from a UNIX shell prompt to process a text file in the format described above in Text File Interface. This is intended for users who don't want to use or learn Lisp and can generate the data some other way.
Type fomus -h to display the command format and list all of the available options. Examples of the file format are
given in Text File Interface and Text Input File Examples.
FOMUS can "splice" together the outputs of two or more runs of the FOMUS
command. This allows sections or parts to be produced separately and put together into a complete score. Each section or part
(referred to here as a "chunk") can then be produced with different arguments.
Support for this is considered unstable at the moment. Bugs (there are probably at least a few) will be squashed and more enhancements will be added shortly.
FOMUS outputs a chunk object automatically on each successful run.
If no outputs are specified, then :CHUNK or :NONE must be specified to prevent FOMUS
from complaining that there are no outputs.
A chunk is actually all of the measures in the processed output that contain anything other than measure rests.
Chunks can only be merged together if there are no such overlapping measures. (At the moment, chunks can't be "relocated" or given an offset--this
obvious features will be added soon.) FOMUS considers parts with matching
PARTID values to be the same and will match them accordingly. Chunks may contain
parts that aren't in other chunks--FOMUS assembles all unique parts into one score and reorders them again after merging.
There are several ways to tell FOMUS to merge chunks. Some examples are given here in both Lisp and command-line syntax:
Example 3.14. FOMUS Usage 13
(fomus (list (fomus ...arguments_for_chunk1...) (fomus ...arguments_for_chunk2...)) :filename "path_to/myoutputfile" :output :musicxml-finale)
Example 3.15. FOMUS Usage 14
(fomus (list (fomus ...arguments_for_chunk1...) "path_to/myfomusfile_chunk2.fms") :filename "path_to/myoutputfile" :output :cmn)
Example 3.16. FOMUS Usage 15
fomus -lw "path_to/myfomusfile_chunk1.fms" "path_to/myfomusfile_chunk2.fms" "path_to/myfomusfile_chunk3.fms"
In each case, two or three chunks are produced from either another FOMUS
command or from reading and parsing an input file.
Lists all FOMUS instruments, merging/replacing FOMUS's own default instruments
with the user-specified contents of the INSTRUMENTS setting.
Lists all FOMUS percussion instruments (the contents of the PERCUSSION
setting).
(LIST-FOMUS-INSTRGROUPS &key :FORMAT format)
Lists FOMUS instrument ordering/grouping data, merging/replacing FOMUS's own defaults
with the contents of the INSTR-GROUPS setting.
If the FORMAT argument is T (the default), FOMUS formats the results
by listing the instruments for each grouping in a vertical score-order arrangement surrounded by [], {}
and || brackets, denoting whether instruments are grouped by brackets, curly braces or barlines only.
If FORMAT is NIL, FOMUS outputs the data as nested lists of symbols
(see the INSTR-GROUPS setting for details).
Lists all default measure divisions , merging/replacing FOMUS's own defaults
with the contents of the DEFAULT-MEAS-DIVS setting.
(See DEFAULT-MEAS-DIVS for more information.)
Lists all default tuplet divisions , merging/replacing FOMUS's own defaults
with the contents of the DEFAULT-TUPLET-DIVS setting.
(See DEFAULT-TUPLET-DIVS for more information.)
(GET-MIDI-INSTR program-change &key
:DEFAULT default-instr)
Returns an instrument to match the given MIDI program change value.
The first INSTR structure
with this number in its MIDIPRGCH-IM
slot is returned.
If no appropriate instrument is found, the value of either the DEFAULT-INSTR
setting or (if set) the DEFAULT argument is returned.
These are utility functions for adding, removing and combining marks and properties in MARKS
and PROPS slots.
ADDMARK and ADDPROP
insert a mark or property (a symbol or list of symbols and arguments values) in the appropriate slot of the object.
GETMARK and GETPROP
find a mark or property given an identifier.
The identifier is a symbol or list specifying the mark/property symbol and any number of the arguments following it.
The function returns the first mark that matches the specified symbols/values up to the number of symbols/values given.
(For example, '(:STARTSLUR- 2) will return the starting mark for a "level 2" slur.)
GETMARKS and GETPROPS
return all matching marks/properties.
RMMARK and RMPROP
remove (as a side-effect) all matching marks/properties from the objects.
COMBMARKS and COMBPROPS
returns a new mark/property list that is a combination of all marks/properties objects in the supplied list (with duplicates removed).
Table of Contents
This chapter describes several important classes and structures that provide the main way of specifying all of the part, instrument, and notational information that is passed to FOMUS for processing. Each section gives a description of a class or structure, its constructor, and a list of its accessor functions. How these are actually used depends on the interface that the user chooses to use (See Usage for more information).
All constructor functions have a corresponding copy function that take exactly the same keyword arguments plus one extra argument (the object to be copied). Any keyword/argument pairs supplied when a copy function is called indicate new replacement values. Objects may therefore be used as templates for creating new objects that differ only in one or two slot values.
The actual class hierarchy isn't given here since it shouldn't be of any concern for most users. It is reflected somewhat in the prefixes that appear in the accessor function names.
A PART object represents a written part in the score.
They are analogous to tracks in a MIDI sequencer or staves in any notation program,
though a part may actually represent more than one staff for instruments that require it.
PART objects are containers for NOTE,
REST and MARK objects
(and optionally TIMESIG and
KEYSIG object if they only apply to that particular part).
Each PART object also specifies an INSTR
object which contains specific information on how
to notate a particular instrument.
PART objects are passed to FOMUS by including them in the
PARTS list.
Constructor:
(MAKE-PART &key
:ID
id
:PARTID partid
:NAME name
:ABBREV abbrev
:INSTR instr
:EVENTS events
:PROPS props
:OPTS opts)
Copy Function:
(COPY-PART
part &key
:ID id
:PARTID partid
:NAME name
:ABBREV abbrev
:INSTR instr
:EVENTS events
:PROPS props
:OPTS opts)
Predicate Function: (PARTP obj)
Accessors:
OBJ-IDThis slot isn't used by FOMUS. The user may use it to store an ID value or some miscellaneous data.
PART-PARTID
This is a symbol or number used as an index or reference to identify the part.
It doesn't need to be unique--parts that share the same ID symbol are treated as a group.
When they appear in PARTID or
PARTIDS slots in classes
other than the PART class they are treated as references to a particular part or group
of parts.
PART-NAMEThis is a string value representing the part name that is to appear on the score.
PART-ABBREVThis is a string value representing the abbreviated part name that is to appear on the score.
PART-INSTRThis slot specifies an instrument for the part. All part must be associated with an instrument--if no instrument is given a generic default instrument will be chosen. Instruments provide important data for many of FOMUS's algorithms and determine at least several major aspects of score layout, including the number of staves a part has and whether or not pitches are to be transposed.
Instruments may be specified in one of several ways.
If a symbol is provided, it is used to lookup an instrument in a user-defined list
or FOMUS's own predefined list of instruments (see the INSTR-GROUPS
setting in the Settings chapter).
The slot may also contain an instance of an instrument object.
If a list is given, FOMUS expects the first element to be a lookup symbol for an instrument
and the rest of the list to be keyword/argument pairs specifying slots that are to be modified in the original instrument
(as if included in a call to COPY-INSTR.
If an integer from 0 to 127 is provided instead of an identifying symbol, FOMUS
interprets this as a MIDI program change number and will use the first instrument it finds that has this number in its
MIDIPRGCH-IM slot.
PART-EVENTS
This is a list of NOTE,
REST or
MARK objects.
TIMESIG and
KEYSIG objects may also be included in this list.
PART-PROPS
Part properties are specified in the same way MARKS are specified.
They are settings that affect only the part they are included in.
See PART Properties for a list of these.
PART-OPTSThis is a keyword/argument pair list specifying options to be passed directly to the backend algorithms. Each backend has its own set of options that may be specified alongside options for any other backend. See the Outputs for more information.
A TIMESIG object indicates a time signature change in the score.
They may also be used to indicate special barlines and a few other changes.
FOMUS uses TIMESIG objects to determine where to place measures and
how to format the events that appear in them.
If new time signatures appear in the middle of a measure, FOMUS either splits the measure
or expands it to a larger size depending on the values of AUTO-OVERRIDE-TIMESIGS
and MIN-AUTO-TIMESIG-DUR.
Each time signature either specifies or implies a value that specifies what notational value is equivalent to 1 "beat" duration.
FOMUS uses this value to determine how all durational events are notated and where they appear in the score.
Unless otherwise indicated, all offsets and durations are expressed in beat units.
See the BEAT slot for information on how to specify it.
Time signatures are passed to FOMUS by including them either
in the GLOBAL list or the EVENTS
slot list of a PART object.
TIMESIG objects listed inside a part apply only to that part
(unless the PARTIDS slot
indicates otherwise).
This method most likely won't be used.
TIMESIG objects in the GLOBAL
list affect parts according to the contents of their PARTIDS slot values.
A symbol or list of symbols in the PARTIDS slot applies the time signature to the parts
that match those symbols.
A default PARTIDS slot value of NIL indicates that the time signature be
applied to all parts that don't have any other time signature specified at that exact offset.
This way you can specify that a certain TIMESIG object be applied to only several
PART objects while another TIMESIG
object by applied to all of the remaining parts.
Constructor:
(MAKE-TIMESIG &key
:ID
id
:PARTIDS partids
:OFF off
:TIME time
:COMP comp
:BEAT beat
:DIV div
:REPL repl
:PROPS props)
Copy Function:
(COPY-TIMESIG
timesig &key
:ID id
:PARTIDS partids
:OFF off
:TIME time
:COMP comp
:BEAT beat
:DIV div
:REPL repl
:PROPS props)
Predicate Function: (TIMESIGP obj)
Accessors:
OBJ-IDThis slot isn't used by FOMUS.
TIMESIG-PARTIDS
This is a reference to a particular part or group of parts.
If the value of this slot is NIL, the time signature is applied to
all parts that don't have some another TIMESIG object
defined for them if this TIMESIG object is included in the
GLOBAL list.
If the TIMESIG object is in a
PART object's EVENTS slot,
the time signature is applied to the part.
If the value is a symbol, number, or list of symbols or numbers, these values are used to lookup which part or parts the event belongs to.
TIMESIG-OFF
This is a number (real, ratio or integer) specifying the absolute position for the onset for this note.
The offset is measured in "beats," which may indicate different notational positions depending on
previous time signatures and what values are present in their BEAT slots.
The number must be precise and "notatable" (floating point numbers are not recommended and values like 10/3 that don't
occur on regular beat divisions are currently impossible for FOMUS to notate).
TIMESIG-TIMEThis is a required list of two integers, specifying the numerator and denominator of the printed time signature.
TIMESIG-COMP
If this slot is set to T, indicates that the measure is a compound meter.
The denominator of the time signature then determines the beat value.
TIMESIG-BEAT
The BEAT slot value determines how events are mapped from beat units to notational durations.
It is a ratio that specifies what notational duration is equivalent to 1 beat.
This duration is expressed as a fraction of a whole note (1/4, for example, specifies a quarter note, 1/2 specifies
a half note, and 3/8 specifies three eight notes).
If the time signature is a compound time signature, the value of this slot is ignored and the
beat value is calculated from the denominator (for example, the beat value of a 12/8 signature is 3/8).
If the slot contains the default value of NIL, the beat value is either the
value of DEFAULT-BEAT or it is calculated from the
denominator (a non-compound 4/8 or 7/8 time signature would have a beat value of 1/8).
Different beat values have an effect on how measures are divided and laid out, so they should be
chosen to influence these things.
TIMESIG-DIV
This is a single list or list of lists containing ratios or integers that add up to the total number of beats
in a measure (as specified by either the TIME or
BEAT slots).
It represents all of the choices available for dividing up measures following this time signature.
If the slot contains the default value of NIL, FOMUS looks up
divisions first in a user-supplied table if one exists (see the DEFAULT-MEAS-DIVS
setting) then in FOMUS's default table.
A value usually only needs to be specified here if the user wants to force FOMUS
to divide measures in a specific way rather than choosing between several choices.
The following example shows what might be specified for a 7/8 meter:
As another example, setting the TIMESIG-DIV slot to '(1 1 1) in a 3/4
time signature forces FOMUS to beam measures in groups of 3 (the default is equivalent to
a TIMESIG-DIV setting of '((2 1) (1 2)))/
TIMESIG-REPL
This is a list of TIMESIG or
TIMESIG-REPL objects
that are chosen to replace this TIMESIG object when FOMUS
needs to change the length of a measure.
This gives the user some control over how FOMUS fudges measures to make them fit.
When FOMUS changes the length of a measure, it will look here first and then in
the (not implemented yet) setting for a replacement that fits (has the correct number of beats).
If none is found, FOMUS will create a new TIMESIG object
from the current one, modifying the DIV slot by adding on extra beats if necessary.
TIMESIG-REPL objects are simply
TIMESIG objects with missing
OFF,
PARTIDS and
REPL slots, all
of them unnecessary in this context.
The use of these is optional.
If TIMESIG objects are given, these slots are just ignored.
TIMESIG-PROPS
This slot behaves like the MARKS slot in
NOTE or
REST objects.
Extra time signature or measure properties may be specified here.
See FIXME for more details and the MARK class for an example of how to specify properties.
A TIMESIG-REPL object is a "replacement"
TIMESIG object.
They are used in the REPL slot of
TIMESIG objects and in
the FIXME setting, and are simply TIMESIG objects with missing
OFF,
PARTIDS and
REPL slots.
The use of these is optional.
They are included for the sake of conciseness and to (hopefully) eliminate confusion.
Since this class is nearly equivalent to the TIMESIG class, no slot descriptions are given here.
See the TIMESIG class for an explanation of all the slots.
The predicate function TIMESIGP returns T for both
TIMESIG and TIMESIG-REPL classes.
Constructor:
(MAKE-TIMESIG-REPL &key
:ID
id
:TIME time
:COMP comp
:BEAT beat
:DIV div
:PROPS props)
Copy Function:
(COPY-TIMESIG-REPL
timesig-repl &key
:ID id
:TIME time
:COMP comp
:BEAT beat
:DIV div
:PROPS props)
Predicate Function: (TIMESIGP obj)
The NOTE object will usually be the only object required to describe
musical events that occur in the score.
It allows the user to specify pitch, offset and duration as well as which voice the event belongs to.
A special slot, MARKS, allows for a wide variety of other information including
articulations, clef and staff change overrides, "spanners" like slurs or dashed lines with text, etc..
NOTE, REST
and MARK objects are all
considered "events," and so all of their important accessors begin with an EVENT- prefix.
NOTE objects are passed to FOMUS by including them either
in the EVENTS slot list of a PART object or in
the global EVENTS list.
NOTE objects listed inside a part apply only to that part (unless the
PARTID slot indicates otherwise).
NOTE objects in the EVENTS
list are distributed to parts according to the contents their
PARTID slot values.
Constructor:
(MAKE-NOTE &key
:ID
id
:PARTID partid
:VOICE voice
:OFF off
:DUR dur
:NOTE note
:MARKS marks)
Copy Function:
(COPY-NOTE
note &key
:ID id
:PARTID partid
:VOICE voice
:OFF off
:DUR dur
:NOTE note
:MARKS marks)
Predicate Function: (NOTEP obj)
Accessors:
OBJ-IDThis slot isn't used by FOMUS.
EVENT-PARTID
This is a reference to a particular part or group of parts.
If the value of this slot is NIL, the event is included in whatever part contains it in its
EVENTS slot list, or to all parts if it is included in the global
EVENTS list.
If the value is a symbol, number, or list of symbols or numbers, these values are used to lookup which part or parts the event belongs to.
Events belonging to multiple parts are effectively copied into these parts.
EVENT-VOICE
This is an integer or a list of integers specifying a voice or selection of voices that this note
should belong to.
Voice numbers are limited to the integers 1 through 4.
The default value NIL specifies voice 1.
If a list of choices is given, FOMUS's voice distribution algorithm will try to make
an intelligent decision based on voice leading, pitch, balance and other factors.
Note that REST and MARK
objects are treated slightly differently.
Settings with the VOICE- prefix can be adjusted to influence FOMUS's
voicing decisions.
See Settings for more information.
EVENT-OFF
This is a number (real, ratio or integer) specifying the absolute position for the onset for this note.
The offset is measured in "beats," which may indicate different notational values depending on what the
current time signature is and what value is present in its BEAT slot.
FOMUS's quantizing algorithm tries to fit all offsets and durations into values
that make the best use of tuplets within given constraints while minimizing the amount of error.
If this quantizing algorithm is switched off, then the user must insure that all offset and duration values
are precise and "notatable" (floating point numbers are not recommended in this case).
EVENT-DUR
This is set to either a number to specify a regular duration or a list to specify a grace note.
If it's a number (real, ratio or integer) it indicates the note's duration in beats (see EVENT-OFF above).
The comments in EVENT-OFF on quantization also apply here.
If Common Music is present and USE-CM is set to T,
the value of this slot may also be a symbol, which is parsed by CM using its RHYTHM
function.
Symbols in this case designate notational values and not beats, although
numbers are still interpreted with respect to beats and not filtered through CM's
RHYTHM function.
If a grace note is desired then a list of two elements must be specified, the first element being the duration value described above
and the second element being an integer value describing the "position" that the grace note occupies.
Grace notes with the same offset are organized with respect to this position number.
Lower position grace notes occur earlier in the score than higher position notes.
Also, grace notes with the same position form chords, and notes with negative positions are notated with a slash.
The duration value at the front of the list is still interpreted in terms of beats and notated as such even though
the note does not take up time in the measure.
Specifying a duration of '(1/4 -1), for example, specifies a grace sixteenth note with a slash
if the current beat is 1/4 (a quarter note).
EVENT-NOTE
This slot either designates a pitch (with an optional choice of spellings) or a percussion instrument if the part is a
percussion part.
If specifying a pitch, the value may be either a symbol or a number (real, ratio or integer).
If a number is used, 60 represents middle C, as in a MIDI file.
Numbers are rounded depending on the whether semitones or quartertones are specified (see the
QUARTERTONES setting).
Symbols are assembled by concatenating a note letter name (A through G),
a + or S for sharp or a - or F for flat, and an
integer designating the register (4 is the octave above middle C).
A few examples are given here:
Quartertones must be specified using numbers.
If Common Music is present and USE-CM is set to T,
symbols are filtered through CM's KEYNUM function.
In this case, the value of CM-SCALE will also be passed to the function if it is set to anything other
than NIL.
If a list of spelling choices is supplied, FOMUS will try to use the note spellings in this list.
To specify one, the value of the NOTE
slot must be a list, the first element of which is the note number
or symbol described above and the rest of which is the list of spelling choices.
A spelling choice is represented either by a number or symbol.
1, + or S designates using a sharp while
-1, - or F designates a flat.
0, N designates a natural while repeating one of the above symbols (for example,
++ or SS) designates a double sharp or flat.
2 or -2 also designates a double sharp or flat.
Quartertones spellings are specified using a list of two elements, the first element specifying the semitone
alteration and the second element specifying the quartertone alteration (one of the numbers
-1/2, 0 or 1/2).
A few examples are given here:
If FOMUS's note spelling algorithm is switched off then all note spellings must be supplied by the user
(so each NOTE slot must contain a list of two elements
specifying the pitch and its spelling, unless it is spelled with a natural).
EVENT-MARKS
This slot is nearly equivalent to the MARKS
slot in the MARK
class described below.
The contents of the MARKS slots of
MARK objects are actually dumped
into the MARKS slots of NOTE and
REST objects
once voices and staves have been decided.
See the MARK class for more information and
Marks for a more detailed explanation of marks and their usage.
The REST objects should rarely be used.
FOMUS handles rests automatically and only needs user-defined rests in special
cases (such as when a fermata needs to appear in all parts).
REST objects require nearly the same information as
NOTE objects,
except that there is no NOTE slot, the marks that can be assigned to it are limited,
and voice information is treated differently
REST objects are passed to FOMUS by including them either
in the EVENTS slot list of a PART object or in
the global EVENTS list.
The behavior in either case is exactly the same as with a NOTE object.
Constructor:
(MAKE-REST &key
:ID
id
:PARTID partid
:VOICE voice
:OFF off
:DUR dur
:MARKS marks)
Copy Function:
(COPY-REST
rest &key
:ID id
:PARTID partid
:VOICE voice
:OFF off
:DUR dur
:MARKS marks)
Predicate Function: (RESTP obj)
Accessors:
OBJ-IDThis slot isn't used by FOMUS.
EVENT-PARTID
This slot is equivalent to the PARTID
slot in the NOTE class.
EVENT-VOICE
This slot is analogous to but different than the VOICE slot in the
NOTE class.
The difference is that when set to a list of voices, the REST object is distributed to all
the specified voices instead of one that is chosen by FOMUS.
EVENT-OFFEVENT-DUR
This slot is equivalent to the DUR
slot in the NOTE class with the
exception that rests cannot be grace notes.
EVENT-MARKS
This slot is equivalent to the MARKS
slot in the NOTE class.
However, the number of marks that can be used in the REST class is limited.
See the MARK class for more information and
Marks for a more detailed explanation of marks and their usage.
The MARK objects allow the user to specify marks outside of a
NOTE
or REST class.
Marks designate extra information that to be applied to a NOTE or
REST object
such as articulations, modifications like tremolos or harmonics, printed text, etc..
After voices and staff assignments have been established, information in the MARK objects is dumped into the
MARKS slots of NOTE and
REST objects
according to the values in the OFF and
PARTID slots.
There are several advantages to using MARK objects as opposed to specifying marks
in NOTE or REST objects.
One is that many markings (dynamics, for example) might only need to be attached to notes that are in one voice, such as the bottom voice of
a particular staff.
Since voice assignments for notes might not be known until FOMUS decides them,
MARK objects are the only way of insuring that the marks occur in the right place.
MARK objects are also a convenient way of specifying marks for a range of parts,
and make it easier to apply spanners such as slurs without having to juggle NOTE
objects around.
MARK objects are passed to FOMUS by including them either
in the EVENTS slot list of a PART object or in
the global EVENTS list.
The behavior in either case is exactly the same as with NOTE or
REST objects.
Constructor:
(MAKE-MARK &key
:ID
id
:PARTID partid
:VOICE voice
:OFF off
:MARKS marks)
Copy Function:
(COPY-MARK
mark &key
:ID id
:PARTID partid
:VOICE voice
:OFF off
:MARKS marks)
Predicate Function: (MARKP obj)
Accessors:
OBJ-IDThis slot isn't used by FOMUS.
EVENT-PARTID
This slot is equivalent to the PARTID slot in the
NOTE or REST class.
EVENT-VOICE
This slot is equivalent to the VOICE
slot in the REST class, with the
exception that a staff or list of staves can be specified instead of voices.
Staves are indicated with a list beginning with the symbol :STAFF followed by
one or more integer values.
The integers represent staff choices and can either be negative or positive, negative indicating that
the mark be placed in the uppermost voice of the staff (the staff number is the absolute value of the number given in this case)
and positive indicating that the mark be placed in the lowermost voice of the staff.
FOMUS chooses the option from the list that places the mark the closest to the
specified offset.
Following is an example of how to specify staves:
Specifying a choice of staves like this allows the user to place marks like dynamics that apply to all voices but
only need to appear in one place.
In the case of the example above, a mark with this value in its VOICE
slot that is applied to a grand staff is attached to a note in a voice on the inside of the staff.
As in the case of the REST class, when set to a list of voices, the
MARK object is distributed to all
of them.
EVENT-OFF
This slot is equivalent to the OFF
slot in the NOTE or
REST class,
with the exception that offsets may also be wrapped inside a list and given
a positive or negative value (for example, '(3), '(11.5) or '(-11.5)).
When this list is used, it indicates that the marks in the MARKS slot are applied to events
just before or after the given offset depending on its sign.
Positive offset values indicate the mark is to applied to the event just following the offset and negative values indicate the mark is
to be applied just before it (the absolute value of it).
This makes it easier in some cases to place marks that indicate ends of spanners such as slurs, since marks that indicate the
end of the spanner can actually be given the offset where the next spanner begins.
FOMUS will place the end mark in the proper place (the event that
immediately precedes the one at the indicated offset).
EVENT-MARKS
MARKS slots contain lists of marks.
(In a NOTE or REST
object, these marks are "attached" to that event.)
Marks are specified as either symbols or lists of symbols and numbers.
If it is a list, then the first element is the mark symbol followed by one or more arguments.
Following is an example of what may appear in the MARKS slot:
Example 4.8. EVENT-MARKS Slot Setting 1
'(:accent :startslur- (:startslur- 2 :dotted) (:texttempo "accelerando"))
The MARK class can contain one extra mark that
NOTE or REST
objects can't contain.
The symbol itself is :MARK and actually specifies another mark that is to be placed in the same voice
at a different offset.
It has the following format: '(:MARK , specifying that another mark is to be placed in the same voice at the offset given.
This special mark is necessary if the user specifies a staff instead of a voice and the mark is a symbol indicating the start of a spanner.
It can also be used as a convenience, since only one off mark
...)MARK object needs to be instantiated
to specify several marks that belong together.
By specifying the end symbol here as part of a MARK mark, FOMUS recognizes the start
and end marks as belonging to each other and will place them in the same voice.
(Starting and ending marks that aren't paired in the same voice cause errors.)
The offset argument that is the second element in this list uses the same extended syntax as the OFF
slot in this class.
The rest of the list after the second element is the mark symbol and the arguments that apply to that symbol.
Following is an example:
The contents of the MARKS slots of
MARK objects are dumped
into the MARKS slots of NOTE and
REST objects
once voices and staves have been decided.
See Marks for a more detailed explanation of marks and their usage.
An INSTR structure contain instrument-specific data that's used to inform FOMUS
on various aspects of notation.
Instruments are specified in the INSTR
slot of PART objects and can be easily
modified.
Users can also build their own "database" of instruments by creating a FOMUS initialization file (see
Initialization File).
Constructor:
(MAKE-INSTR &key
:SYM
sym
:CLEFS clefs
:STAVES staves
:MINP minp
:MAXP maxp
:SIMULTLIM simultlim
:TPOSE tpose
:CLEFLEGLS cleflegls
:8UPLEGLS 8uplegls
:8DNLEGLS 8dnlegls
:PERCS percs
:MIDIPRGCH-IM midiprgch-im
:MIDIPRGCH-EX midiprgch-ex)
Copy Function:
(COPY-INSTR
instr &key
:SYM sym
:CLEFS clefs
:STAVES staves
:MINP minp
:MAXP maxp
:SIMULTLIM simultlim
:TPOSE tpose
:CLEFLEGLS cleflegls
:8UPLEGLS 8uplegls
:8DNLEGLS 8dnlegls
:PERCS percs
:MIDIPRGCH-IM midiprgch-im
:MIDIPRGCH-EX midiprgch-ex)
Predicate Function: (INSTRP obj)
Accessors:
INSTR-SYM
This is a unique symbol identifying the instrument.
It is used as a lookup value so that it may easily be specified in PART objects.
INSTR-CLEFS
This is either a symbol or list of symbols, specifying valid clefs for the instrument in order of preference.
The following clefs are supported:
:bass, :c-baritone, :f-baritone, :tenor, :alto,
:mezzosoprano, :soprano, :treble
and :percussion.
The user may also add an -8UP or -8DN suffix to the symbol to specify an octave transposition.
INSTR-STAVESThis is an integer specifying the number of staves to use. The default is 1.
INSTR-MINP
This is an integer specifying the lowest pitch in the instrument's range.
It may also be set to NIL, in which case the lower range is considered to be unlimited.
This is only useful if the CHECK-RANGES setting is set to T.
INSTR-MAXP
This is an integer specifying the highest pitch in the instrument's range.
It may also be set to NIL, in which case the upper range is considered to be unlimited.
This is only useful if the CHECK-RANGES setting is set to T.
INSTR-SIMULTLIM
This is an integer of 1 or greater specifying the maximum number of simultaneous pitches allowed in a single voice.
It may also be set to NIL, indicating that there is no limit.
INSTR-TPOSE
This is set to the value NIL or an integer indicating the number of semitones to transpose
the instrument before notating it.
This number only has an effect if the TRANSPOSE setting is set to T.
INSTR-CLEFLEGLS
The value of this slot influences how FOMUS decides when to change clefs.
A clef change isn't considered necessary until the number of ledger lines required exceeds a threshold value.
Other factors determine if there is actually a clef change or not.
If the value is an integer, it designates the threshold number of ledger lines in all cases.
If it's a list, the first element of the list must be an integer specifying a default threshold.
This is followed by one or more exceptions, each in the form of a list.
This exception list contains a clef symbol (see the CLEFS slot above)
followed by one of the two symbols :UP or :DN
and ended by an integer specifying the number of ledger lines.
An example illustrates this data structure.
INSTR-8UPLEGLSThis value influences how FOMUS chooses where to place ottava brackets above the staff. An ottava bracket isn't considered necessary until the number of ledger lines required exceeds a threshold value. An integer in this slot indicates the threshold value, while a list of two elements specifies the threshold for the ottava bracket to begin and the threshold below which the number of ledger lines must drop for it to end.
INSTR-8DNLEGLS
This is the same as INSTR-8UPLEGLS above, only for ottava brackets placed below the staff
INSTR-PERCS
This is a list of symbols, PERC objects, numbers or lists
indicating all of the percussion instruments that are to be notated together as a group.
PERC objects provide necessary extra information for notating percussion.
All of these value types function to lookup percussion instruments in the same way as the PART-INSTR
slot of the PART class.
Symbols are used as lookup values into a user-defined percussion instrument table (see the
PERCUSSION setting) or FOMUS's own predefined table.
Lists contain a symbol lookup value followed by keyword-argument pairs signifying values to replace in the predefined percussion table--it will
usually be necessary to use a list instead of a symbol since the NOTE and
VOICE slots are empty in FOMUS's table.
Example 4.11. INSTR-PERCS Slot Setting
(list '(:low-tom :note 0 :voice 1) '(:high-tom :note 4 :voice 1)
(make-perc :anvil :note -3 :voice 2 :midinote-ex 79))
MIDIPRGCH-IM
This is a number from 0 to 127 or a list of such numbers specifying which MIDI program change values can
translate to this instrument.
This is used when specifying an instrument as a program change number (see the INSTR slot in the
PART class) or calling the
GET-MIDI-INSTR function.
When given a program change number, FOMUS finds the first instrument that matches in its list.
MIDIPRGCH-EX
This is usually a number from 0 to 127 specifying which program change value is to be used when exporting
MIDI data.
It can also be set to a list, the first element of which is the number mentioned above followed by keyword/value pairs indicating alternate program
change values for different playing modes.
(For example, the list '(40 :pizz 45) is a valid value for a violin instrument.)
The keywords currently allowed are :PIZZ, :STOPPED, :OPEN and :HARMONIC.
(More will be added in future releases.)
Constructor:
(MAKE-PERC &key
:SYM
sym
:STAFF staff
:VOICE voice
:NOTE note
:AUTODUR autodur
:MARKS marks
:MIDINOTE-IM midinote-im
:MIDINOTE-EX midinote-ex)
Copy Function:
(COPY-PERC
perc &key
:SYM sym
:STAFF staff
:VOICE voice
:NOTE note
:AUTODUR autodur
:MARKS marks
:MIDINOTE-IM midinote-im
:MIDINOTE-EX midinote-ex)
Accessors:
PERC-SYM
This is a unique symbol identifying the percussion instrument.
It is used as a lookup value so that it may easily be specified in INSTR structures.
PERC-STAFF
This is an integer of 1 or greater specifying on which staff the
instrument appears on.
PERC-VOICE
This is an integer of 1 or greater specifying a voice that this
instrument belongs to.
Specifying different voices prevents notes belonging to different instruments from being beamed together.
PERC-NOTE
This is an integer or symbol designating where the instrument's notes are to appear on the staff.
The value is interpreted with middle C in the center as if notated with an alto clef signature.
See EVENT-NOTE in the NOTE class for information on
specifying notes with symbols.
Percussion notes should not require flats or sharps.
PERC-AUTODUR
If set to T, indicates that FOMUS should determine
durations for this instrument.
This is appropriate for percussion instruments that don't have long sustain times
and can therefore be notated with durations that are simpler to read.
Notes containing certain marks such as trills and tremolos are left unchanged.
This slot is T by default.
PERC-MARKS
Contains a list of MARKS to be added to
NOTE objects that specify this percussion instrument.
An example value to put here might be ((:text "R.S." :up)) for a "rim shot" percussion instrument.
PERC-MIDINOTE-IM
Represents the MIDI note or notes used to import MIDI data.
This can either be an integer from 0 to 127 or a list of such integers.
PERC-MIDINOTE-EX
An integer value from 0 to 127 representing the MIDI note used when exporting MIDI data.
Table of Contents
Settings are arguments or parameters used to pass data to FOMUS for processing.
There are a lot of them, but only a few of them are essential or even important for most users.
The most useful ones are listed below--many of the ones that aren't on this list are there
to provide some way of tweaking FOMUS's decisions or turning various
decision-making algorithms on and off.
Setting values can be passed to the FOMUS function as keyword/argument pairs or
bound as special variables, the names of which are derived by surrounding the symbol names with asterisks.
All of the variables are exported symbols in the FOMUS package.
See Initialization File for an explanation of how to modify default values for any of these settings.
:ACC-CAUT-ACC-DISTThis number represents the maximum distance a cautionary accidental may be from the note that causes it.
:ACC-THROUGHOUT-MEAS
If set to T, accidentals carry to the end of the measure.
If set to NIL, accidentals affect only the note they precede.
:AUTO-ACCIDENTALS
If set to T, FOMUS automatically determines note spellings.
If set to NIL, a generic set of note spellings is used (all notes receive flats except for F sharp).
The user may supply note spellings to override FOMUS's spellings.
:AUTO-ACCS-PLUGIN
Designates which plugin is to be used for determining note spellings.
Current possible values are T, :NOKEY1 and :NOKEY2.
T represents the default plugin and is equivalent to :NOKEY1.
:AUTO-BEAM-PLUGIN
Designates which plugin is to be used for beaming.
Current possible values are T and :BEAMS1.
T represents the default plugin and is equivalent to :BEAMS1.
:AUTO-BEAMS
If set to T, FOMUS determines beaming based on time signature information and
decisions it makes regarding irregular measure divisions.
If set to NIL, beaming decisions are made by the backend notation program.
:AUTO-CAUTIONARY-ACCS
If set to T, FOMUS inserts several different kinds of cautionary accidentals.
The user can supply her own cautionary accidentals with the :CAUTACC mark.
:AUTO-DISTR-RESTS-PLUGIN
Designates which plugin is to be used for determining how rests are distributed among staves.
Current possible values are T and :RESTS1.
T represents the default plugin and is equivalent to :RESTS1.
:AUTO-DYN-NODUP
If set to T, indicates that FOMUS should eliminate all redundant dynamic markings.
:AUTO-GRACE-SLURS
If set to T, FOMUS automatically puts slurs over all grace notes.
If set to NIL, the user must supply all grace note slurs with
:STARTGRACESLUR-,
:GRACESLUR- and :ENDGRACESLUR- marks.
:AUTO-MULTIVOICE-COMB-PLUGIN
Designates which plugin is to be used for determining how simultaneous notes from different voices are combined into chords on the same staff.
Current possible values are T and :COMB1.
T represents the default plugin and is equivalent to :COMB1.
:AUTO-MULTIVOICE-NOTES
If set to T, FOMUS combines simultaneous notes from different voices into chords.
:AUTO-MULTIVOICE-RESTS
If set to T, FOMUS combines equivalent simultaneous rests from different voices into single rests.
:AUTO-OTTAVAS
If set to T, FOMUS automatically determines where to place ottava brackets.
If set to NIL, the user must supply all ottava brackets with
:8UP, :8DOWN
and related spanner marks.
:AUTO-OTTAVAS-PLUGIN
Designates which plugin is to be used for determining where ottava brackets occur.
Current possible values are T and :OTTAVAS1.
T represents the default plugin and is equivalent to :OTTAVAS1.
:AUTO-OVERRIDE-TIMESIGS
If set to T, FOMUS extends or contracts measures within certain bounds,
adding new time signatures as necessary to fit measures into the user-supplied time signatures given
in the GLOBAL or PARTS settings.
If set to NIL, FOMUS simply cuts the last measure (also inserting a new time signature)
before a new time signature change, resulting in measures of arbitrary sizes depending on where the cut occurs.
:AUTO-PERCUSSION-DURS
If set to T, FOMUS determines the durations of all percussion
instruments that have their AUTODUR slot
set to T.
Percussion instruments that don't need to be notated precisely with respect to duration are then notated
with durations that are simpler to read (without tying together groups of notes).
:AUTO-PIZZ/ARCO
If set to T, indicates that FOMUS should convert each consecutive group of
:PIZZ marks it finds to a single pair of
:PIZZ and :ARCO marks.
This makes it easier to notate pizz. and arco changes by simply attaching :PIZZ
marks where they belong.
:AUTO-QUANTIZE
If set to T, FOMUS quantizes offsets and durations so that
everything fits into the closest fitting tuplets and beat divisions possible.
If set to NIL, all offset and duration values must be precise ratios or integers--
floating point numbers are treated with the RATIONALIZE function in this case (this isn't recommended).
If no quantizing is done and offsets and durations of events don't fit into anything that is "notatable" then
FOMUS will complain with an error.
:AUTO-QUANTIZE-PLUGIN
Designates which plugin is to be used for quantizing.
Current possible values are T and :QUANTIZE1.
T represents the default plugin and is equivalent to :QUANTIZE1.
:AUTO-STAFF/CLEF-CHANGES
If set to T, FOMUS automatically determines staff and clef changes for voices.
If set to NIL, the user must supply all staff and clef changes with :STAFF, :CLEF
and related marks.
:AUTO-STAFF/CLEFS-PLUGIN
Designates which plugin is to be used to determine automatic staff and clef changes.
Current possible values are T and :STAVES/CLEFS1.
T represents the default plugin and is equivalent to :STAVES/CLEFS1.
:AUTO-VOICES-PLUGIN
Designates which plugin is to be used for determining how notes are distributed into separate voices.
Current possible values are T and :VOICES1.
T represents the default plugin and is equivalent to :VOICES1.
:AUTO-VOICING
If set to T, FOMUS automatically decides how to distribute notes among multiple voices,
given the choices specified in the NOTE, REST and MARK objects.
If set to NIL, the user must specify explicitly which voice an event belongs to.
:BEAT-DIVISIONThe value of this setting is used by the quantizing algorithm to determine how to round offsets and durations. If only an integer is given, it represents the number of divisions per beat in a non-compound meter-- the compound meter value is then calculated by multiplying the first number by 3/2. If specified as a list of two integers, the first integer represents the number of divisions per beat in a non-compound meter while the second represents the number of divisions in a compound meter. The first number must be a power of 2 while the second number 3/2 or 3/4 times a power of 2.
A BEAT-DIVISION of 2, for example, tells FOMUS
to quantize to eighth-note values (if the current beat is a quarter-note).
In a compound 12/4 meter, this setting also tells FOMUS to quantize to an eighth-note value (2 multiplied by 3/2
is 3, and there are 3 eighth-notes per beat).
In the same compound 12/4 meter, a setting of '(4 6) would cause durations to be quantized to sixteenth notes (there
are 6 sixteenth notes per beat).
BEAT-DIVISION specifies only approximately how durations are quantized inside tuplets.
It is completely predictable only when the MAX-TUPLET
setting is set to NIL or the notation contains nothing that would generate any kind of tuplet.
When tuplets are allowed and FOMUS tries to create them, it divides them into units that are as
close as possible in duration to the non-tuplet divisional units.
For example, if BEAT-DIVISION is set to 16 and it's allowable for
FOMUS to try to divide one beat into a septuplet, then it's possible for notes to be quantized to either 16 or 14
divisions per beat (since a septuplet divides evenly into 14 units and 1/14 is the closest septuplet divisional duration to 1/16).
:CAUT-ACC-NEXT-MEAS
When set to NIL, indicates that cautionary accidentals may occur only in the same measure as the note that causes them.
When set to 1, specifies that cautionary accidentals may occur only if they are in the measure immediately after the note that causes them.
When set to T or 2, specifies that cautionary accidentals may occur in any measure after the note that causes them.
:CAUT-ACC-OCTAVES
When set to T, the cautionary accidental algorithm places cautionary accidentals at all octave transpositions
from the note that causes them.
When set to the integer 1 or greater, specifies the maximum number of octaves a cautionary accidental
can be from the note that causes it.
:CAUT-ACC-OTTAVAS
When set to T, the cautionary accidental algorithm considers the presence of ottava brackets, placing
cautionary accidentals where apparent octave transpositions might cause confusion.
:CHECK-RANGES
When set to T, activates a check that prints warnings if it finds notes out of range for their instruments.
The MINP and MAXP slots in the appropriate INSTR
object must be set for this to have any effect.
:CM-SCALE
If set to T, indicates that the value of CM-SCALE will be used
to parse note symbols (as the value of the :IN keyword argument) if CM is present and being used.
:CMN-VIEW-EXEThis is a string specifying the path and filename to the executable for the Common Music Notation viewer application. The full pathname may or may not need to be specified depending on the Lisp implementation. The default application depends on what is installed on the user's machine, and should be an application appropriate for viewing PostScript or EPS files.
:CMN-VIEW-OPTSThis is a list of strings representing options to be passed to the CMN viewer application executable.
:COMP-LONG-EIGHTH-BEAM-COUNT
This is set to an integer greater than 0, specifying the number of eighth notes that need to be present
to be beamed as groups of 6 in compound meters.
This setting is only effective if LONG-EIGHTH-BEAMS is set to T.
:COMPOSERThis is an optional string value containing the composer's name.
:DEBUG-FILENAME
If set to a string, represents the name of a file to which debug information is dumped each time the FOMUS
function is called.
If you wish to report a bug, please send the contents of this file.
:DEFAULT-BEAT
Specifies a default value for the BEAT slot of
TIMESIG objects that are not compound time signatures.
This setting is 1/4 by default, specifying that for non-compound meters a quarternote is
equivalent to 1 beat.
In compound time signatures the beat is always infered from the denominator (for example, in a 12/8 meter the
beat is 3/8).
:DEFAULT-GRACE-DURIf FOMUS needs to convert a note into a grace note, this value is used as the grace note's duration.
:DEFAULT-GRACE-NUM
If FOMUS needs to convert a note into a grace note, this value is used as the grace note's default position number.
This value together with the grace note's context determines the actual position (when necessary, FOMUS will
increment or decrement this value to determine the actual position number).
See the DUR slot in class NOTE
for more information.
:DEFAULT-INSTR
This is a default INSTR object to be used in cases when
another instrument isn't specified.
:DEFAULT-MEAS-DIVSThis list is a table containing possible ways of dividing measures into smaller segments or divisions. These segments affect how notes are split, tied and beamed. Entries in this list replace entries in FOMUS's own default table if they exist. Each member of this list is itself a list, containing an integer or ratio lookup value as the first element followed by one or more lists of integers/ratios that each add up to the first number.
Example 5.1. DEFAULT-MEAS-DIVS Setting
:default-meas-divs
'((3 (2 1) (1 2))
(4 (2 2))
(5 (3 2) (2 3))
(6 (4 2) (2 4))
(7 (4 3) (3 4)))
The numbers in these lists correspond to the number of beats in a measure, multiplied or divided by 2 if necessary.
In most cases, only specify integers should be necessary, though ratios may also be used.
For example, if a 7/8 measure with a quarter-note beat is processed, FOMUS
first tries to lookup a set of divisions using the index number 7/2, then 7, 14, etc..
This way the lookup value 7 is sufficient for any meter with a numerator of 7, though it's possible to supply
more specific entries such as 7/2 (for measures that contain 3 + 1/2 beats).
:DEFAULT-TIMESIG
If no time signature is specified in the GLOBAL or
PARTS lists, this default one is used.
:DEFAULT-TUPLET-DIVSThis list is a table containing possible ways of dividing tuplets into smaller segments or divisions. These segments affect how notes are split, tied and beamed. Entries in this replace entries in FOMUS's own default table if they exist. Each member of this list is itself a list, containing an integer lookup value as the first element followed by one or more lists of integers that each add up to the first number.
Example 5.2. DEFAULT-TUPLET-DIVS Setting
:default-meas-divs
'((3 (2 1) (1 2))
(4 (2 2))
(5 (3 2) (2 3) (4 1) (1 4))
(6 (4 2) (2 4))
(7 (4 3) (3 4)))
The numbers in this list correspond to numerators of tuplet ratios (or multiples or divisions of two).
When FOMUS needs to find possible divisions for a triplet, for example, it uses the entries
in the list corresponding to lookup value 3.
If it needs to lookup divisions for a sextuplet, it will first try to lookup the number 6 and then use
3 if an entry for 6 doesn't exist.
:DEFAULT-TUPLETS
This list is a lookup table indicating what ratios FOMUS should use when deciding how to notate tuplets.
Each list element is itself a list of two integers specifying a tuplet ratio, or how many durational units should be used in place of another.
'(7 4) thus specifies that septuplet eighth notes are to be used in place of 4 eighth notes. FOMUS
searches this table by finding a match for number of tuplet divisions (the first integer in each pair) and checking the second integer to see if it's
appropriate for the context it is in (a power of 2 of the actual number of durational units).
Thus, several entries for septuplets might exist: '(7 4) for the majority of cases and '(7 5) for
cases where, for example, 7 eighth notes might span an entire 5/8 measure or a section of a larger tuplet.
Example 5.3. DEFAULT-TUPLETS Setting
:default-meas-divs '((3 2) (6 5) (5 4) (7 4) (7 5) (13 8) (13 10))
The default value is NIL.
If FOMUS doesn't find an entry for a tuplet division here, it determines its own depending on the value
of TUPLET-FUNCTION.
:DOTTED-NOTE-LEVEL
Indicates how dotted notes are allowed to appear.
Possible values are T, :ALL, :TOP and :SIG.
:ALL specifies that they can appear anywhere, :TOP specifies that they can appear
only if they occupy an entire measure, and :SIG specifies that they can appear if they occupy durations
larger than a beat.
T is equivalent to :ALL.
:DOUBLE-DOTTED-NOTES
If set to T, indicates that double-dotted notes are allowed.
:EFFECTIVE-GRACE-DUR-MUL
If FOMUS needs to determine the effective duration of a grace note (for scoring or comparison purposes),
it multiplies the value of this setting
with the duration given in the grace note's DUR slot.
:ENSEMBLE-TYPE
This setting determines how parts are both ordered and grouped
together with brackets and barlines in the score.
Setting this to a symbol specifies a lookup value for a ordering/grouping table entry specified
in the INSTR-GROUPS setting or
FOMUS's own default table.
It may also be set to an ordering/grouping data structure, in which case this specified ordering/grouping is used instead.
An ordering/grouping data structure is a list of symbols or nested lists of symbols that specify both the groups and the layout order of parts.
A symbol specifies an instrument while a list contains a group type
(a symbol designating what type of bracket is to appear on the left-hand margin
of the score and how barlines are to appear) followed by more instrument symbols or lists (see the example below).
A group type is one of the symbols :GROUP, :GRANDSTAFF or :CHOIRGROUP.
A look at the following examples might make this clearer:
Example 5.5. ENSEMBLE-TYPE Setting 2
:ensemble-type
'((:my-orchestra
(:group (:group :piccolo :flute) (:group :oboe :english-horn)
(:group :bf-clarinet :a-clarinet :bass-clarinet)
(:group :bassoon :contra-bassoon))
(:group (:group :horn) (:group :c-trumpet :bf-trumpet)
(:group :alto-trombone :tenor-trombone :bass-trombone)
(:group :tuba))
:timpani :percussion
(:grandstaff :piano)
(:group (:group :violin) (:group :viola) (:group :violoncello)
(:group :contrabass))))
:EVENTS
This is a global list of events to be processed by FOMUS.
An event can be a NOTE,
REST or MARK object.
A NOTE or
REST object must have a symbol or number in its
PARTID
slot specifying which part it belongs to.
A MARK object may have a default PARTID
value of NIL to specify all parts or
a symbol/number or list of symbols/numbers to specify only those parts.
(Note that specifying part ID information isn't necessary when event objects are listed in the
EVENTS slot of a
PART object.
Including these objects in the events list provides an alternative to listing them inside PART objects.)
See Objects for more detailed descriptions of these objects and their uses.
:FILENAME
This string represents the path and filename to which FOMUS adds an appropriate extension when it saves
output in various formats.
This setting in combination with the OUTPUT setting determines the actual output filenames.
:GLOBAL
This is a list of objects that have "global" influence over other events in the PARTS
and EVENTS settings.
Only objects of type TIMESIG and
KEYSIG are allowed here (KEYSIG
isn't implemented yet).
When a global object's PARTIDS slot is set to the default value of NIL
the object affects all parts that don't already have a TIMESIG or
KEYSIG attached to them at that point.
When its PARTIDS slot is set to symbol or list of symbols the
object affects those parts only.
This enables the specification of multiple simultaneous time signatures and polymeters (not implemented yet).
:GRANDSTAFF-HIDE-RESTS
When set to T or :SOME, indicates that FOMUS hides some rests
when combining multiple voices in a grand staff.
This makes the notation easier to read for multi-staff instruments by eliminating rests that aren't necessary.
When set to :ALL indicates that all rests in all parts are hidden (this could be more useful in the future
when proportional notation is supported).
When set to NIL indicates that no rests are hidden.
:INPUT-BEAT-VALUE
When set to some real number greater than 0, indicates that this durational value is to be interpreted as one beat.
FOMUS scales all input objects by dividing offsets and durations by this value before doing any other processing.
A value of NIL is the default and is equivalent to 1.
:INPUT-OFFSET
When set to some real number, indicates that this durational value is to be interpreted as one beat.
FOMUS shifts all input objects by adding this value to all offsets before doing any other processing.
A value of NIL is the default and is equivalent to 0.
:INSTR-GROUPS
The value of this setting is a table in the form of a list that provides a way of adding instrument orderings and groupings
to FOMUS's own default table.
These tables map symbol lookup values to ordering/grouping data structures which specify how parts are both ordered and grouped
together with brackets and barlines in the score.
The user may choose one of these groupings by setting ENSEMBLE-TYPE to
a symbol lookup value.
The user-supplied list is searched first so user-supplied orderings/groupings can override FOMUS's
default orderings/groupings.
The setting is a list of lists, the first element in each inner list containing a symbol specifying a unique lookup name.
These are followed by grouping/ordering definitions:
symbols or nested lists of symbols that specify both the groups and the layout order of parts.
In this data structure a symbol specifies an instrument while a list contains a group type
(a symbol designating what type of bracket is to appear on the left-hand margin
of the score and how barlines are to appear) followed by more instrument symbols or lists (see the example below).
A group type is one of the symbols :GROUP, :GRANDSTAFF or :CHOIRGROUP.
A look at the following example might make this clearer:
Example 5.7. INSTR-GROUPS Setting
:instr-groups
'((:orchestra
(:group (:group :piccolo :flute) (:group :oboe :english-horn)
(:group :bf-clarinet :a-clarinet :bass-clarinet)
(:group :bassoon :contra-bassoon))
(:group (:group :horn) (:group :c-trumpet :bf-trumpet)
(:group :alto-trombone :tenor-trombone :bass-trombone)
(:group :tuba))
:timpani :percussion
(:grandstaff :piano)
(:group (:group :violin) (:group :viola) (:group :violoncello)
(:group :contrabass)))
(:ensemble
:piccolo :flute :oboe :english-horn :bf-clarinet :a-clarinet :bassoon
:contra-bassoon (:grandstaff :piano)))
:INSTRUMENTS
The user can use this setting to specify additional INSTR
objects that are added to the default instrument list.
FOMUS searches this list before its own default list when resolving symbols to instrument definitions, so they may
be replacements or modifications of existing instruments.
The contents are either instrument objects created with MAKE-INSTR
or lists specifying modifications to FOMUS's default instruments (or a combination of both).
If a list is specified, it contains a symbol specifying a default instrument followed by keyword/argument pairs indicating slot values that replace
existing default values (see the INSTR slot in the
PART object
and PART-INSTR Slot Setting for an example of this).
Example 5.8. INSTRUMENT Setting
:instrument
(list (make-instr :recorder :clefs :treble)
'(:piano :staves 3 :simultlim 6))
:LILYPOND-EXEThis is a string specifying the path and filename to the LilyPond executable. The full pathname may or may not need to be specified depending on the Lisp implementation.
:LILYPOND-FILEHEADThis is a string or list of strings representing text to be inserted directly into a LilyPond output file. Each string in the list is followed by a carriage return. The text is inserted near the top of the file at a point before any score or part data appears.
:LILYPOND-OPTS
This is a list of strings representing options to be passed to the LilyPond executable.
The default is currently '("--ps") for Linux or '("--pdf") for OS X/Windows,
specifying that LilyPond should generate either a PostScript or PDF format file.
:LILYPOND-OUT-EXT
This is a string specifying the extension for the output filename that is created when LilyPond is run.
The default is "ps" for Linux and "pdf" for OS X/Windows.
:LILYPOND-SCOREHEADThis is a string or list of strings representing text to be inserted directly into a LilyPond output file at the beginning of a score block. Each string in the list is followed by a carriage return.
:LILYPOND-TEXT-MARKUP
This is a "wrapper" string specifying LilyPond markup instructions to be used when
printing text above or below the staff.
The string must have an ~A or similar substring to indicate where to place the actual text
(as if in a call to FORMAT).
The default value is "\markup{\italic{~A}}".
:LILYPOND-TEXTACC-MARKUP
This is a "wrapper" string specifying LilyPond markup instructions to be used when
engraving accidentals as text.
The string must have an ~A or similar substring to indicate where to place the actual text
(as if in a call to FORMAT).
The default value is "\\markup{\\tiny{~A}}".
:LILYPOND-TEXTDYN-MARKUP
This is a "wrapper" string specifying LilyPond markup instructions to be used when
printing text in a dynamic-type font.
The string must have an ~A or similar substring to indicate where to place the actual text
(as if in a call to FORMAT).
The default value is "\markup{\dynamic{\italic{\bold{~A}}}}".
:LILYPOND-TEXTNOTE-MARKUP
This is a "wrapper" string specifying LilyPond markup instructions to be used when
printing text above single notes.
The string must have an ~A or similar substring to indicate where to place the actual text
(as if in a call to FORMAT).
The default value is "\markup{\italic{~A}}".
:LILYPOND-TEXTTEMPO-MARKUP
This is a "wrapper" string specifying LilyPond markup instructions to be used when
printing text in a heavy "tempo" font.
The string must have an ~A or similar substring to indicate where to place the actual text
(as if in a call to FORMAT).
The default value is "\markup{\bold{\huge{~A}}}".
:LILYPOND-VERSION
If set to a string (for example, "2.8"), forces FOMUS to output LilyPond files for that
version.
:LILYPOND-VIEW-EXEThis is a string specifying the path and filename to the executable for the LilyPond viewer application. The full pathname may or may not need to be specified depending on the Lisp implementation. The default application depends on what is installed on the user's machine, and should be one appropriate for viewing PostScript files.
:LILYPOND-VIEW-OPTSThis is a list of strings representing options to be passed to the LilyPond viewer application executable.
:LONG-EIGHTH-BEAM-COUNT
This is set to an integer greater than 0, specifying the number of eighth notes that need to be present
to be beamed as a group of 4.
This setting is only effective if LONG-EIGHTH-BEAMS is set to T.
:LONG-EIGHTH-BEAMS
If set to T, specifies that the beaming algorithm should beam eighth notes into groups of up
to 4 under certain conditions (if enough of them are present).
If set to :ALWAYS, specifies that eighth notes are always beamed in groups of 4.
If set to NIL, specifies that eighth notes are never beamed in groups of 4.
:MAX-OTTAVA-REST-DIST
This is a real number greater than 0, specifying the maximum distance an ottava bracket will span over a group
of contiguous rests.
:MAX-TUPLET
If set to an integer, represents the largest tuplet allowed.
If set to a list of integers, represents the largest tuplets allowed for each nested tuplet level (and also specifies how many levels of
tuplet nesting are allowed by the length of the list).
A value of '(7 3), for example, specifies two levels of tuplet nesting with septuplets being the maximum
allowed in the outer level and triplets being the maximum in the inner level.
A value of NIL specifies that no tuplets are to be used.
:MAX-TUPLET-DURThis is the largest duration in beats that a tuplet can span.
:MIN-AUTO-TIMESIG-DUR
if AUTO-OVERRIDE-TIMESIGS is set to T,
FOMUS automatically generates new time signatures as necessary to fit measures into the
time signatures specified in the GLOBAL and
PARTS list.
The value of this setting represents the smallest duration (in beats) of any such time signature that is generated.
See TIMESIG and TIMESIG-REPL for more information.
:MIN-GRANDSTAFF-HIDE-RESTS-DUR
This is a real number greater than 0, specifying the minimum duration that a group of simultaneous rests must occupy
in order for some of them to be hidden.
This is applicable only when there are multiple voices on a staff, in cases where several simultaneous rests can be
shown as one rest.
AUTO-MULTIVOICE-RESTS must also be set to T
for this to have any effect.
:MIN-MULTIVOICE-CHORDS-DUR
This is a real number greater than 0, specifying the minimum duration a group of simultaneous notes in separate
voices must span to be combined into chords.
This is applicable only when there are multiple voices on a staff, and if
AUTO-MULTIVOICE-NOTES is set to T.
:MIN-SPLIT-ALL-PARTS-DURThis is the smallest duration that FOMUS will consider when deciding whether or not to "split" or divide all parts together or separately. (Splitting means splitting and tying notes as necessary to properly notate a given rhythm in a given measure.) A unit of music must be larger than this value to be considered--units equal to or smaller than this duration are not considered. FOMUS splits measures in all parts together up to a certain point to insure that the notation is consistently divided in all parts. A 5/8 measure, for example, will be consistently divided as either 3 + 2 to 2 + 3 in all parts together (as long as the value of this setting is smaller than the duration of a 5/8 measure).
:MIN-TUPLET-DURThis is the smallest duration in beats that a tuplet can span.
:PARTS
This is a list of PART objects, each representing a stave or grand staff in the score.
At least one part must be specified.
:OUTPUT
This is either a list or a list of lists specifying one or more output files with optional keyword/argument pairs for tweaking their contents.
Current possible output symbols are :DATA or :FOMUS, :RAW, :MUSICXML,
:MUSICXML-SIBELIUS, :MUSICXML-FINALE, :CMN, :LILYPOND and :MIDI.
More information on these is given in Outputs.
The following are examples of valid output specifications:
:PERCUSSION
This is a list of PERCUSSION objects serving as a lookup table for information pertaining to
percussion notation.
PERCUSSION objects are listed in
INSTR objects to define
collections of percussion instruments that are notated together on a single staff.
FOMUS searches this user setting list before its own default list when
resolving symbols to percussion instrument definitions, so they may
be replacements or modifications of FOMUS's predefined percussion instruments.
The contents are either percussion objects created with MAKE-PERC
or lists specifying modifications to FOMUS's default percussion objects (or a combination of both).
If a list is specified, it contains a symbol specifying a default percussion instrument followed by keyword/argument pairs indicating slot values that replace
existing default values (see the PERCS slot in the
INSTR object for an example of this).
Example 5.12. PERCUSSION Setting
:instrument
(list (make-perc :anvil :note -3 :voice 2 :midinote-ex 79)
'(:triangle :note 0 :voice 1))
See the documentation for PERCUSSION objects for more information.
:QUALITY
This is a real number indicating how much FOMUS should trade
speed of computation for "quality" of output.
Setting it lower increases speed while setting it higher gives better results.
The default is 1, which is reasonable for relatively uncomplicated scores with a small number of parts.
The most effective values are between approximately -3 and 3, though complex
scores might show a little improvement (better guesses within a larger context) with values of 5 or more.
After a certain point increasing this value only makes the program run slower with no noticeable improvement in output.
:QUARTERTONES
If set to T, FOMUS rounds pitches to quartertone values
and uses quartertone notation in the score.
This only works if the algorithm specified by the AUTO-ACCS-PLUGIN setting
supports it.
FOMUS's default plugin :NOKEY1 supports quartertones.
:SHORTLONGSHORT-NOTES-LEVEL
Indicates how "short-long-short" note patterns are allowed to appear.
An example of such a pattern is an eighth note followed by a quarter note then an eighth note, and is treated as
an exception to insure that the middle note isn't split in the middle and tied.
Possible values are T, :ALL, :TOP and :SIG.
:ALL specifies that this pattern can appear anywhere, :TOP specifies that it can appear
only if it occupies an entire measure, and :SIG specifies that it can appear if it occupies a duration
larger than a beat.
T is equivalent to :ALL.
:SPLIT-PLUGIN
Designates which plugin is to be used for splitting and tying notes.
Current possible values are T and :SPLIT1.
T represents the default plugin and is equivalent to :SPLIT1.
:SUBTITLEThis is an optional string value containing the subtitle of the composition.
:SYNCOPATED-NOTES-LEVEL
When set to T, indicates that a certain syncopated note pattern,
a short note followed by any number of long notes then a short note, may appear.
An example of such a pattern is an eighth note followed by several quarter notes then an eighth note.
This can only occur if the pattern occupies the duration of an entire measure.
:TIMESIG-STYLE
This indicates how time signature are printed.
It can be set to :FRACTION or :COMMON, specifying that either fractional or common
time signatures are to be used in the backend (given the choice).
The default value of NIL is equivalent to specifying :FRACTION.
:TITLEThis is an optional string value containing the title of the composition.
:TRANSPOSE
When set to T, activates a transposition function that automatically transposes note values.
The TPOSE slot of the appropriate INSTR
objects must be set for this to have any effect.
:TUPLET-DOTTED-RESTS
If set to T, specifies whether or not dotted rests are allowed inside tuplets of irregular (ie. not a power of 2)
divisions.
For example, a quintuplet might be divided into a dotted eight rest followed by an eighth note if
TUPLET-DOTTED-RESTS is true.
:TUPLET-FUNCTION
Designates which function is to be used for determining tuplet ratios.
Current possible values are T, :POW2 and :DUR.
T represents the default function and is equivalent to :POW2.
:POW2 determines tuplet ratios based on the rule that the number of tuplet divisions replace (in most cases)
the number of durational units equaling the next lowest power of two. FOMUS thus notates 7 in the time of 4
and 13 in the time of 8. :DUR determines ratios
by finding the closest number of durational units to the number of tuplet divisions. FOMUS then notates
7 in the time of 8 and 13 in the time of 16.
:TUPLET-STYLE
Specifies how tuplets are to be printed.
The possible values are :RATIO or :SINGLE.
The default value of NIL is equivalent to :SINGLE.
:USE-CM
If set to T, indicates that FOMUS should use Common Music functions if present.
Note symbols are then parsed by CM using the value of
CM-SCALE as if it were passed as the :IN argument to
CM's KEYNUM function.
Also, durations specified as symbols indicate notational durations and are interpreted
as such using CM's RHYTHM function.
Numbers are still interpreted by FOMUS in terms of beats.
:USE-DOUBLE-ACCS
If set to T, the note spelling algorithm considers double sharps and double flats in addition to
single sharps and flats.
:VERBOSE
This must be set to a value from 0 to 2, indicating the amount of printed output.
A value of 0 represents minimal output while a value of 2 represents maximal output.
Table of Contents
Marks are symbols or lists of symbols with arguments that appear in the MARKS slots of
NOTE,
REST and
MARK objects.
All extra information (articulations, ornamentations, etc.) that doesn't have a special slot in these objects is indicated with marks.
A few "marks" can also appear in TIMESIG and
PART objects, but are called properties--for these, the syntax is exactly the same.
Two types of marks exist:
Simple marks that apply only to the NOTE,
REST or
MARK object
they are included in.
Marks that indicate they are to be applied over a range of these objects.
These marks are distinguished by a trailing dash character at the end of the symbol (for example,
:STARTSLUR-
and :ENDSLUR-).
Exceptions that don't have a trailing dash are :STARTWEDGE> and
:STARTWEDGE< and related marks.
The second type is mostly used to indicate "spanners," or items in the score that occur across a range of notes such as slurs or ottava brackets.
Most of them come in a group of three, one prefixed with the string START, another with no prefix, and the last one with the prefix
END. (For example, :STARTSLUR-, :SLUR- and :ENDSLUR-.)
Spanner marks may be indicated in two different ways:
The START and END marks are inserted in the objects that occur where the spanner begins and ends.
The START mark is inserted in the object at the point where the spanner starts and the mark without a prefix
is placed in subsequent objects up to the point where the spanner ends.
The last object with a mark in it before a new START mark is found is considered to be the end of the spanner.
In either case, care must be taken to insert all marks that belong together either in the same voice or the same staff, depending on the type of mark.
Formats for marks and their arguments are shown in a pseudo lambda-list style format with &optional symbols to designate optional arguments.
Some arguments are shown as a choice between several options or symbols, each separated by a pipe character.
In most cases, it doesn't matter in what order the arguments appear--FOMUS figures out which is which by the data types
(reorderable arguments like this are shown by a double arrow figure).
Also, spanner marks that belong together are shown together and separated with forward slashes.
The following list is a reference for the some of the arguments given in the following sections:
art-orderclefCLEFS slot in structure
INSTR for a list of these symbols).level1 may be used to designate the 1st or innermost level
and 2 to designate the 2nd level, as in two levels of slur markings).
This method allows the user to be "lazy" and leave out matching START and
END marks--FOMUS can supply the missing marks by finding the next START or
END marks in that level. The second method is to use a separate number for each start/end pair--in this case, all
START marks must have matching END marks or FOMUS will try to supply missing
marks for each individual "level" and create a mess.
noteNOTE
slot in the NOTE class).stringtrem-subdiv1/2 indicates an eighth-note tremolo, 1/4
indicates a sixteenth-note tremolo, etc.).
If the optional :NOTATED keyword is given, the number is instead interpreted as
a written duration regardless of the beat value (so in this case, 1/8 indicates an eighth-note tremolo, 1/16 indicates a sixteenth-note
tremolo, etc.). The absence of a number indicates an unmeasured tremolo and is notated with three tremolo beams.
Marks with no arguments can always be indicated with a symbol only (the enclosing list isn't necessary). Also, many of these symbols closely correspond to symbols used in some of the backend formats (MusicXML and LilyPond). Not all symbols are supported in all of the backends.
These marks add articulation symbols to notes. Multiple levels of slurs may be specified (FOMUS
applies extra sorting to slurs to insure that smaller ones occur in the "innermost" level while larger ones occur in the "outermost" level).
The :GRACESLUR- marks are slurs reserved for gracenotes, and
are automatically added by FOMUS by default.
(:STACCATO &optional |
(:STACCATISSIMO &optional
|
(:ACCENT &optional |
(:MARCATO &optional |
(:TENUTO &optional |
(:PORTATO &optional |
(:STARTSLUR- &optional
/ (:SLUR- &optional
/ (:ENDSLUR- &optional
|
:STARTGRACESLUR- / :GRACESLUR- / :ENDGRACESLUR- |
These add common dynamic markings. The :WEDGE> and
:WEDGE< marks create wedge-shaped crescendo and decrescendo markings.
All of the dynamics marks may be appended with an asterisk (for example FFF* or :STARTWEDGE<*).
These marks are equivalent to the non-asterisk versions, the only difference being that during MIDI playback dynamics changes will affect all voices in a part.
This allows the user to specify one set of notated dynamics markings for a part with multiple voices
(using MARK objects, for example), but have the MIDI playback rendered more accurately.
:FFFFFF |
:FFFFF |
:FFFF |
:FFF |
:FF |
:F |
:MF |
:MP |
:P |
:PP |
:PPP |
:PPPP |
:PPPPP |
:PPPPPP |
:SFZ |
:SFF |
:RFZ |
:FP |
:SF |
:SP |
:SPP |
:STARTWEDGE> / :WEDGE> / :ENDWEDGE> |
:STARTWEDGE< / :WEDGE< / :ENDWEDGE< |
These are notation symbols that affect duration. Three different types of fermatas may be specified (the default is :SHORT if none is specified).
Breath marks may be set to occur before or after the note it's attached to (the default is :AFTER).
The :AUTODUR mark indicates that FOMUS should determine the duration of the
note, appropriate for events such as pizzicatos or other percussive-type attacks that don't require a specific duration but only a simply notated one.
This has an effect only if the AUTO-PERCUSSION-DURS setting
is set to T.
(:FERMATA &optional |
(:BREATH &optional |
(:AUTODUR) |
These marks add common ornamentation markings.
Glissandi and portamenti may be set to occur before or after a note (the default for both is :BEFORE).
A :TREMOLO mark is notated by placing slashes over the note stems while the
:TREMOLOFIRST and
:TREMOLOSECOND marks refer to the chordal tremolos commonly
found in piano scores. These are processed by separating the notes marked "first" from the ones marked "second" into separately notated chords
and placing a tremolo-style beam over them. The optional :NOTATED keyword indicates that the subdivision number is to be
interpreted as a written duration.
The optional :UP and :DOWN keywords in the :ARPEGGIO
mark specify that a direction is to be notated using an arrowhead.
The optional note arguments are for specifying the trill note.
Only half and whole step trills are currently supported (and unison trills for percussion instruments).
(:TREMOLO &optional |
(:TREMOLOFIRST &optional
|
(:TREMOLOSECOND &optional
|
(:LONGTRILL &optional |
(:ARPEGGIO &optional |
(:GLISSANDO &optional |
(:PORTAMENTO &optional |
(:TRILL &optional |
(:MORDENT &optional |
(:PRALL &optional &optional |
These marks are for special instrument-specific effects or instructions.
If the AUTO-PIZZ/ARCO setting is set to T,
the :ARCO marks shouldn't be needed--FOMUS inserts them where they are necessary.
Harmonics are specified by attaching one or more :HARMONIC marks, each
indicating an extra note to appear above the base note.
Specifying :SOUNDING (the default) causes a small parenthesized notehead to appear while specifying
:TOUCHED causes a diamond notehead to appear.
The actual results may vary depending on the backend (extra editing may be required).
Notes are indicated with either a symbol or number, as in the NOTE
slot in the NOTE class.
(Extra accidentals are not specified here.)
:PIZZ |
:ARCO |
(:HARMONIC
|
(:OPEN &optional |
(:STOPPED &optional |
(:UPBOW &optional |
(:DOWNBOW &optional |
(:THUMB &optional |
(:LEFTHEEL &optional |
(:RIGHTHEEL &optional |
(:LEFTTOE &optional |
(:RIGHTTOE &optional |
Different kinds of text may be attached to events.
:TEXTNOTE is for text that appears over a single note (for example, "sul G"),
:TEXT and :TEXT-
are for italicized texts that appear above or beneath the staff,
:TEXTTEMPO indicates tempo changes (and is printed in a larger boldface font),
and :TEXTDYN is for texts appearing in a dynamics-type font.
For text spanners, "levels" may be specified to influence the order of their placement on the score.
(:TEXTNOTE |
(:TEXT |
(:STARTTEXT-
/ (:TEXT- &optional
/ (:ENDTEXT- &optional
|
(:TEXTTEMPO |
(:TEXTDYN |
Most of these behave as user overrides to FOMUS's automatic algorithms.
:CAUTACC indicates that a cautionary accidental is to be placed before
the note. :FORCEACC forces an accidental spelling.
:NOTEHEAD indicates a different notehead.
The :CLEF and :CLEF- spanner
marks indicate clef changes and regions where a certain clef is required. A clef spanner must occur in a single voice.
All marks containing 8UP and 8DOWN are overrides for ottava brackets and must be specified
for notes that appear in a single staff rather than a voice. The :TIE mark
ties a note to the following or previous note depending on whether :BEFORE or :AFTER (default) is supplied
and whether or note the adjacent note is the same.
:CAUTACC |
:FORCEACC |
(:NOTEHEAD
|
(:CLEF |
(:STARTCLEF
/ :CLEF- / :ENDCLEF- |
:8UP |
:START8UP- / :8UP- / :END8UP- |
:8DOWN |
:START8DOWN- / :8DOWN- / :END8DOWN- |
(:TIE &optional |
The :IGNORE has no effect. It is intended to be useful for automatically generating
FOMUS input files.
:IGNORE |
These are marks that are specified in TIMESIG objects
(and are called properties rather than marks). They either affect one location in the score at the
TIMESIG object's offset or the entire region of the score governed by that time signature.
At the moment there's only one property, :BARLINE that
changes the type of barline that appears at the TIMESIG's
offset.
(:BARLINE
|
These are "marks" that are specified in PART objects
(and are called properties rather than marks). They either change how the part appears in the score or affect
all of the objects in that part some way.
At the moment there's only one property, :DISTR that
allows the user to distribute notes or rests across several other parts. This is done by voice so that
the user may specify multiple parts for a single instrument but insert all of the events into only one of them.
The user may then, for example, treat four violins as one instrument, inserting note events for all four instruments into
one part and letting FOMUS's voice separating algorithm figure out how they are distributed to the actual parts that appear in the score.
The syntax of this property is given below.
The PARTID argument specifies the part that notes and rests are moved to once all voices have been determined. The VOICE or
VOICEFROM arguments specify which events are to be moved. VOICETO, if given, specifies
the voice the events will have once they have been moved. If VOICETO isn't given, then the new voice defaults to
the position of the argument in the list. (:DISTR (PRT1 2 3) (PRT2 1 4)) is then equivalent to
(:DISTR (PRT1 (2 1) (3 2)) (PRT2 (1 1) (4 2)))--events in voices 2 and 3 are distributed to the part PRT1
as voices 1 and 2 while events in voices 1 and 4 are distributed to PRT2 as voices 1 and 2.
(:DISTR
( |
Table of Contents
This chapter explains options specific to each of the possible output formats.
One or more outputs or backends may be selected with the OUTPUT setting.
Most options are passed as keyword/argument pairs via this setting or in the
OPTS slot of the PART
class. Current possible output symbols are :DATA or :FOMUS, :CHUNK, :NONE,
:MUSICXML, :MUSICXML-SIBELIUS, :MUSICXML-FINALE, :CMN,
:LILYPOND and :MIDI.
The base output filename is specified using the FILENAME setting.
It may be overridden by the filename option present in each of the outputs.
Each output adds its own extension (for example, a LilyPond file gets a .ly extension added).
This produces a file with extension .fms containing a dump of the data that is
sent to FOMUS before any processing occurs.
If this is the only output specified, FOMUS simply saves the data and returns without further processing.
It may be specified using either the :DATA or :FOMUS keywords in the
OUTPUT setting.
The file is editable and can be reloaded for editing and processing by calling the FOMUS
function with the name of the file. See Text File Interface for a description of this file format.
FOMUS currently creates notation files for LilyPond versions 2.4 and 2.6.
The OUTPUT setting keyword to use is :LILYPOND.
FOMUS outputs a slightly different file depending on whether LilyPond version 2.4 or 2.6 is installed to insure
that it compiles correctly (a file for one version may give an error when compiled in the other version).
A .ly extension is added to the base filename to make the complete output filename.
When FOMUS loads it looks for LilyPond
and viewer application executables in several locations in the filesystem.
If these executables are in an uncommon location or the user wants to specify these herself, several options exist for
setting the pathnames and changing command line arguments.
When setup correctly, FOMUS can automatically compile the output file and launch a viewer (a PostScript
viewing application in Gnome or KDE
or the Preview application in OS X).
Tremolos might be represented by displaying slash marks (like in the MusicXML
:XML-1NOTE-TREMOLO-KLUDGE
and :XML-MULTINOTE-TREMOLO-KLUDGE options)
in rare cases where they can't be indicated properly.
:FILENAME | :VIEW-OPTS | :OUT-EXT |
:PROCESS | :VERSION | :TEXT-MARKUP |
:VIEW | :FILEHEAD | :TEXTDYN-MARKUP |
:EXE | :SCOREHEAD | :TEXTTEMPO-MARKUP |
:OPTS | :LILY-PARTHEAD | :TEXTNOTE-MARKUP |
:VIEW-EXE | :LILY-PARTNAME | :TEXTACC-MARKUP |
:EXE
This is a string specifying the path and filename to the LilyPond executable.
The full pathname may or may not need to be specified depending on the Lisp implementation.
This overrides the LILYPOND-EXE setting if used.
:OPTS
This is a list of strings representing options to be passed to the LilyPond executable.
The default is currently '("--ps") for Linux or '("--pdf") for OS X/Windows,
specifying that LilyPond should generate either a PostScript or PDF format file.
This overrides the LILYPOND-OPTS setting if used.
:FILEHEADThis is a string or list of strings representing text to be inserted directly into the output file. Each string in the list is followed by a carriage return. The text is inserted near the top of the file at a point before any score or part data appears.
:FILENAME
This is a string representing the output filename.
It overrides the FILENAME setting if used.
:OUT-EXT
This is a string specifying the extension for the output filename that is created when LilyPond is run.
The default is "ps" for Linux and "pdf" for OS X/Windows.
This overrides the LILYPOND-OUT-EXT setting if used.
:LILY-PARTHEAD
This option is specified in PART part objects
and is valid only for that part.
It is a string or list of strings representing text to be inserted directly into the output file.
Each string is followed by a carriage return.
The text inserted at the beginning of a staff section just before note, rest and other
information appears for that part in the file.
:LILY-PARTNAME
This option is specified in PART part objects
and is valid only for that part.
It is a string representing a part name used to uniquely identify the part in the output file.
If it isn't supplied, FOMUS automatically generates a name.
:PROCESS
If set to T, indicates that FOMUS should call LilyPond
to process the output file once it's been written.
If set to NIL, only the output file is written and no processing occurs (unless
VIEW is set to T).
:SCOREHEADThis is a string or list of strings representing text to be inserted directly into the output file at the beginning of a score block. Each string in the list is followed by a carriage return.
:TEXT-MARKUP
This is a "wrapper" string specifying LilyPond markup instructions to be used when
printing text above or below the staff.
The string must have an ~A or similar substring to indicate where to place the actual text
(as if in a call to FORMAT).
The default value is "\markup{\italic{~A}}".
:TEXTACC-MARKUP
This is a "wrapper" string specifying LilyPond markup instructions to be used when
engraving accidentals as text.
The string must have an ~A or similar substring to indicate where to place the actual text
(as if in a call to FORMAT).
The default value is "\\markup{\\tiny{~A}}".
:TEXTDYN-MARKUP
This is a "wrapper" string specifying LilyPond markup instructions to be used when
printing text in a dynamic-type font.
The string must have an ~A or similar substring to indicate where to place the actual text
(as if in a call to FORMAT).
The default value is "\markup{\dynamic{\italic{\bold{~A}}}}".
:TEXTNOTE-MARKUP
This is a "wrapper" string specifying LilyPond markup instructions to be used when
printing text above single notes.
The string must have an ~A or similar substring to indicate where to place the actual text
(as if in a call to FORMAT).
The default value is "\markup{\italic{~A}}".
:TEXTTEMPO-MARKUP
This is a "wrapper" string specifying LilyPond markup instructions to be used when
printing text in a heavy "tempo" font.
The string must have an ~A or similar substring to indicate where to place the actual text
(as if in a call to FORMAT).
The default value is "\markup{\bold{\huge{~A}}}".
:VERSION
If set to a string (for example, "2.8"), forces FOMUS to output LilyPond files for that
version.
:VIEW
If set to T, indicates that FOMUS should call LilyPond
to process the output file then open the results with a viewer program for immediate viewing.
If set to NIL, no viewer application is opened.
:VIEW-EXE
This is a string specifying the path and filename to the executable for the viewer application.
The full pathname may or may not need to be specified depending on the Lisp implementation.
The default application depends on what is installed on the user's machine, and should be
one appropriate for viewing PostScript files.
This overrides the LILYPOND-VIEW-EXE setting if used.
:VIEW-OPTS
This is a list of strings representing options to be passed to the viewer application executable.
This overrides the LILYPOND-VIEW-OPTS setting if used.
FOMUS outputs MusicXML version 1.1 format files when the :MUSICXML
keyword is used in the OUTPUT setting.
An .xml extension is automatically added to make the complete output filename.
The output file is importable into a number of different notation programs, though the quality of the
results will vary.
FOMUS doesn't including any information about positioning--this is left up to the program doing the importing
to decide.
So far, MusicXML has been tested on Sibelius version 4.1
and Finale version 2006.
Although the MusicXML format itself can support almost all of the notational elements that FOMUS supports,
a few things don't seem to work correctly or don't import at all into either of these programs.
The following major issues were found:
Most of these are easily fixed with the exception of the improper rhythm/tuplet problems. Until there are better solutions for these problems, there are some options for getting around some of them:
:FILENAME | :XML-MULTINOTE-TREMOLO-KLUDGE | :XML-PARTGROUPS-KLUDGE |
:XML-1NOTE-TREMOLO-KLUDGE | :XML-HARMONIC-KLUDGE |
:FILENAME
This is a string representing the output filename.
It overrides the FILENAME setting if used.
:XML-1NOTE-TREMOLO-KLUDGE
If set to T, indicates to insert a // symbol wherever there is a single-note tremolo.
The number of slashes indicates the number of tremolo lines that would normally be added to the note.
The default is NIL.
:XML-HARMONIC-KLUDGE
If set to T, FOMUS fudges an artificial harmonic by changing the notehead to a diamond shape.
This appears correct when imported into Finale and Siblius, but
doesn't make use of the special XML tags reserved for specifying this type of harmonic (a minor issue).
The default is NIL.
:XML-PARTGROUPS-KLUDGE
If set to T, parts are not grouped together by brackets or braces. These must then be added manually
once the notation data has been imported.
The default is NIL.
:XML-MULTINOTE-TREMOLO-KLUDGE
If set to T, indicates to insert a //- symbol wherever there is a multiple-note tremolo
(such as those sometimes found in piano scores).
The number of slashes indicates the number of tremolo beam-lines that would normally be added to the beam or beams connecting the two notes or chords.
The default is NIL.
This is equivalent to the MusicXML output with "kludge" options set appropriately for Sibelius version 4.
Use the :MUSICXML-SIBELIUS keyword in the OUTPUT setting for this.
This is equivalent to the MusicXML output with "kludge" options set appropriately for Finale.
Use the :MUSICXML-FINALE keyword in the OUTPUT setting for this.
This backend produces files in Lisp syntax suitable for loading and processing with Common Music Notation.
The OUTPUT setting for this is :CMN.
A .cmn extension is added to the base filename to make the complete output filename.
The file can be compiled and viewed automatically if CMN is loaded and an .eps file
viewing application (a PostScript viewing application in Gnome or KDE
or the Preview application in OS X) has been found or is specified by the user.
:FILENAME
This is a string representing the output filename.
It overrides the FILENAME setting if used.
:OUT-EXT
This is a string specifying the extension for the output filename that is created when the score file is loaded
and CMN is called.
The default is "eps".
:PROCESS
If set to T, indicates that FOMUS should load the score file and call CMN
to process the output file once it's been written.
If set to NIL, only the output file is written and no processing occurs (unless
VIEW is set to T).
:SCORE-ATTR
This is a list of extra CMN score attributes to be inserted into the score file.
The default is NIL.
:VIEW
If set to T, indicates that FOMUS should load the score file and call CMN
to process the output file, then open the results with a viewer program for immediate viewing.
If set to NIL, no viewer application is opened.
:VIEW-EXE
This is a string specifying the path and filename to the executable for the viewer application.
The full pathname may or may not need to be specified depending on the Lisp implementation.
The default application depends on what is installed on the user's machine, and should be
an application appropriate for viewing PostScript or EPS files.
This overrides the CMN-VIEW-EXE setting if used.
:VIEW-OPTS
This is a list of strings representing options to be passed to the viewer application executable.
It overrides the CMN-VIEW-OPTS setting if used.
This requires Common Music to output MIDI data.
The purpose of this backend is to allow the user to hear the results after any changes and adjustments made to the music
(for example, quantizing).
It should not be used as input to a score notation program, since the output data will not precisely match the input data.
FOMUS attempts to accurately simulate most of FOMUS's markings (trills, dynamic markings, etc.).
Users can override how marks are interpretted by using the EVENTS-FUN option to
provide their own instructions.
Output can also be tweaked using most of the options listed below.
See the INSTR and PERC
structures for information on how to define MIDI data for FOMUS's instruments.
MIDI output is be routed either to a file or to Common Music's realtime scheduler, the latter being advantageous if more than 16
channels are necessary (see the PLAY option).
Also, the CM-ARGS option may be used to send Common Music specific
arguments to its EVENTS or RTS function, whichever is used.
FOMUS uses floating point MIDI velocity (or amplitude) values (ie. 0.0 to 1.0).
:ARPATT
A real number from 0 to 1 specifying the amount of
attenuation to apply to arpeggios to make them sound more natural (a crescendo is also added).
The number is subtracted from the velocities of the events.
:BREATH-DUR
A real number greater than 0 specifying the duration in beats of a breath mark.
:CM-ARGS
This is a list of arguments that are sent to Common Music's
EVENTS or RTS function, whichever is used.
FOMUS overrides the :TEMPO and :PLAY keyword arguments to
these functions.
:DELAY
A real number greater than or equal to 0 specifying a delay time in seconds to be inserted at the
beginning of the MIDI file or output (useful if the score takes several seconds to appear on the screen).
:EVENTS-FUN
This options provides a way of overriding FOMUS's default interpretation of marks into MIDI events.
It is a function of the form
(lambda (,
where ev mark arg1 arg2) ...)ev is either a single Common Music MIDI object or a list of such objects,
mark is a keyword symbol specifying what modifications should occur, and arg1 and
arg2 are input arguments specific to each mark.
The function may either modify the MIDI event objects or create new ones using Common Music
functions (or return a mixture of both).
The return value is either a single MIDI object, a list of MIDI objects,
NIL or '(NIL).
Returning NIL indicates that FOMUS should use its default function to interpret the mark.
'(NIL) indicates that the return value actually is an empty list of events (and that the default function should not
be called)--they will then be deleted from the output.
The user should not worry about how multiple marks will affect either other.
For example, a note with both :TREMOLO and :ACCENT marks will be passed to the user function
first with the :TREMOLO keyword. Next (assuming the user returned multiple MIDI events)
only the first note of the tremolo is passed to this function with the :ACCENT keyword.
The user function should then only deal directly with what it is given and allow FOMUS to handle
the sorting out of these details and applying them to the correct notes.
Also, the dynamic markings :PPPPPP through :FFFFFF are translated before any other dynamics-related
markings, so user code should set the amplitudes of MIDI objects to some initial value in these cases.
Subsequent handling of other dynamics-related marks can then alter MIDI amplitude values in whatever ways are appropriate.
Marks that are sent via the mark argument are listed here (with arg1 and arg2
if appropriate).
Marks beginning with :SPAN- accompany a list of events to modify and correspond to what are called "spanner" marks in
Marks.
:FFFFFF |
:FFFFF |
:FFFF |
:FFF |
:FF |
:F |
:MF |
:MP |
:P |
:PP |
:PPP |
:PPPP |
:PPPPP |
:PPPPPP |
:RFZ |
:SFZ |
:SPP |
:SP |
:SFF |
:SF |
:FP |
:STACCATO |
:STACCATISSIMO |
:PORTATO |
:TENUTO |
:MARCATO |
:ACCENT |
:SPAN-SLUR ( |
:FERMATA ( |
:BREATH |
:TREMOLO (arg1 is the number of tremolo subdivisions,
arg2 is 1/8 for eighth-note subdivions, 1/16 for sixteenths, etc.) |
:SPAN-TREMFIRST (arg1 and arg2
are the same as with :TREMOLO) |
:SPAN-TREMSECOND (arg1 and arg2
are the same as with :TREMOLO) |
:TRILL (arg1 is the additional trill pitch) |
:LONGTRILL (arg1 is the additional trill pitch) |
:PRALL (arg1 is the additional prall pitch) |
:MORDENT (arg1 is the additional mordent pitch) |
:SPAN-ARP (arg1 is either :UP, :DOWN or NIL,
arg2 is the offset of the previous note) |
:SPAN-PORT |
:SPAN-GLISS |
:SPAN-WEDGE< (arg1 is the destination amplitude or velocity,
arg2 is the offset of the event following the last event of the wedge) |
:SPAN-WEDGE> (arg1 and arg2
are the same as with :SPAN-WEDGE<) |
:HARMONIC (arg1 is either :SOUNDING or :TOUCHED,
arg2 is the sounding pitch in either case) |
:ARCO |
:PIZZ |
:STOPPED |
:OPEN |
:FLAGEOLET |
:FERMATA-MULTS
This is a list of three real numbers greater than 0, specifying how much to increase (by multiplying) the durations
of notes that have fermatas over them.
The three values each correspond to short, long and very long fermatas.
:FILENAME
This is a string representing the output filename.
It overrides the FILENAME setting if used.
:GRACE-DUR-SECS
A real number greater than 0 specifying the default MIDI grace note duration in seconds.
:HARMATT
A real number from 0 to 1 specifying the amount of
attenuation to apply to harmonics to make them sound closer to what is expected.
The number is subtracted from the velocities of the events.
:INSTR-PER-CH
When set to an integer value greater than or equal to 1, specifies how many parts with similar instruments
(ie. with equivalent MIDI program change values) are stuffed into one MIDI channel or track.
A value of NIL indicates that all parts with the same program change indicated in their
INSTR objects are to be put into a single channel.
:MIDI-FILENAME
This is a part option (see the PART class).
It is a string representing a filename for a separate output file--FOMUS fills this with
MIDI data only for the part that it is specified in.
These strings are "merged" with FILENAME using Lisp's MERGE-PATHNAMES function
so that if a full path isn't specified it appears in the same directory as FILENAME.
Parts with the same MIDI-FILENAME are grouped together so that
all of their output is written to one file.
:MIN-AMP
A real number from 0 to 1 specifying a minimum velocity value for all midi events.
:MINDUR-SECSThis real number specifies an absolute minimum duration in seconds for all midi events.
:NPORTS
If realtime playback is specified using the PLAY option, this integer
value specifies the number of ports to use.
The default is 1.
If output is to a MIDI file, then this value will be 1 regardless of what is specified.
:PBEND-WIDTH
This is equivalent to the :PITCH-BEND-WIDTH option used when opening MIDI streams in Common Music.
It is a real number greater than 0, specifying the maximum pitch bend range in semitones used to calculate
pitch bend values for quartertone playback.
The default is 2.
:PLAY
If set to NIL or T, specifies that output is to a MIDI file.
T indicates that the output should be played automatically (equivalent to sending :PLAY T to
Common Music's EVENTS function).
If set to a Common Music MIDI stream, indicates that the RTS function should be used
and the MIDI events scheduled for realtime playback.
:PORTATO-MULT
A real number greater than 0 indicating the amount to increase (by multiplying) the duration
of MIDI events with portato markings.
:SLUR-ADDDUR
A real number greater than or equal to 0 indicating the amount of beats to add to the duration
of slurred events (causing them to overlap slightly).
:STACCATISSIMO-MULT
A real number greater than 0 indicating the amount to increase (by multiplying) the duration
of MIDI events with staccatissimo markings.
:STACCATO-MULT
A real number greater than 0 indicating the amount to increase (by multiplying) the duration
of MIDI events with staccato markings.
:TEMPO
A real number greater than or equal to 0 specifying the MIDI playback tempo.
:TENUTO-ADDDUR
A real number greater than or equal to 0 indicating the amount of beats to add to the duration
of MIDI events with tenuto markings.
:TRAMP
A real number from 0 to 1 specifying the amount of
amplification to apply to MIDI events that are a part of a trill or tremolo.
The number is added to the velocities of the events.
:TRDUR-SECS
A real number greater than 0 indicating the duration in seconds of an individual
MIDI event in a trill or tremolo.
(For tremolos it is the minimum duration of an individual MIDI event.)
:TROVLP-ADDDUR
A real number greater than or equal to 0 indicating the amount of beats to add to the duration
of MIDI events that are a part of a trill or tremolo.
When no other outputs are specified but a "chunk" is desired (see Chunks),
this keyword tells FOMUS to go ahead and process the input without complaining. The :NONE
keyword can also be used.
All of FOMUS's default settings may be overridden using an initialization file that FOMUS looks for
every time it loads.
This file is named .fomus and must be created in the user's home directory.
To specify default settings, simply list keyword/argument pairs as if they were keyword arguments to the
FOMUS command.
Example 8.1. Initialization File Contents
:output '((:data) (:lilypond :view t))
:lilypond-exe "/usr/local/bin/lilypond"
:lilypond-opts '("--ps")
:lilypond-out-ext "ps"
:lilypond-view-exe "/usr/bin/ggv"
:cmn-view-exe "/usr/bin/ggv"
:verbose 1
:composer "David Psenicka"
:min-tuplet-dur 1
:max-tuplet 13
:caut-acc-ottavas t
Table of Contents
These examples (will eventually) show most of FOMUS's functionality and hopefully eliminate the need to spend countless hours figuring out settings, how to create objects, etc.. Examples using different interfaces (see Usage) are given. The images were all generated using LilyPond 2.8.
Example 9.1. Simple Example
(fomus
:output '(:lilypond :view t)
:parts
(list
(make-part
:name "Piano"
:instr :piano
:events
(loop
for off from 0 to 10 by 1/2
collect (make-note :off off
:dur (if (< off 10) 1/2 1)
:note (+ 48 (random 25)))))))
Output
Example 9.2. Staccato and Accent Marks
(fomus
:output '(:lilypond :view t)
:parts
(list
(make-part
:name "Piano"
:instr :piano
:events
(loop
for off from 0 to 10 by 1/2
collect (make-note :off off
:dur (if (< off 10) 1/2 1)
:note (+ 48 (random 25))
:marks (case (random 3)
(0 nil)
(1 '(:staccato))
(2 '(:accent))))))))
Output
Example 9.3. Quartertones
(fomus
:output '(:lilypond :view t)
:quartertones t
:parts
(list
(make-part
:name "Flute"
:instr :flute
:events
(loop
for off from 0 to 10 by 1/2
collect (make-note :off off
:dur (if (< off 10) 1/2 1)
:note (+ 70 (/ (random 4) 2)))))))
Output
Example 9.4. Polyphony with Slurs
(fomus :output '(:lilypond :view t) :verbose 1 :parts (list (make-part :name "Piano" :instr :piano :events (loop for v from 1 to 2 nconc (loop for off from 0 to 10 by 1/2 collect (make-note :off off :dur (if (< off 10) 1/2 1) :note (+ 60 (random 25)) :voice v :marks (when (= (random 3) 0) '(:startslur-))))))))
Output
Example 9.5. Piano Chords
(fomus :output '(:lilypond :view t) :verbose 1 :ensemble-type :orchestra :parts (list (make-part :name "Piano" :instr :piano :events (loop repeat 3 nconc (loop for off from 0 to 10 by 1/2 collect (make-note :off off :dur (if (< off 10) 1/2 1) :note (+ 48 (random 25)) :voice '(1 2)))))))
Output
Example 9.6. Quantizing/Chords
(fomus :output '(:lilypond :view t) :parts (list (make-part :name "Piano" :instr :piano :events (loop repeat 10 for off = (random 30.0) and dur = (1+ (random 3.0)) collect (make-note :off off :dur dur :note (+ 60 (random 25)))))))
Output
Example 9.7. Mark Objects
(fomus :output '(:lilypond :view t) :parts (list (make-part :partid :flute :name "Flute" :instr :flute :events (loop for o from 0 to 20 by 1/2 collect (make-note :off o :dur 1/2 :note 72))) (make-part :partid :tuba :name "Tuba" :instr :tuba :events (loop for o from 0 to 20 by 1/2 collect (make-note :off o :dur 1/2 :note 48)))) :events (loop repeat 10 collect (make-mark :partid (case (random 2) (0 :flute) (1 :tuba)) :off (random 20.0) :marks '(:accent))))
Output
Example 9.8. Percussion 1
(fomus :output '(:lilypond :view t) :parts (list (make-part :name "Percussion" :instr (list :percussion :percs (list (make-perc :woodblock :note 'e4) (make-perc :snaredrum :note 'a3))) :events (loop for o from 0 to 20 by 1/2 collect (make-note :off o :dur 1/2 :note (case (random 2) (0 :woodblock) (1 :snaredrum)))))))
Output
Example 9.9. Percussion 2
(fomus :output '(:lilypond :view t) :parts (list (make-part :name "Percussion" :instr (list :percussion :percs (list (make-perc :woodblock :voice 1 :note 'e4) (make-perc :snaredrum :voice 2 :note 'a3))) :events (loop for o from 0 to 20 by 1/2 collect (make-note :off o :dur 1/2 :note (case (random 2) (0 :woodblock) (1 :snaredrum)))))))
Output
Example 9.10. Percussion with Automatic Durations
(fomus :output '(:lilypond :view t) :parts (list (make-part :name "Snare Drum" :instr '(:percussion :percs ((:snare-drum :note a3))) :events (loop for o from 0 to 40 by 1/2 when (= (random 2) 0) collect (make-note :off o :note :snare-drum)))))
Output
Example 9.11. Semi-Orchestra Score
(fomus :output '(:lilypond :view t) :ensemble-type :orchestra :global (list (make-timesig :off 0 :time '(3 4))) :parts (list (make-part :name "Flute 1" :instr :flute :events (list (make-note :off 0 :dur 1 :note 60))) (make-part :partid 'fl2 :name "Flute 2" :instr :flute :events (list (make-note :off 0 :dur 1 :note 60))) (make-part :partid 'cl1 :name "Clarinet 1" :instr :bf-clarinet :events (list (make-note :off 0 :dur 1 :note 60))) (make-part :name "Clarinet 2" :instr :bf-clarinet :events (list (make-note :off 0 :dur 1 :note 60))) (make-part :name "Violin 1" :instr :violin :events (list (make-note :off 0 :dur 1 :note 60))) (make-part :name "Violin 2" :instr :violin :events (list (make-note :off 0 :dur 1 :note 60))) (make-part :name "Cello 1" :instr :cello :events (list (make-note :off 0 :dur 1 :note 48))) (make-part :name "Cello 2" :instr :cello :events (list (make-note :off 0 :dur 1 :note 48))) (make-part :name "Tuba" :instr :tuba :events (list (make-note :off 0 :dur 1 :note 36)))))
Output
Example 9.12. 2 Part Polyphony
(defparameter *part* (new fms:part :instr :piano :partid 'pno)) (defun polygen (voice len minp maxp) (process repeat len output (new fms:note :off (now) :voice voice :partid 'pno :note (between minp maxp) :dur 1/2) wait 1/2)) (events (list (polygen 1 20 60 80) (polygen 2 20 40 60)) "/tmp/fomus.ly" :parts *part* :view t)
Output
Example 9.13. 2 Part Polyphony (FOMUS Chooses the Voice)
(defparameter *part* (new fms:part :instr '(:piano :simultlim 1) :partid 'pno)) (defun polygen (voice len minp maxp) (process repeat len output (new fms:note :off (now) :voice voice :partid 'pno :note (between minp maxp) :dur 1/2) wait 1/2)) (events (list (polygen '(1 2) 20 50 80) (polygen '(1 2) 20 40 70)) "/tmp/fomus.ly" :parts *part* :view t)
Output
Example 9.14. 3 Part Polyphony
(defparameter *part* (new fms:part :instr '(:piano :simultlim 1) :partid 'pno)) (defun polygen (voice len minp maxp) (process repeat len output (new fms:note :off (now) :voice voice :partid 'pno :note (between minp maxp) :dur 1/2) wait 1/2)) (events (list (polygen '(1 2 3) 20 50 70) (polygen '(1 2 3) 20 50 70) (polygen '(1 2 3) 20 50 70)) "/tmp/fomus.ly" :parts *part* :view t)
Output
Example 9.15. 6 Part Polyphony
(defparameter *parts* (list (new fms:part :name "Violin 1" :instr :violin :partid 'vlns :props '((:distr (v2 2) (v3 3) (v4 4) (v5 5) (v6 6)))) (new fms:part :name "Violin 2" :instr :violin :partid 'v2) (new fms:part :name "Violin 3" :instr :violin :partid 'v3) (new fms:part :name "Violin 4" :instr :violin :partid 'v4) (new fms:part :name "Violin 5" :instr :violin :partid 'v5) (new fms:part :name "Violin 6" :instr :violin :partid 'v6))) (defun polygen (voice len minp maxp) (process repeat len output (new fms:note :off (now) :voice voice :partid 'vlns :note (between minp maxp) :dur 1/2) wait 1/2)) (events (list (polygen '(1 2 3 4 5 6) 20 55 70) (polygen '(1 2 3 4 5 6) 20 60 75) (polygen '(1 2 3 4 5 6) 20 65 80) (polygen '(1 2 3 4 5 6) 20 70 85) (polygen '(1 2 3 4 5 6) 20 75 90) (polygen '(1 2 3 4 5 6) 20 80 95)) "/tmp/fomus.ly" :parts *parts* :quality 3 :view t)
Output
Any of the following may be reproduced by saving the example to a file and using the so-called text file or command line interface to process it (see Text File Interface and Command Line Interface for more information). When an output isn't specified in the file, this must be given in the Lisp function call or at the command line. Some examples are:
Example 9.16. Text Input Commands (From Lisp)
(fomus "/directory/file.fms") ; use values in file (fomus "/directory/file.fms" :output :musicxml) ; output to MusicXML format (fomus "/directory/file.fms" :output '(:lilypond :view t)) ; output to LilyPond and open for viewing
Example 9.17. Text Input Commands (Command Line)
# print help message fomus -h # use values in file fomus /directory/file.fms # output to MusicXML fomus -x /directory/file.fms # output to LilyPond and open for viewing fomus -lw /directory/file.fms
Example 9.18. Simple Text Input Example
INIT :output :lilypond INIT :filename "/mydir/output" PART 1 :name "Piano" :instr :piano NOTE 1 :voice 1 :off 0 :dur 1/2 :note 54 NOTE 1 :voice 1 :off 1/2 :dur 1/2 :note 60 NOTE 1 :voice 1 :off 1 :dur 1/2 :note 51 NOTE 1 :voice 1 :off 3/2 :dur 1/2 :note 61 NOTE 1 :voice 1 :off 2 :dur 1/2 :note 61 NOTE 1 :voice 1 :off 5/2 :dur 1/2 :note 61 NOTE 1 :voice 1 :off 3 :dur 1/2 :note 58 NOTE 1 :voice 1 :off 7/2 :dur 1/2 :note 65 NOTE 1 :voice 1 :off 4 :dur 1/2 :note 65 NOTE 1 :voice 1 :off 9/2 :dur 1/2 :note 58 NOTE 1 :voice 1 :off 5 :dur 1/2 :note 56 NOTE 1 :voice 1 :off 11/2 :dur 1/2 :note 50 NOTE 1 :voice 1 :off 6 :dur 1/2 :note 65 NOTE 1 :voice 1 :off 13/2 :dur 1/2 :note 62 NOTE 1 :voice 1 :off 7 :dur 1/2 :note 55 NOTE 1 :voice 1 :off 15/2 :dur 1/2 :note 49 NOTE 1 :voice 1 :off 8 :dur 1/2 :note 70 NOTE 1 :voice 1 :off 17/2 :dur 1/2 :note 72 NOTE 1 :voice 1 :off 9 :dur 1/2 :note 62 NOTE 1 :voice 1 :off 19/2 :dur 1/2 :note 54 NOTE 1 :voice 1 :off 10 :dur 1 :note 68
Output
Example 9.19. Staccato and Accent Marks
INIT :output (:lilypond :view t) INIT :filename "/tmp/output" PART 1 :name "Piano" :instr :piano NOTE 1 :voice 1 :off 0 :dur 0.5 :note 53 :marks (:staccato) NOTE 1 :voice 1 :off 0.5 :dur 0.5 :note 53 :marks (:accent) NOTE 1 :voice 1 :off 1 :dur 0.5 :note 55 :marks (:staccato) NOTE 1 :voice 1 :off 1.5 :dur 0.5 :note 62 NOTE 1 :voice 1 :off 2 :dur 0.5 :note 49 NOTE 1 :voice 1 :off 2.5 :dur 0.5 :note 50 NOTE 1 :voice 1 :off 3 :dur 0.5 :note 52 :marks (:staccato) NOTE 1 :voice 1 :off 3.5 :dur 0.5 :note 61 NOTE 1 :voice 1 :off 4 :dur 0.5 :note 57 NOTE 1 :voice 1 :off 4.5 :dur 0.5 :note 63 NOTE 1 :voice 1 :off 5 :dur 0.5 :note 61 :marks (:staccato) NOTE 1 :voice 1 :off 5.5 :dur 0.5 :note 72 :marks (:staccato) NOTE 1 :voice 1 :off 6 :dur 0.5 :note 51 NOTE 1 :voice 1 :off 6.5 :dur 0.5 :note 58 NOTE 1 :voice 1 :off 7 :dur 0.5 :note 51 NOTE 1 :voice 1 :off 7.5 :dur 0.5 :note 70 :marks (:accent) NOTE 1 :voice 1 :off 8 :dur 0.5 :note 52 :marks (:staccato) NOTE 1 :voice 1 :off 8.5 :dur 0.5 :note 59 :marks (:accent) NOTE 1 :voice 1 :off 9 :dur 0.5 :note 54 :marks (:staccato) NOTE 1 :voice 1 :off 9.5 :dur 0.5 :note 68 NOTE 1 :voice 1 :off 10 :dur 1 :note 48 :marks (:staccato)
Output
Example 9.20. Percussion
PART prc :name "Percussion" :instr (:percussion :percs ((MAKE-PERC :sym :woodblock :staff 1 :voice 1 :note e4 :autodur t :midinote-im nil :midinote-ex nil) \
(MAKE-PERC :sym :snaredrum :staff 1 :voice 1 :note a3 :autodur t :midinote-im nil :midinote-ex nil)))
NOTE prc :voice 1 :off 0 :dur 1/2 :note :woodblock
NOTE prc :voice 1 :off 1/2 :dur 1/2 :note :woodblock
NOTE prc :voice 1 :off 1 :dur 1/2 :note :woodblock
NOTE prc :voice 1 :off 3/2 :dur 1/2 :note :snaredrum
NOTE prc :voice 1 :off 2 :dur 1/2 :note :snaredrum
NOTE prc :voice 1 :off 5/2 :dur 1/2 :note :woodblock
NOTE prc :voice 1 :off 3 :dur 1/2 :note :snaredrum
NOTE prc :voice 1 :off 7/2 :dur 1/2 :note :woodblock
NOTE prc :voice 1 :off 4 :dur 1/2 :note :woodblock
NOTE prc :voice 1 :off 9/2 :dur 1/2 :note :woodblock
NOTE prc :voice 1 :off 5 :dur 1/2 :note :woodblock
NOTE prc :voice 1 :off 11/2 :dur 1/2 :note :woodblock
NOTE prc :voice 1 :off 6 :dur 1/2 :note :woodblock
NOTE prc :voice 1 :off 13/2 :dur 1/2 :note :snaredrum
NOTE prc :voice 1 :off 7 :dur 1/2 :note :woodblock
NOTE prc :voice 1 :off 15/2 :dur 1/2 :note :snaredrum
NOTE prc :voice 1 :off 8 :dur 1/2 :note :snaredrum
NOTE prc :voice 1 :off 17/2 :dur 1/2 :note :snaredrum
NOTE prc :voice 1 :off 9 :dur 1/2 :note :woodblock
NOTE prc :voice 1 :off 19/2 :dur 1/2 :note :woodblock
NOTE prc :voice 1 :off 10 :dur 1/2 :note :snaredrum
Output
Example 9.21. Articulations
;; Example by Rob Canning init :output (:lilypond :view t) part 1 :name "Piano" :instr :piano (note 1 :off 0 :dur 0.25 :note 82 :marks (:ignore)) (note 1 :off 0.25 :dur 0.25 :note 87 :marks (:ignore)) (note 1 :off 0.5 :dur 0.25 :note 48 :marks (:staccato)) (note 1 :off 0.75 :dur 0.25 :note 76 :marks (:ignore)) (note 1 :off 1 :dur 0.25 :note 83 :marks (:marcato)) (note 1 :off 1.25 :dur 0.25 :note 51 :marks (:accent)) (note 1 :off 1.5 :dur 0.25 :note 82 :marks (:ignore)) (note 1 :off 1.75 :dur 0.25 :note 76 :marks (:endslur- (:fermata))) (note 1 :off 2 :dur 0.5 :note 57 :marks (:ignore)) (note 1 :off 2.5 :dur 0.25 :note 45 :marks (:portato)) (note 1 :off 2.75 :dur 0.25 :note 50 :marks (:marcato)) (note 1 :off 3 :dur 0.25 :note 36 :marks (:ignore)) (note 1 :off 3.25 :dur 0.25 :note 51 :marks (:accent)) (note 1 :off 3.5 :dur 0.25 :note 46 :marks (:ignore)) (note 1 :off 3.75 :dur 0.25 :note 51 :marks (:ignore)) (note 1 :off 4 :dur 0.25 :note 79 :marks (:staccato)) (note 1 :off 4.25 :dur 8 :note 40 :marks (:startslur- (:textnote "id=479")))
Output
Example 9.22. More Percussion
PART p1 :name "Perc" \
:instr (:percussion :percs ((:snare-drum :note a3) \
(:low-wood-block :note e4) (:high-wood-block :note g4) \
(MAKE-PERC :rim-shot :staff 1 :voice 1 :note c4 :autodur t :midinote-im nil :midinote-ex 40))) \
:opts (:midi-filename "part1")
NOTE p1 :voice 1 :off 1 :dur (1/2 -100) :note :snare-drum
NOTE p1 :voice 1 :off 1 :dur 1/2 :note :snare-drum :marks (:sf :accent)
NOTE p1 :voice 1 :off 5/2 :dur 1/2 :note :snare-drum :marks (:p)
NOTE p1 :voice 1 :off 4 :dur 1/2 :note :snare-drum
NOTE p1 :voice 1 :off 11/2 :dur 1/2 :note :snare-drum
NOTE p1 :voice 1 :off 6 :dur 1/2 :note :snare-drum :marks (:sf :accent)
NOTE p1 :voice 1 :off 15/2 :dur 1/2 :note :snare-drum
NOTE p1 :voice 1 :off 8 :dur 1/2 :note :snare-drum :marks (:sf :accent)
NOTE p1 :voice 1 :off 17/2 :dur 1/2 :note :snare-drum
NOTE p1 :voice 1 :off 10 :dur (1/2 -100) :note :high-wood-block
NOTE p1 :voice 1 :off 10 :dur 1/2 :note :low-wood-block
NOTE p1 :voice 1 :off 10.5 :dur 1/2 :note :low-wood-block
NOTE p1 :voice 1 :off 11 :dur 1/2 :note :low-wood-block
NOTE p1 :voice 1 :off 11.5 :dur 1/2 :note :low-wood-block
NOTE p1 :voice 1 :off 12 :dur 1/2 :note :high-wood-block :marks (:sf :accent)
NOTE p1 :voice 1 :off 12.5 :dur 1/2 :note :low-wood-block
NOTE p1 :voice 1 :off 13 :dur 1/2 :note :low-wood-block
NOTE p1 :voice 1 :off 13.5 :dur 1/2 :note :low-wood-block
NOTE p1 :voice 1 :off 14 :dur 1/2 :note :low-wood-block
Output
Example 9.23. Overtone Series (using Quartertones)
INIT :output '(:lilypond :view t) INIT :filename "overser" INIT :quartertones t PART h :name nil :instr :piano TIMESIG :off 0 :time (20 4) NOTE h :voice 1 :off 0 :dur 1 :note 42.999996 NOTE h :voice 1 :off 1 :dur 1 :note 54.999996 NOTE h :voice 1 :off 2 :dur 1 :note 62.019547 NOTE h :voice 1 :off 3 :dur 1 :note 67.0 NOTE h :voice 1 :off 4 :dur 1 :note 70.86313 NOTE h :voice 1 :off 5 :dur 1 :note 74.01955 NOTE h :voice 1 :off 6 :dur 1 :note 76.688255 NOTE h :voice 1 :off 7 :dur 1 :note 79.0 NOTE h :voice 1 :off 8 :dur 1 :note 81.03909 NOTE h :voice 1 :off 9 :dur 1 :note 82.86313 NOTE h :voice 1 :off 10 :dur 1 :note 84.513176 NOTE h :voice 1 :off 11 :dur 1 :note 86.01955 NOTE h :voice 1 :off 12 :dur 1 :note 87.40528 NOTE h :voice 1 :off 13 :dur 1 :note 88.68826 NOTE h :voice 1 :off 14 :dur 1 :note 89.88269 NOTE h :voice 1 :off 15 :dur 1 :note 91.0 NOTE h :voice 1 :off 16 :dur 1 :note 92.04956 NOTE h :voice 1 :off 17 :dur 1 :note 93.03909 NOTE h :voice 1 :off 18 :dur 1 :note 93.97514 NOTE h :voice 1 :off 19 :dur 1 :note 94.86313
Output
Example 9.24. Marks 1
INIT :output '(:lilypond :view t) INIT :filename "marks1" PART h :name nil :instr :piano TIMESIG :off 0 :time (5 4) NOTE h :voice 1 :off 0 :dur 1 :note 50 :marks (:IGNORE) NOTE h :voice 1 :off 1 :dur 1 :note 51 :marks (:STACCATO) NOTE h :voice 1 :off 2 :dur 1 :note 52 :marks (:MARCATO) NOTE h :voice 1 :off 3 :dur 1 :note 53 :marks (:STACCATISSIMO) NOTE h :voice 1 :off 4 :dur 1 :note 54 :marks (:ACCENT) NOTE h :voice 1 :off 5 :dur 1 :note 55 :marks (:TENUTO) NOTE h :voice 1 :off 6 :dur 1 :note 56 :marks (:PORTATO) NOTE h :voice 1 :off 7 :dur 1 :note 57 :marks (:STARTSLUR-) NOTE h :voice 1 :off 8 :dur 1 :note 58 :marks (:ENDSLUR-) NOTE h :voice 1 :off 9 :dur 1 :note 59 :marks (:P) NOTE h :voice 1 :off 10 :dur 1 :note 60 :marks (:F :MARCATO) NOTE h :voice 1 :off 11 :dur 1 :note 61 :marks (:SF :ACCENT) NOTE h :voice 1 :off 12 :dur 1 :note 62 :marks (:STARTWEDGE>) NOTE h :voice 1 :off 13 :dur 1 :note 63 NOTE h :voice 1 :off 14 :dur 1 :note 64 :marks (:ENDWEDGE> :P) NOTE h :voice 1 :off 15 :dur 1 :note 65 :marks (:PIZZ) NOTE h :voice 1 :off 16 :dur 1 :note 66 NOTE h :voice 1 :off 17 :dur 1 :note 67 :marks (:MORDENT) NOTE h :voice 1 :off 18 :dur 1 :note 68 :marks ((:TRILL 70)) NOTE h :voice 1 :off 19 :dur 1 :note 69 :marks (:FERMATA)
Output
Example 9.25. Marks 2
INIT :output '(:lilypond :view t)
INIT :filename "marks2"
PART z :name nil :instr :piano
TIMESIG :off 0 :time (5 4)
NOTE z :voice 1 :off 0 :dur 2 :note 50 :marks (:tremolo)
NOTE z :voice 1 :off 2 :dur 2 :note 52 :marks ((:tremolo 1/2))
NOTE z :voice 1 :off 5 :dur 1 :note 55 :marks ((:glissando :after))
NOTE z :voice 1 :off 6 :dur 1 :note 56
NOTE z :voice 1 :off 7 :dur 1 :note 57 :marks ((:breath :after))
NOTE z :voice 1 :off 8 :dur 1 :note 58 :marks ((:notehead :x))
NOTE z :voice 1 :off 9 :dur 1 :note 59 :marks ((:textnote ":("))
NOTE z :voice 1 :off 10 :dur 1 :note 60 :marks ((:textnote ":)"))
NOTE z :voice 1 :off 11 :dur 1 :note 61 :marks ((:textnote "L.H."))
NOTE z :voice 1 :off 12 :dur 1 :note 62 :marks ((:textdyn "pppppppppp"))
NOTE z :voice 1 :off 13 :dur 1 :note 63
NOTE z :voice 1 :off 14 :dur 1 :note 64 :marks ((:texttempo "Fast"))
NOTE z :voice 1 :off 15 :dur 1 :note 65
NOTE z :voice 1 :off 16 :dur 1 :note 66 :marks ((:starttext- "rit." :up))
NOTE z :voice 1 :off 17 :dur 1 :note 67
NOTE z :voice 1 :off 18 :dur 1 :note 68
NOTE z :voice 1 :off 19 :dur 1 :note 69 :marks (:endtext-)
Output