Cambridge poster

Is text an ade­quate tool for mod­el­ling musi­cal analy­sis, com­po­si­tion and performance?

This poster was pre­sent­ed at the con­fer­ence Language and Music as Cognitive Systems in Cambridge (UK), on 11-13 May 2007.

➡ Download the poster (20 Mb PDF)

Shapes in Rhythm

This com­po­si­tion was part of the chore­o­graph­ic work CRONOS cre­at­ed by Andréine Bel and per­formed at the National Centre for the Performing Arts (Mumbai, India) and the Shri Ram Center (Delhi) in October 1994.

The fol­low­ing gram­mar "-gr.ShapesInRhythm" was writ­ten (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 musi­cal struc­ture con­sists of 9 parts using very dif­fer­ent sound patch­es played on Roland D-50 syn­the­sis­er with a Musitronics exten­sion card. Each part is based on the rhyth­mic struc­ture of a tihai: three equal rep­e­ti­tions of a rhyth­mic pat­tern, inter­spersed with two equal rests, with the con­straint that the last unit must fall on the first beat of the rhyth­mic cycle. The cycle has 16 beats, or tin­tal in North-Indian music/dance. Tihais are basic fig­ures of Kathak dance and tabla drumming.

On an old Mac IIci, this would take 14 min­utes to pro­duce and time! For this rea­son, sub­gram­mar instruc­tions have been opti­mised: instead of the stan­dard "RND" mode, "ORD" has been used wher­ev­er pos­si­ble, oth­er­wise "SUB1", whose process is a unique "par­al­lel" rewrite of the work string.

Playing the piece required a 30-millisecond quan­ti­za­tion set­ting which reduced the size of the phase table by a fac­tor of 222. See Complex ratios in poly­met­ric expres­sions for a detailed explanation.

At the time this gram­mar was writ­ten, BP2 did not sup­port artic­u­la­tion or glos­saries. This gram­mar has high­light­ed the need for such features.

Smooth time and time pat­terns (with time-objects t1, t2 and t3) were used because the dancers expect­ed the first sec­tions to start slow­ly and speed up. Thus, the com­po­si­tion starts at metronome 60, con­tin­ues at metronome 80 and ends at 88. In this com­po­si­tion, how­ev­er, stri­at­ed time would be a much bet­ter option because speed changes can be man­aged using the "_tempo()" tool: for­get time pat­terns, set the metronome to 88 and insert _tempo(60/88) then _tempo(80/88) and final­ly _tempo(1) to change speeds. This work was an incen­tive to imple­ment the "_tempo()" per­for­mance tool…

Click this link to dis­play the score of this piece. 
“Shapes in Rhythm” com­posed by Andréine Bel and played by the Bol Prorcessor on a Roland D-50 syn­the­sis­er (1994)

➡ Video at the bot­tom 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 val­ues of pitch­bend. Usually it is eas­i­er to use cent val­ues but this wasn't yet imple­ment­ed.

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 pat­terns]
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 fol­low­ing rules are typ­i­cal cas­es 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 con­troller #98 = 1 chan­nel 1)
GRAM#17[2] Internal --> _script(MIDI con­troller #98 = 0 chan­nel 1)
GRAM#17[3] X13 --> Xcard _script(MIDI pro­gram 5)
GRAM#17[4] X24 --> Xcard _script(MIDI pro­gram 12)
GRAM#17[5] X26 --> Xcard _script(MIDI pro­gram 14)
GRAM#17[6] X27 --> Xcard _script(MIDI pro­gram 15)
GRAM#17[7] X36 --> Xcard _script(MIDI pro­gram 22)
GRAM#17[8] X63 --> Xcard _script(MIDI pro­gram 43)
GRAM#17[9] X68 --> Xcard _script(MIDI pro­gram 48)
GRAM#17[10] X72 --> Xcard _script(MIDI pro­gram 50)
GRAM#17[11] X75 --> Xcard _script(MIDI pro­gram 53)
GRAM#17[12] X76 --> Xcard _script(MIDI pro­gram 54)
GRAM#17[13] X83 --> Xcard _script(MIDI pro­gram 59)
GRAM#17[14] X85 --> Xcard _script(MIDI pro­gram 61)
GRAM#17[15] X86 --> Xcard _script(MIDI pro­gram 62)
GRAM#17[16] X87 --> Xcard _script(MIDI pro­gram 63)
GRAM#17[17] I42 --> Internal _script(MIDI pro­gram 26)
GRAM#17[18] I62 --> Internal _script(MIDI pro­gram 42)
GRAM#17[19] I66 --> Internal _script(MIDI pro­gram 46)
GRAM#17[20] C13 --> Internal _script(MIDI pro­gram 67)
GRAM#17[21] C42 --> Internal _script(MIDI pro­gram 90)
GRAM#17[22] C56 --> Internal _script(MIDI pro­gram 102)
GRAM#17[23] C23 --> Internal _script(MIDI pro­gram 75)
GRAM#17[24] PedalOn --> _switchon(64,1)
GRAM#17[25] PedalOff --> _switchoff(64,1)

An extract of this work is shown in the fol­low­ing video from 3mn 36s to 3mn 48s:

References

Related work

No posts found.

Computing ‘ideas’

Dwaram Venkataswamy Naidu playing a violin
Dwaram Venkataswamy Naidu play­ing a vio­lin (cred­it)

A com­po­si­tion in Carnatic musi­cal style by Srikumar K. Subramanian, June 1995. Name: "-gr.trial.mohanam".

This is a non-stop impro­vi­sa­tion of vari­a­tions in a style sim­i­lar to Carnatic music. The com­po­si­tion­al approach here is to decide that each vari­a­tion should con­tain 32 notes and can use up to 20 "ideas". To do this, a flag called Ideas is set to 20 at the begin­ning, and it is decreased by 1 unit in cer­tain rules (such as GRAM#2[2]) or 2 units in oth­ers (such as GRAM#2[3]). See the Flags in gram­mars for more details.

Rules in sub­gram­mar #3 can only be can­di­dates if there are few ideas left, but they do not reduce ideas.

Rules in sub­gram­mar #6 use wild­cards to cre­ate patterns.

Rules in sub­gram­mar #9 cre­ate "effects" by chang­ing 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 --> lamb­da

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 --> lamb­da
GRAM#8[2] R2 --> lamb­da

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 val­ues of flags and rule weights can be car­ried over from one vari­a­tion to the next. This allows them to be used to trigger/inhibit events at any dis­tance from those that created/modified them.

The fol­low­ing out­put was record­ed on a Roland D-50 synthesiser.

Undetermined rests in dance performance

The polyrhyth­mic piece "765432" com­posed by Andréine Bel for her CRONOS dance pro­duc­tion (1994) illus­trates the use of unde­ter­mined rests. Six dancers were on stage: Suresh Shetty, Smriti Mishra, Olivier Rivoirard, Vijayshree Chaudhary, Arindam Dasgupta and Andréine Bel.

In this gram­mar, "SUB1" indi­cates a sub­sti­tu­tion that only needs to be per­formed once. Using it to replace "SUB" saves com­pu­ta­tion time.

Glyphs "" are unde­ter­mined rests, i.e. silences whose dura­tion is a pri­ori unknown and will be pre­cise­ly cal­cu­lat­ed by the poly­met­ric expan­sion algorithm.

The whole struc­ture is based on reg­u­lar arith­metic divi­sions. For exam­ple, Suresh moves at "speed 7", Smriti at "speed 6" and Olivier at "speed 5".

"CR47" and "C46" are patch­es 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 con­troller #98 = 0 chan­nel 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 fol­low­ing out­put was record­ed on a Roland D-50 synthesiser.

This per­for­mance was part of the chore­o­graph­ic work CRONOS per­formed 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 fol­low­ing is a sim­ple gram­mar illus­trat­ing the use of time pat­terns in smooth time. Whereas stri­at­ed time is filled with (reg­u­lar or irreg­u­lar) puls­es, 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 gram­mar, "t1", "t2" etc. are the time pat­terns arranged in such a way that they define a struc­ture of (irreg­u­lar) "beats" on which notes "C4", "D4" etc. will be located.

The final arrange­ment is as follows:

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

A sequence of sim­ple notes ‘C4’, ‘D4’,…, arranged against a lat­tice of time-objects ‘t1’, ‘t2’,…, result­ing in an irreg­u­lar "beat" struc­ture in smooth time.

Time flex­i­bil­i­ty in Bol Processor is not the effect of arbi­trary numer­i­cal func­tions.  This flex­i­bil­i­ty stems from a time struc­ture — Xenakis’ (1963) struc­ture tem­porelle — that is deeply inter­wo­ven with the syn­tac­tic descrip­tion of music.

If stri­at­ed time is select­ed, the same struc­ture will be dis­played as shown below:

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

Some time pat­terns were used in Andréine Bel's chore­o­graph­ic work: Shapes in Rhythm.

Reference

Interactive improvisation with sound-objects

Lady play­ing koto. Public domain, source: Wikimedia

This gram­mar (name­ly “-gr.koto3") is an impro­vi­sa­tion mod­el run­ning on the Bol Processor BP2 con­nect­ed to a Roland D-50 syn­the­sis­er. The choice of syn­the­sis­er was cru­cial for a good repro­duc­tion of the sound imi­tat­ing a Japanese koto.

The under­ly­ing mod­el (SUB gram­mar) is a one-dimensional cel­lu­lar automa­ton using sub­sti­tu­tion rules: at each step of the com­pu­ta­tion, a set of ran­dom­ly select­ed rules is applied to the work string. Conversely, in a RND gram­mar, a new rule would be select­ed each time the pre­vi­ous one was applied. For more details, see a pre­sen­ta­tion of "-gr.koto3" on the Bol Processor ‘BP3’ and its PHP inter­face page.

In sub­gram­mar #2 we see a com­pe­ti­tion between con­struc­tive rules, such as gram#2[8] and gram#2[11] which increase the length of the work string, and destruc­tive rules, such as gram#2[10] and gram#2[15] which decrease its length.

The weight of gram#2[12], ini­tial­ly set to 100, decreas­es 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 sub­gram­mar #2 are applied until none of them can be a can­di­date. Then the rules in sub­gram­mar #3 are applied, pro­duc­ing 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 pro­to­type file called "-so.koto3". Some of them have spe­cif­ic prop­er­ties that force a relo­ca­tion to sat­is­fy topo­log­i­cal con­straints. For exam­ple, "a" must main­tain con­ti­nu­ity with the pre­ced­ing object (as shown in the image), which may cause it to be moved into the past.

The time-setting algo­rithm takes into account all the con­straints to cre­ate a piece that may not fit exact­ly into the metro­nom­ic beat pat­tern. Below is an exam­ple of the final piece cre­at­ed using this gram­mar (played 3 times):

A piece gen­er­at­ed by "-gr.koto3" played on a Roland D-50 synthesiser

In this gram­mar, para­me­ter K9 is set to fol­low the posi­tion of a con­troller (e.g. the pitch­bend or a ped­al on the D-50), assign­ing a val­ue from 0 to 100. This val­ue is the weight of the rules gram#1[2], gram#2[16] and gram#2[17]. The high­er the weight, the more "a" and the less "b" in the string; in addi­tion, the final string becomes small­er due to the high­er weight of the destruc­tive rules gram#2[16] and gram#2[17].

During the impro­vi­sa­tion, the work string is played at each step of its trans­for­ma­tion. The end of the trans­for­ma­tion is indi­cat­ed by the <<f>> and <<chick>> sound-objects.

Below is an exam­ple of impro­vi­sa­tion played in real time MIDI:

An improviza­tion of "-gr.koto3" pro­duced by BP2.9.8 and played on a Roland D-50 synthesiser

The fol­low­ing video illus­trates the gram­mar at work on BP2.9.8 — unfor­tu­nate­ly with a GeneralMIDI "koto" sound:

References

A beginner's tutorial

By Harm Visser, 2007

Let us take a look to the ideas and his­tor­i­cal back­ground of BP2. At the end of the fifties the lin­guis­tic sci­en­tist Noam Chomsky wrote his famous book 'Syntactic Structures'. It was an attempt to gen­er­al­ize the struc­ture of lan­guage in a sys­tem of rewrite-rules, so called 'gram­mars':

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

When we com­put­er­ize such a gram­mar and we give the com­mand '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 fur­ther deriva­tion is pos­si­ble. The words 'man', 'hit' are there­fore called 'ter­mi­nal symbols'.

After deriva­tion of Sentence we should read: the man hit… (or what­ev­er). Such a Chomsky 'gram­mar' can be seen as a set of rules to gen­er­ate well-formed English sentences.

You can read a rule as 'X --> Y'. It gives the 'instruc­tion' to rewrite X as Y (X becomes Y). Maybe you can imag­ine already that such a grammar-system can also apply to musi­cal syntax.

Let us there­fore com­pare the Chomsky-example with this BP2-example:

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

After deriva­tion we should hear the ter­mi­nal sym­bols C3 D3.

The main dif­fer­ence between the 'Chomsky-grammar' and a BP2-grammar is that a BP2-grammar is exclu­sive. It is a for­mal­i­sa­tion of one par­tic­u­lar piece of music. Chomsky-grammars try to gen­er­al­ize lan­guage as a whole.

At the oth­er hand you can in BP2 'for­mal­ize' 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 noth­ing, because there are no ter­mi­nal sym­bols i.c. 'real notes', like C3, D2, etc. So let's fin­ish 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) trans­pos­es up or down at a giv­en inter­val: _transpose(2) (two semi­tone up), _transpose(6) (six semi­tones up) _transpose(-7) (sev­en semi­tones down). You can also use val­ues like _transpose(0.2).

The _retro tool stands of course for 'ret­ro­grade'. It turns the sym­bols back­wards. You can read com­mands like _transpose and _retro as 'trans­form­ers'.

Well, let's lis­ten 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 dis­play of the Sonata

There are two impor­tant things to remember

  1. When you write a vari­able like Theme1 or VariateNotes2 or Sonata (yes, these are vari­ables until you give them a 'con­tent'), start the vari­able with a cap­i­tal and don't use emp­ty spaces between sym­bols. So Not 'sonata', but 'Sonata'. Not 'n1', but 'N1', not 'my piece', but 'Mypiece'.
  2. You can lis­ten to every stage or lev­el of your piece at every moment. So, instead select­ing S, you can select Notes1 or Development, or G3… In oth­er words, you can lis­ten to every com­pos­i­to­r­i­al detail! Try to make your own Sonata now!

Note that the example-Sonata is also a descrip­tion of the actu­al piece. That is to say that the first half is the descrip­tion, the sec­ond half is the 'real­i­sa­tion' of the descrip­tion. This approach means that a descrip­tion can also have a 'sub­de­scrip­tion', while the sub­de­scrip­tion can have… indeed, a sub­sub­de­crip­tion. So BP2 is the per­fect tool for hier­ar­chi­cal descrip­tions of musi­cal structures.