5. Non-stop improvisation
5.1 "Random" isn't anything...
When producing items, BP2 made random
decisions as to candidate rules in the grammar and the
position of each derivation. These decisions may also be controlled in "step
computation" (see §12).
Sequences of random numbers are predetermined in computers. This means that each time
you run BP2 you get the same sequence. If you run an improvisation immediately
after starting BP2 you get the same "random" performance... Of
course, if the "Autorandomize" button is
checked on the upper "Settings" dialog, every
piece is likely to differ from tyhe preceding one, but this may not still not be
the way you expect a machine to "improvise"!
There are two ways of avoiding this.
First, you may want to instruct BP2 to produce anything you've never heard
before. For this the random-sequence generator should
be reseeded with an arbitrary number, for instance a number computed from the
date/time information available inside the computer. Select "Randomize" in the "Misc" menu. You get the little "Randomize"
dialog as shown Fig.23. The current random seed number
is always 1 when you start BP2, therefore default random sequences are
identical.
The random seed is saved in the "-se"
setting file automatically loaded with each project.
Clicking "Reset" will restart
the random generator with the current seed number, thus producing again the same
sequence of random numbers. Clicking "New seed"
will take an arbitrary number as a new seed and recalculate the sequence
accordingly. Now you get something really unpredictable.
Another way of playing with randomness
is to type a seed and click "Reset". In this way you select manually
one among more than 65,000 sequences (because the seed may be any number between
0 and 65535). If you get a remarkable result with a given value of the seed
number, you should note it down carefully or save it along with the current
settings (see the "File" menu).
There is no certitude that every future
version of Macintosh® will produce the same random sequence starting from a
given seed number. In addition, you must keep in mind that if you make changes
in the grammar (modifying or moving rules) the sequence is likely to change. If
you need more control on productions, either modify the grammar (see for
instance "Programmed grammars", §11 infra, or control procedures,
reference manual §8.1) or make decisions by hand as shown §12 infra.
5.2 A kind of cellular automaton playing a kind of Turkish
music
Load "-gr.koto3"
and type cmd-option space. Check "Non-stop improvize", "Use each
substitution", and uncheck "Display items":
Fig.24 Controlling production -- The "Settings"
dialogs
Now click "Produce items..."
or type cmd-r. Since you selected "Use each substitution" you will see and hear all intermediate work strings
produced by subgrammar #2. (See "SUB" grammars, §4.14 of the
reference manual.)
All variables (like "X" and "Y")
in the workstring are ignored when interpreting it as a musical item.
Therefore, only terminal symbols such as 'a', 'b', 'c', 'chik'... will produce
sound-objects.
While BP2 is improvising you may hold
down the mouse-button to interrupt the process. This makes it possible, for
instance, to uncheck "Show graphics" and check "Display items".
Now all items played by BP2 are also written to the "Data" window.
Buttons appearing at the bottom of
Fig.24 also belong to the "Settings" dialog:
- "Use MIDI in/out"
allows BP2 to send data to MIDI devices (including QuickTime music, if you are
using Opcode OMS) and to receive messages from external MIDI devices (including
the Inter-Application Communication bus, if OMS is installed). If this option
is not set, then at least either "Write Csound scores"
or "Write MIDI files" should be checked.
- "Synchronize start"
keeps BP2 waiting for either a NoteOn message, a
"Start" or
"Continue" MIDI message, or a mouse
click, before playing any item. It will wait for a NoteOn if and only if the
key and channel are defined in the "-in.abc1" interaction file (see §6).
- "Compute while playing"
tells BP2 that it may go on computing items while the current one is being
played. This is a good way to ensure continuous output, but remember that
interactive commands do not affect items already queuing in the MIDI buffer. For
instance, a "repeat" instruction will often not repeat the item
currently being heard, but the one being computes.
- If this option is off in continuous improvisation,
BP2 keeps a minimum number of items in the queue. For this, it remembers the
maximum computation time of items already produced. Let
tmax be that time. While the item is being played, BP2 will wait until
the duration of the part still remaining to be played is a little more than
tmax. Then it proceeds with a new item, thus hoping that it will just
be ready to play it when the preceding item has been played entirely (see "-gr.Mozart"
§5.4).
- "Interactive"
sets the interactive mode on. The "-in.abc1"
file is loaded and the MIDI input is used for controlling BP2 (see §6).
- "Reset rule weights"
is meaningful only if there are dynamic weight
assignments in grammars, e.g. a weight written <100-20> in a rule that
takes decreasing values 100, 80, 60,... every time the rule is used. (See
reference manual §4.7) If it is on (default setting) then weights are set
to their initial values each time a new item is computed from the start string.
- "Reset flags"
is meaningful in the context of programmed subgrammars
(see §11). Normally it is necessary to delete all existing flags before
generating a new item, but the opposite option may sometimes be useful.
- When
"Ignore constraints" is on, the time
setting algorithm does not take topological properties
of sound-objects into consideration (see Bel 1990b,1991,1992, or reference
manual §3-5).
- "Write MIDI files"
gives the option to save items as MIDI files after
playing them (see §14.1).
- "Write Csound scores"
gives the option to save items as Csound scores after
playing them (see §17).
Other buttons shown on top of Fig.24
have the following effects:
- "Cyclic play"
produces a single item and plays it forever.
- "Use each substitution":
this flag is used in "SUB" subgrammars (see §4.14 of the
reference manual). If it is on, the current work string is played on the MIDI
output after each substitution. Polymetric structures are evaluated and
variables are ignored. If it off then only final items are played.
- "Time setting display",
"Time setting trace" and
"Time setting step" are optional
controls of the time setting algorithm. These have been used, for instance, in
example "-da.checkTimeset" (see §2.2 and §13);
- "Trace Csound",
when checked, displays the Csound score on the "Trace" window while it
is being recorded to a file.
5.3 The "INIT" instruction
In case you wish to play "-gr.koto3" on a Roland D-50 or D-550 synthesizer, you might
insert the following line top of the grammar:
INIT: Play _script(MIDI set
basic channel to 15) Koto _script(MIDI Omni mode ON channel 15)
What does it mean? 'INIT:' indicates
something that is done during the initialisation, that is, every time the
grammar is requested to improvise. Here, the initialisation is a script
instruction "Play any item" in which the item contains two
performance controls "_script()" and a
variable "Koto" (starting with an
uppercase character).
Instruction "MIDI set basic channel
to 15" tells BP2 that MIDI program changes should be sent on channel 15.
These program changes are performed by the glossary when rewriting variable "Koto".
The effect depends on the glossary which contains the proper program number
setting a patch named "Koto". Then, "MIDI Omni mode ON..."
will set the synthesiser to OMNI OFF, so that messages may be received and
played even if they are not sent on channel 15.
Initialisation
is performed before playing the first item produced by the grammar. If it
contains a "Play" instruction, BP2 first produces the item, performs
the initialisation, and then immediately plays the item. Otherwise it performs
the initialisation before producing the item.
An example will make it clear. If the
initialisation is
INIT: Wait for space
then BP2 will prompt you for hitting the
space bar just after compiling the grammar, before producing an item. If it is
INIT: Play _script(Wait for
space)
then it will prompt you just before
playing the first item the grammar has produced. This is a good way of
synchronising the beginning of an improvisation. You may even want to be
notified by a beep:
INIT: Play _script(Beep)
_script(Wait for space)
The specificity of the "INIT"
instruction should be made clear. You could as well insert the preceding
instructions as
performance controls into the item produced.
For instance, the first rule in the "-gr.koto3"
grammar could be:
S --> _script(Beep)
_script(Wait for space) _vel(127) _volume(40) X X X X Y X X X X Y X X X X
However, in this case, the beep and wait
would be performed each time a new item is produced, which is not convenient in
the "Non-stop improvize" mode.
You may also use the "INIT"
instruction to execute any script stored on the disk, e.g.:
INIT: Run script "MyInitScript"
5.4 Mozart's musical dice game
You may not like the so-called Turkish
music improvised on a so-called Koto... I would recommend listening to the
marvellous CD "Masters of Turkish Music" (Rounder CD 1051) and
apologise to Turkish music lovers and lovely Koto players for such a joke.
How about some
unknown pieces (presumably) composed by Wolfgang Amadeus Mozart? Select
"Load project" in the "File" menu (cmd-l) and load
"-gr.Mozart".
This grammar uses "simple notes",
i.e. the predefined alphabet of French notes. This convention has been
automatically selected when settings "-se.Mozart" were loaded.
Now produce items (cmd-r)...
In the current set-up (mm = 220
ticks/min) the duration of any variation is about 26 seconds, slightly more than
computation time on a Mac II-ci. Therefore, Mac II-ci and faster machines are
able to string variations without break. You may also save time by unchecking "Show
messages" in the "Settings" dialog.
Weights of some
rules in the grammar are controlled by <K1>, <K2>, etc., and may be
changed by MIDI controllers (see §6.5). Since controllers are not used
here, these parameters are assigned the constant values defined in the first
grammar. These actually reflect the probabilities of getting 2, 3, 4,..., 12,
out of a two-dice throw. An explanation of weights may be found in the
reference manual, §4.6.
The last subgrammar has instruction "SUB1", a faster version of "SUB"
when substitutions are to be performed only once.
You may select polymetric expressions in the last subgrammar and play them (cmd-p) in order to
listen to the various units defined by the composer. If the selection contains
a variable it is used as a start string by the grammar. Try for instance to
play "A1 A2 A3".
To select an expression with balanced
curled brackets {}, click anywhere inside the expression and type cmd-b
('balance'). Repeat typing to extend the selection.
How was this grammar created?
Subgrammars 1 to 17 have been directly typed from Mozart's tables. Subgrammar
18 contains the "terminals" of the "dice grammar": musical
segments taken from Mozart's score in conventional music notation. Selecting "Type
from MIDI" in the "Misc" menu, or typing cmd-j allowed BP2 to
capture notes from a MIDI keyboard, and prolongations '_' with the "hold"
pedal.
If you are not yet familiar with
polymetric structures, this grammar can teach you the essential: select
structures, play them and compare polymetric expressions
with their "scores" appearing on the "Graphic" window.