Bol Processor BP3

BP3 is the multi-platform version of the Bol Processor that has been in development since 2020. It consists of two modules:

  • A console written in C language for cross-platform compilation, containing the core algorithms of the Bol Processor
  • An interface that allows non-technical users to edit or create specific material (grammars, sound-objects, Csound instruments) and interact with the console to produce Bol Processor scores, MIDI files, Csound scores and real-time MIDI output/input.

Currently, the interface has been built in the HTML5/JavaScript/PHP environment which makes it possible to work with the Bol Processor on any web browser. The setup works in different environments (MacOS X, Windows, Linux, etc.) but it requires the installation of a local Apache/PHP server.

Follow the instructions on the Bol Processor ‘BP3’ and its PHP interface page to install the latest version.

standalone version compiled from the PHP/JavaScript package is about to be released.

No posts found.

Two algorithms

Two algorithms for the instantiation of structures of musical objects

Bernard Bel

This is an extended and revised version of the chapter: Symbolic and Sonic Representations of Sound-Object Structures published in M. Balaban, K. Ebcioglu & O. Laske (Eds.) “Understanding Music with AI: Perspectives on Music Cognition”, AAAI Press (1992, p. 64-109).

Abstract

A representational model of discrete structures of musical objects at the symbolic and sonological levels is introduced. This model is being used to design computer tools for rule-based musical composition, where the low-level musical objects are not notes, but “sound-objects”, i.e. arbitrary sequences of messages sent to a real-time digital sound processor.

“Polymetric expressions” are string representations of concurrent processes that can be easily handled by formal grammars. These expressions may not contain all the information needed to synchronise the whole structure of sound-objects, i.e. to determine their strict order in (symbolic) time. In response to this, the notion of “symbolic tempo” is introduced: the ordering of all objects in a structure is possible once their symbolic tempos are known. Rules for assigning symbolic tempos to objects are therefore proposed. These form the basis of an algorithm for interpreting incomplete polymetric expressions. The relevant features of this interpretation are commented.

An example is given to illustrate the advantage of using (incomplete) polymetric representations instead of conventional music notation or event tables when the complete description of the musical piece and/or its variants requires difficult calculations of durations.

Given a strict ordering of sound-objects, summarised in a "phase table" representing the complete polymetric expression, the next step is to compute the times at which messages should be sent. This requires a description of "sound-object prototypes" with their metric/topological properties and various parameters related to musical performance (e.g. "smooth" or "striated" time, tempo, etc.). These properties are discussed in detail, and a time-polynomial constraint satisfaction algorithm for the time-setting of sound objects in a polymetric structure is introduced. Typical examples computed by this algorithm are shown and discussed.

Excerpts of an AI review of this paper (Academia, June 2025)

Summary of the Work

The manuscript introduces a model for representing and instantiating musical structures made of discrete sound-objects. It explores separate representations for symbolic and physical time, then proposes methods to synchronize concurrent musical processes and to compute the precise scheduling of messages (or events) destined for a sound processor. The author conceptualizes “smooth” and “striated” time, describes “polymetric expressions” as high-level objects that can be incomplete, and provides algorithms to infer missing timing details. The paper merges formal language approaches, real-time considerations, and practical examples of usage in a software environment called Bol Processor.

Comprehensive Model of Time

  • The clear distinction between symbolic time (strictly ordered events) and physical time (metronomic or arbitrary “striated” structures) provides an insightful way to handle simultaneous or overlapping musical events.
  • The notion of “smooth” versus “striated” time is conjugated with helpful examples, making it straightforward to envision both contexts of performance.

Polymetric Expressions and Incomplete Descriptions

  • The approach to polymetric expressions accommodates incomplete representations that can later be resolved by an algorithmic interpretation. This is particularly valuable for composers and researchers looking to experiment with generative or rule-based systems without being forced into fully specified notation from the outset.
  • The examples and diagrams showing how one can map polymetric structures to a phase diagram illustrate the concept effectively.

Synchronization and Constraints

  • The proposed synchronization algorithm handles concurrency by carefully propagating symbolic tempos across sequences. This helps manage cases where direct numeric durations are not known beforehand.
  • The introduction of properties such as pivot alignment (PivBeg, PivCent, etc.), truncation, elasticity, and relocatability demonstrates thorough consideration of realistic performance scenarios (e.g., rubato, partial overlaps). The concept of locating a sound object by its pivot was inspired by Marco Stroppa's work at IRCAM in 1990.

Practical Implementation and Examples

  • The paper gives a thorough demonstration of how these algorithms integrate with a functional software environment, including tangible data structures (phase tables, instance tables) and step-by-step flowcharts.
  • Musical examples and references to real-time computer music systems underscore the applicability of the approach.

Rich Technical Detail

  • The stepwise pseudo-code for the time-setting algorithm is extensive and transparent. This level of detail can guide further experimental or production-level implementations.
  • The complexity analysis (O(nmax² · imax³) in the worst case) provides an understanding of potential computational limits, helpful for anyone planning to use or extend these algorithms.

Potential Impact

  • This work is useful to composers, researchers in algorithmic composition, and developers of music software who need robust synchronization methods that go beyond simple “note-by-note” scheduling.
  • The proposed methods can enable more flexible representations of time and concurrency, allowing for richer generative or improvisational projects.

Summary of Review

Overall, this paper provides a detailed, formalized framework for resolving concurrent musical structures. It bridges the gap between abstract symbolic grammars and practical real-time performance considerations. Researchers and musicians interested in algorithmic composing or advanced computer-assisted composition tools will likely find its approach compelling, especially given the extensive examples and robust pseudo-code.

Download this paper (PDF)

Skip to PDF content

Presentations

No posts found.

Cambridge poster

Is text an adequate tool for modelling musical analysis, composition and performance?

This poster was presented at the conference Language and Music as Cognitive Systems in Cambridge (UK), on 11-13 May 2007.

Download the poster (20 Mb PDF)

Shapes in Rhythm

This composition was part of the choreographic work CRONOS created by Andréine Bel and performed at the National Centre for the Performing Arts (Mumbai, India) and the Shri Ram Center (Delhi) in October 1994.

The following grammar "-gr.ShapesInRhythm" was written (in about 2 days) by Andréine and Bernard Bel.

There were six dancers on the stage: Smriti Mishra, Olivier Rivoirard, Vijayshree Chaudhary, Arindam Dasgupta, Somenath Chatterjee and Suresh Shetty.

The musical structure consists of 9 parts using very different sound patches played on Roland D-50 synthesiser with a Musitronics extension card. Each part is based on the rhythmic structure of a tihai: three equal repetitions of a rhythmic pattern, interspersed with two equal rests, with the constraint that the last unit must fall on the first beat of the rhythmic cycle. The cycle has 16 beats, or tintal in North-Indian music/dance. Tihais are basic figures of Kathak dance and tabla drumming.

On an old Mac IIci, this would take 14 minutes to produce and time! For this reason, subgrammar instructions have been optimised: instead of the standard "RND" mode, "ORD" has been used wherever possible, otherwise "SUB1", whose process is a unique "parallel" rewrite of the work string.

Playing the piece required a 30-millisecond quantization setting which reduced the size of the phase table by a factor of 222. See Complex ratios in polymetric expressions for a detailed explanation.

At the time this grammar was written, BP2 did not support articulation or glossaries. This grammar has highlighted the need for such features.

Smooth time and time patterns (with time-objects t1, t2 and t3) were used because the dancers expected the first sections to start slowly and speed up. Thus, the composition starts at metronome 60, continues at metronome 80 and ends at 88. In this composition, however, striated time would be a much better option because speed changes can be managed using the "_tempo()" tool: forget time patterns, set the metronome to 88 and insert _tempo(60/88) then _tempo(80/88) and finally _tempo(1) to change speeds. This work was an incentive to implement the "_tempo()" performance tool…

Click this link to display the score of this piece. 
“Shapes in Rhythm” composed by Andréine Bel and played by the Bol Prorcessor on a Roland D-50 synthesiser (1994)

Video at the bottom of this page.

TIMEPATTERNS:
t1 = 88/60 t2 = 88/80 t3 = 1/1

ORD
_mm(88.0000) _smooth
GRAM#1[1] S --> Route script(Beep) _script(Wait for space) Part1 Gap12 Part2 Gap23 Part3 Gap34 Part4 Gap45 Part5 Gap56 Part6 Gap67 Part7 Gap78 Part8 Gap89 Part9
GRAM#1[2] Part1 --> _script(Tick cycle OFF) Route - _vel(127) _script(Tick cycle ON) _script(Reset tick cycle) {Tp1 Tp1 Tp1 Tp1 Tp1 Tp1 Tp1 Tp1, P1} {Tp1,Accord5,sol4 15}
GRAM#1[3] Part2 --> Sablier _vel(127) {Tp2 Tp2 Tp2 Tp2 Tp2, P2}{Tp3,Dha1 15} GRAM#1[4] Part3 --> Maison _vel(35) {Tp3 Tp3 Tp3 Tp3, P3}_vel(45){Tp3,Dha5} GRAM#1[5] Part4 --> Toit _vel(127){Tp3 Tp3 Tp3 Tp3 Tp3 Tp3, P4}
GRAM#1[6] Part5 --> Drapeau _vel(70){Tp3 Tp3 Tp3 Tp3, P5}{Tp3,Chhe 15}
GRAM#1[7] Part6 --> CerfVolant _vel(127){Tp3 Tp3 Tp3 Tp3, P6}{Tp3,Tin ---}
GRAM#1[8] Part7 --> Guimbarde _vel(127){Tp3 Tp3 Tp3 Tp3, P7} PedalOn {Tp3,Dha4 15}
GRAM#1[9] Part8 --> Hippocampe _vel(90){Tp3 Tp3 Tp3, P8}{Tp3,la5 31} GRAM#1[10] Part9 --> VaisseauVolant _vel(90) {Tp3 Tp3 Tp3 Tp3 Tp3 Tp3 Tp3 Tp3 Tp3 Tp3 Tp3 Tp3 Tp3 Tp3 Tp3 Tp3 t3 t3 t3 t3, P9}
GRAM#1[11] Gap12 --> _vel(80) Conque {Tp2,- _pitchbend(0) _pitchcont _mod(0) _modcont si3____ mod(16383) _pitchbend(8192) Sablier -} _mod(0)
GRAM#1[12] Gap23 --> Maison {Tp3,16,_vel(2) _velcont - fa3 _ mi3 fa#3 fa3 mi3 sol3 fa3 sol#3 do3 _ _ _ _ vel(40)}
GRAM#1[13] Gap34 --> Toit _vel(100) {Tp3,- sol#2 sol#2 sol#2 }
GRAM#1[14] Gap45 --> Toit _vel(100) {Tp3 Tp3, - sol2 - sol2 sol2 - sol2 Drapeau -}
GRAM#1[15] Gap56 --> CerfVolant _vel(60) {Tp3,- {6,do4,- do5} -}[{Tp3,PedalOn _vel(50) _velcont do2 sol#2 fa#2 do#3 PedalOff - _vel(90)}]
GRAM#1[16] Gap67 --> Guimbarde {Tp3,{_vel(40) do3__,vel(40) _velcont -fa3 fa3 vel(60), ---fa2}}
GRAM#1[17] Gap78 --> {Tp3,7 PedalOff -}
GRAM#1[18] Gap89 --> _vel(110) Michiko {Tp3, - PedalOn _press(0) _presscont _pitchbend(8192) _pitchcont re5_____ _press(127) _pitchbend(12000) - PedalOff}_pitchbend(8192)_press(0)
// Here we used the real values of pitchbend. Usually it is easier to use cent values but this wasn't yet implemented.

SUB1
GRAM#2[1] P1 --> {16,8 Vi4,Accord1} {16,{8,So8} {8,Ar12},Accord2} {16,{8,Sm16}{8,Su24}} {16,{8,Ol32}{8,An48}
GRAM#2[2] Accord1 --> do2
GRAM#2[3] Accord2 --> do2
GRAM#2[4] Accord5 --> do2

SUB1
GRAM#3[1] P2 --> Down12345 S5 Up12345 S5 Down12345 S5 Up12345 S5 Down12345 S3 Up12345 S3 Down12345 S3 Up12345 S3 Down12345 - Up12345 - Down12345 - Up12345 - Down12345 Up12345 Down12345 Up12345 Dha1 - Down12345 Up12345 Down12345 Up12345 Dha1 - Down12345 Up12345 Down12345 Up12345
GRAM#3[2] Down12345 --> si5 sol5 fa#5 mi5 re#5
GRAM#3[3] Up12345 --> si4 re#5 mi5 fa#5 sol5
GRAM#3[4] S5 --> -----
GRAM#3[5] S3 --> ---

SUB1
GRAM#4[1] P3 --> P3T1 Dha3 P3T2 Dha4 {P3T1,P3T3}
GRAM#4[2] P3T1 --> {3,do4 do5 do3 do3 do3 do3} {3, do#3 re3 la3 la#4 sol3 sol#4 do#4 do5 do3}{3,do#3 fa3 re#4 la#4 fa#3 sol4 mi4 la4 la#3 do5 re3 fa#3}{1,sol4 fa4}
GRAM#4[3] Dha3 --> sol#4
GRAM#4[4] P3T2 --> {3,do#4 do5 do#3 fa3 mi4 la4} {3,si3 do5 do3 do#3 re#3 si3 do5 do#3 re3}{3,sol#3 la#4 sol#3 la4 la#3 si4 re3 sol#3 la#4 sol#3 la#4 sol#3}{1,la#4 la4}
GRAM#4[5] Dha4 --> do5
GRAM#4[6] P3T3 --> {3,sol#3 la4 la#3 do5 re3 fa#3} {3,fa#4 fa4 sol4 re#4 do5 fa#3 fa#4 la4 do4}{3,do5 do3 do3 re#3 re#4 do5 re#3 do4 do5 do3 re#3 do4}{1,do5 do3}
GRAM#4[7] Dha5 --> sol#4

SUB1
GRAM#5[1] P4 --> {12,Trio Trio Trio Trio} {12,Trio Trio Trio Trio,Quatuor Quatuor Quatuor Quatuor} {24,Trio Trio Trio Trio Trio Trio Trio Trio,Quatuor Quatuor Quatuor Quatuor Quatuor Quatuor Quatuor Quatuor,OlSeul32}
GRAM#5[2] Trio --> {1,Sm,An,So} Tik Tik
GRAM#5[3] Quatuor --> {1,Ar,Ol,Su,Vi} {1,mi6---,do6---}
GRAM#5[4] OlSeul32 --> OlSeul4 OlSeul4 OlSeul4 OlSeul4 OlSeul4 OlSeul4 OlSeul4 OlSeul4
GRAM#5[5] OlSeul4 --> Ol Ol Ol Ol

SUB1
GRAM#6[1] P5 --> {Tick32,Tihai5 Chhe Tihai5 Chhe Tihai5}
GRAM#6[2] Tihai5 --> {4,Cinq2 Chhe Cinq2 Chhe} {6,Cinq2 Cinq2 Cinq2}

SUB1
GRAM#7[1] P6 --> {Tick32,Tihai6 Tin Tihai6 Tin Tihai6}
GRAM#7[2] Tihai6 --> {2,Huit}{2,Six}{2,Cinq}{2,Quatre}{2,- - Ek - - Do - -}

SUB1
GRAM#8[1] P7 --> {Tick32,Tihai7 Dha4 Tihai7 Dha4 Tihai7}
GRAM#8[2] Tihai7 --> {2,Huit2}{2,Sept2}{2,Six2}{2,Cinq2}{2,Quatre2}

SUB1
GRAM#9[1] P8 --> Tihai8 Gap8 Tihai8 Gap8 Tihai8
GRAM#9[2] Tihai8 --> {fa4,do5} - fa5 do6 la5 la#5 sol5 do6 la5 - {fa4,do5} fa5 - do6 la5 la#5 sol5 do6 la5 - {fa4,do5} fa5 do6 - la5 la#5 sol5 do6
GRAM#9[3] Gap8 --> la5 - - - - -

SUB1
GRAM#10[1] P9 --> {M1 M1 M1 M1 M2 M2 M2 M2 M2 M2 M2 M2 M3 M3 M3 M3 M3 M3 M3 M3 M4 M4 M4 M4 M4 M4 M4 M4 M5 M5 M5 M5 M5 M5 M5 M5 M6 M6 M6 M6 M6 M6 M6 M6,_vel(10){re3,mi3,fa3}}
GRAM#10[2] M1 --> Smriti
GRAM#10[3] M2 --> {Smriti,Olivier}
GRAM#10[4] M3 --> {Smriti,Olivier,Vijayshree}
GRAM#10[5] M4 --> {Smriti,Olivier,Vijayshree,Arindam}
GRAM#10[6] M5 --> {Smriti,Olivier,Vijayshree,Arindam,Somenath}
GRAM#10[7] M6 --> {Smriti,Olivier,Vijayshree,Arindam,Somenath,_vel(127) Suresh}

ORD [Setting ratios with time patterns]
GRAM#11[1] Tp1 --> t1 t1 t1 t1 t1 t1 t1 t1
GRAM#11[2] Tp2 --> t2 t2 t2 t2 t2 t2 t2 t2
GRAM#11[3] Tp3 --> t3 t3 t3 t3 t3 t3 t3 t3

SUB1
GRAM#12[1] Vi4 --> {4,Vi1 Vi1 Vi1 Vi1}
GRAM#12[2] So8 --> {8,So1 So1 So1 So1 So1 So1 So1 So1}
GRAM#12[3] Ar12 --> {12,Ar1 Ar1 Ar1 Ar1 Ar1 Ar1 Ar1 Ar1 Ar1 Ar1 Ar1 Ar1}
GRAM#12[4] Sm16 --> {16,Sm1 Sm1 Sm1 Sm1 Sm1 Sm1 Sm1 Sm1 Sm1 Sm1 Sm1 Sm1 Sm1 Sm1 Sm1 Sm1}
GRAM#12[5] Su24 --> {24,Su1 Su1 Su1 Su1 Su1 Su1 Su1 Su1 Su1 Su1 Su1 Su1 Su1 Su1 Su1 Su1 Su1 Su1 Su1 Su1 Su1 Su1 Su1 Su1}
GRAM#12[6] Ol32 --> {32, Ol4 Ol4 Ol4 Ol4 Ol4 Ol4 Ol4 Ol4}
GRAM#12[7] An48 --> An16 An16 An16
GRAM#12[8] An16 --> An4 An4 An4 An4
GRAM#12[9] An4 --> {4, An1 An1 An1 An1}
GRAM#12[10] Ol4 --> Ol1 Ol1 Ol1 Ol1
GRAM#12[11] Vi1 --> fa3 -
GRAM#12[12] So1 --> {mi3,fa#3} -
GRAM#12[13] Ar1 --> {sol3,la#3} -
GRAM#12[14] Sm1 --> do4 -
GRAM#12[15] Su1 --> {do#4,fa4} -
GRAM#12[16] Ol1 --> sol3 -
GRAM#12[17] An1 --> sol4 -

SUB1
GRAM#13[1] Smriti --> {3,Sm Sm Sm}
GRAM#13[2] Olivier --> {5,Ol Ol Ol Ol Ol}
GRAM#13[3] Vijayshree --> {2,Vi Vi}
GRAM#13[4] Arindam --> {4,Ar Ar Ar Ar}
GRAM#13[5] Somenath --> {6,So So So So So So}
GRAM#13[6] Suresh --> {12,Su Su Su Su Su Su Su Su Su Su Su Su}

SUB1
GRAM#14[1] Huit --> BigTik Tik Tik Tik Tik Tik Tik Tik
GRAM#14[2] Six --> BigTik Tik Tik Tik Tik Tik
GRAM#14[3] Cinq --> BigTik Tik Tik Tik Tik
GRAM#14[4] Cinq2 --> BigTik Tik3 Tik3 Tik3 Tik3
GRAM#14[5] Quatre --> BigTik Tik Tik Tik
GRAM#14[6] Huit2 --> BigTik2 Tik2 Tik2 Tik2 Tik2 Tik2 Tik2 Tik2
GRAM#14[7] Sept2 --> BigTik2 Tik2 Tik2 Tik2 Tik2 Tik2 Tik2
GRAM#14[8] Six2 --> BigTik2 Tik2 Tik2 Tik2 Tik2 Tik2
GRAM#14[9] Cinq2 --> BigTik2 Tik2 Tik2 Tik2 Tik2
GRAM#14[10] Quatre2 --> BigTik2 Tik2 Tik2 Tik2
GRAM#14[11] Ek --> Tik
GRAM#14[12] Do --> Tik
GRAM#14[13] Tin --> Tik
GRAM#14[14] Chhe --> BigTik

SUB1
// The eight following rules are typical cases in which _staccato() should be used.
GRAM#15[1] Dha1 --> {1,{si3,si4}---}
GRAM#15[2] Su --> do6---
GRAM#15[3] Sm --> fa5---
GRAM#15[4] Ol --> mi6---
GRAM#15[5] So --> la5---
GRAM#15[6] Vi --> re6-
GRAM#15[7] Ar --> mi5---
GRAM#15[8] An --> fa6---
GRAM#15[9] Dha4 --> {fa2,do4}
GRAM#15[10] Tick32 --> _vel(40) do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3 do3
GRAM#15[11] Tik --> do7
GRAM#15[12] Tik2 --> {do5,do6}
GRAM#15[13] Tik3 --> {_vel(15) sol6,_vel(110) do7}
GRAM#15[14] BigTik --> {do6,do8}
GRAM#15[15] BigTik2 --> {fa3,fa4}

SUB1
GRAM#16[1] Route --> X87
GRAM#16[2] Sablier --> X76
GRAM#16[3] Maison --> C13
GRAM#16[4] Toit --> X76
GRAM#16[5] Drapeau --> X36
GRAM#16[6] CerfVolant --> X63
GRAM#16[7] Guimbarde --> X86
GRAM#16[8] Hippocampe --> X72
GRAM#16[9] VaisseauVolant --> X36
GRAM#16[10] Conque --> I66
GRAM#16[11] Michiko --> X75

ORD
[D-50 stuff]
GRAM#17[1] Xcard --> _script(MIDI controller #98 = 1 channel 1)
GRAM#17[2] Internal --> _script(MIDI controller #98 = 0 channel 1)
GRAM#17[3] X13 --> Xcard _script(MIDI program 5)
GRAM#17[4] X24 --> Xcard _script(MIDI program 12)
GRAM#17[5] X26 --> Xcard _script(MIDI program 14)
GRAM#17[6] X27 --> Xcard _script(MIDI program 15)
GRAM#17[7] X36 --> Xcard _script(MIDI program 22)
GRAM#17[8] X63 --> Xcard _script(MIDI program 43)
GRAM#17[9] X68 --> Xcard _script(MIDI program 48)
GRAM#17[10] X72 --> Xcard _script(MIDI program 50)
GRAM#17[11] X75 --> Xcard _script(MIDI program 53)
GRAM#17[12] X76 --> Xcard _script(MIDI program 54)
GRAM#17[13] X83 --> Xcard _script(MIDI program 59)
GRAM#17[14] X85 --> Xcard _script(MIDI program 61)
GRAM#17[15] X86 --> Xcard _script(MIDI program 62)
GRAM#17[16] X87 --> Xcard _script(MIDI program 63)
GRAM#17[17] I42 --> Internal _script(MIDI program 26)
GRAM#17[18] I62 --> Internal _script(MIDI program 42)
GRAM#17[19] I66 --> Internal _script(MIDI program 46)
GRAM#17[20] C13 --> Internal _script(MIDI program 67)
GRAM#17[21] C42 --> Internal _script(MIDI program 90)
GRAM#17[22] C56 --> Internal _script(MIDI program 102)
GRAM#17[23] C23 --> Internal _script(MIDI program 75)
GRAM#17[24] PedalOn --> _switchon(64,1)
GRAM#17[25] PedalOff --> _switchoff(64,1)

An extract of this work is shown in the following video from 3mn 36s to 3mn 48s:

References

Related work

No posts found.

Computing ‘ideas’

Dwaram Venkataswamy Naidu playing a violin
Dwaram Venkataswamy Naidu playing a violin (credit)

A composition in Carnatic musical style by Srikumar K. Subramanian, June 1995.
Name: "-gr.trial.mohanam"

This is a non-stop improvisation of variations in a style similar to Carnatic music. The compositional approach here is to decide that each variation should contain 32 notes and can use up to 20 "ideas". To do this, a flag called Ideas is set to 20 at the beginning, and it is decreased by 1 unit in certain rules (such as GRAM#2[2]) or 2 units in others (such as GRAM#2[3]). See the page Flags in grammars for more details.

Rules in subgrammar #3 can only be candidates if there are few ideas left, but they do not reduce ideas.

Rules in subgrammar #6 use wildcards to create patterns.

Rules in subgrammar #9 create "effects" by changing velocities.

ORD
GRAM#1[1] S --> _transpose(-5) I /Ideas=20/ /Notes=32/ /NumR=1/

RND
GRAM#2[1] <0> I --> I /NumR+1/ [This rule is only fired on a _goto()]
GRAM#2[2] <20> /Ideas-1/ I --> R1 A R2
GRAM#2[3] <50> /Ideas-2/ I --> A B
GRAM#2[4] <20> /Ideas-1/ I --> R1 B R2
GRAM#2[5] <50> /Ideas-2/ I --> B A

RND
GRAM#3[1] <100> /Ideas/ /NumR-1/ A --> I
GRAM#3[2] <100> /Ideas/ /NumR-1/ B --> I
GRAM#3[3] <1> /Ideas/ I --> I _goto(2,1)

SUB1
GRAM#4[1] I --> lambda

RND
GRAM#5[1] <50-12> /Notes-4/ A --> P4
GRAM#5[2] <50-9> /Notes-3/ A --> P3
GRAM#5[3] <50-10> /Notes-2/ A --> P2
GRAM#5[4] <50-12> /Notes-4/ B --> Q4
GRAM#5[5] <50-9> /Notes-3/ B --> Q3
GRAM#5[6] <50-10> /Notes-2/ B --> Q2

RND
GRAM#6[1] R1 ?1 R2 --> ?1 ?1
GRAM#6[2] R1 ?1 ?2 R2 --> ?1 ?2 ?1 ?2
GRAM#6[3] R1 ?1 ?2 ?3 R2 --> ?1 ?2 ?3 ?1 ?2 ?3
GRAM#6[4] R1 ?1 ?2 ?3 ?4 R2 --> ?1 ?2 ?3 ?4 ?1 ?2 ?3 ?4
GRAM#6[5] R1 ?1 ?2 ?3 ?4 ?5 R2 --> ?1 ?2 ?3 ?4 ?5 ?1 ?2 ?3 ?4 ?5

RND
GRAM#7[1] P4 --> P41
GRAM#7[2] P4 --> P42
GRAM#7[3] P4 --> P43
GRAM#7[4] P4 --> P44
GRAM#7[5] P3 --> P31
GRAM#7[6] P3 --> P32
GRAM#7[7] P2 --> P21
GRAM#7[8] P2 --> P22
GRAM#7[9] Q4 --> Q41
GRAM#7[10] Q4 --> Q42
GRAM#7[11] Q4 --> Q43
GRAM#7[12] Q4 --> Q44
GRAM#7[13] Q3 --> Q31
GRAM#7[14] Q3 --> Q32
GRAM#7[15] Q3 --> Q33
GRAM#7[16] Q3 --> Q34
GRAM#7[17] Q2 --> Q21
GRAM#7[18] Q2 --> Q22
GRAM#7[19] Q2 --> Q23

RND
GRAM#8[1] R1 --> lambda
GRAM#8[2] R2 --> lambda

RND [Effects]
GRAM#9[1] Str ?1 --> _vel(110) ?1 _vel(64)
GRAM#9[2] Step3Up ?1 ?2 ?3 --> _vel(80) ?1 _vel(95) ?2 _vel(110) ?3 _vel(64)
GRAM#9[3] Step3Dn ?1 ?2 ?3 --> _vel(110) ?1 _vel(95) ?2 _vel(80) ?3 _vel(64)
GRAM#9[4] P41 --> sa6 re6 ga6 pa6
GRAM#9[5] P42 --> re6 ga6 pa6 ga6
GRAM#9[7] P43 --> dha6 pa6 ga6 pa6
GRAM#9[9] P44 --> ga6 Str dha6 pa6 Str dha6
GRAM#9[11] P31 --> ga6 pa6 dha6
GRAM#9[13] P32 --> sa6 ga6 re6
GRAM#9[14] P33 --> Str ga6 re6 sa6
GRAM#9[15] P34 --> Str sa7 dha6 pa6
GRAM#9[17] P21 --> ga6 pa6
GRAM#9[19] P22 --> sa6 Str ga6
GRAM#9[20] Q41 --> Str ga6 _ re6 sa6
GRAM#9[22] Q42 --> Str re6 ga6 _ re6
GRAM#9[24] Q43 --> ga6 _ pa6 Str dha6
GRAM#9[26] Q44 --> Str sa6 re6 _ ga6
GRAM#9[28] Q31 --> sa6 _ re6
GRAM#9[29] Q32 --> sa6 _ ga6
GRAM#9[30] Q33 --> Str sa7 dha6
GRAM#9[32] Q34 --> ga6 _ _
GRAM#9[34] Q21 --> ga6 ga6
GRAM#9[36] Q22 --> pa6 pa6
GRAM#9[38] Q23 --> Str dha6 Str dha6 

In the ‘Improvize’ mode, the values of flags and rule weights can be carried over from one variation to the next. This allows them to be used to trigger/inhibit events at any distance from those that created/modified them.

The following output was recorded on a Roland D-50 synthesiser.

« Translate