As part of my composition work lately I’ve been developing some new
scripts. Some are custom to the piece I’m working on, while others
have been a bit more generic. I thought I’d share this NoteParse
Python code as I thought others might find it useful.
One of the things I’ve wanted is a shorthand for creating scores. I’m
aware of a number of different approaches for this (microcsound,
lilypond, abc, mck/mml), but wanted something that worked more closely
to my own personal style. I found I was able to write something
fairly quickly that is simple but flexible enough.
Attached are two python scripts. The first works with standard
python, while the other requires being used within blue as it depends
on my python orchestra library that comes with blue. Both use the
basic syntax I created, while the blue version allows score modifiers.
An example of the syntax with modifiers:
def stoccato(n): n.duration = n.duration * .5 modifiers = {"stoccato": stoccato } a = "m:stoccato 8.00d.25a-12 4 m:clear 3d.5 2 1 0d1a-8" notes = parseOrchScore(a, modifiers)
generates the following:
i x 0.0 0.125 8.00 8.00 -12.0 0 0 i x 0.25 0.125 8.04 8.04 -12.0 0 0 i x 0.5 0.5 8.03 8.03 -12.0 0 0 i x 1.0 0.5 8.02 8.02 -12.0 0 0 i x 1.5 0.5 8.01 8.01 -12.0 0 0 i x 2.0 1.0 8.00 8.00 -8.0 0 0
(disregard that x is used for p1, these notes get further processed by
performers and performerGroup objects in my composition library).
The things I’d like to point out:
1. The score line is:
a = "m:stoccato 8.00d.25a-12 4 m:clear 3d.5 2 1 0d1a-8"
Disregarding the m: statements, the line looks like:
a = "8.00d.25a-12 4 3d.5 2 1 0d1a-8"
How the library works is that the first note becomes a template note
that carries over values to the next note. So, for the first note, it
uses pch 8.00, has a duration of .25, and amplitude of -12. The next
note, which is just a 4, means scale degree four for the same octave
as previously given, so the next generated note has a pch of 8.04, a
duration of .25, and amplitude of -12. The third note uses
scaleDegree 3, but now has a duration of .5, and carries over the
amplitude.
2. The use of modifiers is completely customizable. To use modifiers,
supply a map that has the name of the modifier together with a
single-arg function that will process the note. When an m: statement
is encountered, it will look up that modifier and set it as the
current modifier. If an m:clear is found, it will set the modifier
function to None. What I like about this is that a standard set of
modifiers could be created, but it’d be easy to create a custom one
while working on a new piece that might be very specific to that
piece.
The non-blue version attached to this email currently just returns a
list of lists of values that one can then process to generate notes
that work with the individual instrument’s p-field signatures (i.e.
your instrument may have 5 p-fields, or 10, etc. and you’d just apply
a transform to the list to generate the notes you want).
I’m still debating on other features to add, and my current plan is to
add this to my orchestra composition library that comes with blue. My
thought is that the code is fairly small and useful to my own
composition method, but might be easy for others to take and modify
for their own use pretty easily.