Multi-stream slice offsets

Hello. Big newbie. FrameLib is awesome and I’m interested in using the multi-stream operators to trigger grains at offsets nabbed from a FluCoMa buffer.

The idea is to grab a list of slice-buffer indices from a list that grows and shrinks in size and create one grain voice per offset. I’m trying to wrap my head around this sort of polyphony in FL.

I must be misunderstanding how this is supposed to work, because the density stays the same when I have less slices:

<pre><code>
----------begin_max5_patcher----------
1359.3oc2ZssaihCF95To4cvBs2sYawXNtRiTeOVMpxI3PcGvDYLY5ri17ru
9.jj1BD2NlcSlKZfXa3++6y+Gc5O9zMK7VU+LowC7mf+BrXwOjirPOlZjE8C
rvqB+75RbidgdqZEhZl2xt4n45QqW8zejfNL5VrX8iTVwCbxZg48m3mdq+R.
LLVcIHr+SvW5eHVaEkURDZ4.OYz5VwaFdKliqHBB+ABCupjnlzueRyCH99Vh
Q1dqvrBOvWzS+Oe5F0U4kkVCZF4aRDd.dBxyZT4so7VNof1H0i8CRI9SQInL
MK.S0TRbjlRBFkRBNCk7FTOSHlxjvcGtbOHx22eHXGmMErgoAZXGiTWLbvDv
Fdg.aAtXOnG6Ch5TKPcPpu5R54PM5BA0U3s6AkTFAyA9.nzJ0WdYzM9DanfP
+aiT6+oWIF7bLKutZPG73Xa.LT6ZGGekf2Fb01RBGKH6A2UUmS.ACh8nICtE
CUvEEmn2rQvew.e3jfOApPcuk9EF3aqVQ3CApnIiaGlkcLzUj+GKrcvGKAt2
xYMI9FdckbsC6hOYN7vTSYMP8kjfqjjY+tz3VvoEER9mxZ.kjMhg.enuEw2P
8bP3kjYN4uywqGbGEclxSzdqwYZK7vn9OeeXxeVhMQYecO3yCFPBYS0GgQ5s
HSkWu+MpfQ2nZnELUUQGt6mXiqjtibaAlxNt4sCyYxnEiM8ozvzUfjzE7RmJ
NzX1hhOOOHUN4KCyXjx00sLwKhV8RRJZpHbP6YvklndaJqwB0Mkx1L7NpmM3
cj7GvBoWrrkLxw6Z531dxUwdksj5M8ieXhSUwxZVwDT7KVqJToZcJRbvooL0
zxteFdAMOVyE1JrdJZv2TKiJZDe2vsgcKnyl63MNuiOb9dPizLHePKPaJILD
ps.S+0omOTnMYJLNdWM87Isyjs+bWIgUHdTBhrLvcMqwkDPUyfjfUoKC00QA
StV5GnyfujtlLHpCxroV3rDsEevkDnqHMM3BxaQcEl+UBuoCzfeCNHtmLkab
WIx5nf.nev0vtMksodhXaASFaKNoyu1brV9nOlWd1nH9k4BOM4nM2n9ipRc6
dZaU6lMD9j9HS1rbFJwbRf5ROSx9I6sZbha95gpkleqjFpYMRsQQC6A2Ksi3
qIFyIv8TVt1Ypym5dwibhrTfxbvIjyoT1jYThhCOgxPm8vUFgyPSelwuv9YN
BzXrblviCYAIzEiI4hpZhmZZoChHnEHBYhgfR0wPfAoe3CJ8cdNCGkxFpLse
eQpF66uIq4dSMuZum6MDTIYGjt7swKvjcAgtFxwbHX4X17vTafbXfU0S7+Wr
xwO.B3jIChLGWb.Re3gWVG.gPZlVQkUC94ACYaSqOcGSTZ5URO.0LYtrAK12
BvZRkGAmerZdydpeplW+K5pUO0DuhALom6dicHBbhJlSZDTFVPqYmrnXyhFm
psVbw1HN0OgJ.dbU07bB+LF3tUCT+ZlmtpCZ.zEZPhUpPp6Hc6vbhyDnpLty
Kv.zLRxVpBwinBtvRSkS6Ty3QTgPmQ6IV4L6PA9Z2jIbmmKR1NUHNdFM0P91
nBg9ti1irVfPmHvPqPHxcoIRrRfwtyRFYU3BjC2CSsRftCgA14nD4NDZWD3L
mIvH6Pn61CQVkWE4tD4H6LZRlyfc1qByUEbu9kOhJj4rveHqJXC4NK4.qLrB
bmgUfU6ppiwwUBD8es.sJiBbXJsqQK71s6H7ltGwHKYOkOUqMsSWZ9NkY9to
IcONYGs+QLM24g4xVGEx9Fa4liZ549+0h7T+2GwYszd2UEZUhV21p5noZ1hM
3R2d6mtQtf+ULBR7h
-----------end_max5_patcher-----------
</code></pre>

Any tips would be much appreciated, thank you!

Hi Jesse,

Glad you are enjoying framelib!

I don’t see anything particularly wrong with your patch, although I’d expect it to put 3 streams on the left and 2 on the right at the output (because streams run modulo).

Two general tips I’d say are:

1 - I think setting enum parameters with symbols is better practice (I’ve been slightly tempted to remove setting by numbers, because it makes it harder to change objects later, but I haven’t pulled the trigger on it yet).

2 - Rather than read the slices using ms input (needing conversion using fl.samplerate~ before fl.read~) I’d just set the units of fl.read~ to samples. I’d also turn interpolation off for that fl.read~ to make sure you are getting the exact sample you ask for (the accuracy means that’s probably going to happen the way you’ve done it, but it’s conceptually nicer to set the object up in this way).

Right now my personal build of framelib is not complete, so I’ll look again once I’ve fixed that and see if I can understand why you aren’t getting the sort of results you want.

Yep - I’ve just checked and this does exactly what I’d expect here - I get 3 sounds on the left (each triggering randomly) and 2 on the right (also triggering randomly).

Because the triggers are so fast and the grains so short (1899 sample every 2500-4500 samples) it’s a bit hard to differentiate the sounds, but it does happen. You’ve also connected both of the outputs to the left, so you’re only hearing 3 of the 5 layers in your patch.

Let me know if you’re still struggling to understand and we can talk further or even set up a call to go through it if needed.

Hey! Thank you for the speedy response. Yes, I definitely don’t quite understand multistreams yet. Big improvement.

My main issue now is how to add and remove voices. Here’s the idea - I’m using fluid.plotter with a radius to pick up some number of samples. I want one voice to be created/removed for each point the radius picks up - for now, if I have one point selected, it plays that point in every stream created. My guess is I want to mute the streams that are greater than the count of selected points, but I’m not sure. Hopefully that makes sense.

I’d certainly be down for a call to work through this if you’re up for it. Thanks again!

----------begin_max5_patcher----------
5633.3oc6cs0iaiik94z.8+AsElG1EaE27NkVfAauyK8SyKy.L.CFrnfrsrK
kHK4URNIcMXpe6KuIYIU5BKaJW1URgDac0jmOdtwCOj7e9y+zGtaY12hJty6
+x6e38gO7OEW4CpqIuxGptvGtaW32VkDVndv6VksaWTZ4c2atYYz2J02HOJr
LxS7vw6NryKaiWf2WxhWEU38u+e+eT+7IwoQqxNjpdIT0UiWq9MxV9oOxg0O
69vxUOFmt8g7nUk5pID.7W.t2iCjehXpSXvE.u+2p2ZSVZYQ7SQpB.uvGFvn
TpOmEDDPnUOU5gcwoIQkJpB13pYGJqtLPc0+0O+SxuEec+4iRBPZs2l7rcdk
OF4UDkHnrn0dEIBfxaeVrnp+JfJvnPEBoPGTfFqHD4WT5fXEbADQDPDI.F.f
AHzaLVUiNZbwaalm36LuPukG1rIJ2dfhELFPwzLSXLWgSBbPhSfgvIXvB.mQ
X..hx.T.6sFm1Gu5yc4cZR79iQ7j.pRDhxjeAwHETPFQfhx3XLymifPhOv+s
lIQJ47KgogI+dgPfJ6P9pndQA9nxJZYCflC.qfDITLnjBmwBv9bLjBw.xkAC
Ri9pfRdIDrIYQY31mkBGQ4eILoWxGWeUcco722Goo86t6HU1CzD.YZ0GJNCe
hVFoIzzhpw8S0v4fp2Et+YOoveXtGvCJMN.7HhO5EAPmKB.UJFfL3DP.5BBA
4goqy18buDL7LIXHW8EicEQuU73O6ELPyL3boZpp80mOAUCujsxBuFdV6jPw
CZcbd+xgzXgQwhvc6Sh5UwOM3TgBHjpHerutsGPulX4i1FWH3B5kom5e1zr1
qI1Emj2EUTDtM5kzrOtWJ8j0ny4JJDCBpbz4pos8+7YueoLOd61n7GhSK7Rh
1T1Kwe551vJplfUFxfPx0B0q8osiTdezNYDV7MIYgB.S7qEltcbf.SwJD.wW
PkegNM8cn4SemztdTQoEZ5HvyVp23+KGco4GhdZc3pd0kQFs6cA59yw0lqHz
pOec06S2azj3uDsXaXb5w59WBySC2EMzsaPZ3QLMUDuMU5Dayij+ul2NQn9e
BgbSecCzx595t1vZBNB5P7ZgooQI0ccDLNxsOLWPcBKOODkFtLIZDoh5vLTD
9kn0ODVJTps7PYzwiJLXaE3JQujCQYaptd8MZVvIYoaGAha8r6DMWxmSxX26
siSk29ipd+1yCT7XVdosEVU6Wu+RJ42xeWiXDyCX34Ndfi0gTDm94m89indY
+7eEreVwoYbZ.eZZOlQknV6sHletlT4l9G4eU0+nch9H9KIQoaKeT3HqnChV
.ErSuODZqILsaE.zUYWmnCzEYL8b6hbfh7CHWQ8cpnTHHrKVHJ7GC5knImaG
F0Qj12+JhnyRWE0ug2yMNP5XkRgWKD6mJ79bZYlv64dI2SNZ.LSXOzAOmANQ
5sse.hpjn.FyIfMwBUUU1bMD1hOUqkpemP.ymgzpdkX7EuOLFxcR+QX59iP7
UFSzedczcjCwqWH84DI.Cuecs.FhSCKiyRGEUFwFxzNvVAFTsqqmJZ3dws84
Q6iRW68X71GSD+ueZ+jC0JVa+zH0AAWMpYxE+5QBMMizfOVePueJBmpsbhHp
1ce50iejRt+OuVXDM5YO4mUwe7WyCWGenvCr.58qhpQZjfcXo3dEdz9vmQ5w
mR4Pyd3YGSh1ta0YuZlD7ror7+6PT9u2GF3lH2P0gikoYY3WbMkCFnxJwigA
.9YpXfi3V4q0Ezu5gsNLHJPNGSCFjvz5C4WbSCep3PbeT04pzGiLCCOo9qoZ
c60YnI7DqkGV5lu8IYkhej6lIqFqOraeuVLNGCFPsIRhOVyMboMXHbesLKse
CgvIT0OJggvM6Ac8mSwc+ZXElIs.BE.YoEhBQFA+m89UigxJ6kwoqUYC0jA3
O.6LSkP+Fw3GigWZKkivkP4mCWhgvXHIgckwkLn8wAUDfO4QsTS5Dsix3fqK
yhqCKCExChdOlkuKTXZSzE3gY6giE1sWIeuAVLQ9eR2ouXdHt2S6J8Hv.5ji
GkQyo1Eo.5YFwBUAHLJ1WDJ9RTdgvCmlO+GtKb+9FWuyPXrK7SYpeK+iCPfn
xnuF530xi9R7K9oE+14BhsTPoGx0Ft+FizXbH1ksNJOU3VRMyrt8pppoZXjF
8K1GtR+CHa.qu+QLDbr6WPpNOv7koBRMHJZ52ljs5yQqaMbG2kI5Vbbpn6wE
QokJ++Ze+0QaBOjT9PqLIDsn+GXioV1+cq8d4+IO9X1d8g61lGuNKUVQZ2vH
udUQJzbZHtVzj5QRC222qqCZ0P2sPPrGJVFlKa2LZTqaOuqLKKo88N9lxw12
b+8woocAzxr8ib2bYrGF49KEdzksazed0sJd3Pp91OHGQvGjwoqyCFljXDm6
TBeKLMdWXYTYrt8.ANdWs4kGKVkmkjzlt025K8cq0Bt+UQeMdc4ipBqE6g3E
h2WwXc2wl80wakgjn8EKC2Vz4R0i.WyqcXoQN+gxnc6SDTS2m3wruJ34BW1l
5ExShdpHuYg4GnhqrEBcL6xaoNno9y12XT8n84b8l3xV2tYmM4styDNYO7na
ojWHZ2seoE1gsxNn+1sF9yZKKmFB0wYiNlgiKG116voN0TFeFOKZ45LqAgOO
nB5bnZLloAiy0fnEbbzZDGVFG9f5jPFRfVfevgwOrywOUwNDdfPtg6Q+IFT8
4HDOXDlml2pJ2waoXSU8SWG8s4gWSWWFDrv2YmVGe6QiQXE.tAMZ3ufLoqGR
0thZjOv.3jQtRyVTw530gzZDGsFOoTEk7Isu45UWYjx0dHapLRyKyckw2ZjA
9xmbW7ZyrBop6Ah9JaFmg5im05eEDMc8WJQLBXVciiN0a8Hp9JcbR3b+xvjN
9zzqiUy2ftt+nQ6w5uL5jy5QcjVqFkMH9GcU7GcU7GcU7GcU78ZWEK8V5sbP
mwryQ91wjdvwlUObLnpIP343A+EtyhqRhByGBjN69FhAFkIZOZo2RcNrNRCk
4goEaD1lGBlfNIhC5NBEnR.sfatHNTCRd5Ykab8TVy5PQ3yN6NSRa5ZC6FLV
DSO3Iu.0vtOjDPPCo19FHk23XRLMNZfumhddPbC4dbqoxt.7MUjbfAV.G1h.
ruGhlCXpn4nyeSL86gn4.stK+fYO9IRVYKqLydcQVBPapJ9SFIGNUE8FMSEj
TcxrW8sBIk1tmYnz5nh4im+5Bx13EBm+5ByZfAMQ31Z2UvgTNbL7BGVGm8WU
8u+g+bT5gFphphGw.DwxsahSRVkkjk23IZ9HBK5FiO2oer6adu52TFPFT.AB
8ET1BLDyQL0QhCnztxdlWDV8lxU8H.R97DFhSnpi7QXJVdDnu2EcrTABm0Uk
EHvGPzGItDTTpu3cEVOMg9n0DuT0fmmsOKuNfPKvAseyCkYakYcsQgO33Maz
70LZV5LdR738zgdoZEQyRbqeo9YDqalEFEYMiF1jstRewTf0CwoxH9E0HzYG
+nKHIXJZzrBMOh4CvBZ6GNb0JAE1hOPwB3iCPPUyB2zr.6pibNwot9XMAR0p
9SDLdn.Eejf4knNRxUBuvzvK6p2b0d+JTBTKBLh3rOS7G+9dOBNg3L2WJ2ee
uGMv6dSpInGg4ShI4ENG+Z3zUrDMT9JPMAsd43x08e7OkbHpUralfD5QkCFx
YDEeFqlZBjWBd4ol7ruldljyQhfVqAB+1PN+VdTz4RNZ6FX4exifLegU9KNk
7WhVelzA2mHb3WQBDpPEiRgpwXwElX96QIIYe80POMGOq+gZDsnA.f+zVyQT
HWqEF5CUjLMfRnWRR9vtkQ4+VVxY2.JDg.JKDTg2ITEYAaZg3RPM6CSiR9aw
YuJ01N0Q8it0HHc.2W6tsPlTYsEcxtpC+txU82mYEwHyYDD37myHloM5MxLK
ZuYPTFMQPfNXpzfnHc1G9ijA4TRFjOBYX8jMQup5AYP85kpNvb+HiP9QFg7c
XFgbgR8iQGQ5OR8WPvbBDohaNC3yDl5YDHGD3QVPHBYWgY.4xDOz26iAxKEv
CB7fx0hAHixaOn98tXiO7pM8omMzl01dfdHzfloE6szPXu7vFjbBsWOUX2sY
0phOJk5KFZvzXSLXrsmf7CO5iXrdcYyLv07aoD.nZcjvB3hPFGtFXYkXXeAz
iXKAoshAAWaovjUbcJH641rchyjW0JPcNRH.MCoAXQbxsTlTzlgbSR3viENz
o7iHjdlMS39Csf.cKvOJQrxnzm6SQX60LjiHrZQ0YirqGEd5UXG4xUp3Xrk4
gfSXaYZMmF7uZCR3Vjscvzcw2sZPCzh1X8ZTi+sICqDwdVyzkEsYijq6EqmE
ahBkcqpng50b0RpqG3LS01SPupAtIXvsDCpLujSFzSn.6PKa3I8WfnxcxAM2
XfZQy3Jhmb77qhQmJ+pzK+MP8hf8UR9Uc+kOS1YDWlJ654dHieclJ6siR3va
2MmUNLx09rgGHfgS.AiE3vqsjLtSpZOHt5dWLzVH806+.P9Um96QCtP3Zch4
48Gf5cfqAmt3Ame.AT.EWauyNOgun8ncbIRJ2IRjZPfYVuydeIRphpTzfSAG
JcbDTw8YliI2qO0ZlJM2DyFdJ5vvE4Mw6ds.3uJWO2E9oNH541.kP08imoW9
EU6sD2Zt42+hV43ZwvtH3bX8xxUE1wOyIUxkUHce3pO6AVH92ffz4uRXn86f
pmHXrqNM8iZR7OLnHHA6JfoZiM0h9wbsGR70KmHVjTmDObCvALaQGA2hgCeR
nh4TU7DSnv0aPTAn2CQBe8xpvfOIXxcerZLcmhZVBR7uEik35A68MwsARjpW
GjIZmbY3aS1O0V37Q9ujrCqSEVOZ6ygjqzrWbULbvCIAyFGIhzXOf6ViirBS
GzeDfaUKpmDvl.tFvuI4KqvrmGNp1SBqv4hcz.s3quAa4Dc7Ce1qdDT8vPQM
aVouGb76wmF2.Ll3BG+p.Nc1nci532jPE1oZ370iffYLOCfuGb76wmpb7aRv
z8CRGs0fHiv2jCh7iOMHh4VCrA5szAhdzrXn2EN9sOVPmer13ZK2+j7lS69G
FNa7klwMzGbKxW1FYGbj2CbKOJ.zvSk917nuEXRUP2KcALLYaVdb4i67PM7G
zRb1et3Rq7Jzm7NwqP34OjX.8tDCkve23VnbFikmEudbizPtShJXE9ALq3X2
jdGZIh41fCBw58GTByrZm+tvKwJnrxWQKgVp66Irgyz.unfaRWFqfuAANGm7
1DcHUMgyJ38gmiEOFtOpsCiGYSm1sQHd9XNMgMjeS52nBWGD0PNVaYqfF5ei
xYtWPP4gIJjajHGNNxBmM9wJODg92TdHpxaXUht6MhyhfyeEA0r+Rp2XR3A2
Tip9w4BvvXz46OMqZm3bncg3qX2A+293H4jgUCMm03Cxr4pcS0eiQy0btyR0
b8PXf39WmYZ9XHzSIKJJyiBU86+oDw6Im3yxMTuNSmylIDqKVvmq.MrIgnPW
aK4yiyWk38TxnKd3zoAopeAawJypiMkcS5IgtK+JFqitQz21B6KFCbmj+cTS
RKp4yrJ2EupTiszaT1M7qXVPbe05duE9vBOtXNyts1btftH2q0Ad7ivqnUz4
270vX4LtYtWCiA1VYf8TsyxWqWKVfWEUQzH0Pv0QMb5keYHU6WClo9hJLEUc
1.jF5pfzrXOBqlzzi4.zGUe1.jFdNIMqkCgy+B8bUQXQkgN+UFp0Ul4eWpCZ
8t7V05w90v5TN4Brjua8BUNd9Wbvsl8kbQpJVsT3KmxScWb06pwR3JlREkRS
Eje7rYmDrZUemAlVoqotaV.wf5bzu0Yb8NHQ.P9fpSlWpyZEu34WJBasHM9B
v5RrtxL+6UoX62dP6Y2mnCWnwMFJmqiYCo9rYkFrFOmeipDqYzXyOWOA+pZa
sRCCUqcr4YyKMXsWJj42+Mh0doPt.rZVuwzPt.6xvVy1eY18ksCWleWIo1qO
3BTYrtUhdApLVKKQmeYIp0xRr4eGmx5cfm4WrlYO6KW6cvbVYr1b17aIPEzN
3UTcwtFo4WRRoFytNlguLUF6zwL+xRbaAFnEc2SODBXj1YrpHtgfCF9P3LSY
mbzk62MSrulx.bb8oWyTl09Oi0qDTPJ43ouAAyl6xXYanLcTTpCkM7MIT1bW
FIaCgo2Ptad1aPfr4tauerR6APIaAYHcKl7z2.VQqC.w76SZfKUjUAqbldw1
xnIiyV7VL9ZAW6CuVfK0HUg8LbKUR32DURAtTkTMWEpoNIN5UqS56tM9kyZe
eQmfKAJ1oqrs8kN474wzbIOJbceHAaXfXBPPaGTmemSsGuftTauM0Ii9fatM
3gI3ARB8god8BOSOo0pU6vMnNTu9sam3IFznqZlJLo+H3ezyfg5FZPi9m2K7
+5JPfUEHvMEH2pBz2cEH1pBj3tBjXSAR6zR2w1P.hpGCPpY5jgpO836zwV9k
nZ2Y3K65uy4UE59iOPU.5rlJFzpBD4tBDYUAhcWAZG2O0YEXmnuNl2QtQCFw
p1Pp6zfQsRkIwcboXp0JTlMkCVIYRamHGtsJPspcFycGryrlS9R1N2sZ4TMv
3.a7+f.bm+GVotf.bGHaEmLbNAYncbxfYTd1Jmv5zzzwCErtyqb87dGoWrTZ
eFLvLC6TOo5LmzFFzJYqlHrNtnAyFzBMJZIWKEjQuPuFhh06plsOCq2LEMnE
VuoJ5hZO5UT8uXr2cqUNUByJWYcmkBq.X20ACnxDvzB.tq.sRmY.1grP1wC4
vtIBgb6XacHrhryVDj6vhzNcYtjY02tlRl6JRpkMktyqBDwtVRG5rnMNpAcG
EZkyvtSCPfU8aER6WzvDJtN6jzpBq6NHc2cO5d14nGYWi9E6XzlHvq2eb6FF
vi60xGVGm8WUa1wO7miROXhoY0FybGvY41MwIIpMt9WD99pvep2W6OFG95mV
uK2SfPe0daODyQ586dwATZqggT+Rvp2hPIA.j7YILDmPUG4ivTr7HP22Ccrz
.v.cY.B7AD8QxsSWQo058BS2Z1im4M2ch2mmsOKudWudAN33abnLaad35Xy7
CD7hQY39JFsbwi7hco361If2352rMyYcyytvuwNtudOPqhLl0JB+g3TIWVTE
8CtuwGMIXQCYilEn41lO.MFNq6BWIWRaZ0FpZ97wAHnBZ4FnE1zIQWQ6Mm6n
CP8spaDASAJP0NKXpHpijbLvYp90dTRbY6iEBZ0reCH13yD+wuu2ifiH1v8k
xV226Q87dW0RacDfrtgs099mMbdplwFJpDHfn96dtN83U8mRNDUO2oGn50in
KFxYDEe.qtlFHuDb9po4YeM8DppGqfzZIY77VU+s7nnSopp0Yhk+IOBx7EVo
lsZ4eIZ8ITG49DLTIRBITg3oRoiQY4LUQ+6QIIYecp55lLQwD+jQmnbw.mF.
.9iaABQgbsVInOTQJz.JgNGjxgcKix+srjSBzErq.kFQpvZIUUkgM0H5xZ59
vznj+Vb1jpsNam3NZZUPJ.tu1cLAOuxRA5jbiC9twMNiG+pLLP13TrOT2eBU
lH7y+j3Q9+oq+doL
-----------end_max5_patcher-----------

js kntobuf: (this just converts the list of symbols kdtree spits out to a list of ints i can put into a buffer)

inlets = 1;
outlets = 1;


function anything()
{
	var indices = [];
	
	for(i = 0; i<arguments.length; i++)
	{
		indices.push(parseInt(arguments[i]));
	}
	
	outlet(0,indices);
}

Yes - in terms of muting streams you have a few options, depending on what you want to happen. The most obvious is to start and stop the fl.interval~ in each stream (you need to set the /switchable parameter to allow this).

Essentially here the multi stream approach is like having (in this case) 9 copies of the patch - you can think of it as a convenience in terms of not having to make and deal with those copies, but it would be possible to do the same things without multi stream capabilities if you coded it manually.

Send me an email off list or direct message here (I think that will trigger an email to me) if you’d like to fix a time for a call.