perl script "dyn":  converts concise specification into an events list

Stan Swanson, May 2004

A concise specification has been developed which will generate
an "events" list with the aid of a perl script, "dyn".  If this 
proves useful, the capability may be added directly to "vamp"

The syntax and format of an "event" command is somewhat
tedious.  As an example consider 4 repeats of the tune
Lamplighters hornpipe (lamp):               % read definitions of melody, chords, etc.
instruments 111 72 1   % fiddle, clarinet, piano
 -1 potatoes           % conventional intro for dance
  1 lamp      1        % melody on fiddle   [voice 1]
  1 lamp      2        % melody on clarinet [voice 2]
  1 best      3        % chords on piano    [voice 3]
  1 odd       1        % play phrase 1, 3, 5, 7 on fiddle
  1 even      2        % play phrase 2, 4, 6, 8 on clarinet
  1 boomchuck 3        % accent (hypermeter) for piano
  2 half      3        % another set of chords (half measures)
  3 root      3        % chords prefered by harmony 55
  4 last      3        % modify chords for coda at end

The above "vamp" input is generated (less comments) by a short 
perl script from this simplifed set of lists:
melody lamp
 fiddle odd
 clarinet even
chords best half root last
 piano boomchuck

In this example, the fiddle and clarinet play alternate 
phrases in the melody; this is coded in the phrasing commands
"odd" and "even".  Four different (but similar) chord sequences
"best", "half", "root", and "last" are used.

The repeat number is deduced from the position in the list.
 (Presently, an explicitly repeated element determines the total
  number of repeats (i.e. "last" above) when "vamp" parses the
  "events" command.)
The voice number is assigned by the order of the appearance of
 of the instrument line in the file.

The general format of the perl input is:
dynamics 'volume1' [rep] 'volume2' [rep] 'volume3' [rep] ...
melody    melody-id [rep] ...
  'iname' phrase-id [rep] ...
chords    chord-id1 [rep] chord-id2 [rep] ...
  'iname' accent-id [rep] ...

The first line gives the name of the input file defining
the melodies, chords, vamping, accents and phrasing used.

For the other lines, the general form is:

 "topic word"  "list with optional repeat counts [rep]"

The optional repeat count [rep] has a default value of 1.
If more than one repetition of a list item is desired, it may
be followed by a number giving the total number of repeats
(c.f. "dynamics" below).  The last item is implicitly repeated
until the end of the piece (e.g. "melody lamp" and "melody lamp 4"
would be equivalent in this example which has 4 chord sequences).

The topic words "melody", "chords", and "dynamics" serve to introduce
lists of melodies, chords, and volume levels which change at a
time granularity of a tune repeat.

'iname' is an instrument name (piano, guitar, bass, sax, clarinet,
           flute, banjo, fiddle are recognized) or the phrase
        "instrument n", with n being a MIDI instrument number.

The instruments following a "melody" line play the designated
melodies, with phrasing specified by the list of phrase-id's.

The instruments following a "chords" line play the designated
chord sequences, with accents specified by the list of accent-id's.

Multiple "chords" lines are possible, if the chords vary by instrument.
It is hard to see why one would want multiple melodies (except perhaps
to transpose for a given instrument), but one might want a medley 
(with several melody-id's given in the "melody" line).

The instruments are assigned to voices in the order of their
appearance, and are written out in an "INSTRUMENT" command.

To change the overall volume as the tune is repeated, a
"dynamics" line may be used.

'Volume' levels use the "fff ff ... ppp" symbols, as introduced 
in the "phrase" command.  [The general "vnnn" designator
is not yet available.]

Adding a line to the above perl input:

dynamics f 2 mf ff

would intercalate these volume commands into the vamp input:

  1 _volume_   88
  3 _volume_   72
  4 _volume_  104