aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Iannini <lukeiannini@users.sourceforge.net>2009-05-21 05:10:26 +0000
committerLuke Iannini <lukeiannini@users.sourceforge.net>2009-05-21 05:10:26 +0000
commitc0dc3476a8baa832e6874b229470decfd522e3cd (patch)
tree508b5527ad31a1eb4bc8aa31026504cd0a7805e3
parent3c670ef38aa37fa309ca0220f251279fbd94160d (diff)
more work on the delegate/dispatch design pattern
switched time- series to delegate/dispatch and added more beat-sync objects midi-stream2notes turns a continuous stream of midi notes into static lists of notes and durations - great for building sequencers but still has a bug. list-extract to "split" a list into a sublist and the remainder ds-criteria to get a pointer to the first item with a specific variable value svn path=/trunk/abstractions/sfruit/; revision=11471
-rw-r--r--controctopus/note-learner.pd112
-rw-r--r--ds-abs/ds-criteria.pd34
-rw-r--r--ds-abs/ds-first.pd2
-rw-r--r--sfruit/countseq.pd42
-rw-r--r--sfruit/delegate.pd10
-rw-r--r--sfruit/delegate_setter-help.pd126
-rw-r--r--sfruit/delegate_setter.pd37
-rw-r--r--sfruit/dispatch-many.pd13
-rw-r--r--sfruit/get_delegate.pd6
-rw-r--r--sfruit/gui-dispatch.pd9
-rw-r--r--sfruit/gui-labeler.pd14
-rw-r--r--sfruit/list-extract-help.pd36
-rw-r--r--sfruit/list-extract.pd35
-rw-r--r--sfruit/midi-stream2notes-help.pd102
-rw-r--r--sfruit/midi-stream2notes.pd71
-rw-r--r--sfruit/oscinify.pd11
-rw-r--r--sfruit/randrange-help.pd14
-rw-r--r--sfruit/randrange.pd29
-rw-r--r--sfruit/time-clock-help.pd82
-rw-r--r--sfruit/time-clock.pd101
-rw-r--r--sfruit/time-last_beat_was.pd10
-rw-r--r--sfruit/time-last_measure_was.pd12
-rw-r--r--sfruit/time-next_beat.pd17
-rw-r--r--sfruit/time-next_measure.pd17
-rw-r--r--sfruit/time-snap_beat.pd23
-rw-r--r--sfruit/time-snap_measure.pd23
26 files changed, 901 insertions, 87 deletions
diff --git a/controctopus/note-learner.pd b/controctopus/note-learner.pd
index a0bc7ee..ac5b53d 100644
--- a/controctopus/note-learner.pd
+++ b/controctopus/note-learner.pd
@@ -4,9 +4,9 @@
#X obj 336 506 pack;
#X obj 336 277 t b b;
#X obj 102 293 nbx 2 14 1 128 0 0 \$0.pad.s \$0.pad.r Pad 32 7 0 11
--154432 -1 -1 1 256;
+-154432 -1 -1 13 256;
#X obj 102 276 nbx 2 14 0 127 0 0 \$0.note.s \$0.note.r Note 32 7 0
-11 -260624 -1 -1 0 256;
+11 -260624 -1 -1 48 256;
#X obj 420 523 outlet;
#X obj 137 263 bng 13 250 50 0 \$0.learn-on empty empty 0 -6 0 8 -259541
-1 -1;
@@ -27,7 +27,7 @@ empty 0 -6 0 10 -110565 -1 -1 1 256;
#X obj 722 303 spigot;
#X obj 41 411 instance lnote;
#X obj 722 204 / 127;
-#X obj 378 278 / 127;
+#X obj 378 104 / 127;
#N canvas 73 463 404 329 midi-learn 0;
#X text 238 89 Route Number;
#X obj 24 18 r \$0.learn-on;
@@ -70,10 +70,9 @@ empty 0 -6 0 10 -110565 -1 -1 1 256;
#X connect 13 0 18 0;
#X connect 14 0 12 1;
#X connect 18 0 12 1;
-#X restore 241 104 pd midi-learn;
+#X restore 241 142 pd midi-learn;
#X obj 336 104 t a;
-#X obj 365 104 t a;
-#X obj 395 104 t a;
+#X obj 471 104 t a;
#X obj 349 53 notein;
#X text 345 33 Intercepts for looping back MIDI (e.g. from sft.schoen)
;
@@ -148,8 +147,8 @@ empty 0 -6 0 10 -110565 -1 -1 1 256;
#X connect 6 0 2 0;
#X connect 6 1 5 0;
#X connect 8 0 3 0;
-#X restore 395 169 pd parse-channel;
-#X obj 396 54 nr PDNOTEIN 3;
+#X restore 471 169 pd parse-channel;
+#X obj 396 53 nr PDNOTEIN 3;
#X obj 814 112 nr PDPOLYTOUCHIN 3;
#N canvas 0 22 265 307 parse-channel 0;
#X obj 76 35 inlet;
@@ -171,7 +170,7 @@ empty 0 -6 0 10 -110565 -1 -1 1 256;
#X connect 8 0 3 0;
#X restore 788 197 pd parse-channel;
#N canvas 282 148 271 319 send-polytouch 0;
-#X msg 51 116 1;
+#X msg 51 116 13;
#X obj 51 148 pack;
#X msg 110 99 set \$1;
#X obj 110 75 r \$0.pad.v;
@@ -245,60 +244,59 @@ empty 0 -6 0 10 -110565 -1 -1 1 256;
#X obj 26 533 sssadie/sssadiez \$1 \$2 device-number 0 256 \$0;
#X text 344 3 [note-learner /device /pad# /group(nonumber)];
#X connect 0 0 3 0;
-#X connect 1 0 35 0;
-#X connect 1 0 44 0;
+#X connect 1 0 34 0;
+#X connect 1 0 43 0;
#X connect 2 0 6 0;
-#X connect 2 0 31 0;
-#X connect 2 0 60 0;
-#X connect 3 0 39 0;
+#X connect 2 0 30 0;
+#X connect 2 0 59 0;
+#X connect 3 0 38 0;
#X connect 3 1 1 0;
#X connect 11 0 0 1;
-#X connect 12 0 39 1;
+#X connect 12 0 38 1;
#X connect 13 0 0 0;
-#X connect 15 0 28 1;
-#X connect 16 0 28 0;
-#X connect 17 0 32 0;
-#X connect 17 1 33 0;
-#X connect 17 2 34 0;
-#X connect 18 0 58 0;
-#X connect 19 0 65 0;
+#X connect 15 0 27 1;
+#X connect 16 0 27 0;
+#X connect 17 0 31 0;
+#X connect 17 1 32 0;
+#X connect 17 2 33 0;
+#X connect 18 0 57 0;
+#X connect 19 0 64 0;
#X connect 20 0 18 0;
#X connect 21 0 1 1;
#X connect 23 0 22 0;
-#X connect 23 0 51 0;
-#X connect 24 0 21 0;
-#X connect 25 0 54 0;
-#X connect 26 0 23 0;
-#X connect 26 1 24 0;
-#X connect 26 2 25 0;
-#X connect 28 0 18 1;
-#X connect 29 0 30 0;
-#X connect 30 0 53 0;
-#X connect 32 0 20 0;
-#X connect 33 0 16 0;
-#X connect 34 0 57 0;
-#X connect 35 1 41 0;
-#X connect 39 0 43 0;
-#X connect 40 0 2 0;
-#X connect 42 0 58 0;
-#X connect 45 0 46 0;
-#X connect 46 0 48 0;
-#X connect 46 1 47 0;
+#X connect 23 0 50 0;
+#X connect 24 0 53 0;
+#X connect 25 0 23 0;
+#X connect 25 1 21 0;
+#X connect 25 2 24 0;
+#X connect 27 0 18 1;
+#X connect 28 0 29 0;
+#X connect 29 0 52 0;
+#X connect 31 0 20 0;
+#X connect 32 0 16 0;
+#X connect 33 0 56 0;
+#X connect 34 1 40 0;
+#X connect 38 0 42 0;
+#X connect 39 0 2 0;
+#X connect 41 0 57 0;
+#X connect 44 0 45 0;
+#X connect 45 0 47 0;
+#X connect 45 1 46 0;
+#X connect 46 0 47 0;
+#X connect 46 1 49 0;
#X connect 47 0 48 0;
-#X connect 47 1 50 0;
-#X connect 48 0 49 0;
-#X connect 50 0 49 0;
-#X connect 51 0 13 0;
-#X connect 54 0 13 1;
-#X connect 55 0 23 0;
-#X connect 55 1 24 0;
-#X connect 55 2 25 0;
-#X connect 56 0 32 0;
-#X connect 56 1 33 0;
-#X connect 56 2 34 0;
-#X connect 57 0 16 1;
-#X connect 60 0 31 0;
-#X connect 61 0 2 1;
-#X connect 62 0 40 0;
-#X connect 63 0 64 0;
+#X connect 49 0 48 0;
+#X connect 50 0 13 0;
+#X connect 53 0 13 1;
+#X connect 54 0 23 0;
+#X connect 54 1 1 1;
+#X connect 54 2 24 0;
+#X connect 55 0 31 0;
+#X connect 55 1 32 0;
+#X connect 55 2 33 0;
+#X connect 56 0 16 1;
+#X connect 59 0 30 0;
+#X connect 60 0 2 1;
+#X connect 61 0 39 0;
+#X connect 62 0 63 0;
#X coords 0 -1 1 1 81 60 1 100 250;
diff --git a/ds-abs/ds-criteria.pd b/ds-abs/ds-criteria.pd
new file mode 100644
index 0000000..3e697b1
--- /dev/null
+++ b/ds-abs/ds-criteria.pd
@@ -0,0 +1,34 @@
+#N canvas 590 49 677 434 10;
+#X obj 212 185 until;
+#X msg 212 206 next;
+#X obj 86 140 list append \$1;
+#X obj 86 163 prepent traverse;
+#X obj 86 103 loadbang;
+#X obj 212 72 inlet;
+#X obj 212 392 outlet;
+#X obj 396 392 outlet;
+#X obj 212 229 pointer \$2;
+#X obj 212 102 t b b;
+#X obj 327 100 t b b;
+#X obj 212 307 get \$2 \$3;
+#X obj 212 358 pointer;
+#X obj 212 329 sel \$4;
+#X obj 212 280 t a a;
+#X text 24 11 [ds-criteria data-canvas template attribute value];
+#X connect 0 0 1 0;
+#X connect 1 0 8 0;
+#X connect 2 0 3 0;
+#X connect 3 0 8 0;
+#X connect 4 0 2 0;
+#X connect 5 0 9 0;
+#X connect 8 0 14 0;
+#X connect 8 2 10 0;
+#X connect 9 0 0 0;
+#X connect 9 1 2 0;
+#X connect 10 0 7 0;
+#X connect 10 1 0 1;
+#X connect 11 0 13 0;
+#X connect 12 0 6 0;
+#X connect 13 0 12 0;
+#X connect 14 0 11 0;
+#X connect 14 1 12 1;
diff --git a/ds-abs/ds-first.pd b/ds-abs/ds-first.pd
index ed37847..43ff5d7 100644
--- a/ds-abs/ds-first.pd
+++ b/ds-abs/ds-first.pd
@@ -1,5 +1,4 @@
#N canvas 540 376 450 300 10;
-
#X obj 182 135 until;
#X msg 182 156 next;
#X obj 56 90 list append \$1;
@@ -13,6 +12,7 @@
#X obj 182 52 t b b;
#X obj 297 50 t b b;
#X obj 289 17 import-disabled list-abs;
+#X text 8 4 [ds-first data-canvas template];
#X connect 0 0 1 0;
#X connect 1 0 8 0;
#X connect 2 0 3 0;
diff --git a/sfruit/countseq.pd b/sfruit/countseq.pd
index b9a0ad1..17482b6 100644
--- a/sfruit/countseq.pd
+++ b/sfruit/countseq.pd
@@ -58,7 +58,6 @@
#X connect 18 0 14 1;
#X restore 208 199 pd split-symbols;
#X obj 159 285 list-find;
-#X obj 26 194 t a a a;
#X obj 26 312 sel 0;
#X obj 26 354 outlet;
#X obj 88 354 outlet;
@@ -72,33 +71,34 @@
#X obj 80 63 list;
#X obj 28 32 route bang seek;
#X obj 180 9 import-disabled list-abs iemlib;
-#X connect 0 0 13 0;
-#X connect 0 0 19 0;
-#X connect 0 0 20 0;
+#X obj 26 194 t a a a a;
+#X connect 0 0 18 0;
+#X connect 0 0 26 0;
#X connect 1 0 2 0;
#X connect 1 1 3 0;
#X connect 2 0 0 1;
#X connect 3 0 0 0;
-#X connect 4 0 25 0;
+#X connect 4 0 24 0;
#X connect 5 0 6 1;
#X connect 6 0 0 1;
#X connect 7 0 9 0;
#X connect 8 0 7 0;
#X connect 9 1 11 0;
-#X connect 10 0 16 0;
-#X connect 11 0 23 0;
-#X connect 11 1 22 0;
-#X connect 12 0 17 0;
+#X connect 10 0 15 0;
+#X connect 11 0 22 0;
+#X connect 11 1 21 0;
+#X connect 12 0 16 0;
#X connect 13 0 14 0;
-#X connect 13 1 10 0;
-#X connect 13 2 12 0;
-#X connect 14 0 15 0;
-#X connect 18 0 11 0;
-#X connect 19 0 6 0;
-#X connect 20 0 21 0;
-#X connect 22 0 12 1;
-#X connect 23 0 10 1;
-#X connect 24 0 1 0;
-#X connect 25 0 0 0;
-#X connect 25 1 0 1;
-#X connect 25 2 24 0;
+#X connect 17 0 11 0;
+#X connect 18 0 6 0;
+#X connect 19 0 20 0;
+#X connect 21 0 12 1;
+#X connect 22 0 10 1;
+#X connect 23 0 1 0;
+#X connect 24 0 0 0;
+#X connect 24 1 0 1;
+#X connect 24 2 23 0;
+#X connect 26 0 13 0;
+#X connect 26 1 10 0;
+#X connect 26 2 12 0;
+#X connect 26 3 19 0;
diff --git a/sfruit/delegate.pd b/sfruit/delegate.pd
new file mode 100644
index 0000000..3a9aa35
--- /dev/null
+++ b/sfruit/delegate.pd
@@ -0,0 +1,10 @@
+#N canvas 506 483 205 178 10;
+#X obj 44 64 inlet;
+#X obj 44 146 s \$1-delegates;
+#X obj 44 90 list prepend \$2;
+#X obj 44 117 list trim;
+#X obj 131 64 inlet;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 3 0 1 0;
+#X connect 4 0 2 1;
diff --git a/sfruit/delegate_setter-help.pd b/sfruit/delegate_setter-help.pd
new file mode 100644
index 0000000..9bc1f2c
--- /dev/null
+++ b/sfruit/delegate_setter-help.pd
@@ -0,0 +1,126 @@
+#N canvas 305 22 1097 656 10;
+#X obj 53 170 delegate_setter -this crankiness;
+#X obj 56 89 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 6100 1;
+#X text 23 50 delegate_setter can be placed in a stream to send delegate
+messages before and after the stream passes through it.;
+#X text 82 108 the first argument;
+#X obj 53 339 get_delegate -this will_set_crankiness;
+#X obj 53 509 get_delegate -this did_set_crankiness;
+#X text 15 13 [delegate_setter -unique *name];
+#X text 202 13 *optional;
+#X obj 56 289 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 6100 1;
+#X obj 53 136 t a b;
+#X floatatom 176 258 5 0 0 0 - - -;
+#X obj 56 458 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 6100 1;
+#X obj 56 637 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 6100 1;
+#X text 210 258 we prove this is the second thing called;
+#N canvas 615 437 450 300 when_was_i_called? 1;
+#X obj 102 68 s \$0-increment;
+#X obj 85 89 r \$0-order;
+#X obj 70 110 f;
+#X obj 51 68 t a b b;
+#X obj 51 42 inlet;
+#X obj 51 175 outlet;
+#X obj 134 179 outlet;
+#X connect 1 0 2 1;
+#X connect 2 0 6 0;
+#X connect 3 0 5 0;
+#X connect 3 1 2 0;
+#X connect 3 2 0 0;
+#X connect 4 0 3 0;
+#X restore 53 230 pd when_was_i_called?;
+#X text 64 190 the slider value comes out after [will_set_crankiness(
+is dispatched;
+#X floatatom 176 406 5 0 0 0 - - -;
+#N canvas 615 437 450 300 when_was_i_called? 0;
+#X obj 102 68 s \$0-increment;
+#X obj 85 89 r \$0-order;
+#X obj 70 110 f;
+#X obj 51 68 t a b b;
+#X obj 51 42 inlet;
+#X obj 51 175 outlet;
+#X obj 134 179 outlet;
+#X connect 1 0 2 1;
+#X connect 2 0 6 0;
+#X connect 3 0 5 0;
+#X connect 3 1 2 0;
+#X connect 3 2 0 0;
+#X connect 4 0 3 0;
+#X restore 53 378 pd when_was_i_called?;
+#X text 210 406 we prove this is the first thing called;
+#X obj 92 136 s \$0-reset_call_order;
+#N canvas 0 22 450 300 calc_call_order 0;
+#X obj 141 74 r \$0-increment;
+#X obj 141 152 s \$0-order;
+#X obj 141 110 f;
+#X obj 167 110 + 1;
+#X msg 204 120 1;
+#X obj 204 99 r \$0-reset_call_order;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 2 0 1 0;
+#X connect 3 0 2 1;
+#X connect 4 0 2 1;
+#X connect 5 0 4 0;
+#X restore 500 62 pd calc_call_order;
+#X text 292 338 this will get called before the slider value comes
+out of [delegate_setter];
+#X text 286 508 finally \, this will get called after the slider value
+comes out of [delegate_setter];
+#X floatatom 176 583 5 0 0 0 - - -;
+#N canvas 615 437 450 300 when_was_i_called? 0;
+#X obj 102 68 s \$0-increment;
+#X obj 85 89 r \$0-order;
+#X obj 70 110 f;
+#X obj 51 68 t a b b;
+#X obj 51 42 inlet;
+#X obj 51 175 outlet;
+#X obj 134 179 outlet;
+#X connect 1 0 2 1;
+#X connect 2 0 6 0;
+#X connect 3 0 5 0;
+#X connect 3 1 2 0;
+#X connect 3 2 0 0;
+#X connect 4 0 3 0;
+#X restore 53 555 pd when_was_i_called?;
+#X text 210 583 we prove this is the last thing called;
+#X obj 726 323 delegate_setter -this;
+#X text 724 420 if you do not provide a name for this delegate variable
+\, you can provide a selector instead and delegate_setter will use
+it;
+#X obj 729 263 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 3600 1;
+#X msg 726 290 my_variable \$1;
+#X obj 729 397 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 3600 1;
+#X obj 726 479 get_delegate -this did_set_my_variable;
+#X obj 729 507 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144
+-1 -1 3600 1;
+#X obj 726 358 list split 1;
+#X obj 684 166 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 684 596 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X text 726 203 using selectors:;
+#X connect 0 0 14 0;
+#X connect 1 0 9 0;
+#X connect 4 0 17 0;
+#X connect 5 0 24 0;
+#X connect 9 0 0 0;
+#X connect 9 1 19 0;
+#X connect 14 0 8 0;
+#X connect 14 1 10 0;
+#X connect 17 0 11 0;
+#X connect 17 1 16 0;
+#X connect 24 0 12 0;
+#X connect 24 1 23 0;
+#X connect 26 0 33 0;
+#X connect 28 0 29 0;
+#X connect 29 0 26 0;
+#X connect 31 0 32 0;
+#X connect 33 1 30 0;
+#X connect 34 0 35 0;
diff --git a/sfruit/delegate_setter.pd b/sfruit/delegate_setter.pd
new file mode 100644
index 0000000..9943e28
--- /dev/null
+++ b/sfruit/delegate_setter.pd
@@ -0,0 +1,37 @@
+#N canvas 142 461 444 327 10;
+#X obj 167 34 inlet;
+#X obj 286 189 list split 1;
+#X obj 286 215 swap-any;
+#X msg 331 243 will_set_\$1;
+#X obj 286 272 delegate \$1;
+#X obj 186 299 outlet;
+#X obj 167 97 t a a a;
+#X obj 46 189 list split 1;
+#X obj 46 215 swap-any;
+#X obj 46 272 delegate \$1;
+#X msg 91 243 did_set_\$1;
+#X obj 286 150 list prepend;
+#X obj 46 150 list prepend;
+#X obj 232 76 loadbang;
+#X obj 232 98 list-onearg \$2;
+#X text 18 11 [delegate_setter unique *name];
+#X text 201 10 *optional;
+#X connect 0 0 6 0;
+#X connect 1 0 2 0;
+#X connect 1 1 2 1;
+#X connect 2 0 4 0;
+#X connect 2 1 3 0;
+#X connect 3 0 4 1;
+#X connect 6 0 12 0;
+#X connect 6 1 5 0;
+#X connect 6 2 11 0;
+#X connect 7 0 8 0;
+#X connect 7 1 8 1;
+#X connect 8 0 9 0;
+#X connect 8 1 10 0;
+#X connect 10 0 9 1;
+#X connect 11 0 1 0;
+#X connect 12 0 7 0;
+#X connect 13 0 14 0;
+#X connect 14 0 11 1;
+#X connect 14 0 12 1;
diff --git a/sfruit/dispatch-many.pd b/sfruit/dispatch-many.pd
new file mode 100644
index 0000000..fb5911d
--- /dev/null
+++ b/sfruit/dispatch-many.pd
@@ -0,0 +1,13 @@
+#N canvas 285 439 450 300 10;
+#X obj 151 211 sendmany;
+#X obj 196 150 list-map;
+#X obj 265 144 list prepend \$1;
+#X obj 196 112 inlet;
+#X obj 151 112 inlet;
+#X msg 265 170 \$1*\$2-dispatcher;
+#X connect 1 0 0 1;
+#X connect 1 1 2 0;
+#X connect 2 0 5 0;
+#X connect 3 0 1 0;
+#X connect 4 0 0 0;
+#X connect 5 0 1 1;
diff --git a/sfruit/get_delegate.pd b/sfruit/get_delegate.pd
new file mode 100644
index 0000000..68e63f2
--- /dev/null
+++ b/sfruit/get_delegate.pd
@@ -0,0 +1,6 @@
+#N canvas 0 22 450 300 10;
+#X obj 81 97 r \$1-delegates;
+#X obj 81 125 route \$2;
+#X obj 81 153 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 2 0;
diff --git a/sfruit/gui-dispatch.pd b/sfruit/gui-dispatch.pd
new file mode 100644
index 0000000..bf2fca7
--- /dev/null
+++ b/sfruit/gui-dispatch.pd
@@ -0,0 +1,9 @@
+#N canvas 485 553 237 262 10;
+#X obj 46 146 list trim;
+#X obj 46 173 s \$1-dispatcher;
+#X obj 46 95 r \$2-\$3-s;
+#X text 32 35 [gui-dispatch \$1 \$0 message];
+#X obj 46 121 list prepend \$3;
+#X connect 0 0 1 0;
+#X connect 2 0 4 0;
+#X connect 4 0 0 0;
diff --git a/sfruit/gui-labeler.pd b/sfruit/gui-labeler.pd
new file mode 100644
index 0000000..46501d1
--- /dev/null
+++ b/sfruit/gui-labeler.pd
@@ -0,0 +1,14 @@
+#N canvas 464 470 450 300 10;
+#X obj 55 63 r \$1-s;
+#X obj 55 142 list-idx-list;
+#X obj 130 90 dollarg;
+#X obj 130 64 loadbang;
+#X obj 130 118 list split 1;
+#X msg 55 178 label \$1;
+#X obj 55 208 s \$1-r;
+#X connect 0 0 1 0;
+#X connect 1 0 5 0;
+#X connect 2 0 4 0;
+#X connect 3 0 2 0;
+#X connect 4 1 1 1;
+#X connect 5 0 6 0;
diff --git a/sfruit/list-extract-help.pd b/sfruit/list-extract-help.pd
new file mode 100644
index 0000000..acdf5c5
--- /dev/null
+++ b/sfruit/list-extract-help.pd
@@ -0,0 +1,36 @@
+#N canvas 71 124 523 398 10;
+#X obj 85 210 hradio 15 1 0 8 empty empty POS_(zero-based) 0 -6 0 8
+-262144 -1 -1 0;
+#X floatatom 85 230 5 0 0 0 - - -;
+#X msg 49 180 0 1 2 3 4;
+#X text 36 65 Negative POS counts from the end of the list.;
+#X floatatom 121 259 5 0 0 1 how_many - -;
+#X msg 293 190 0 1 2 3 4;
+#X text 322 231 arguments: <pos> <bodycount>;
+#X text 38 99 Arguments;
+#X text 51 122 1: Default POS to delete.;
+#X floatatom 343 259 5 0 0 0 - - -;
+#X floatatom 393 260 5 0 0 0 - - -;
+#X obj 49 278 list-extract;
+#X obj 293 279 list-extract 2 3;
+#X text 51 143 2: How many items to extract (cannot be less than 1)
+;
+#X obj 49 328 print extracted;
+#X obj 118 306 print remaining;
+#X text 35 26 list-extract: grab NUM elements at position POS from
+list \, and output the remaining items from the right outlet.;
+#X obj 293 328 print extracted;
+#X obj 386 306 print remaining;
+#X text 273 357 2009 Luke Iannini;
+#X text 273 374 Helpfile based on list-delete by fbar;
+#X connect 0 0 1 0;
+#X connect 1 0 11 1;
+#X connect 2 0 11 0;
+#X connect 4 0 11 2;
+#X connect 5 0 12 0;
+#X connect 9 0 12 1;
+#X connect 10 0 12 2;
+#X connect 11 0 14 0;
+#X connect 11 1 15 0;
+#X connect 12 0 17 0;
+#X connect 12 1 18 0;
diff --git a/sfruit/list-extract.pd b/sfruit/list-extract.pd
new file mode 100644
index 0000000..4961594
--- /dev/null
+++ b/sfruit/list-extract.pd
@@ -0,0 +1,35 @@
+#N canvas 249 403 450 300 10;
+#X obj 92 200 list-slice;
+#X obj 183 200 list-delete;
+#X obj 120 143 t a a;
+#X obj 149 176 + 1;
+#X obj 92 80 t a a;
+#X obj 92 31 inlet;
+#X obj 183 263 outlet;
+#X obj 92 262 outlet;
+#X obj 246 19 inlet;
+#X obj 246 70 t a;
+#X obj 317 69 t a;
+#X obj 317 19 inlet;
+#X obj 188 18 loadbang;
+#X obj 188 41 \$1;
+#X obj 358 19 loadbang;
+#X obj 358 42 \$2;
+#X connect 0 0 7 0;
+#X connect 1 0 6 0;
+#X connect 2 0 0 1;
+#X connect 2 1 3 0;
+#X connect 3 0 0 2;
+#X connect 4 0 0 0;
+#X connect 4 1 1 0;
+#X connect 5 0 4 0;
+#X connect 8 0 9 0;
+#X connect 9 0 2 0;
+#X connect 9 0 1 1;
+#X connect 10 0 3 1;
+#X connect 10 0 1 2;
+#X connect 11 0 10 0;
+#X connect 12 0 13 0;
+#X connect 13 0 9 0;
+#X connect 14 0 15 0;
+#X connect 15 0 10 0;
diff --git a/sfruit/midi-stream2notes-help.pd b/sfruit/midi-stream2notes-help.pd
new file mode 100644
index 0000000..9a83302
--- /dev/null
+++ b/sfruit/midi-stream2notes-help.pd
@@ -0,0 +1,102 @@
+#N canvas 347 450 449 345 10;
+#X obj 97 199 midi-stream2notes;
+#X obj 196 171 timer;
+#X obj 196 132 loadbang;
+#N canvas 731 143 383 603 random-notes 0;
+#X obj 125 445 + 50;
+#X obj 125 421 random 450;
+#X obj 104 470 pipe;
+#X msg 104 496 \$1 0;
+#X obj 168 267 + 60;
+#X obj 168 243 random 40;
+#X obj 238 243 random 117;
+#X obj 238 268 + 10;
+#X obj 104 375 list split 1;
+#X obj 167 174 del;
+#X obj 167 121 random 450;
+#X obj 167 143 + 50;
+#X obj 92 174 t b b;
+#X obj 168 206 t b b;
+#X obj 169 296 pack f f;
+#X obj 169 327 t a a;
+#X obj 196 540 outlet;
+#X obj 104 397 t a b;
+#X obj 167 95 spigot;
+#X obj 191 27 inlet;
+#X obj 192 71 sel 1;
+#X obj 192 48 t a a;
+#X connect 0 0 2 1;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 3 0 16 0;
+#X connect 4 0 14 0;
+#X connect 5 0 4 0;
+#X connect 6 0 7 0;
+#X connect 7 0 14 1;
+#X connect 8 0 17 0;
+#X connect 9 0 12 0;
+#X connect 10 0 11 0;
+#X connect 11 0 9 0;
+#X connect 12 0 18 0;
+#X connect 12 1 13 0;
+#X connect 13 0 5 0;
+#X connect 13 1 6 0;
+#X connect 14 0 15 0;
+#X connect 15 0 8 0;
+#X connect 15 1 16 0;
+#X connect 17 0 2 0;
+#X connect 17 1 1 0;
+#X connect 18 0 10 0;
+#X connect 19 0 21 0;
+#X connect 20 0 10 0;
+#X connect 21 0 20 0;
+#X connect 21 1 18 1;
+#X restore 97 34 pd random-notes;
+#X msg 97 93 74 0;
+#N canvas 0 22 279 283 show 0;
+#X obj 82 95 list prepend set;
+#X obj 82 122 list trim;
+#X obj 82 36 inlet;
+#X obj 82 154 t b a;
+#X obj 82 196 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 2 0 0 0;
+#X connect 3 0 4 0;
+#X connect 3 1 4 0;
+#X restore 97 63 pd show;
+#X obj 97 143 t a b;
+#X floatatom 213 200 0 0 0 0 - - -;
+#X text 231 171 time can be in any format you like;
+#X text 287 186 (even symbols!);
+#X msg 97 256 74 112 226741 226920;
+#N canvas 0 22 279 283 show 0;
+#X obj 82 95 list prepend set;
+#X obj 82 122 list trim;
+#X obj 82 36 inlet;
+#X obj 82 154 t b a;
+#X obj 82 196 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 2 0 0 0;
+#X connect 3 0 4 0;
+#X connect 3 1 4 0;
+#X restore 97 226 pd show;
+#X obj 97 288 print note;
+#X obj 256 138 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
+-1 -1;
+#X obj 97 9 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1
+;
+#X connect 0 0 11 0;
+#X connect 1 0 0 1;
+#X connect 1 0 7 0;
+#X connect 2 0 1 0;
+#X connect 3 0 5 0;
+#X connect 4 0 6 0;
+#X connect 5 0 4 0;
+#X connect 6 0 0 0;
+#X connect 6 1 1 1;
+#X connect 10 0 12 0;
+#X connect 11 0 10 0;
+#X connect 13 0 1 0;
+#X connect 14 0 3 0;
diff --git a/sfruit/midi-stream2notes.pd b/sfruit/midi-stream2notes.pd
new file mode 100644
index 0000000..874c138
--- /dev/null
+++ b/sfruit/midi-stream2notes.pd
@@ -0,0 +1,71 @@
+#N canvas 173 60 491 669 10;
+#X obj 109 443 list-find;
+#X obj 108 163 unpack f f;
+#X obj 108 186 swap;
+#X text 173 163 note \, vel;
+#X obj 136 358 list-value-extend \$0-notes;
+#X obj 109 266 f;
+#X obj 109 233 sel 0;
+#X obj 136 334 list append;
+#X obj 136 266 list prepend;
+#X text 213 268 note \, vel;
+#X text 207 335 note \, vel \, time-on;
+#X obj 109 516 list-extract 0 3;
+#X obj 109 490 list-value \$0-notes;
+#X obj 136 420 list-value \$0-notes;
+#X obj 109 399 t a b;
+#X obj 202 540 list-value \$0-notes;
+#X obj 109 585 list append;
+#X obj 108 39 inlet note vel;
+#X obj 323 41 inlet time;
+#X obj 199 312 r \$0-time;
+#X obj 172 562 r \$0-time;
+#X obj 323 76 s \$0-time;
+#X obj 109 629 outlet note vel timeon timeoff;
+#N canvas 748 370 257 276 ignore-dupes 0;
+#X obj 42 26 inlet;
+#X obj 42 144 list-find;
+#X obj 42 68 unpack f f;
+#X obj 93 166 sel 0;
+#X obj 93 190 list;
+#X obj 42 47 t a a;
+#X obj 42 100 t a b;
+#X obj 69 121 list-value \$0-notes;
+#X obj 93 215 outlet;
+#X connect 0 0 5 0;
+#X connect 1 1 3 0;
+#X connect 2 0 6 0;
+#X connect 3 0 4 0;
+#X connect 4 0 8 0;
+#X connect 5 0 2 0;
+#X connect 5 1 4 1;
+#X connect 6 0 1 0;
+#X connect 6 1 7 0;
+#X connect 7 0 1 1;
+#X restore 136 288 pd ignore-dupes;
+#X obj 109 464 t b a;
+#X connect 0 0 24 0;
+#X connect 1 0 2 0;
+#X connect 1 1 2 1;
+#X connect 2 0 6 0;
+#X connect 2 1 5 1;
+#X connect 2 1 8 1;
+#X connect 5 0 14 0;
+#X connect 6 0 5 0;
+#X connect 6 1 8 0;
+#X connect 7 0 4 0;
+#X connect 8 0 23 0;
+#X connect 11 0 16 0;
+#X connect 11 1 15 0;
+#X connect 12 0 11 0;
+#X connect 13 0 0 1;
+#X connect 14 0 0 0;
+#X connect 14 1 13 0;
+#X connect 16 0 22 0;
+#X connect 17 0 1 0;
+#X connect 18 0 21 0;
+#X connect 19 0 7 1;
+#X connect 20 0 16 1;
+#X connect 23 0 7 0;
+#X connect 24 0 12 0;
+#X connect 24 1 11 1;
diff --git a/sfruit/oscinify.pd b/sfruit/oscinify.pd
index 11eeb9e..eac552b 100644
--- a/sfruit/oscinify.pd
+++ b/sfruit/oscinify.pd
@@ -1,11 +1,6 @@
#N canvas 433 96 153 116 10;
-#X obj 22 11 r PDOSC;
-#X obj 22 34 deeprouteOSC \$1;
#X obj 22 65 s \$2;
#X obj 22 91 outlet;
-#X obj 81 11 r /pd\$1;
-#X connect 0 0 1 0;
-#X connect 1 0 2 0;
-#X connect 1 0 3 0;
-#X connect 4 0 2 0;
-#X connect 4 0 3 0;
+#X obj 22 11 r /pd\$1;
+#X connect 2 0 0 0;
+#X connect 2 0 1 0;
diff --git a/sfruit/randrange-help.pd b/sfruit/randrange-help.pd
new file mode 100644
index 0000000..966649b
--- /dev/null
+++ b/sfruit/randrange-help.pd
@@ -0,0 +1,14 @@
+#N canvas 394 438 450 300 10;
+#X obj 77 114 randrange 10 20;
+#X obj 77 160 print;
+#X obj 77 67 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X floatatom 120 52 5 0 0 0 - - -;
+#X floatatom 164 52 5 0 0 0 - - -;
+#X text 175 114 arg1...(arg2-1);
+#X text 178 98 produces random numbers in the range;
+#X text 259 248 2009 Luke Iannini;
+#X connect 0 0 1 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 1;
+#X connect 4 0 0 2;
diff --git a/sfruit/randrange.pd b/sfruit/randrange.pd
new file mode 100644
index 0000000..b4622d9
--- /dev/null
+++ b/sfruit/randrange.pd
@@ -0,0 +1,29 @@
+#N canvas 577 71 429 347 10;
+#X obj 151 201 random;
+#X obj 151 239 + \$1;
+#X obj 151 81 inlet;
+#X obj 151 275 outlet;
+#X obj 218 81 inlet;
+#X obj 344 51 inlet;
+#X obj 218 106 t a a;
+#X obj 245 149 expr abs($f2-$f1);
+#X obj 280 31 loadbang;
+#X obj 280 52 t b b;
+#X obj 307 79 \$2;
+#X obj 280 79 \$1;
+#X obj 307 111 t b a;
+#X connect 0 0 1 0;
+#X connect 1 0 3 0;
+#X connect 2 0 0 0;
+#X connect 4 0 6 0;
+#X connect 5 0 12 0;
+#X connect 6 0 1 1;
+#X connect 6 1 7 0;
+#X connect 7 0 0 1;
+#X connect 8 0 9 0;
+#X connect 9 0 11 0;
+#X connect 9 1 10 0;
+#X connect 10 0 12 0;
+#X connect 11 0 6 0;
+#X connect 12 0 7 0;
+#X connect 12 1 7 1;
diff --git a/sfruit/time-clock-help.pd b/sfruit/time-clock-help.pd
new file mode 100644
index 0000000..1a5d2f4
--- /dev/null
+++ b/sfruit/time-clock-help.pd
@@ -0,0 +1,82 @@
+#N canvas 0 22 696 466 10;
+#X msg 40 59 120;
+#X obj 473 79 bng 40 50 50 0 empty empty empty 17 7 0 10 -33289 -159808
+-1;
+#X obj 472 155 nbx 4 30 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 20
+-262144 -1 -1 0 256;
+#X obj 216 155 nbx 4 30 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 20
+-262144 -1 -1 500 256;
+#X obj 194 125 bng 15 50 50 0 empty empty empty 17 7 0 10 -1 -159808
+-1;
+#X obj 472 225 nbx 4 30 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 20
+-262144 -1 -1 34 256;
+#X obj 216 225 nbx 4 30 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 20
+-262144 -1 -1 2000 256;
+#X obj 194 196 bng 15 50 50 0 empty empty empty 17 7 0 10 -1 -4034
+-1;
+#X obj 41 197 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X floatatom 40 127 2 0 0 0 - - -;
+#X floatatom 307 371 5 0 0 0 - - -;
+#X obj 39 301 time-next_beat;
+#X obj 39 274 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 39 328 bng 15 50 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 39 364 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 39 418 bng 15 50 50 0 empty empty empty 17 7 0 10 -262144 -1
+-1;
+#X obj 39 391 time-next_measure;
+#X msg 75 59 90;
+#X msg 108 59 50;
+#X text 57 273 click to get a bang on the next beat;
+#X text 57 363 click to get a bang on the next measure;
+#X obj 473 55 get_delegate time-clock tick;
+#X obj 216 196 get_delegate time-clock next_measure_in;
+#X obj 472 126 get_delegate time-clock beat;
+#X obj 472 196 get_delegate time-clock measure;
+#X obj 216 126 get_delegate time-clock next_beat_in;
+#X obj 41 17 time-clock;
+#X obj 218 55 get_delegate time-clock tempo;
+#X obj 218 83 nbx 4 30 -1e+37 1e+37 0 0 empty empty empty 0 -8 0 20
+-204800 -1 -1 120 256;
+#X obj 307 411 s time-clock-dispatcher;
+#X msg 307 389 seek_measure \$1;
+#X floatatom 307 291 5 0 0 0 - - -;
+#X obj 307 331 s time-clock-dispatcher;
+#X msg 307 309 seek_beat \$1;
+#X obj 41 238 s time-clock-dispatcher;
+#X msg 41 216 sync;
+#X obj 40 170 s time-clock-dispatcher;
+#X msg 40 147 beats_per_measure \$1;
+#X msg 40 80 tempo \$1;
+#X obj 40 100 s time-clock-dispatcher;
+#X text 114 11 a centralized timing system. meant to be one-per-pd-instance
+atm \; this will likely change.;
+#X text 548 425 2009 Luke Iannini;
+#X text 548 439 proyekto.net;
+#X connect 0 0 38 0;
+#X connect 8 0 35 0;
+#X connect 9 0 37 0;
+#X connect 10 0 30 0;
+#X connect 11 0 13 0;
+#X connect 12 0 11 0;
+#X connect 14 0 16 0;
+#X connect 16 0 15 0;
+#X connect 17 0 38 0;
+#X connect 18 0 38 0;
+#X connect 21 0 1 0;
+#X connect 22 0 6 0;
+#X connect 22 0 7 0;
+#X connect 23 0 2 0;
+#X connect 24 0 5 0;
+#X connect 25 0 3 0;
+#X connect 25 0 4 0;
+#X connect 27 0 28 0;
+#X connect 30 0 29 0;
+#X connect 31 0 33 0;
+#X connect 33 0 32 0;
+#X connect 35 0 34 0;
+#X connect 37 0 36 0;
+#X connect 38 0 39 0;
diff --git a/sfruit/time-clock.pd b/sfruit/time-clock.pd
new file mode 100644
index 0000000..310da0e
--- /dev/null
+++ b/sfruit/time-clock.pd
@@ -0,0 +1,101 @@
+#N canvas 138 22 535 783 10;
+#X obj 93 235 metro;
+#X obj 93 212 > 0;
+#X obj 120 311 f;
+#X obj 149 311 + 1;
+#X obj 147 377 change;
+#X obj 120 335 t a a;
+#X obj 175 529 *;
+#X obj 118 150 s \$0-tick_time;
+#X obj 146 673 r \$0-tick_time;
+#X obj 175 459 r \$0-beats_per_measure;
+#X obj 256 484 r \$0-tick_time;
+#X obj 120 625 t b a;
+#X obj 147 401 t b a;
+#X obj 147 529 f;
+#X obj 184 356 r \$0-beats_per_measure;
+#X obj 158 589 r \$0-beats_per_measure;
+#X obj 131 203 t b;
+#X obj 93 96 expr 60000 / $f1;
+#X obj 93 124 t a;
+#X obj 208 256 r \$0-beats_per_measure;
+#X obj 93 259 t b b;
+#X obj 175 508 hotpack2 4 600;
+#X obj 120 589 mod 4;
+#X obj 147 356 div 4;
+#X obj 182 256 * 4;
+#X obj 120 696 f 600;
+#X obj 321 23 inlet;
+#N canvas 761 202 450 300 dispatch 0;
+#X obj 39 19 inlet;
+#X obj 39 64 dispatcher \$0 tempo_in_ms;
+#X obj 39 44 dispatcher \$0 tempo;
+#X obj 39 84 dispatcher \$0 beats_per_measure;
+#X obj 39 104 dispatcher \$0 sync;
+#X obj 39 124 dispatcher \$0 seek_beat;
+#X obj 39 144 dispatcher \$0 seek_measure;
+#X obj 77 19 r time-clock-dispatcher;
+#X connect 0 0 2 0;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 3 0 4 0;
+#X connect 4 0 5 0;
+#X connect 5 0 6 0;
+#X connect 7 0 2 0;
+#X restore 321 49 pd dispatch;
+#X obj 93 43 r \$0-tempo;
+#X obj 56 20 r \$0-tempo_in_ms;
+#X obj 131 180 r \$0-sync;
+#X obj 182 207 r \$0-seek_beat;
+#X obj 182 232 r \$0-seek_measure;
+#X obj 174 424 delegate time-clock measure;
+#X obj 147 551 delegate time-clock next_measure_in;
+#X obj 120 718 delegate time-clock next_beat_in;
+#X obj 147 648 delegate time-clock beat;
+#X obj 93 757 delegate time-clock tick;
+#X text 343 424 *;
+#X text 367 552 *;
+#X text 298 648 *;
+#X text 329 719 *;
+#X text 245 756 *;
+#X obj 104 68 delegate time-clock tempo;
+#X text 262 70 *;
+#X connect 0 0 20 0;
+#X connect 1 0 0 0;
+#X connect 2 0 3 0;
+#X connect 2 0 5 0;
+#X connect 3 0 2 1;
+#X connect 4 0 12 0;
+#X connect 5 0 22 0;
+#X connect 5 1 23 0;
+#X connect 6 0 13 1;
+#X connect 8 0 25 1;
+#X connect 9 0 21 0;
+#X connect 10 0 21 1;
+#X connect 11 0 25 0;
+#X connect 11 1 36 0;
+#X connect 12 0 13 0;
+#X connect 12 1 33 0;
+#X connect 13 0 34 0;
+#X connect 14 0 23 1;
+#X connect 15 0 22 1;
+#X connect 16 0 0 0;
+#X connect 17 0 18 0;
+#X connect 18 0 0 1;
+#X connect 18 0 1 0;
+#X connect 18 0 7 0;
+#X connect 19 0 24 1;
+#X connect 20 0 37 0;
+#X connect 20 1 2 0;
+#X connect 21 0 6 0;
+#X connect 22 0 11 0;
+#X connect 23 0 4 0;
+#X connect 24 0 2 1;
+#X connect 25 0 35 0;
+#X connect 26 0 27 0;
+#X connect 28 0 17 0;
+#X connect 28 0 43 0;
+#X connect 29 0 18 0;
+#X connect 30 0 16 0;
+#X connect 31 0 2 1;
+#X connect 32 0 24 0;
diff --git a/sfruit/time-last_beat_was.pd b/sfruit/time-last_beat_was.pd
new file mode 100644
index 0000000..71df5a5
--- /dev/null
+++ b/sfruit/time-last_beat_was.pd
@@ -0,0 +1,10 @@
+#N canvas 563 103 450 300 10;
+#X obj 129 107 inlet;
+#X obj 102 159 timer;
+#X obj 129 129 t b;
+#X obj 102 193 outlet;
+#X obj 102 82 get_delegate time-clock tick;
+#X connect 0 0 2 0;
+#X connect 1 0 3 0;
+#X connect 2 0 1 1;
+#X connect 4 0 1 0;
diff --git a/sfruit/time-last_measure_was.pd b/sfruit/time-last_measure_was.pd
new file mode 100644
index 0000000..3c4654f
--- /dev/null
+++ b/sfruit/time-last_measure_was.pd
@@ -0,0 +1,12 @@
+#N canvas 513 202 450 300 10;
+#X obj 129 107 inlet;
+#X obj 102 159 timer;
+#X obj 129 129 t b;
+#X obj 102 193 outlet;
+#X obj 102 75 t b;
+#X obj 102 52 get_delegate time-clock measure;
+#X connect 0 0 2 0;
+#X connect 1 0 3 0;
+#X connect 2 0 1 1;
+#X connect 4 0 1 0;
+#X connect 5 0 4 0;
diff --git a/sfruit/time-next_beat.pd b/sfruit/time-next_beat.pd
new file mode 100644
index 0000000..c256cf0
--- /dev/null
+++ b/sfruit/time-next_beat.pd
@@ -0,0 +1,17 @@
+#N canvas 0 22 450 300 10;
+#X obj 144 226 del;
+#X obj 144 167 timer;
+#X obj 144 90 t b a;
+#X obj 144 194 expr $f2 - $f1;
+#X obj 112 39 inlet;
+#X obj 112 90 t b;
+#X obj 144 255 outlet;
+#X obj 144 65 get_delegate time-clock next_beat_in;
+#X connect 0 0 6 0;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 2 1 3 1;
+#X connect 3 0 0 0;
+#X connect 4 0 5 0;
+#X connect 5 0 1 1;
+#X connect 7 0 2 0;
diff --git a/sfruit/time-next_measure.pd b/sfruit/time-next_measure.pd
new file mode 100644
index 0000000..1ff6cb8
--- /dev/null
+++ b/sfruit/time-next_measure.pd
@@ -0,0 +1,17 @@
+#N canvas 0 22 450 300 10;
+#X obj 144 226 del;
+#X obj 144 167 timer;
+#X obj 144 90 t b a;
+#X obj 144 194 expr $f2 - $f1;
+#X obj 112 39 inlet;
+#X obj 112 90 t b;
+#X obj 144 255 outlet;
+#X obj 144 65 get_delegate time-clock next_measure_in;
+#X connect 0 0 6 0;
+#X connect 1 0 3 0;
+#X connect 2 0 1 0;
+#X connect 2 1 3 1;
+#X connect 3 0 0 0;
+#X connect 4 0 5 0;
+#X connect 5 0 1 1;
+#X connect 7 0 2 0;
diff --git a/sfruit/time-snap_beat.pd b/sfruit/time-snap_beat.pd
new file mode 100644
index 0000000..96da63f
--- /dev/null
+++ b/sfruit/time-snap_beat.pd
@@ -0,0 +1,23 @@
+#N canvas 507 404 450 300 10;
+#X obj 185 130 r CLOCK-NEXT_BEAT_IN;
+#X obj 185 160 / 2;
+#X obj 123 84 time-last_beat_was;
+#X obj 123 33 inlet;
+#X obj 188 219 time-next_beat;
+#X obj 123 249 outlet;
+#X obj 123 189 sel 0 1;
+#X obj 123 124 t a a;
+#X obj 123 216 f;
+#X obj 123 159 >;
+#X obj 188 249 outlet;
+#X connect 0 0 1 0;
+#X connect 1 0 9 1;
+#X connect 2 0 7 0;
+#X connect 3 0 2 0;
+#X connect 4 0 10 0;
+#X connect 6 0 8 0;
+#X connect 6 1 4 0;
+#X connect 7 0 9 0;
+#X connect 7 1 8 1;
+#X connect 8 0 5 0;
+#X connect 9 0 6 0;
diff --git a/sfruit/time-snap_measure.pd b/sfruit/time-snap_measure.pd
new file mode 100644
index 0000000..842019e
--- /dev/null
+++ b/sfruit/time-snap_measure.pd
@@ -0,0 +1,23 @@
+#N canvas 0 22 450 300 10;
+#X obj 185 160 / 2;
+#X obj 123 33 inlet;
+#X obj 123 249 outlet;
+#X obj 123 189 sel 0 1;
+#X obj 123 124 t a a;
+#X obj 123 216 f;
+#X obj 123 159 >;
+#X obj 188 249 outlet;
+#X obj 123 84 time-last_measure_was;
+#X obj 188 219 time-next_measure;
+#X obj 185 129 get_delegate time-clock next_measure_in;
+#X connect 0 0 6 1;
+#X connect 1 0 8 0;
+#X connect 3 0 5 0;
+#X connect 3 1 9 0;
+#X connect 4 0 6 0;
+#X connect 4 1 5 1;
+#X connect 5 0 2 0;
+#X connect 6 0 3 0;
+#X connect 8 0 4 0;
+#X connect 9 0 7 0;
+#X connect 10 0 0 0;