(
~config1 = (
cp: 10,
melody:
~makeMelody.(
(4..16).reciprocal.scramble,
[60, 67, [68, 65], [63, 55], [62, 59, 53], [58, 70, 82], [36,48,60,72]].mirror.reverse
),
voices:
~makeConvVoices.(
Array.series(7, 50, 15)*0.5, // tempos
Array.series(7, -30, 8.3).scramble // transp
)
);
~config2 = (
baseTempo: 20,
voices:
~makeDivVoices.(
Array.series(13, 0, 0.1)++[-20] // transp
),
melody:
~makeMelody.(
(4..7).stutter(2).reciprocal.scramble,
[60, 67.5, 68, 63, 62.3, 58.5, 60]
),
tempos:
~makeDivTempos.(
Array.series(14, 30, 13), // tempos
[1, 2, 5, 7, 8, 10, 9, 3, 3, 5, 4, 3, 2, 3], // percentages
normalize: true
)
);
~canon1= ~convCanon.(~config1);
~c1= ~canon1
.canon
.collect(~instrument.([\pianola], amp: 1, repeat: 1));
~c2= ~divCanon.(~config2)
.canon
.collect(~instrument.([\pianola], amp: 1, repeat: 1));
Pdef(\myCanonLoop, Ptpar(
[0, Ppar(~c1, 1), ~canon1.canon[6].durs.sum*0.75, Ppar(~c2, 1)]
, inf ));
);
Pdef(\myCanonLoop).play
The key issue here is how to design an API that could allow a better and clearer interface for the onset time of each canon. Even further, how to correlate each canon by creating a convergence between them like: 7thnote-1stvoice-1stcanon converging with 11thnote-2ndvoice-2ndcanon.
By using
Ptparclass it is possible to create multiple canon structures embedded inPdefs. It would be great if it wouldn´t look so horrible when live coding with it:The key issue here is how to design an API that could allow a better and clearer interface for the onset time of each canon. Even further, how to correlate each canon by creating a convergence between them like: 7thnote-1stvoice-1stcanon converging with 11thnote-2ndvoice-2ndcanon.