This is a very interesting topic that may feed a tutorial and discussion
on the future Bol Processor website!
There are several levels of "regularity" when dealing with musical time
structures in a computational approach. They can be figured out from a
composer's or from a performer's point of view.
A composer is "designing" music and doing his/her best to embed
so-called "performance rules" into the score (or the grammar in BP). I
had implemented tools for randomizing parameters of NoteOns, among which:
### _rndtime(x) [Performance control]
Assigns random fluctuations in range +/- x to the timings of following
"sound-objects" or "simple notes".
• 'x' is the fluctuation in milliseconds.
• Range of x is 0..32767. Values less than the "quantization" will
produce no effect.
This was called "humanizing" in sequencers: changing a little bit the
timing of NoteOn to imitate a performer's "inaccuracy". Indeed it worked
but it did not sound more "human" and it could have disastrous
consequences. For instance, in the piece ShapesInRhythm
(https://leti.lt/bolprocessor/ShapesInRhythm.mp3) played on a Roland
D50, changing NoteOns by a few milliseconds altered mysterious effects
(like Leslie) produced by the precise NoteOns.
Understandably, Harm Visser hated that feature and more generally he
rarely used any tool of BP2 that would produce an unpredictable effect.
Only randomizing velocities was accepted by him. He viewed grammars as a
concise and comprehensive ways of creating and interpreting musical
pieces. He could use "ORD" at the top of all grammars because only one
rule was a candidate at every step. In fact he implemented a
tree-representation of musical scores.
Did the result sound "human"? Consider for instance -gr.Visser8. You
can listen to the resulting sound on PianoTeq:
https://leti.lt/bolprocessor/Visser8.mp3
and see the graphic display:
https://leti.lt/bolprocessor/Visser8.png
(Harm wouldn't be happy because the piece was meant to be partly played
on a saxophone…)
The piece is played on metronome = 60, striated time. You can hear and
see repeated patterns — it's actually built on only 3 notes, using the
transposition tool! — but their durations are different. Here, the only
approach for time-setting is the construction of polymetric structures.
Using recursivity makes it very compact and it "fractalizes" the structure.
In the end, those repetitive patterns do not fall on metronome beats. To
build complex structures, Harm used the _tempo performance tool. For
instance, _tempo(5/4) would multiply the speed by 1.25. If possible, use
integer ratios, but the machine will do as well with _tempo(125/100) or
_tempo(1.25)…
An emblematic example of polymetric structures is -gr.Visser5, a
recording of which I also stored on https://leti.lt/bolprocessor/. That
piece is made of only 12 very simple rules and its total duration is
about 10 minutes. You can't imagine a more concise notation. It does not
even use the _tempo tool which had not yet been implemented! But it is
an example of "serial operators" such as _keyxpand and _rotate.
I was hoping to implement a performance tool _tempocont that would force
tempo to speed up/down gradually between two _tempo() values. But it
would have made the polymetric expansion algorithm terribly complicated.
This was an incentive to implement "smooth" time structures.
I asked Harm to compose a piece "à la Debussy" hoping that he would take
advantage of the _tempo() tool. He did not! He produced -gr.Visser.Waves
(recorded as Waves.mp3) in which only pure polymetric structures would
produce the "waving" effect. As he said: "It is build on the idea of
imbedding: {5, A B {3, A B {2, A B C D} C D} C D}". The piece is using a
_legato() effect by which NoteOffs can be delayed.
The "Shapes.mp3" piece is also interesting but it uses the _tempo tool.
These are the limits of what we can do in striated time.
It's fantastic to use self-embedding structures and recursive rule, but,
much like quantum physics it is difficult to understand how it works! ;-)
> I have been wondering for awhile if time patterns could be used to
> create a nice, "smooth" rubato effect? I started working back in 2013
> on new example files with a Couperin piece called "Le Dodo ou L'Amour
> au Berçeau". It is supposed to have a "rocking tempo" which I like to
> interpret as starting each 2-measure phrase more quickly and slowing
> down at the end. I haven't experimented yet with adding the time
> patterns because it was quite a bit of work just to enter the notes.
> Do you think that this is the sort of thing that time patterns could
> be used for?
If you need rubato effects you can start writing the piece for striated
time, in which all notes in the rubato will have equal durations. Then
set the time structure to smooth: the result will be the same because of
the use of simple notes. However, you can create time-objects and string
them as time patterns controling the sequences of rubato notes.
For instance slowing down a movement:
----
ORD
_mm(120.0000) _smooth
S --> MyPiece
MyRubato --> t1 t2 t3 t4
Fournotes --> {C4 D4 E4 F4}
MyPiece --> G4 E4 G4 {MyRubato, Fournotes} C4 G3 C4
TIMEPATTERNS:
t1=12/12 t2=7/12 t3=25/12 t4=35/12
-----
(Trying this on BP2.9.8 I discovered that it does not reset time
patterns every time it is run. We need to quit to reset them!)
To speed up the rubato and make it last 2 time units, for instance:
----
ORD
_mm(60.0000) _smooth
gram#1[1] S --> MyPiece
gram#1[2] MyRubato --> t1 t2 t3 t4
gram#1[3] Fournotes --> {C4 D4 E4 F4}
gram#1[4] MyPiece --> G4 E4 G4 {2, MyRubato, Fournotes} C4 G3 C4
TIMEPATTERNS:
t1=8/7 t2=10/7 t3=14/7 t4=16/7
----
Note that the denominators of time patterns have become irrelevant since
the rubato is forced to a 2 time-unit duration.
You can enter notes directly in BP2.9.8 using a MIDI keyboard.
Unfortunately no way of creating polymetric structures from polyphonic
music! This occupied my mind for several weeks while on holiday in
Himalaya. Perhaps today using AI/neural networks?
> Speaking of examples, I was looking at Chopin's "Fantaisie-Impromptu"
> while at the piano recently and had the thought that since I will
> never play it well even at a very slow tempo, that it would make an
> excellent demo of how polymetric expressions handle complex timing.
> Throughout the fast sections are 4:3 rhythms between the right and
> left hands and there are a couple of spots with things like 7:6
> (IIRC). The slow section has a lot of 2:3 and multi-note ornaments
> that might be represented well as sound-objects. (I was also thinking
> of using sound-objects to realize the ornaments in the Couperin).
Sound-objects are indeed interesting to store sequences of notes and
deal with them, given that they still can be resized according to tempo.
But Harm would probably call it a bad solution. ;-) Using polymetric
structures, maybe with variations selected randomly to avoid repetitions
(and flags to avoid using the same rule too many times) would be the
best educational example. To go further into details, use time patterns
as above.
If you send me the scan of a very short fragment (not more than 1 or 2
measures) I will try to show its implementation…
Bernard
|