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­al mod­el run­ning on Bol Processor BP2 con­nect­ed to a Roland D-50 syn­the­siz­er. Selecting a syn­the­siz­er was crit­i­cal for a good ren­der­ing of sound imi­tat­ing a Japanese koto.

The under­ly­ing mod­el (SUB gram­mar) is a uni­di­men­sion­al 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. Conversally, in a RND gram­mar, a new rule would be select­ed each time the pre­ced­ing one has been applied. For more details, read a pre­sen­ta­tion of “-gr.koto3″ on page Bol Processor ‘BP3’ and its PHP inter­face.

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] decreas­ing its length.

The weight of gram#2[12], ini­tial­ly set to 100, is dimin­ished by 10 each time it is applied, until the rule is invalidated.

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
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
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 are applied in sub­gram­mar #2 until none of them can be a can­di­date. Then rules in sub­gram­mar #3 are applied, pro­duc­ing out-time sound-objects «f» (a bass note) and «chick» (a chord).

Sound-objects “a”, “b”, “c”, “f”, “chick” are defined in a sound-object pro­to­type file named “-mi.koto3”. A few of them have spe­cif­ic prop­er­ties forc­ing a relo­ca­tion to sat­is­fy topo­log­i­cal con­straints. For instance, “a” should main­tain a con­ti­nu­ity with the pre­ced­ing object (as shown on pic­ture) which may shift it to the past.

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

A piece pro­duced by “-gr.koto3” played on a Roland D-50 synthesizer

In this gram­mar, para­me­ter K9 is set to fol­low the posi­tion of a con­troller (for instance the pitch­bend or a ped­al on the D-50) assign­ing a val­ue 0 to 100. This val­ue is the weight of rules gram#1[2], gram#2[16] and gram#2[17]. The greater the weight, the more “a” and the less “b” in the string; in addi­tion, the final string will get small­er because of the high­er weight of 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 notice­able because of the «f» and «chick» sound-objects.

The fol­low­ing is an exam­ple of impro­vi­sa­tion played in real time:

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

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:


Leave a Reply

Your email address will not be published. Required fields are marked *