Two algorithms

Two algo­rithms for the instan­ti­a­tion of struc­tures of musi­cal objects

Bernard Bel

This is an extend­ed and revised ver­sion of the chap­ter: Symbolic and Sonic Representations of Sound-Object Structures pub­lished in M. Balaban, K. Ebcioglu & O. Laske (Eds.) “Understanding Music with AI: Perspectives on Music Cognition”, AAAI Press (1992, p. 64-109).

Abstract

A rep­re­sen­ta­tion­al mod­el of dis­crete struc­tures of musi­cal objects at the sym­bol­ic and sono­log­i­cal lev­els is intro­duced. This mod­el is being used to design com­put­er tools for rule-based musi­cal com­po­si­tion, where the low-level musi­cal objects are not notes, but “sound-objects”, i.e. arbi­trary sequences of mes­sages sent to a real-time dig­i­tal sound processor.

“Polymetric expres­sions” are string rep­re­sen­ta­tions of con­cur­rent process­es that can be eas­i­ly han­dled by for­mal gram­mars. These expres­sions may not con­tain all the infor­ma­tion need­ed to syn­chro­nise the whole struc­ture of sound-objects, i.e. to deter­mine their strict order in (sym­bol­ic) time. In response to this, the notion of “sym­bol­ic tem­po” is intro­duced: the order­ing of all objects in a struc­ture is pos­si­ble once their sym­bol­ic tem­pos are known. Rules for assign­ing sym­bol­ic tem­pos to objects are there­fore pro­posed. These form the basis of an algo­rithm for inter­pret­ing incom­plete poly­met­ric expres­sions. The rel­e­vant fea­tures of this inter­pre­ta­tion are commented.

An exam­ple is giv­en to illus­trate the advan­tage of using (incom­plete) poly­met­ric rep­re­sen­ta­tions instead of con­ven­tion­al music nota­tion or event tables when the com­plete descrip­tion of the musi­cal piece and/or its vari­ants requires dif­fi­cult cal­cu­la­tions of durations.

Given a strict order­ing of sound-objects, sum­marised in a "phase table" rep­re­sent­ing the com­plete poly­met­ric expres­sion, the next step is to com­pute the times at which mes­sages should be sent. This requires a descrip­tion of "sound-object pro­to­types" with their metric/topological prop­er­ties and var­i­ous para­me­ters relat­ed to musi­cal per­for­mance (e.g. "smooth" or "stri­at­ed" time, tem­po, etc.). These prop­er­ties are dis­cussed in detail, and a time-polynomial con­straint sat­is­fac­tion algo­rithm for the time-setting of sound objects in a poly­met­ric struc­ture is intro­duced. Typical exam­ples com­put­ed by this algo­rithm are shown and discussed.

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

Summary of the Work

The man­u­script intro­duces a mod­el for rep­re­sent­ing and instan­ti­at­ing musi­cal struc­tures made of dis­crete sound-objects. It explores sep­a­rate rep­re­sen­ta­tions for sym­bol­ic and phys­i­cal time, then pro­pos­es meth­ods to syn­chro­nize con­cur­rent musi­cal process­es and to com­pute the pre­cise sched­ul­ing of mes­sages (or events) des­tined for a sound proces­sor. The author con­cep­tu­al­izes “smooth” and “stri­at­ed” time, describes “poly­met­ric expres­sions” as high-level objects that can be incom­plete, and pro­vides algo­rithms to infer miss­ing tim­ing details. The paper merges for­mal lan­guage approach­es, real-time con­sid­er­a­tions, and prac­ti­cal exam­ples of usage in a soft­ware envi­ron­ment called Bol Processor.

Comprehensive Model of Time

  • The clear dis­tinc­tion between sym­bol­ic time (strict­ly ordered events) and phys­i­cal time (metro­nom­ic or arbi­trary “stri­at­ed” struc­tures) pro­vides an insight­ful way to han­dle simul­ta­ne­ous or over­lap­ping musi­cal events.
  • The notion of “smooth” ver­sus “stri­at­ed” time is con­ju­gat­ed with help­ful exam­ples, mak­ing it straight­for­ward to envi­sion both con­texts of performance.

Polymetric Expressions and Incomplete Descriptions

  • The approach to poly­met­ric expres­sions accom­mo­dates incom­plete rep­re­sen­ta­tions that can lat­er be resolved by an algo­rith­mic inter­pre­ta­tion. This is par­tic­u­lar­ly valu­able for com­posers and researchers look­ing to exper­i­ment with gen­er­a­tive or rule-based sys­tems with­out being forced into ful­ly spec­i­fied nota­tion from the outset.
  • The exam­ples and dia­grams show­ing how one can map poly­met­ric struc­tures to a phase dia­gram illus­trate the con­cept effectively.

Synchronization and Constraints

  • The pro­posed syn­chro­niza­tion algo­rithm han­dles con­cur­ren­cy by care­ful­ly prop­a­gat­ing sym­bol­ic tem­pos across sequences. This helps man­age cas­es where direct numer­ic dura­tions are not known beforehand.
  • The intro­duc­tion of prop­er­ties such as piv­ot align­ment (PivBeg, PivCent, etc.), trun­ca­tion, elas­tic­i­ty, and relo­cata­bil­i­ty demon­strates thor­ough con­sid­er­a­tion of real­is­tic per­for­mance sce­nar­ios (e.g., ruba­to, par­tial over­laps). The con­cept of locat­ing a sound object by its piv­ot was inspired by Marco Stroppa's work at IRCAM in 1990.

Practical Implementation and Examples

  • The paper gives a thor­ough demon­stra­tion of how these algo­rithms inte­grate with a func­tion­al soft­ware envi­ron­ment, includ­ing tan­gi­ble data struc­tures (phase tables, instance tables) and step-by-step flowcharts.
  • Musical exam­ples and ref­er­ences to real-time com­put­er music sys­tems under­score the applic­a­bil­i­ty of the approach.

Rich Technical Detail

  • The step­wise pseudo-code for the time-setting algo­rithm is exten­sive and trans­par­ent. This lev­el of detail can guide fur­ther exper­i­men­tal or production-level implementations.
  • The com­plex­i­ty analy­sis (O(nmax² · imax³) in the worst case) pro­vides an under­stand­ing of poten­tial com­pu­ta­tion­al lim­its, help­ful for any­one plan­ning to use or extend these algorithms.

Potential Impact

  • This work is use­ful to com­posers, researchers in algo­rith­mic com­po­si­tion, and devel­op­ers of music soft­ware who need robust syn­chro­niza­tion meth­ods that go beyond sim­ple “note-by-note” scheduling.
  • The pro­posed meth­ods can enable more flex­i­ble rep­re­sen­ta­tions of time and con­cur­ren­cy, allow­ing for rich­er gen­er­a­tive or impro­vi­sa­tion­al projects.

Summary of Review

Overall, this paper pro­vides a detailed, for­mal­ized frame­work for resolv­ing con­cur­rent musi­cal struc­tures. It bridges the gap between abstract sym­bol­ic gram­mars and prac­ti­cal real-time per­for­mance con­sid­er­a­tions. Researchers and musi­cians inter­est­ed in algo­rith­mic com­pos­ing or advanced computer-assisted com­po­si­tion tools will like­ly find its approach com­pelling, espe­cial­ly giv­en the exten­sive exam­ples and robust pseudo-code.

Download this paper (PDF)

Skip to PDF content

Presentations

No posts found.

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 page 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