Hi, here is a working example of the proportional canon patch.
Now I have the following question: if I want to make this patch an abstraction, and use more instances of it, how to avoid duplications of the same "send", coll, etc?

I read the subpatch tutorial, but the mechanism is not really clear.

Thanks for any help.

Libero

#N canvas 55 22 1371 812 10;
#X obj 704 569 cnv 15 160 40 empty empty empty 20 12 0 14 -204352 -66577
0;
#X obj -76 20 cnv 15 160 40 empty empty empty 20 12 0 14 -204352 -66577
0;
#X obj 123 19 cnv 15 160 40 empty empty empty 20 12 0 14 -204352 -66577
0;
#X obj -49 113 makenote 100 100;
#X msg -49 61 60;
#X obj 628 217 timer;
#X obj 628 122 i 0;
#X obj 664 122 + 1;
#X msg 643 96 0;
#X obj 498 169 prepend set;
#X msg 498 202 184.308;
#X obj 628 154 sel 0;
#X obj 138 95 s counterreset;
#X msg 138 67 0;
#X obj -38 88 s notes;
#X obj 628 19 r notes;
#X obj 643 69 r counterreset;
#X obj 628 43 t b;
#X obj 655 182 t b b;
#X text 701 175 restart the counter on the first note and show the
other time differences.;
#X text 734 93 restart counter when canon is played from the beginning.
;
#X obj 628 257 t b f;
#X obj 628 339 i 0;
#X obj 664 339 + 1;
#X msg 643 313 0;
#X obj 643 286 r counterreset;
#X text 668 256 bang triggers index values \, float the durations.
;
#X text 695 337 generates index values.;
#X obj 628 370 pack 0 1 0;
#X text 696 369 index \, event \, time diff.;
#X obj 640 398 r counterreset;
#X msg 640 425 clear;
#X obj 628 523 coll -------;
#C restore;
#X obj 38 337 i 0;
#X obj 74 337 + 1;
#X msg 53 311 0;
#X obj 38 234 r notes;
#X obj 53 284 r counterreset;
#X obj 38 258 t b;
#X obj 628 555 unpack f f;
#X text 699 554 separate events and time diffs.;
#X obj 38 369 sel 9;
#X text 727 608 change the time diffs with a fixed proportion.;
#X obj 38 533 i 0;
#X obj 74 533 + 1;
#X msg 53 507 0;
#X obj 53 483 r counterreset;
#X obj 38 461 t b;
#X obj 628 641 pipe;
#X text 80 364 trigger the first value in the coll \, after the 10th
note has been played.;
#X obj 665 737 + 1;
#X obj 644 691 r counterreset;
#X msg 644 714 1;
#X obj 629 737 i 1;
#X obj 38 567 s playcoll0;
#X obj 649 453 r playcoll0;
#X obj 629 767 s playcoll1toinf;
#X text 121 564 when the 10th note has been played \, play the first
note only!;
#X text 701 729 play from the second note.;
#X obj 654 488 r playcoll1toinf;
#X obj 628 671 t b;
#X obj -49 142 noteout 1;
#X obj 469 746 makenote 100 100;
#X obj 469 775 noteout 1;
#X msg 469 718 80;
#X obj 685 608 * 1.5;
#X msg 712 577 1;
#X msg 743 577 2;
#X msg 776 577 0.5;
#X text -74 31 1) play at least 10 notes;
#X text 125 32 2) before restart \, reset!;
#X text 807 577 3) try different speed.;
#X connect 3 0 61 0;
#X connect 3 1 61 1;
#X connect 4 0 3 0;
#X connect 4 0 14 0;
#X connect 5 0 9 0;
#X connect 5 0 21 0;
#X connect 6 0 7 0;
#X connect 6 0 11 0;
#X connect 7 0 6 1;
#X connect 8 0 6 1;
#X connect 9 0 10 0;
#X connect 11 0 5 0;
#X connect 11 0 5 1;
#X connect 11 1 18 0;
#X connect 13 0 12 0;
#X connect 15 0 17 0;
#X connect 16 0 8 0;
#X connect 17 0 6 0;
#X connect 18 0 5 0;
#X connect 18 1 5 1;
#X connect 21 0 22 0;
#X connect 21 1 28 2;
#X connect 22 0 23 0;
#X connect 22 0 28 0;
#X connect 23 0 22 1;
#X connect 24 0 22 1;
#X connect 25 0 24 0;
#X connect 28 0 32 0;
#X connect 30 0 31 0;
#X connect 31 0 32 0;
#X connect 32 0 39 0;
#X connect 33 0 34 0;
#X connect 33 0 41 0;
#X connect 34 0 33 1;
#X connect 35 0 33 1;
#X connect 36 0 38 0;
#X connect 37 0 35 0;
#X connect 38 0 33 0;
#X connect 39 0 48 0;
#X connect 39 1 65 0;
#X connect 41 0 47 0;
#X connect 43 0 44 0;
#X connect 43 0 54 0;
#X connect 44 0 43 1;
#X connect 45 0 43 1;
#X connect 46 0 45 0;
#X connect 47 0 43 0;
#X connect 48 0 60 0;
#X connect 50 0 53 1;
#X connect 51 0 52 0;
#X connect 52 0 53 1;
#X connect 53 0 50 0;
#X connect 53 0 56 0;
#X connect 55 0 32 0;
#X connect 59 0 32 0;
#X connect 60 0 53 0;
#X connect 60 0 64 0;
#X connect 62 0 63 0;
#X connect 62 1 63 1;
#X connect 64 0 62 0;
#X connect 65 0 48 1;
#X connect 66 0 65 1;
#X connect 67 0 65 1;
#X connect 68 0 65 1;