
In Computer Music Journal 22,2 (1998) page 63, Dutch composer Visser commented:
I think that the development of more and more visual stuff curtails the possibility of “thinking in your chair.” Sometimes I develop grammars, not at the computer, but sitting with a pencil and paper. With programs [other than BP2] this is not possible: you must sit in front of the computer. The difference lies in the type of attention that each software environment demands on the part of the composer, and indeed reflects on the way s/he thinks about music.
The following is a presentation and discussion of a few examples composed on Bol Processor by Harm Visser in 1998. Versions of ‘BP2’ compliant with Macintosh system versions up to MacOS 10.14 (Mojave) can be dowloaded from SourceForge. The package contains all grammars mentioned in this article.
A new version compliant with 64-bit processors on various systems (MacOS, Windows, Linux…) is under development.
Period notation
In the same way it deals with superimposed sequences, the polymetric expansion algorithm works out equal symbolic durations between beat separators notated ‘•’ — namely the period notation. A note sequence in period notation and the context-free grammar it originated from are shown below. In this example, beats contain increasing numbers of notes resulting in an accelerating movement.
S --> _vel(60) A B _vel(65) C D _vel(70) E F _vel(75) G _vel(77) H _vel(80) I _vel(85) J _vel(87) K _vel(90) L
A --> E2 •
B --> D2 A
C --> B2 B
D --> G2 C
E --> F#2 D
F --> A#2 E
G --> C2 F
H --> G#2 G
I --> A2 H
J --> D#2 I
K --> C#2 J
L --> F2 K
The “_vel” operator is a control of velocity producing a stepwise increasing volume of the piece. This grammar yields the following “score”:
_vel(60) E2 • D2 E2 •_vel(65) B2 D2 E2 • G2 B2 D2 E2 • _vel(70) F#2 G2 B2 D2 E2 • A#2 F#2 G2 B2 D2 E2 • _vel(75) C2 A#2 F#2 G2 B2 D2 E2 • _vel(77) G#2 C2 A#2 F#2 G2 B2 D2 E2 • _vel(80) A2 G#2 C2 A#2 F#2 G2 B2 D2 E2 • _vel(85) D#2 A2 G#2 C2 A#2 F#2 G2 B2 D2 E2 • _vel(87) C#2 D#2 A2 G#2 C2 A#2 F#2 G2 B2 D2 E2 • _vel(90) F2 C#2 D#2 A2 G#2 C2 A#2 F#2 G2 B2 D2 E2 •
and the following piano-roll representation with the sound example on a Pianoteq synthesizer:

Serial tools
The following grammar produces a 10-minute musical piece with only 12 rules and 3 notes (C3, D4, F#3). It is an illustration of Visser’s motto: “composing with a pencil and paper”.
The rhythmic intricacy is the result of using polymetric expressions: superimposition of sequences listed between curled brackets {} and resizing “beats” thanks to the period marker ‘•’.
The length and complexity of the piece is achieved by the use of recursive rules. For instance, rule gram#2[2] produces “Mel1” that will be rewritten again by rule gram#2[1].
Three “serial tools” are used:
- _transpose(n) shifts up the following sequence by n semitones
- _rotate(x) rotates the following sequence by x units
- _keyxpand(basenote, ratio) multiplies melodic intervals with ratio relative to basenote. For instance, after _keyxpand(C4, 2), sequence D4 E4 F4 would be replaced with E4 G#4 Bb4. This tool is applied recursively to the fields of a polymetric expression.
The grammar follows:
ORD
gram#1[1] S --> _vel(80) _rndvel(20) Melos1 Melos2 Melos3
gram#1[2] Melos1 --> Mel1 Mel2 Mel3
gram#1[3] Melos2 --> _transpose(11) Melos1
gram#1[4] Melos3 --> _transpose(5) Melos1 - Melos2
ORD
gram#2[1] Mel1 --> M1 - - - - - • M2 - - M3 M4 - - M5
gram#2[2] Mel2 --> _transpose(-11) Mel1
gram#2[3] Mel3 --> _transpose(6) _rotate(-1) {Mel1 - Mel2}
ORD
gram#3[1] M1 --> C3 - • D4 F#3 _keyxpand(B3,-1) C3 - D3 F#2
gram#3[2] M2 --> _transpose(2) M1
gram#3[3] M3 --> _transpose(-6) _rotate(-2) {M1 M2, _keyxpand(C3,-1) M1}
gram#3[4] M4 --> C3 D4 F#3 _keyxpand(B3,-1) C3 D3 F#2
gram#3[5] M5 --> _keyxpand(B4,-1) {M4, _vel(100) M1} {M2, M3}
Note that all subgrammars are headed with “ORD”, meaning that rules will be applied in order instead of being randomly selected. Thus, this grammar produces a unique musical piece, which is the case with all examples composed by Harm Visser. The only stochastic element of this piece is the velocity that may vary between 60 and 100 due to performance controls _vel(80) _rndvel(20).
The sound output was played on a Pianoteq synthesizer:
Trills
The following grammar produces trills taking advantage of tempo variations and continuous variations of velocities:
ORD
gram#1[1] S --> _script(Wait for space) _staccato(50) Shapes
gram#1[2] Shapes --> Part1 {_rotate(20) _transpose(2) Part1} Part2 Part3 {_tempo(0.7) Part3} Part4
ORD
gram#2[1] Part1 --> {M1 Trill1 M2 Trill2 Int1 Int2 Trill3 Int3 1/4}
gram#2[2] Part2 --> {M3 M4 M5 1/4 Trill4 1/4 Trill4 Trill4 1/4 Trill5 M6 1/4 Trill6 Trill7 Trill8 1/4 Trill9 Trill10 1/4 M5 M4 M3 M6 {_rotate(6) _transpose(23) M6} 1/4 Int3 Int2 Int1 _rotate(23) Part1} Trill3
gram#2[3] Part3 --> {1 {M3, M4} 2, _transpose(12) Trill1} _transpose(-11) {1 {M3, M4} 2, _transpose(12) Trill1}
gram#2[4] Part4 --> {Trill12, Trill11} {Trill10, Trill1} {Trill9 Trill10, Trill2} {_transpose(11) {M3, Trill2}} {M3, _transpose(12) Trill3} {Trill10, Trill1} {Trill9 Trill10, Trill2} {_tempo(2/3) Trill10} {M3, M4} {_tempo(1/2) Trill10} 1/4 _transpose(12) Trill9
ORD
gram#3[1] M1 --> {_velcont _vel(40) _transpose(12) _tempo(7) C0 C2 C4 C6 _vel(60) _tempo(6) Bb4 G3 F2 B2 G3 _vel(80) _tempo(8) A2 B1 F#1 G2 A3 C#4 E3 G2 _vel(40) _tempo(6) Bb1 C#1 G0 _tempo(5) G#1 A2 A3 Bb4 _vel(90)}
gram#3[2] M2 --> {_keyxpand(C4,-1) M1}
gram#3[3] M3 --> {_velcont _vel(40) _transpose(12) _tempo(7) C0 C2 {C4, C6} _vel(100) _tempo(6) Bb4 G3 F2 {B2, G3} _vel(80) _tempo(8) A2 B1 F#1 G2 A3 C#4 {E3, G2} _vel(50) _tempo(6) Bb1 C#1 G0 _tempo(5) G#1 A2 {A3, Bb4} _vel(70)}
gram#3[4] M4 --> {_tempo(0.7) _rotate(5) _transpose(3) M3}
gram#3[5] M5 --> {_tempo(0.7) _rotate(12) _transpose(6) M4}
gram#3[6] M6 --> {_tempo(2) M1}
gram#3[7] Int1 --> {_tempo(12) _vel(40) _transpose(3) D2 C#3 _transpose(6) D2 C#3 _transpose(9) D2 C#3}
gram#3[8] Int2 --> {_transpose(11) Int1}
gram#3[9] Int3 --> {_transpose(11) Int2}
gram#3[10] Trill1 --> {_tempo(12) _velcont _vel(10) Bb4 A5 Bb4 A5 Bb4 A5 Bb4 A5 Bb4 A5 Bb4 A5 Bb4 A5 Bb4 A5 Bb4 A5 Bb4 A5 _vel(80) Bb4 A5 Bb4 A5 Bb4 A5 Bb4 A5 Bb4 A5 Bb4 A5 Bb4 A5 Bb4 A5 Bb4 A5 Bb4 A5 _vel(10)}
Waves
Harm Visser had been invited to compose a piece à la Debussy with rubato rhythms creating the impression of waving movements. We had expected him to use the “_tempo()” tool with floating-point values (or integer ratios) as arguments.
In fact he did not… In the following grammar, only markers “1/2”, “1/4” indicate regular speed changes applied to an entire section. The waving effect is produced by a clever use of (self-imbedded) polymetric expressions. As indicated by the composer: “It is build on the idea of imbedding: {5, A B {3, A B {2, A B C D} C D} C D}.”
ORD
_mm(48) _striated
S --> Frase1 1 Frase1 Frase2 1/2 {_retro _transpose(12) Frase1} {_rotate(2) _transpose(1) Frase2} {_transpose(-13) Frase3} 1/4 {_transpose(-1) Frase1} Frase4 {_retro _transpose(-1) Frase1} {_rotate(3) _transpose(-11) Frase4} 1 Frase1 {_keyxpand(C4,-1) Frase1} 1/2 {2, _keyxpand(B3,-1) _vel(40) M19, M24} 1/2 {2, _keyxpand(A#3,-1) _vel(40) M19, M24} 1/4 Frase5 {_keyxpand(B3,-1) _transpose(-1) Frase5} {_keyxpand(C4,-1) Frase1} 1/2 {2, _keyxpand(B3,-1) _vel(40) M19, M24} 1/2 {2, _keyxpand(A#3,-1) _vel(40) M19, M24} 1 Frase6 1 Frase6 F1 B3 1 {_vel(50) F1 B3} 2 {6, _vel(40) F1}
Frase1 --> _legato(100) {_velcont _vel(50) M1 M2 M3 M4 _vel(60) M5 M6 _vel(50)}
Frase2 --> _legato(100) {_velcont _vel(50) _transpose(2) M7 M8 _vel(60) M9 M10 M11 M12 _vel(50)}
Frase3 --> _legato(100) {_velcont _vel(50) _transpose(2) M13 M14 M15 _vel(60) M16 M17 M18 _vel(50)}
Frase4 --> _legato(100) {_velcont _vel(50) _transpose(2) M19 M20 M21 M22 _vel(60) M23 M24 _vel(50)}
Frase5 --> _legato(100) {_velcont _vel(50) _transpose(2) M25 _vel(60) M26 M27 M28 M29 M30 _vel(50)}
Frase6 --> _legato(100) {_velcont _vel(50) _transpose(2) M31 _vel(60) M32 M33 M34 M35 M36 M37 M38 _vel(50)}
M1 --> {5, C3 F#3
M2 --> {3, _transpose(13) C3 F#3
M3 --> {3, _transpose(1) C3 F#3
M4 --> F2 B3}
M5 --> F2 B3}
M6 --> F1 B3}
M7 --> {5, _vel(60) C3 F#3
M8 --> {3, _transpose(13) C3 F#3
M9 --> {3, _transpose(1) C3 {M8 M10} F#3
M10 --> F2 B3}
M11 --> F2 B3}
M12 --> F1 B3}
M13 --> {5, _vel(60) C3 F#3
M14 --> {5, _transpose(13) C3 {_transpose(1) M13 M17} F#3
M15 --> {5, _transpose(1) C3 {M14 M16} F#3
M16 --> F2 B3}
M17 --> F2 B3}
M18 --> F4 B3}
M19 --> {9, C3 F#3
M20 --> {9, _transpose(13) C3 {_transpose(1) M13 M17} F#3
M21 --> {9, _transpose(1) C3 {M14 M16} F#3
M22 --> F2 {18, _transpose(-11) M1 M2 M3 M4 M5 M6} B3}
M23 --> F2 B3}
M24 --> F1 B3}
M25 --> {15, _vel(60) C3 F#3
M26 --> {15, _transpose(13) C3 {_transpose(1) M1 M5} F#3
M27 --> {15, _transpose(1) C3 {M2 M4} F#3
M28 --> F2 {30, _transpose(-11) M1 {30, _transpose(-11) M1 M5 M1 M5 M3 M6} M2 M3 M4 M5 M6} B3}
M29 --> F2 B3}
M30 --> F1 B3}
M31 --> {6, C3 F#3
M32 --> {5, _transpose(13) C3 F#3
M33 --> {5, _transpose(1) C3 F#3
M34 --> {5, _transpose(1) C3 F#3
M35 --> F2 B3}
M36 --> F2 B3}
M37 --> F1 B3}
M38 --> F1 B3}
The following is a rendering of the piece for piano solo on a Pianoteq synthesizer:
In an other version, the composer assigned parts to a different MIDI channel controlling a physical-model synthesized saxophone (which he had designed on his own):
Fractals
Harm Visser sent this grammar with the following comment:
It is completely based on a function that I have made in PatchWork. Take 3 notes and take their intervals to transpose. The result is a kind of ‘autotranspose’. You get a ‘fractal’ - the idea of the famous Von Koch-curve. The next step is making a recursive loop, so that you can set the level of recursion. The number of notes grows exponential: 3 9 27 81 243 etc. Of course you can do the same with rhythm-values.
This grammar is a BP2-version of exactly the same idea. It has 4 recursion levels. (You might also say ‘depth’. It is in fact a ‘copy’ of the PW-function). That’s why S --> L4 (level 4) (number of notes 243).
The difference between BP2 and PW is that the function in PW is fixed, which is not the case in BP2. I can easy make subtle changes (deviations) in the process. I can ‘break in’, so to speak. In his grammar I have set a comma between M10 and M11 and set M11 on the sax. The result is a polymetric canon!
S --> L4
L1 --> M1 M2 M3
L2 --> M4 M5 M6
L3 --> M7 M8 M9
L4 --> _rndvel(20) _vel(80) {_tempo(1/2) _chan(9) M10, _chan(1) M11 M12}
M1 --> _tempo(1) _transpose(0) C3 B3 F3
M2 --> _tempo(2) _transpose(11) M1
M3 --> _tempo(3) _transpose(5) M1
M4 --> _tempo(1) _transpose(0) M1 M2 M3
M5 --> _tempo(2)_transpose(11) M1 M2 M3
M6 --> _tempo(3) _transpose(5) M1 M2 M3
M7 --> _tempo(1) _transpose(0) M4 M5 M6
M8 --> _tempo(2) _transpose(11) M4 M5 M6
M9 --> _tempo(3) _transpose(5) M4 M5 M6
M10 --> _tempo(1) _transpose(0) M7 M8 M9
M11 --> _tempo(2) _transpose(11) M7 M8 M9
M12 --> _tempo(3) _transpose(5) M7 M8 M9
The following sound rendering is with piano solo on a Pianoteq synthesizer. The version with saxophone is unfortunately missing. It could be generated playing the (type-1) MIDI file Visser8.mid on a synthesizer assigning MIDI channel 9 to a saxophone sound.