Bol Processor BP2 -- a 'QuickStart' 9. Make it swing with smooth time... 10. For BP1 old-timers... Title Page Index Contents

9. Make it swing with smooth time...

So far we played around with musical items that were set on striated time, i.e. with a regular beat imposed by the time base (metronome, see §4.3). Indeed it was possible to change the metronome setting (although not in the middle of an item) and the time setting algorithm provided for infinite flexibility with sound-objects relocated or truncated on the basis of individual properties. However it seemed impossible to program an accelerando or some non-metric time-pattern like the typical elongated third beat in Saturday evening's waltz.

With smooth time you will be able to combine "plasticity" with accuracy. Suppose for instance that you want BP2 to play

do5 re5 mi5 fa5 - la5 si5 do6_ mi6

(in which '-' is a silence and '_' is the prolongation of do6) with the following time-pattern:



Fig.27 Time-pattern with irregular beats


"t1", "t2", etc. are time-objects, somehow similar to sound-objects except that they do not contain any sound-generating code. Here the piece is divided in two sections, namely "t1" and "t2", each of them lasting five beats with different physical durations. Let us assume that "t1" is a "normal duration" yielding five beats in 2.5 seconds, therefore we will set mm = 120. Here the metronome does not construct a regular pattern of time streaks. It only serves as a time reference. This case is referred as measured smooth time. The second section "t2" is also five beats but it lasts 3.75 seconds, i.e. 1.5 times the first section. When specifying time-patterns each duration will be written as an integer ratio. We will therefore write:

t1 = 1/1 t2 = 3/2

(We could write t2 = 150/100 or any equivalent ratio as well.) This statement contains three pieces of information: (1) t2 is 1.5 times longer than t1, (2) the default duration of t1 is one metronome beat, (3) the default duration of t2 is 3/2 metronome beats. Of course, (3) may be deducted from (1) and (2).

Let us now look at subdivisions. "t1" contains three subdivisions labelled "t1", "t3" and "t4". Of course, the new "t1" has been resized so that the three subdivisions fit exactly in the first section. Only ratios are important at this stage. You may measure that t3 is 1.33 times longer than t1, and t4 is two times shorter. Therefore we will write

t3 = 4/3 t4 = 1/2

(or equivalent integer ratios). The second section is subdivided as "t3" and "t1" in which the ratio between t3 and t1 is 1.33 as expected.

So far we have been able to define the hierarchy of time-span intervals as a tree structure. Let us now look at the note sequence itself. Time-object "t1" is subdivided as "do5" and "re5" with equal durations because all sound-objects belonging to "-mi.Frenchnotes" have identical time references -- corresponding to ratios 1/1. "t3" is subdivided in a similar way, as well as "t4" which contains '-' (a silence) and "la5". The last part "t3 t1" is an interesting case since the time-span of "do6" is partly a subdivision of "t3" and of "t1". This indicates that the hierarchy of time-span intervals is not always a tree structure -- here it is called a join-semilattice.

9.1 Programming time-patterns

A grammar producing the item shown Fig.27 may be written as follows (see "-gr.tryTimePatterns"):

PATTERNS:
t1= 1/1 t2 = 3/2 t3 = 4/3
t4 = 1/2
---------------------

RND
S --> {10,t1 t2,Part1 Part2}
Part1 --> {t1 t3 t4, do5 re5 mi5 fa5 - la5}
Part2 --> {t3 t1, si5 do6 _ mi6}


Title "PATTERNS:" announces a list of time-pattern definitions . The list terminates with a string of '-' or the end of the grammar file. "PATTERNS:" definitions may also be inserted in the alphabet file. If so, the defined time-patterns will be used with all grammars based on the same alphabet. Patterns defined in the grammar are specific to productions of that grammar.

If you load only data (e.g. "-da.tryTimePatterns") and try to play a selected item, BP2 will first look for time-patterns in the alphabet, then in the grammar file. If "-gr.tryTimePatterns" has not been loaded, the compiler will complain that terminal symbols "t1", "t2", etc. are undefined.

You may use any label for time-patterns, including labels starting with an uppercase character, but then the compiler will not return an error message in case these patterns are undefined, as it will mistakenly take them as variables.

It is very important that time-patterns appear in the leftmost position of polymetric expressions (see detailed explanation §4.10 of reference manual). Here, "t1 t3 t4" and "t3 t1" are the first fields of polymetric expressions, and "t1 t2" is the first field because duration "10" should always be the first field. Suppose for instance that you change the second rule to:

Part1 --> {do5 re5 mi5 fa5 - la5, t1 t3 t4}

This would yield:



Fig.28 An incorrect use of time-patterns t1, t3, t4


in which duration ratios in section "t1 t3 t4" have been mistakenly determined by "do5", "re5",... "la5". In addition, symbolic durations are incorrect because Part1 now counts six units (do5, re5,...) instead of three (t1, t3, t4). Now the symbolic duration of the entire item is now 6 + 2 = 8 instead of 3 + 2 = 5. BP2 therefore plays eight time units in ten beats, so that all on-settings of notes fall off-beat. For this reason most time streaks in Fig.28 are not numbered. This explanation requires a good understanding of polyrhythms in polymetric structures, but playing with the software will be certainly beneficial in acquiring it.

A (musically disastrous) example of time-patterns is found in "-gr.MozartExpression":

TIMEPATTERNS:
t1 = 96/100 t2 = 100/100 t3 = 102/100 t4 = 100/100
t5 = 100/100 t6 = 102/100 t7 = 104/100 t8 = 106/100 t9 = 107/100
t10 = 108/100 t11 = 107/100 t12 = 106/100 t13 = 104/100 t14 = 102/100
t15 = 1/1
-------------------
RND [Select rules randomly]
S --> {96,Tp1,A B}
A --> {12,(=Tp2),A1 A2 A3 A4} A5 A6 A7 A8 {12,(:Tp2),A1 A2 A3 A4} {12,Tp3,A5 A6 A7 A'8}
B --> B1 B2 B3 B4 B5 B6 B7 B8 B1 B2 B3 B4 {12,Tp2,B5 B6 B7 B8}
-------------------
RND [Here we define time-patterns]
<20> Tp1 --> Tp2
<30> Tp1 --> t5 t6 t7 t8 t9 t10 t11 t12 t13 t14 t15
Tp2 --> t1 t2 t3 t4
Tp2 --> t1 t7
Tp3 --> t2 t1
Tp3 --> t14 t15
-------------------
etc...

We suppose that the entire piece is controlled by a general time-pattern "Tp1" that may be subdivided in either 11 or 4 sections. The value "11" is arbitrarily chosen here to demonstrate that time-pattern sections may not coincide with metric divisions (here the actual symbolic duration is 96 beats). Part A (48 beats) comprises four sub-sections. The first and third subsections are controlled by two identical occurrences of time-pattern "Tp2" that may in turn be expressed as "t1 t2 t3 t4" or "t1 t7". Occurrences are identical because of the use of Bol Processor typical bracketing "(=Tp2)...(:Tp2)". (See reference manual §4.3) This also shows that the same time-pattern "Tp2" may be used at different hierarchical levels. The fourth subsection of A is controlled by "Tp3", and the second subsection is not controlled, so it is played at a regular tempo determined by whichever time-pattern has been used at the higher level. Section B comprises a first subsection lasting 36 beats at regular tempo, and then a second one lasting 12 beats controlled by "Tp2" (which may not be the same occurrence used in A).

Fig.29 shows the beginning of a variation in which overall time-pattern "Tp1" is subdivided in 11 sections "t5 t6..." and "Tp2" is rewritten as "t1 t2 t3 t4". Change of tempo is almost unnoticeable because time ratios are close to 1/1.


Fig.29 Time-patterns in Mozart pieces


9.2 Loading time-patterns

Time-patterns may be entered with a MIDI instrument. Bring to front either the "Grammar" or "Alphabet" window and select "Load time-pattern" in the "File" menu. The rest is self-explanatory: BP2 captures notes played on the MIDI input and stores their relative durations.

Note that it is necessary to play an extra note at the end because durations are measured on the basis of NoteOn messages. NoteOff's are ignored. It is therefore evident that n notes define n-1 time intervals.

Each time-pattern may be assigned a variable. BP2 suggests labels "Tp1", "Tp2", etc. and inserts automatically a rule rewriting "Tp..." as the sequence of durations entered.

Notes used for defining time-patterns must be played in sequence: playing chords would mess durations because simultaneous events actually do not produce simultaneous MIDI codes. You may for instance play the Mozart piece "with one finger" (plus the extra note at the end) and store the 96 beats obtained as "Tp1". All variations will then be played exactly with the same expressive (or dull) duration ratios. You may also play parts of the piece several times and store them as optional time-patterns randomly selected by the grammar. With context-sensitive or programmed grammars (see §11) musically significant effects could be obtained.

9.3 Non-measured smooth time

When using non-measured smooth time, durations are determined exclusively by the durations of the prototypes of sound-objects found in the first sequence (appearing on the top of graphics).

To set this mode type cmd-t and type "0" in the "ticks" field of the "Time base" dialog. The "Metronom" dialog will display "no clock".

You may try to play Mozart pieces in non-measured smooth time if you want to make them sound as if your little sister were deciphering the score. This mode is useful when dealing with sound-objects that have predetermined durations.


Bol Processor BP2 -- a 'QuickStart' 9. Make it swing with smooth time... 10. For BP1 old-timers... Title Page Index Contents