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.

Undetermined rests in dance performance

The polyrhythmic piece "765432" composed by Andréine Bel for her CRONOS dance production (1994) illustrates the use of undetermined rests. Six dancers were on stage: Suresh Shetty, Smriti Mishra, Olivier Rivoirard, Vijayshree Chaudhary, Arindam Dasgupta and Andréine Bel.

In this grammar, "SUB1" indicates a substitution that only needs to be performed once. Using it to replace "SUB" saves computation time.

Glyphs "" are undetermined rests, i.e. silences whose duration is a priori unknown and will be precisely calculated by the polymetric expansion algorithm.

The whole structure is based on regular arithmetic divisions. For example, Suresh moves at "speed 7", Smriti at "speed 6" and Olivier at "speed 5".

"CR47" and "C46" are patches from the Roland D-50 synthesiser.

ORD
GRAM#1[1] S --> Internal C47 Part1 Canon C46 _vel(90) Part2
GRAM#1[2] Part1 --> {Suresh1, Smriti1, Olivier1, Vijayshree1, Arindam1, Andreine1}
GRAM#1[3] Part2 --> {Suresh2, Smriti2 , Olivier2 , Vijayshree2 , Arindam2 , Andreine2 }
GRAM#1[4] Internal --> _script(MIDI controller #98 = 0 channel 1) [D50 stuff]

ORD
GRAM#2[1] Suresh1 --> SuMov7x7 SuSil7x7 SuMov6x7 SuSil6x7 SuMov5x7 SuSil5x7 SuMov4x7 SuSil4x7 SuMov3x7 SuSil3x7 SuMov2x7 SuSil2x7 SuMov1x7 SuSil1x7
GRAM#2[2] Smriti1 --> SmMov6x6 SmSil6x6 SmMov5x6 SmSil5x6 SmMov4x6 SmSil4x6 SmMov3x6 SmSil3x6 SmMov2x6 SmSil2x6 SmMov1x6 SmSil1x6
GRAM#2[3] Olivier1 --> OlMov5x5 OlSil5x5 OlMov4x5 OlSil4x5 OlMov3x5 OlSil3x5 OlMov2x5 OlSil2x5 OlMov1x5 OlSil1x5
GRAM#2[4] Vijayshree1 --> ViMov4x4 ViSil4x4 ViMov3x4 ViSil3x4 ViMov2x4 ViSil2x4 ViMov1x4 ViSil1x4
GRAM#2[5] Arindam1 --> ArMov3x3 ArSil3x3 ArMov2x3 ArSil2x3 ArMov1x3 ArSil1x3
GRAM#2[6] Andreine1 --> AnMov2x2 AnSil2x2 AnMov1x2 AnSil1x2

ORD
GRAM#3[1] Suresh2 --> SuMov7x7 SuMov6x6 SuMov5x5 SuMov4x4 SuMov3x3 SuMov2x2 SuMov1x1
GRAM#3[2] Smriti2 --> SmMov6x6 SmMov5x5 SmMov4x4 SmMov3x3 SmMov2x2 SmMov1x1
GRAM#3[3] Olivier2 --> OlMov5x5 OlMov4x4 OlMov3x3 OlMov2x2 OlMov1x1
GRAM#3[4] Vijayshree2 --> ViMov4x4 ViMov3x3 ViMov2x2 ViMov1x1
GRAM#3[5] Arindam2 --> ArMov3x3 ArMov2x2 ArMov1x1
GRAM#3[6] Andreine2 --> AnMov2x2 AnMov1x1

ORD
GRAM#4[1] SuMov1x7 --> SuCycle7
GRAM#4[2] SuSil1x7 --> SuMov1x7
GRAM#4[3] SuMov2x7 --> SuCycle7 SuCycle7
GRAM#4[4] SuSil2x7 --> SuMov2x7
GRAM#4[5] SuMov3x7 --> SuCycle7 SuCycle7 SuCycle7
GRAM#4[6] SuSil3x7 --> SuMov3x7
GRAM#4[7] SuMov4x7 --> SuCycle7 SuCycle7 SuCycle7 SuCycle7
GRAM#4[8] SuSil4x7 --> SuMov4x7
GRAM#4[9] SuMov5x7 --> SuCycle7 SuCycle7 SuCycle7 SuCycle7 SuCycle7
GRAM#4[10] SuSil5x7 --> SuMov5x7
GRAM#4[11] SuMov6x7 --> SuCycle7 SuCycle7 SuCycle7 SuCycle7 SuCycle7 SuCycle7
GRAM#4[12] SuSil6x7 --> SuMov6x7
GRAM#4[13] SuMov7x7 --> SuCycle7 SuCycle7 SuCycle7 SuCycle7 SuCycle7 SuCycle7 SuCycle7
GRAM#4[14] SuSil7x7 --> SuMov7x7
GRAM#4[15] SuMov1x1 --> SuCycle1
GRAM#4[16] SuSil1x1 --> SuMov1x1
GRAM#4[17] SuMov2x2 --> SuCycle2 SuCycle2
GRAM#4[18] SuSil2x2 --> SuMov2x2
GRAM#4[19] SuMov3x3 --> SuCycle3 SuCycle3 SuCycle3
GRAM#4[20] SuSil3x3 --> SuMov3x3
GRAM#4[21] SuMov4x4 --> SuCycle4 SuCycle4 SuCycle4 SuCycle4
GRAM#4[22] SuSil4x4 --> SuMov4x4
GRAM#4[23] SuMov5x5 --> SuCycle5 SuCycle5 SuCycle5 SuCycle5 SuCycle5
GRAM#4[24] SuSil5x5 --> SuMov5x5
GRAM#4[25] SuMov6x6 --> SuCycle6 SuCycle6 SuCycle6 SuCycle6 SuCycle6 SuCycle6
GRAM#4[26] SuSil6x6 --> SuMov6x6

ORD
GRAM#5[1] SmMov1x6 --> SmCycle6
GRAM#5[2] SmSil1x6 --> SmMov1x6
GRAM#5[3] SmMov2x6 --> SmCycle6 SmCycle6
GRAM#5[4] SmSil2x6 --> SmMov2x6
GRAM#5[5] SmMov3x6 --> SmCycle6 SmCycle6 SmCycle6
GRAM#5[6] SmSil3x6 --> SmMov3x6
GRAM#5[7] SmMov4x6 --> SmCycle6 SmCycle6 SmCycle6 SmCycle6
GRAM#5[8] SmSil4x6 --> SmMov4x6
GRAM#5[9] SmMov5x6 --> SmCycle6 SmCycle6 SmCycle6 SmCycle6 SmCycle6
GRAM#5[10] SmSil5x6 --> SmMov5x6
GRAM#5[11] SmMov6x6 --> SmCycle6 SmCycle6 SmCycle6 SmCycle6 SmCycle6 SmCycle6
GRAM#5[12] SmSil6x6 --> SmMov6x6
GRAM#5[13] SmMov1x1 --> SmCycle1
GRAM#5[14] SmSil1x1 --> SmMov1x1
GRAM#5[15] SmMov2x2 --> SmCycle2 SmCycle2
GRAM#5[16] SmSil2x2 --> SmMov2x2
GRAM#5[17] SmMov3x3 --> SmCycle3 SmCycle3 SmCycle3
GRAM#5[18] SmSil3x3 --> SmMov3x3
GRAM#5[19] SmMov4x4 --> SmCycle4 SmCycle4 SmCycle4 SmCycle4
GRAM#5[20] SmSil4x4 --> SmMov4x4
GRAM#5[21] SmMov5x5 --> SmCycle5 SmCycle5 SmCycle5 SmCycle5 SmCycle5
GRAM#5[22] SmSil5x5 --> SmMov5x5

ORD
GRAM#6[1] OlMov1x5 --> OlCycle5
GRAM#6[2] OlSil1x5 --> OlMov1x5
GRAM#6[3] OlMov2x5 --> OlCycle5 OlCycle5
GRAM#6[4] OlSil2x5 --> OlMov2x5
GRAM#6[5] OlMov3x5 --> OlCycle5 OlCycle5 OlCycle5
GRAM#6[6] OlSil3x5 --> OlMov3x5
GRAM#6[7] OlMov4x5 --> OlCycle5 OlCycle5 OlCycle5 OlCycle5
GRAM#6[8] OlSil4x5 --> OlMov4x5
GRAM#6[9] OlMov5x5 --> OlCycle5 OlCycle5 OlCycle5 OlCycle5 OlCycle5
GRAM#6[10] OlSil5x5 --> OlMov5x5
GRAM#6[11] OlMov1x1 --> OlCycle1
GRAM#6[12] OlSil1x1 --> OlMov1x1
GRAM#6[13] OlMov2x2 --> OlCycle2 OlCycle2
GRAM#6[14] OlSil2x2 --> OlMov2x2
GRAM#6[15] OlMov3x3 --> OlCycle3 OlCycle3 OlCycle3
GRAM#6[16] OlSil3x3 --> OlMov3x3
GRAM#6[17] OlMov4x4 --> OlCycle4 OlCycle4 OlCycle4 OlCycle4
GRAM#6[18] OlSil4x4 --> OlMov4x4

ORD
GRAM#7[1] ViMov1x4 --> ViCycle4
GRAM#7[2] ViSil1x4 --> ViMov1x4
GRAM#7[3] ViMov2x4 --> ViCycle4 ViCycle4
GRAM#7[4] ViSil2x4 --> ViMov2x4
GRAM#7[5] ViMov3x4 --> ViCycle4 ViCycle4 ViCycle4
GRAM#7[6] ViSil3x4 --> ViMov3x4
GRAM#7[7] ViMov4x4 --> ViCycle4 ViCycle4 ViCycle4 ViCycle4
GRAM#7[8] ViSil4x4 --> ViMov4x4
GRAM#7[9] ViMov1x1 --> ViCycle1
GRAM#7[10] ViSil1x1 --> ViMov1x1
GRAM#7[11] ViMov2x2 --> ViCycle2 ViCycle2
GRAM#7[12] ViSil2x2 --> ViMov2x2
GRAM#7[13] ViMov3x3 --> ViCycle3 ViCycle3 ViCycle3
GRAM#7[14] ViSil3x3 --> ViMov3x3

ORD
GRAM#8[1] ArMov1x3 --> ArCycle3
GRAM#8[2] ArSil1x3 --> ArMov1x3
GRAM#8[3] ArMov2x3 --> ArCycle3 ArCycle3
GRAM#8[4] ArSil2x3 --> ArMov2x3
GRAM#8[5] ArMov3x3 --> ArCycle3 ArCycle3 ArCycle3
GRAM#8[6] ArSil3x3 --> ArMov3x3
GRAM#8[7] ArMov1x1 --> ArCycle1
GRAM#8[8] ArSil1x1 --> ArMov1x1
GRAM#8[9] ArMov2x2 --> ArCycle2 ArCycle2
GRAM#8[10] ArSil2x2 --> ArMov2x2

ORD
GRAM#9[1] AnMov1x2 --> AnCycle2
GRAM#9[2] AnSil1x2 --> AnMov1x2
GRAM#9[3] AnMov2x2 --> AnCycle2 AnCycle2
GRAM#9[4] AnSil2x2 --> AnMov2x2
GRAM#9[5] AnMov1x1 --> AnCycle1
GRAM#9[6] AnSil1x1 --> AnMov1x1

ORD
GRAM#10[1] Canon --> Twist Walk Stretch Bend Jump Turn
GRAM#10[2] Twist --> Sm Tik Tik Tik Tik Tik Su Tik Tik Tik Tik Ol Tik Tik Tik Ar Tik Tik Vi Tik An
GRAM#10[3] Walk --> Sm Su Tik Ol Tik Tik Ar Tik Tik Tik Vi Tik Tik Tik Tik An Tik Tik Tik Tik Tik
GRAM#10[4] Stretch --> Twist
GRAM#10[5] Bend --> Walk
GRAM#10[6] Jump --> Twist
GRAM#10[7] Turn --> Walk

SUB1
GRAM#11[1] SuCycle7 --> Su Tik Tik Tik Tik Tik Tik
GRAM#11[2] SuCycle6 --> Su Tik Tik Tik Tik Tik
GRAM#11[3] SuCycle5 --> Su Tik Tik Tik Tik
GRAM#11[4] SuCycle4 --> Su Tik Tik Tik
GRAM#11[5] SuCycle3 --> Su Tik Tik
GRAM#11[6] SuCycle2 --> Su Tik
GRAM#11[7] SuCycle1 --> Su
GRAM#11[8] SmCycle6 --> Sm - - - - -
GRAM#11[9] SmCycle5 --> Sm - - - -
GRAM#11[10] SmCycle4 --> Sm - - -
GRAM#11[11] SmCycle3 --> Sm - -
GRAM#11[12] SmCycle2 --> Sm -
GRAM#11[13] SmCycle1 --> Sm
GRAM#11[14] OlCycle5 --> Ol - - - -
GRAM#11[15] OlCycle4 --> Ol - - -
GRAM#11[16] OlCycle3 --> Ol - -
GRAM#11[17] OlCycle2 --> Ol -
GRAM#11[18] OlCycle1 --> Ol
GRAM#11[19] ViCycle4 --> Vi - - -
GRAM#11[20] ViCycle3 --> Vi - -
GRAM#11[21] ViCycle2 --> Vi -
GRAM#11[22] ViCycle1 --> Vi
GRAM#11[23] ArCycle3 --> Ar - -
GRAM#11[24] ArCycle2 --> Ar -
GRAM#11[25] ArCycle1 --> Ar
GRAM#11[26] AnCycle2 --> An -
GRAM#11[27] AnCycle1 --> An

SUB1
GRAM#12[1] Su --> {1,do4-}
GRAM#12[2] Sm --> {1,mi4-}
GRAM#12[3] Ol --> {1,sol4-}
GRAM#12[4] Vi --> {1,do5-}
GRAM#12[5] Ar --> {1,mi5-}
GRAM#12[6] An --> {1,sol5-}
GRAM#12[7] Tik --> {1,do7-}

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

This performance was part of the choreographic work CRONOS performed at the National Centre for the Performing Arts (Mumbai, India) and the Shri Ram Center (Delhi) in October 1994. An excerpt is shown from 4mn 50s to 5mn 10s:

References

Tutorials

No posts found.

Time patterns (smooth time)

The following is a simple grammar illustrating the use of time patterns in smooth time. Whereas striated time is filled with (regular or irregular) pulses, smooth time does not involve counting.

_mm(120.0000) _smooth

GRAM#1[1] S --> {10 , t1 t2 , Part1 Part2}
GRAM#1[2] Part1 --> {t1 t3 t4 , C4 D4 E4 F4 - A4}
GRAM#1[3] Part2 --> {t3 t1 , B4 C5 _ E5}

TIMEPATTERNS:
t1 = 1/1  t2 = 3/2   t3 = 4/3  t4  = 1/2

In this grammar, "t1", "t2" etc. are the time patterns arranged in such a way that they define a structure of (irregular) "beats" on which notes "C4", "D4" etc. will be located.

The final arrangement is as follows:

{10, t1 t2, {t1 t3 t4, C4 D4 E4 F4 - A4} {t3 t1, B4 C5 _ E5}}

A sequence of simple notes ‘C4’, ‘D4’,…, arranged against a lattice of time-objects ‘t1’, ‘t2’,…, resulting in an irregular "beat" structure in smooth time.

Time flexibility in Bol Processor is not the effect of arbitrary numerical functions.  This flexibility stems from a time structure — Xenakis’ (1963) structure temporelle — that is deeply interwoven with the syntactic description of music.

If striated time is selected, the same structure will be displayed as shown below:

The same sequence of notes in striated time. In this case,
time-objects ‘t1’, ‘t2’, etc., have null durations.

Some time patterns were used in Andréine Bel's choreographic work: Shapes in Rhythm.

Reference

Interactive improvisation with sound-objects

Lady playing koto. Public domain, source: Wikimedia

This grammar (namely “-gr.koto3") is an improvisation model running on the Bol Processor BP2 connected to a Roland D-50 synthesiser. The choice of synthesiser was crucial for a good reproduction of the sound imitating a Japanese koto.

The underlying model (SUB grammar) is a one-dimensional cellular automaton using substitution rules: at each step of the computation, a set of randomly selected rules is applied to the work string. Conversely, in a RND grammar, a new rule would be selected each time the previous one was applied. For more details, see a presentation of "-gr.koto3" on the Bol Processor ‘BP3’ and its PHP interface page.

In subgrammar #2 we see a competition between constructive rules, such as gram#2[8] and gram#2[11] which increase the length of the work string, and destructive rules, such as gram#2[10] and gram#2[15] which decrease its length.

The weight of gram#2[12], initially set to 100, decreases by 10 each time it is applied, until the rule is invalidated.

SUB
gram#1[1] <100> S --> _vel(127) _volume(40) X X X X Y X X X X Y X X X X
gram#1[2] <K9> X --> a  [Weight is controlled by K9, see Interaction]
gram#1[3] X  --> b
-----
SUB
gram#2[1] Y --> Y
gram#2[2] #? ?1 --> #? ?1  [Keep leftmost symbol]
gram#2[3] ?1 #? --> ?1 #?  [Keep rightmost symbol]
gram#2[4] } --> }
gram#2[5] , --> ,
gram#2[6] <5> a --> a
gram#2[7] <30> a b a --> a a
gram#2[8] <100> #({) a b a --> {5,a c b,f f f - f}
gram#2[9] <5> b --> b
gram#2[10] <30> #({) b a b #(}) --> b b
gram#2[11] <100> #({) b a b --> {3,b a b c b a,f a f}
gram#2[12] <100-10> #({) #a b #(}) --> #a c b
gram#2[13] c c c -->  c a c
gram#2[14] c a c --> b a b
gram#2[15] <50> ?1 ?1 ?2 ?3 ?4 ?4 --> ?2 ?3
gram#2[16] <K9> ?1 ?1 ?1 --> ?1
gram#2[17] <K9> ?1 ?1 --> ?1
-----
SUB
gram#3[1] <40> Y --> <<f>>
gram#3[2] <50> Y --> <<chik>>
gram#3[3] <1-1> ? #? --> ? Silence _script(MIDI send Continue) #?
gram#3[4] <50> Silence --> - - - - -
gram#3[5] <15> Silence --> - - - -
gram#3[6] <8> Silence --> - - -
gram#3[7] <8> Silence --> - -

Rules in subgrammar #2 are applied until none of them can be a candidate. Then the rules in subgrammar #3 are applied, producing the out-time sound-objects <<f>> (a bass note) and <<chick>> (a chord).

The sound objects "a", "b", "c", "f", "chick" are defined in a sound-object prototype file called "-so.koto3". Some of them have specific properties that force a relocation to satisfy topological constraints. For example, "a" must maintain continuity with the preceding object (as shown in the image), which may cause it to be moved into the past.

The time-setting algorithm takes into account all the constraints to create a piece that may not fit exactly into the metronomic beat pattern. Below is an example of the final piece created using this grammar (played 3 times):

A piece generated by "-gr.koto3" played on a Roland D-50 synthesiser

In this grammar, parameter K9 is set to follow the position of a controller (e.g. the pitchbend or a pedal on the D-50), assigning a value from 0 to 100. This value is the weight of the rules gram#1[2], gram#2[16] and gram#2[17]. The higher the weight, the more "a" and the less "b" in the string; in addition, the final string becomes smaller due to the higher weight of the destructive rules gram#2[16] and gram#2[17].

During the improvisation, the work string is played at each step of its transformation. The end of the transformation is indicated by the <<f>> and <<chick>> sound-objects.

Below is an example of improvisation played in real time MIDI:

An improvization of "-gr.koto3" produced by BP2.9.8 and played on a Roland D-50 synthesiser

The following video illustrates the grammar at work on BP2.9.8 — unfortunately with a GeneralMIDI "koto" sound:

References

A beginner's tutorial

By Harm Visser, 2007

Let us take a look to the ideas and historical background of BP2. At the end of the fifties the linguistic scientist Noam Chomsky wrote his famous book 'Syntactic Structures'. It was an attempt to generalize the structure of language in a system of rewrite-rules, so called 'grammars':

Sentence --> NP + VP
NP --> T + N
VP --> Verb + NP
T --> The
N --> man, ball..
Verb -> hit, took…

When we computerize such a grammar and we give the command 'derive' we should see that Sentence became NP + VP, NP became T + N, VP became Verb + NP etc. At the end we see that N became 'man' and Verb became 'hit'. No further derivation is possible. The words 'man', 'hit' are therefore called 'terminal symbols'.

After derivation of Sentence we should read: the man hit… (or whatever). Such a Chomsky 'grammar' can be seen as a set of rules to generate well-formed English sentences.

You can read a rule as 'X --> Y'. It gives the 'instruction' to rewrite X as Y (X becomes Y). Maybe you can imagine already that such a grammar-system can also apply to musical syntax.

Let us therefore compare the Chomsky-example with this BP2-example:

S(entence) --> X Y
X --> Motif1
Y --> Motif2
Motif1 --> C3
Motif2 --> D3

After derivation we should hear the terminal symbols C3 D3.

The main difference between the 'Chomsky-grammar' and a BP2-grammar is that a BP2-grammar is exclusive. It is a formalisation of one particular piece of music. Chomsky-grammars try to generalize language as a whole.

At the other hand you can in BP2 'formalize' the sonata-form:

S --> Sonata
Sonata --> Theme1 Theme2 Development Coda
Theme1 --> Notes1
Theme2 --> Notes2
Development VariateNotes1 VariateNotes2
Coda --> HalfTheme1 HalfTheme2

When we derive the Sonata, we shall hear nothing, because there are no terminal symbols i.c. 'real notes', like C3, D2, etc. So let's finish the Sonata:

S --> Sonata
Sonata --> Theme1 Theme2 Development Coda
Theme1 --> Notes1
Theme2 --> Notes2
Development --> VariateNotes1 VariateNotes2
Coda --> HalfTheme1 HalfTheme2
Notes1 --> A3 B3 A3 G3
Notes2 --> D3 E3 F3 A3
VariateNotes1 --> _transpose(2) Notes1
VariateNotes2 --> _retro Notes2
HalfTheme1 --> A3 B3
HalfTheme2 --> D3 E3

Note that we use for VariateNotes1 and VariateNotes2 the tools _transpose(2) and _retro.

_transpose(x) transposes up or down at a given interval: _transpose(2) (two semitone up), _transpose(6) (six semitones up) _transpose(-7) (seven semitones down). You can also use values like _transpose(0.2).

The _retro tool stands of course for 'retrograde'. It turns the symbols backwards. You can read commands like _transpose and _retro as 'transformers'.

Well, let's listen to this Sonata! Select S and 'Play selection':

A3 B3 A3 G3 D3 E3 F3 A3 _transpose(2) A3 B3 A3 G3 E3 D3 B3 A3 A3 F3 E3 D3

A piano-roll display of the Sonata

There are two important things to remember

  1. When you write a variable like Theme1 or VariateNotes2 or Sonata (yes, these are variables until you give them a 'content'), start the variable with a capital and don't use empty spaces between symbols. So Not 'sonata', but 'Sonata'. Not 'n1', but 'N1', not 'my piece', but 'Mypiece'.
  2. You can listen to every stage or level of your piece at every moment. So, instead selecting S, you can select Notes1 or Development, or G3… In other words, you can listen to every compositorial detail! Try to make your own Sonata now!

Note that the example-Sonata is also a description of the actual piece. That is to say that the first half is the description, the second half is the 'realisation' of the description. This approach means that a description can also have a 'subdescription', while the subdescription can have… indeed, a subsubdecription. So BP2 is the perfect tool for hierarchical descriptions of musical structures.