7. Glossaries

Two ready-made glossaries are supplied with BP2: "-gl.D50" and "-gl.GeneralMIDI". The first one contains information relative to Roland D-50 synthesiser, and the second one information that is common to all General MIDI synthesisers. If your synth is neither Roland D-50 nor General MIDI, you may edit a specific glossary on the basis of supplied examples.

A glossary is altogether a grammar and a script... Let us first look at it as a grammar. Load "-gl.GeneralMIDI" to the glossary window for instance:

// This glossary defines program changes used to select instruments following General MIDI specifications.
// Note that MIDI programs are numbered 0 to 127 here (following MIDI spec. 1.0) instead of 1 to 128 as per General MIDI specs.
// You may change variable names, but names should remain consistent in all your projects. (See acceptable variable names under "variable" in the Help menu.)
// Beware that program change messages will be sent on the current channel, which should be the basic channel of the synthesizer (i.e. the one on which it receives mode messages). This channel (default 1) may be changed by script instruction: MIDI set basic channel to ...
[1] AcousticGrandPiano --> _script(MIDI program 1)
[2] BrightAcousticPiano --> _script(MIDI program 2)
[3] ElectricGrandPiano --> _script(MIDI program 3)
[4] HonkyTonkPiano --> _script(MIDI program 4)
[5] RhodesPiano --> _script(MIDI program 5)
[6] ChorusedPiano --> _script(MIDI program 6)
[7] Harpsichord --> _script(MIDI program 7)
...

It clearly looks like a grammar (a subgrammar) with its rewrite rules. Because of speed optimisation it is always taken as a 'SUB1' type subgrammar, i.e. it performs one single substitution of the start string. Rule syntax is limited: the left argument should contain a single variable. If that variable already appears in the left argument of a rule belonging to the grammar, the compiler warns you that it may be a mistake, but proceeds anyway. If the same variable is defined twice in the same glossary, or if the glossary generates undefined variables, then en error message is returned.

How does it work practically?

Suppose that BP2 has produced an item and is about to play it, or you have selected an item in the text window. It first scans the item looking for variables that are used in the glossary. If no such variable is found then the glossary is not used. Otherwise it uses the glossary as a subgrammar in order to get the final string, which will then be expanded (as a polymetric expression), set in time, and then played on the MIDI output.

Since the glossary makes a single substitution, a variable appearing in the right argument of a glossary rule will only be rewritten if it is defined in a following rule. (See for example variables 'Internal' and 'Expansion' in "-gl.D50".)

Let us now look at the glossary as a script. Any rewrite rule may equivalently be put as a "Define" script instruction, e.g.

ChorusedPiano --> _script(MIDI program 6)

is equivalent to:

Define ChorusedPiano _script(MIDI program 6)

In addition, script instructions that influence compilation are acceptable in glossaries, notably:

Note convention = key numbers

You may use glossaries for any other purpose than setting a MIDI device. The good thing about glossaries is that they can perform transformations on a string representing a musical item even when no grammar is used to produce it. It makes sense that the design of device-specific procedures is not part of a grammar which is only meant to produce symbolic representations of musical items.