Skip to content
roomi fields

BPscript · S5 · Course

Structuring Time

Master musical time with BPscript, from polymetry to silences, including speed and Boulez's concepts for limitless composition.

Published 20 May 2026 · Lire en français

Polymetry, Silences, Speed

Braces, Periods, Three Silences, and the Two Philosophies of Time

Musical time is not a line — it’s a network. BPscript inherits from BP3 the tools to describe it: superimposing flows, dividing into periods, playing with speed, and choosing between the measured time of the metronome and the free time of the ālāp.

Where does this article fit in?

After types (S3) and backticks (S4), we delve into an area where BPscript is particularly well-equipped: structuring time. This is the core of the BP3 legacy. This article assumes familiarity with the concept of polymetry — for an introduction, see B5.


Braces {}: Polymetry and Grouping

Music often has several things happening at once — a melody and a rhythm — or motifs that one wants to treat as a whole. Braces serve this purpose, and they have two roles depending on whether a comma is included:

Polymetry — Multiple Simultaneous Voices

S -> { melodie, rythme }

The comma , separates the voices. Each voice has its own duration — the BP3 engine calculates the least common multiple (LCM) to synchronize them. This is polymetry in the strong sense: duration ratios can be irrational (B5).

Temporal Grouping — A Single Voice

S -> A {B C D} E F

Without a comma, braces group symbols into a single temporal unit. The group {B C D} occupies the same duration as a simple symbol. A qualifier can be applied to it:

S -> A {B C D}[speed:2] E F      // B C D played at double speed

The Periodic Notation .

How do you get three groups of the same duration without manually calculating “this group is 1/3, that one is 1/3…”? This is the role of the dot .: it divides a sequence into fragments of equal symbolic duration.

S -> A B . C D . E F              // 3 fragments of equal duration

Each fragment between the . occupies the same time. This is a fundamental BP3 mechanism for building proportional structures without manually calculating durations.

Combinable with polymetry:

S -> { A B . C D, E F G }        // voice 1: 2 fragments, voice 2: 3 symbols

The . and , are two sides of the same BP3 expansion mechanism — they are passed as-is to the engine.


The Three Silences

BPscript distinguishes three ways to express the absence of sound:

SymbolNameDurationEffect
-silencecontext-dependentabsence of event, occupies time
_prolongationextends previous eventsound continues, no new attack
...indeterminate restcalculated by enginePolyMake finds optimal duration

The distinction is crucial. Compare:

Sa - Re          // silence between Sa and Re — two sounds separated by emptiness
Sa _ Re          // Sa lasts 2 positions — a single prolonged sound, then Re
Sa ... Re        // the engine calculates the rest duration to balance the voices

The indeterminate rest ... is the most subtle: in a polymetric context, the BP3 engine (via the PolyMake algorithm — see B13) calculates the duration that produces the simplest temporal structure. The composer writes the minimum, the engine does the rest:

S -> { A B C ..., D E F G }      // the ... compensates for the length difference

This is the notation closest to what a human musician would expect: one specifies the structure, not the timing details.


Speed: [speed:] on a Group and Duration Operators

Two distinct mechanisms control speed, and they do not compile in the same way.

[speed:N] on a Polymetric Group → Ratio

On a group {}, [speed:N] expresses a polymetric tempo ratio. In BP3, this ratio is placed in the first position within the braces:

BPscriptCompiled BP3
{A B}[speed:2]{2, A B}
{A B}[speed:1/2]{1/2, A B}
{mi fa sol}[speed:2/3]{2/3, mi fa sol}

The compiler translates {...}[speed:N] → {N, ...}. No implicit ratio in BPscript: everything goes through [speed:].

Duration Operators [/N], [\N], [*N], [**N] → Encapsulating Pair

On a symbol or group, BP3’s temporal operators are directly exposed and compile into an encapsulating pair of _tempo() (BP3’s tempo change instruction):

BPscriptCompiled BP3Effect
A[/2]_tempo(2/1) A _tempo(1/2)doubles the speed of A
A[*2]_tempo(1/2) A _tempo(2/1)divides the speed of A by 2
{A B}[/2]_tempo(2/1) {A B} _tempo(1/2)group at double speed, local scope

The encapsulating pair ensures that the effect is local: the tempo is restored after the element. This is the essential difference from the polymetric ratio of [speed:], which is a structural property of the {} block.

S -> A {B C D}[speed:2] E F
// B C D played at double speed via the polymetric ratio, A and E at normal speed

Element Controls: [] Engine vs () Runtime

BPscript distinguishes two types of controls, with two syntaxes:

[] — Engine Instructions (BP3)

Square brackets [] carry instructions for the BP3 engine. They apply to symbols, groups, and rules. On an element of the RHS, [] is always written as a suffix: attached to the right of the element it qualifies (without a space).

A[/2]                            // symbol: duration operator, as suffix
{A B C}[speed:2]                 // group: polymetric ratio
S -> A B C [weight:3]            // rule: weight 3 (at end of rule)

The reserved language keywords in [] are: the duration operators /N, \N, *N, **N, as well as mode, scan, weight, speed, on_fail, tempo, meter, scale. Any other language keyword in [] is an error.

Other words (retro, rotate, keyxpand, striated, smooth, stop, goto…) are engine controls provided by the @controls library, not reserved language keywords themselves. They exist because the library defines them, not because BPscript knows them. The complete list of language keywords is in S12.

() — Runtime Parameters (Transport/REPL)

Parentheses () carry parameters intended for the runtime — BPscript does not interpret them, it transports them. Three scopes (always as a suffix):

Sa(vel:120)                      // symbol: vel=120 for this note
{A B C}(vel:80)                  // group: vel=80 for the entire group
S -> A B (vel:120)               // rule: vel=120 for the entire phrase

The compiler translates runtime parameters into _script(CTn) tokens — opaque references to a separately maintained control table:

BPscriptCompiled BP3
Sa(vel:120)Sa _script(CT0) (CT0 = vel:120)
S -> A B (vel:120)_script(CT1) A B (rule scope)

The []/() distinction is fundamental: [] changes the engine’s behavior (speed, weight, mode), () changes the runtime’s rendering (velocity, pan, instrument).

A () itself comes in two regimes — containment (confined to its scope) and flux !(...) (flowing forward in playing order) — detailed in S14.


Derivation Types

BP3 offers several strategies for choosing which rule to apply when a non-terminal (a symbol that can be rewritten) has multiple candidate rules. In BPscript, the derivation type is declared as a block directive via @mode:X — it applies to the entire sub-grammar that follows:

TypeFull NameBehavior
ordOrderedRules are applied in declaration order (top to bottom)
randomRandomA rule is chosen randomly from candidates, weighted by their weights
linLinear (leftmost)Random choice among rules applicable to the leftmost non-terminal
sub1Substitute firstSubstitution of the first occurrence of the non-terminal only
subSubstitute allSimultaneous substitution of all occurrences
temTemplatesMatching via the TEMPLATES block
poslongPositional longestLike sub1, but selects the longest derivation
@mode:random                     // all rules below are in random mode

S -> A B C                       // weighted random choice
S -> D E F                       // same — same sub-grammar

-----                            // sub-grammar separator

@mode:ord                        // the following rules are in ordered mode
A -> Sa Re Ga
A -> Pa Dha Ni

The @mode:X persists until the next mode change. random mode is the most common in composition: it produces unpredictable variations, controlled by weights (B4). Details of each mode are in B3.

Scan Direction

Distinct from the derivation type, the scan direction sets the direction in which the engine searches, in the current string (BP3’s work string), for the next symbol to rewrite — thus which occurrence is chosen when several are suitable:

DirectionQualifierEffect
LEFT[scan:left]Searches for the symbol to rewrite from left to right
RIGHT[scan:right]Searches from right to left
RND[scan:rnd]Searches in a random order (default)
S -> A B C [scan:right]          // this rule scans from right to left

The scan direction is a qualifier per rule ([scan:X]), while the derivation type is a directive per sub-grammar (@mode:X). The two are orthogonal. The default, if no [scan:] is specified, is rnd.


Three Directions

The derivation arrow indicates the direction:

S -> A B C                       // production — when the engine generates
S <- A B C                       // analysis — when the engine recognizes (right → left)
S <> A B C                       // bidirectional — valid in both phases

The -> direction is the most common: the non-terminal on the left rewrites to the sequence on the right (production). <- corresponds to the direction of analysis, when the engine recognizes a given sequence. <> is bidirectional: the rule is valid in both generation and analysis.


Striated Time and Smooth Time

Pierre Boulez, in Penser la musique aujourd’hui (1963), distinguishes two textures of time using a textile image: a striated fabric is crossed by regular lines (a pulse), a smooth felt is homogeneous, without a grid.

  • Striated Time: counted time. A pulse divides time into units; durations are positions on this grid. This is the time of the metronome, of dance, of most Western music.
  • Smooth Time: uncounted time. No reference grid; durations are properties inherent to the sound objects themselves. This is the time of the ālāp (slow, unmeasured introduction to an Indian raga), of the drone, of free improvisation.

Warning: striated/smooth is not the discrete/continuous distinction of signal processing. Both regimes use the same rational arithmetic; what changes is the source of the duration — the grid (striated) or the object itself (smooth). See B12.

BP3 implements both regimes: _striated (the default) places events on a pulse grid; _smooth assigns each object its own duration (via time patterns). In BPscript, one switches between them with the striated / smooth controls (@controls library).

Beyond the regime, B12 identifies two ways to act on the temporal flow: time as an object property — smooth time, which BPscript finds in the cv type (a CV object carries its own duration — see S3) — and time as an instruction inserted into the flow — BP3’s _tempo() operator, exposed in BPscript by [/N], [*N]… seen above.


Tempo: Three Levels

BPscript distinguishes three levels of tempo control, provided by the @controls library:

ControlSyntaxEffect
Relative Multiplier[tempo:2]Doubles the current speed
Absolute Metronomic Marking@mm:120120 BPM (beats per minute)
Striated/Smooth Togglestriated / smoothChanges the temporal mode
@controls                        // import performance controls
@mm:120

S -> A B [tempo:2] C D           // C and D at double speed (relative)

[tempo:2] is a reserved language keyword. The striated/smooth toggles are controls from the @controls library. These three levels correspond to the concepts explored in B12.


Key Takeaways

  1. {} = polymetry (with ,) or grouping (without ,)
  2. . = periodic notation — fragments of equal duration
  3. Three silences: - (empty), _ (prolongation), ... (engine-calculated rest)
  4. [speed:N] on a group = polymetric ratio {N, ...} ; [/N], [*N] = duration operators (encapsulating _tempo pair)
  5. 7 derivation types (ord, random, lin, sub1, sub, tem, poslong) via @mode:X per sub-grammar + 3 scan directions (left, right, rnd — default rnd) via [scan:X] per rule
  6. 3 directions: -> (left→right), <- (right→left), <> (bidirectional)
  7. Two times: striated (durations = positions on a grid, _striated) and smooth (durations = object properties, _smooth) — distinct from discrete/continuous

Further Reading

  • Bel, B. (2001): “Rationalizing Musical Time: Syntactic and Symbolic-Numeric Approaches” — the foundations of time processing in BP3. The Ratio Book.
  • Boulez, P. (1963): Penser la musique aujourd’hui — the striated/smooth time distinction underlying BP3’s temporal architecture

Glossary

  • Polymetry: Superposition of voices with potentially different durations, synchronized by the LCM
  • Periodic notation: notation using . to divide a sequence into fragments of equal symbolic duration
  • Prolongation: Symbol _ that extends the duration of the previous sound without a new attack
  • Indeterminate rest: Symbol ... whose duration is calculated by the BP3 engine (PolyMake algorithm)
  • Polymetric ratio: Factor [speed:N] that places a tempo ratio at the beginning of a {} block (compiled {N, ...})
  • Derivation mode: Strategy for choosing a rule when a non-terminal has multiple candidate rules (ord, random, lin…)
  • Striated time: counted time, where durations are positions on a pulse grid (_striated, default in BP3) — Boulez 1963
  • Smooth time: uncounted time, where durations are properties inherent to the objects, without a grid (_smooth) — Boulez 1963; not to be confused with signal continuity
  • Ālāp: Slow, unmeasured introduction to an Indian raga — a paradigmatic example of smooth time
  • LCM: Least Common Multiple — used by BP3 to synchronize polymetric voices

  • S2 — Temporal symbols (-, _, …, .)
  • S3 — The CV type and the question “who interpolates?”
  • S6 (coming soon) — Flags and modes — how conditions interact with derivation
  • S8 — Patterns, captures, and templates
  • B5 — Polymetry in BP3 — foundations
  • B12 — The three times of BP3 — symbolic, striated, physical time
  • B13 — PolyMake — the polymetric expansion algorithm

Prerequisites: S2, B5 Reading time: 14 min Tags: #BPscript #polymetry #time #silence #Boulez #BP3


Next article: S6 — Composing with conditions: flags and traversals


← Back to index