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.

I just having a similar nut to crack… very beginner who just try to understand how overlapping grain playback with the flucoma concat plotter would work with fl as grainplayback engine … maybe you found a solution in the meantime and care to elaborate?

Here’s something quick and nasty without any of the plumbing inbetween that does the map / analysis etc. But the principle is there to build the infrastructure you need around this.


----------begin_max5_patcher----------
1323.3ocuZkzaiaCE9r8uBAgdzwCIknVFfBDzhhdoysdqXP.sDsCSokLjnxR
GL92d4hjSxD6XF+jlKlfZ6wu266sQ5uMeV3p5G4sgAeN3eBlM6aymMydIyEl
0OeV3V1iERVq8wBU0a1H4gKb2ppaqnRxU16ge9h0cpe7phR66Wu5tqRiGd+c
rF1Vth2bCuhsR+c0OBp+dtug5ocb25KTToBC95g2TUbqnZyMM7Bk6AxPwKQK
BHYoKo5A2D8uAe07Jee9byOK7Dma4ssrMG.ph+nxc8NoRntsgyJC9E7Q0CDu
0CjvSgUe.ZDIyLjQs.kbg.sh+fds7FbJqYkFcP.FnsFABijXhYHEMEXbsbYQ
ckYpYnoVt+CfUzawZRd34MZoXy.FMUH5AQUY8C6gwLSnWlUKAYIiINqVxjvL
KYE6CvAjO.BOlsJJ7rvHEmXFnzIxT0Jp9WnFpSGBoUrohI8xbklaFhSlHbtS
10BEmXPDRJ0RHiSmHDpXa1GH4UaT2dTbF4MNQfvYL0lRHMahvoFRfMkzDXPj
3rnSkorcmTn1G7QRsSNBHeG95hy.TZh07EkYyTPmJuRckW61G7o1BljGTT2o
qtBjcMJGlKJxkXjLUIFMkrsOnUJJ3sAepqRnZCZ05.ot.XX.+BSVNXmcwcwI
joL7a.vZUitvZUo4QVXEQlTu16pEU.iKEgAYFItZTiimzPufMiHPfLO2zZUx
TYEazQgJ2CqgCRJLuQT1DG0UWd9VfTUBLqHtu77jorZH8J6FBrhgHWZQeNWw
dXlNUkuukoyeJEUbVS.R2QBBpyIFF0Emk6xfhAAX9+Y5vBV2UX560IL00tQZ
rqj0geGYyinZcM778QGAbmo1NOquKwBeLMaRq2YU25QsXGLrFTn4oNWy7IB0
hJEu4dlbevuloClGrsEV5jbXEE37HwvRXdp8hrPpC8rvXhWyaLCKFn68CwwX
DBl8N6xvejKBrqpObNLN9csch20JtVn68lsk2SB5DkKefcOeccyqxzdlVuun
Mk1GsPR+1qD4HCWZntUcJUcEL5L8h.4JV0FO.Ze08v138S3Z6H4Cwy+.Jgiz
bdzI4zqk0LkI.94QLo21ZKwXhhlYHxZfWUeOWpdxB88AW2V20TvsQ1uVTU9R
G9qMmLQ6s0xx.zxXBL0D4x2BCGeH2pbhRlDsy.gvnF96F91UR1SW86+wec0e
JE50ySeoqUT7a0O9Etr1DM.lt.OFTlWvXHYGWoXe+PSQk+voxY+dlq+ZMkiK
zuTFNaMcknCKiRdqRTwTBcfiW7PD2CcTqg2RB4ijhGCIQ7PRlCeArjx8PPlx
+.KHydFcVIQGCIY+H3yIojwRRHejzyKmshxc05Z15Y6zT6Y2FicmKAkbX1g2
ntoj2XyVM8K1DrGKVZT5vYdML6sKVLL1hON.Q8KVXRxG0hYKV.yVvo9hIzYL
.j39pOdd1Xa.R7wcMYLhph8Ip5vxAFl7JpZzq7.FImO+E83aI8Q+FkOIh1Ge
qA6OLu3beCtAlD4s57jgQSvw1n74H2YtSOLazi4m3iZYTL.9nVHHOBtgivKI
zEud5XyLIdEKl9SKpOwmn9ts4LAQNLar4KDerh3zeZ7E7GfuX9Oc7N7EXJFr
OQxhFCGIB1WS.zJe7IC+Xjf2mTeYifbx7IV2ajiq+S1tc2yaZ6eXqHz8jeWs
k5jsvNUT4lRsSa32KFdd61HExZz8+pzM+1031WtGSb+sOC2VqIgUch93VZvo
Eoseeyd30ti4vgcaAl+84+OPb9AsY
-----------end_max5_patcher-----------

this is great @james.bradbury! than ks for taking the time.
I somehow missed your post today, while I was working on the ola version and now I find it very interesting to see/follow how you did the parts with fl that I did in normal max…
just in case: iam referring to my mod of your corpus explorer patch over here:

a question about simultaneity of frames in frame lib:
is it correct that as long as grains overlap but didn’t start at the very same time
than sink~ can do it just fine … but if I would like to have 3 simultaneous instances of a grain with different pitches (each one octave apart) I do need poly~ to accomplish it ?

You don’t need to manage polyphony at all which is one of the great things about FL :slight_smile:. Instead if a new frame hits the fl.sink~ while a new one is “playing” the new one is added to the old one. This is fundamentally no different to how a poly~ output works anyway, as usually you just have a singular out~ 1 where all the voices sum.

I’ve tried to visualise how that works for you below. Time goes from left to right and the big squares represent frames as they would be generated. The first two frames don’t overlap at all because the first is already over by the time the second arrives. The second and third frames however do have some overlap, shown with the red overlay. For “frame 3”, the red portion would be added to “frame 2”.

So you never really manage voices, you just constantly paste into the fl.sink~ and it will combine the frames giving you the effect of voices.

You can also see what I mean in this didactic patch:


----------begin_max5_patcher----------
587.3ocuVssiaCBD8Y6uBjUepJM0fsis6uR0pUDGRV1ZCV.NMsq17sW7Pr1K
4FM1JuPBCSxYNykC7RXPzR4NlNB8CzOQAAuDFD.l5MDbXePTCcWUMUCtEIX+
Vt74nYtiLrcFvbsjtpgo0H7vQsTS0SbwlGUrJiCAbAdd7LDYQ+ZdL7cx7XzC
G9IhtFtnlY.jvuYT1Y9rU9J.Van7Mb5.jN+L+ok4vKJB8P+IuFF1uLabT7qn
hqyMbbIPqx4YWhbDuIWxYIGWXtM9w96JZ09KvERYFPhDnDklMr9+vk3SvERz
sTM5ZVxTWOyu.B1rapqhbhf8cMxJZCyvTOxDzk0r2yti63lghVREatsJS+DD
cC63oKlXi4IzW7X3BmV.4ghKmG7tAr79Lbstd9Zkrw55dDjv0dP0RB7ANahT
RxmXtVy2xlqqjsrKMskAJFINUQbQJzLWL5B2hyRlau+77EOMW7qqSRRdNnkr
XhZNOuxuluQPqmZVZkbYpsz58W7p.GWcq4oSTuYxcaNrSvWKUM6QVoTL56Gz
dtNgIjRm.DdhptDOoL.icXS74Wx.gZu8OlGzxNU0ve0vKHPuEsqXZCWPMbo3
8NgcNcxbsuHk3APjO3iTsxd6WeBZT.m6Iv3QRPhG3jNAIRrOYxxo.HrO8FI2
odi7S2aDOJfK8G3QgiOSYKNBG2zMsscKSoO3L.gUO6YIP+hYvVtvsMC1pXa4
C9COWKhprBWFqpUmBBqncKbWfD0HsIRQG+vblkbVHAsRg8oe5VpiGfjZ3qg+
CLtcInL
-----------end_max5_patcher-----------

It shows how as you increase the length of the fl.uniform~ (in practice the duration of a grain) it makes the output larger, because it is being overlapped and added at the output.

thanks for taking the time to outline and illustrate that, James.
it all makes much more sense now to me!

while we are at multistreams/polyphony/voices: let say i would like to track 3 kdtree neighbours from a corpus and play those all at once via the plotter.
to see how this type of overlapping stream sounds at all and how it can be done in framelib i modified @james.bradbury ´s “quick and nasty” example patch as a starting point. the input is a list of 3 integers that refer to 3 different slice positions. this list is iterated, so i basically send 3 sets of integers (slice n and slice n+1) to [fl.read~ slices].
for some reasons it only plays the last item of the list. why? did i missed something?


----------begin_max5_patcher----------
1476.3ocwZkrjaaCD8rzWAJV4nrLwJIyIWIUpbI9VtkxUJHJHMXLWTwkYwtr
91CH.olMJIHpdb7AQCPLrwqWdc2f76ymErp7AUc.5WQ+CZ1ruOe1L6TcSLqe
7rfb4CoYxZ6xB1J0E6CV3tSQattHS0XuE9oIKaaFlkzO6NYS5M5hs+akJswI
PQHeY3BTDlzcgZGfwlKnuz+G4dNMOtS49KBp0aKjYAKPAAGVTdaViN8FYQgJ
6NYkVVXe9g82Vu1tuKWc6GvwAG1MUxbUip5eUExUY1GeX2s9w74c+rvSsQg5
dyCd3o1ndvJ5fFzJjFFkDWDa0KLxxHFkJ3LgfmvDIByj73k7EHB4TprUxhsc
JLcmZ4KinTvAS.34p5Z4V0aPNEinTytcTvSFE73S3gPXc.Lx5Zvs+dZvNNBE
AvYZ0FmlKvxddvgwgVbMYzQADcaxVtKqsdOBCiAjmPsvJ15nxilHFoDXw3sk
GiD6xQnK9jRrVQFapHDCKB2TUlaV5dXbU6AIwDB9FRnHxDgbxjPba9pKJ.77
Tq8rKgd.iE8zoiAmnSlaYHWktPm2lCb5lzLc5Wg0TiiFIeCCedcTeF5wzPjX
X8wksq0kMU5saUU.6nGNB5iimJC8j7zaJ2tMSACrhCc7RQBa8BtArSAjiUsP
DC5RnNVkD1x5ZtoRIWi9EfRG0qGntJNimZJ2HHSGkUJW2oCNRJ2IaqYVLFEN
ULFBavZZYQ2vtKUkYWR3Z34smLWuCguErOCQhDXQz85h0k2uG8Q2+A0TI2o9
VodM5iGhMpQgKwnjXfJG10vjvYZIhoRHI3.pIVKSMkKhHW.DCOKDiYQGoj+m
CCfq7sVW7Ui4bU6lMFVsZ82TlpB59G5isE5lZTsLeWlocYPMlQIVLR4WUtUA
4cnK.PAJma8ZYSsG.AvUH2H2tGkoJ11byn3jNQbx3tpJmbvIvDuFHAsoj4ZV
cxsywE.G3tKS2bY8rd91Bnw1pc4B+5KXbfBrOqIqxNCCUcpLSgRKaMEoAZHZ
nExXxTKZfBbJ1th+1ipMs2npeWHgGr0LKILVL0dYoSJip5acIOgIwYLOwQux
bjPC+NZCI72CyjIu46YhRdRj6fPSlZaXgPdPmoYJY0BjqXgtKKF7S6uvXl5Q
gQCPswiXp06DmL0LKSp86aqa0vzXROJDN+TA0ii6+IXrQaRUapot2kqUud48
x6TaJqxOD.87jnP2k5p1llxBHUD8YO8nW7idjS7eRuNCmS9.QLLG9V+Alhso
Wi7HldioQ4lSdBbv1NPmKlA3Ek2oxZdzB88nOUW1Vkprbcexz12yC3+T2gUT
eSY1ZSSeLBPpIqVJwpknhjqnVDHaPXvgnSM72Up7UYxG+vu+G+0G9SSgXo27
3maq0o+V4CeVkU1EmBotv4wPhAwk4E0mYWPPlt30uQT6doa9Wpob9B8xpuIr
Enm1OqU0M5BYi1Pb7zh5dIjcKZTqguRZ3gbRIY5O94KprZspxp3+IIZ7aEc3
0I5PeDMG.86vC4zRh.fjh7wkACgKC1CIQhgRR3yHojWrax0q2UpKZ5C7hv8I
GwKIu9X34QQtCw9M26Z21zKvTL99VPYtJ0DKiivhXRDkRRhnr3C66Qt20tuE
9ruo.XXI9D5iSfvEJwCIAgfn9DUPgfRwGDQImx6ZvyOlrTPdk2kHjbj6AMIr
W3.+dj4gR7Uz3qzV4UJNHBn7PNPvH6S1LHRlw8gJRDBQBZeJEfl7hDQulrFa
+9aXIgtuBM9gQPGxP8IlQ.QRdgOzY3etF.v4A3XeUm3yPkxoQCuPsgQ+urYs
wMmayxvtWXDmbXDzNpbepbiCAyG0GJINDgDQ9PxJfnVhHeBI59.JtdIw7QRu
kQ20gqb2t6TU08q1JDSW+2VZcfhWL28cJ4FZeKXAUp6zCq2Mirxzcdio071J
2Yx8fv8kgDjWZbEKZ08gNF3YDo8DE5N+t5cRGRrG7v7eL++v94Sz9
-----------end_max5_patcher-----------

maybe i still miss something important, but iam not able to start multiple grains at the the same time.
from my tests it seems that if the interval between the grain starts is smaller than 20 ms it only plays the last in a row. i would like to understand what happens here.
i append the patch (adopted from @james.bradbury ) with 3 different ways of iteration of my list (with neighbour indicies).
one version with using iter object one with a deferlow´d uzi (basically a slightly slower iter) and a iter with a 25ms interval between iterations. only the latter works.
maybe @a.harker can shed some light on it?


----------begin_max5_patcher----------
2920.3oc6bszjihiD9bU+JHbrGq1sdKXN06twF6kcts2lXhJv1XWzMFb.35Q
OwT+12TRfM1FCx1BhJ1opC9gDFo7Kemon9i6uaxrrWiJl38Kd+l2c28G2e2c
5gTCbW02uax5vWmmDVnurIqiJJBWEM4AybkQuVpGGKqGZSX47mhSW8Xdz7Ry
slSnSQO3wkpWIAS4vqjoHueu5mjtccbZRTodIH6GLaaY8n3pQiWnWtrYe+KD
T8RZttx21DYVuIS79c0L+482qd4gaj1nz9oMJ0oz1d3bnoMb+zlaYaXliIsz
nWf66IT1Fu0u4MOObyl27hKix8H70EdwovGeNLo9xShSilmsMsrIMzBTHkxo
LD7GAIHTBRhB.lt+z.BkhHRLBwETDfPXjPKOvuYfh0o7cysZTdE7TgO2MYYb
RzyQ4EwYoMt62MAPiFCeWiehBT+dl9F4+vtghSMCQ2MTdzyw0+98iFlC.VIf
Vay06wIuJpYypaS1hn7zsw5shYPf8VskzLxzPP.cS3byOVwuqmdOK3KXLhqE
EYL0aBFR+lfsGpAYkUIYy+QjFFQ0ClsIJMNcSdTQTZYXY01e2zKhVFtMo7wk
YokEw+TuIvfjdayurZS15jJxPSA+873cxX2MYUd7hrT0l3.lgZ35k627vZZC
yaRL5qHMbSK+XPBAPlyLYAPjaKlElq3UyRhZH2AZHYYIGN0teWRzxxpo2Dml
dDJVls47SlGu5oN9syxfIW208VOSwiaSMy9HHVT9XQ3yGh1kgIIUJ7Gd6eML
MdcXYTYrgEPP6lLJMDHzmJlmmkjb.8Zl44VlYAHlOO5k3EkOoWnlBCvkGuoV
HZxNt7h3UQEkGNVY3phCGon7MCn2XnsypTierLZ8lDfJN7B.Ej3hxhmxdon5
BqEzZB.6cj2Tsto0yCFuKqnGZI8mIdIYY+X6lly1hMRgXZ.7mzmy.SjReeLX
Gj4OES3foQj4Oh.TY0JtJmK6D0OmYxVLU1blCbY52b+cftLcG6qcyoOzvj5t
e8QJy0Sp8NUYB6JwZMU1CXRB7mJf+X9XV.K.Q4.vQCzHLfwBgzG4yovXZvT8
54ASzYASb6fIkLoS.6fkZd150QoGJ4queoKhzvAwgXWGxoEQI.74g6CYI9SY
X..oAbeJByYLPXThA3lRoLFiGvoLP1kaDSINULkh6DYmEltpRbbb.sRuYdw8
gXTxT7wxhDTfV.UR3DoL.gjsEj3oHF9RQLhzJDKVIA5RP6vPlOD0PWiLFEgl
RUhXDLkEvIbF2NHibopu79zdGGYq0Qk4YPb28AV.tbhoNLDvMBLyEH7wTHnZ
NUdqNNNCXQPWqeCsn2H52nCnVmCCjGvUfzDlYPIUfPpWkJWz39s8wOKRyNCR
2oXoRA9gJmwCg9bmFAwdPPN8fd9ro9f5KFvNerfChkPtwroRFkxCjfeCluLv
GvNtVMmxP99TB+FrHROCNZOPNVHnJFQHIjtAP.wzHCF9P.kiwAhpDlUJ5LDF
K78AmMfoR4.35kzsqW2iW1DmWaBUiVXdLgKCyC6PnyrWrHgCBABcSDfHbI3p
UUSF4TLmRCTdLnvm3A1AdmWKDcFv6f3RtJzYel9p5Pcl72zDtZ91gshrs4yq
4XUN+8NjNgTVKiS2U2ieaueuitv0wK1jAlOJpi6SNM3jnXnBi6BNG4iHDJRg
5DvNHBDjQRBBhiFIwWxUh40N64XtZRLHwSvnSi5rkqzRU1KEFUo.YONhGncA
gbgbygYWfrcWLfaBcB9VsKTZlCGVX4lX21cv1EDK1EpzMGtMA1VwhAkgPL5e
VxQFTMUaXIjAkkHsDLT6V1PtIr0bAYnreaqvIe.YGp.rrCINukypAq6XxDUM
wW7no9+OFVVlGOaaoI3gls.5hpS8pjrYgIGUb41Ji8862bNqCjPfBdc1+31a
91o8diyONqgqr0azQq0x8S7BectPCI4RBFqVxpaD6hnkQ4IYuXAQ2RCV8YcS
0Xq6uZvm8WsY+UkHClWIVEXNWCR5mcW8ytq9Y2UGrtqdj0vyV6LleK0NSpKS
Km0e0xvWZsgjeL5gv1e1W2ovDYKHCUiLrapEdmo7qBq5G0f0WJWzodyoUiQ9
r27tuKAnSKnqv+ytDXeWBZUeFg9KcWBZQnhR+rKAV0k.htKAATLSFPQHo5fJ
3i+KdWB9nTM0Kt3cmucEfAioriO.Zf1xz.JX7kPkDBX+ECFNTWIu04FHxT9g
nnwBKqPo7iPMiEevKK2GiJF++IEGbUXb56cUOHyI+Vpqaf9v0qTh4WVMfHs7
vH3ueQyAJqDxRzj1ZCS5m5xqHdUppBDMqTz5sIkwyeJDRuN44PHrTiYdj6Je
VyipWqOtFPXlJbABqWEsofyDBd.Snieh628yug8PF9rkM6zTdFwxjR7G5xjh
EiSYRi2ePt5hRao1nDtipMJlNNj5xjoaR1V7tWmOFRlRQR70hvboqJxOYznw
um0s4sJMWJQGAJi4JJDOZT3xbHx1vWsfHgTcO07jj3HAWm2Iisqm0o1XMqqE
6NnqglZwhqzFeTvMNd810c51ZWYobIyedR77eXAeGKawsDC6H9NweRONqcr.
e31EwYP3UqVEkaiTOpEp222UlqcsXeY1pUIQcPV9HiQJoPGVg4KralPjrqJd
LmGvgNXtxmxiBW382v8iCTSfo9tJTC4H4aJIKbgBC7rfFUkKVECNxQBsRzn4
cZdVp5qp2xyRd2B9IyjhA5pHVzoDqHXhSonWhSWj8x6de07Aux7vMQ+LKdg2
W2o4T3glh8B76OuJgg0RD9NR9UvGGd6hv4Pridj9IQelNtwqKYf1XnT2xPKh
S+AvNmsc4Rvlmp6Hdl1x380sowkEdEgq2j.Yx2OyTFXZgiqLFIHiruUcJA8S
nbtVpk4pDBDiW3xkgqdW0JjUkO0Ocx3Z0RYOJmTqoywyvKr8rhUxLYt5rb63
hQiDK1jDW1SBrU4H3a5Vu3ZHxVxKf2g75CtmPAuJa.KTEyCSh7L+OyneUTjl
jwDjqRoMXzXrpf+d2q.RuIpvdiv07Zl1HLVPbEg6ZOpQ+T47rqPg3AFyqLiQ
n5WuQGmX9jAfMA9MuXGk7.oodoAtp.gi0wFcdRTX9CdlfETu8PsbZ0aLFD5Z
GHfoUmXpV5DG3pv97cL8+8hsw8SEBibp4PsbwcEnMGjWURn6aEf5zgtqOIKS
1FuX5KgOGsLKe86Wiv+rskkYo8BDUdOcUt37qBEbd8kLB40Fh6BDHUhC5fkB
bTw2NegvWBIOWNHkTyHx.DdZ1yQIkuoI8289loChZaceCR6qoB+2TEqn3orj
EPReLRuxJAl+KUIbELQFuPQpEHTvv+MOZ8rjv29x+7e8e9x+FBDa9Su8qaKh
m+Oxd8WiRxT5cVX.wzdAWgE3qQjQulGd.OLXzwcUtBoN8.cvZ1S6yc9BZzI4
S3FVuRxwZkN74NbHWI1nsRTaVIFxAqTfEKzgOkqGehZ3Rot7t9joBBV3SjTJ
IPRYpyuHhbl41c2xxWXdzIPCOcbvwJY+JiuoU12hUV3.NkzFcWIwEqDwFRJv
EqjMx40D9ssRikpqfaC34B1jvF1D12EqD1lUxEliD1HPPCFB8X6WZ74LEJvL
k4NV.xbPj369lqM2wE1Hk4BNB2FduV.A2iGBt4nXq5iP82bMOzpMqF65ayxL
OLXBNY22bNO7PPqiM6MyCs.UbgEIVvnEfTfsRk27JYC3wcxJQrMFF7stR1nl
P4tH3ba3SLWDJAwl3vvNYkrXgbgWWrMXmKHHrUgvRGBmt1uzXWa9EaiKTL0E
3K8BLK1oWILUL0WdThT21dyFmPAcs0j3pRJhmRN9vKUma3oy4hscutzbhVnM
gEJN0VooVMG8r9qVjidF+O546+zms+y+b8e7yzu9.9etmk+6+y6+eDjmR9A
-----------end_max5_patcher-----------

In the middle of grant writing so no time today to look at the patch, but framelib can trigger grains in extremely rapid succession in one stream (a tiny tiny fraction of a sample apart).

In a single stream you cannot have simultaneous grains - for that you have to consider “polyphony” and multiple streams.

There are thus two options for simultaneous (or near simultaneous) grains.

1 - you have a multi stream network
2 - you trigger grains a tiny distance apart with some suitable method.

So the first thing is to confirm if you are doing 1 or 2 or not. If you are and it doesn’t work there is an implementation issue. If you are not then it’s a broader conceptual issue.

I will look at the patch when time allows.

thanks Alex, that already gives me a rough idea and a direction.
the grain time distance (25ms) already worked but with 8 grains it adds up to 200 ms and when triggering a big bunch of grains with lot of transient it would be nice to have them in dead sync… I will look closer into the multistream stuff…take care

So here’s an example of 2 (super short gap of 0.0001 samples between sounds). I can’t remember (given that fl.sink~ is not set to interpolate by default) if all the samples will trigger on the same sample exactly, or whether the first one might be a single sample earlier than the others, but one of those things will happen, which for most purposes means they are simultaneous. I could dig into the detail if needed.


----------begin_max5_patcher----------
1862.3ocuZszabaCD9r8uBhE8PKfiiHoHkTOEzhhdo4VuUTDvUK2coidrPhx
1IA0+1KeH4Xm80XItxGjLk3pgey6YH+10WsXY8ix1EneE8Onqt5aWe0UtGYe
vU8iuZQo3w7BQqaZKJksshMxE23emV9n18bZDhhQTBhRQz3gWW0UV2oKjZ2O
F2+T0J2Ood4cuKlOLU+7zeYmzubVr.8u8uZmPmuUUs4SMxbs+sYzraitAk4t
l5tRH2F87OwPXU0.cI1m8eWes8xMSDmXjAhnXDCwQInTTFBGgvXDlfvTDNFg
YHLGgSP3TDNCQhF9D6ZjsxJsPqpq9TgpRlW2U49nbnbKZx33V73TG2B63SIo
gmckWWVZ.2drKy5bWmFo2JQJsrrEstotzMrP0pQ0URjXsV13dTs4Ryvm3UbH
xA4PQGfC8r9zgXCN7ywT6ML2ciROFa.eAXCMpMajMsnGT5sHQERUYv98hBT8
ZTzsQQQXTqnbWgrEsTpePJqrLlRzOa3DEqLOC0VJJJjM2fV5XqBMR05eHRVU
2sYKZccCpsqQ9KGjSFeVsQFXdM8r753TmtF1eiGMG75Vy2zoNYnvRil0yr11
EfQVzIPl2JJNlbKyfLVryXZVPVgrZiQuw.HqwCXzPRNAZHQINyfjHKbRnyGZ
Lpeq7dAz0F2BhRYgZIbPcRCcivwhCF61jXJkyh4bVVLOiajXXR3wXk7AyhZO
Htt3VsXySHufCbPQR73byS8t4oYTmr7Lt4oALpnMzuI5WBbHRGGDYINquLt8
pQ7F7.YGWR5EhOAGhjoIEYYVoH6LRwvps1UoLgOJeB8dSPoNYuiS3PFONHSR
IdepXmO03n4TtluUnpNhXkrOFwmPrdCPbl4741G5XlfoY4Xx0nBt96HcB0md
IG6S1hbZLFOBLt4sIuR+dfBaPFCS3SxJwxB4KirrGFaUapDEuVhV1UnUF0kp
JYw8hFkvmvTzIBDE4XFIYwdSZWxPX1LXLqQKQEvYRG2vconZyYUrYbeddl3t
6Gvk3BGMWtv1Uz09DBtOK5HcSy7wf5SbhkLm1x2UqdCFxT7jh0FG06bdNQns
LQyTgCxrQhQuh6AyTLgLagdyKT4e9MjZQ5hy32BhwZxALViwyY5FhtUp59hh
gid7Dk0QG.2oWfzrz0a1THACqj3QEnRYCBcBTmF4MbS3Nuv9AwgDmGqn.W3R
81FoXE5mf6PNYjNj6AJ0WeW57UaPQsXkkG7FB5jDMILR702lDMmFq40U1g1a
M0EOAtRcd1hyKzh8oFEMqH5AU0p5GLE63+GjtQrS90Z0Jz6e1Dr0TCDFkkBV
zxYirGs8oJ1agxSmM82UhbSBSHBbI5Ia7mGGYjr4uD8VU0mMhykcqWabd1p9
pDwhr+gduoxVc6PyUgKLISIP6fH02KTBcV4Et7fgCT7jzZ4TmVa7rlE7XZsF
OZR3j4aMwkn0ZGGmlO7aQTx3SCh9FBOuEzztqPoOZUaGnfUFd7cgYntF+F.w
3yIPMQU1Y7P0lKJjH+Vt.tLtroIWS8a6EYVatlM4umPslxajsi0ILkMs5WoX
+98QBOvke0F7DbfSL6ToBwx79P8tRYCWmOwjIt4XkQ3o4Wkmj46ezLtS94ER
gaeTsIKXucyfdZ+s3XS9nf4.oira+NyQL0obhyt.Y8cWamBd7wQUCJDDxydg
S2W2Cz0JSTbC050F6Tqt8Aw8R2NQrHTkArrSqqqfGEcTLBWyROOynO35EnV7
iXh6UxGbDCNJ6w2jt0lhd01HsmGwjd4uuQ3yX8cV8HCvqpuWVn+hC5Og9Pac
WStz4q6Clx9doA+GrMqncacwJSQewDvroIriPd8g9VIymOtyfBgkM72MxxkE
hu7te+O9q28mlDwx29kO10px+s5G+nrn1ZLBemDBgJyKzXHouAlhaFty6xOb
l1bDw97Wyo75B8qugiiF56DZkrUqpbmQlWLI6lkXmzAkFPozvG4jTx1m2vPI
7YnT1qVMkpU6pUU5dtH2uskjX7sjerworjDeeE26cSbYaOg.yinvdp5lGJYO
XGmWn+ZMi5lUxlia8GdRi2mzQShzY.nb7gILYVHLIzLa6YD.DkmpBEDgJ8hn
OAhxjCS4ooNQf34bPBLMJAQLRBgbDhlJ4hvMwPHcVHBCEAfP1lmOcJkBgRzK
gqN3jN7N3AP4PjNAABDwgPigBwPmFBMFJApeT7ToDC.kXAIqFHF17PPIHPJD
tiYPRjkwCEkhfPI7wxYlk5NWP8G0ONi87nP6yAzhkiArX4XWsV7X1yiBsWJF
jBr3QAPFxgDuwYjbT1BGm3OaW9caGm97nPKCguXCtDgCJcpfHQf3kEGhXTbH
tj3gvmTBDAWRHRQLAB2iGh3tIPxsOIDbOPYKsGc7c4Qra28xl19I6HwhRwc0
NShzabCUU9gT2vF48pg46536BQS9VkVlq6Z7Me9Qt+PXsnr1XbU0o5suLfyP
RWW0rMptcmviCWy2t9+t9+4FABwD
-----------end_max5_patcher-----------

I’ve just checked and in practice with interpolation off for fl.sink~ the grains are exactly simultaneous in the above example. There is a limit where there are enough triggers together that the combined intervals sum to more than half a sample and the grains get split across samples at the output, but that depends on the gap between them (here 0.0001 samples, which will be enough for 5000 simultaneous grains) - you can make that gap smaller if you need some ridiculous number of simultaneous grains.

thanks for the patch and the explanation. that makes sense…

I read more about multistreams and just tested something that I thought might be easy: creating 4 interval instances that get their interval-values from a list.
hmm, doesn’t work as I expected: sending the list into a perblock´ed fl.frommax~ =4.
or is there also a special treatment of the list values needed when using multistreams?


----------begin_max5_patcher----------
854.3oc2XstaaBCE92IOEH94VVmuAAlzdRllpbHtszB1QFm1rU07rOeAZRWS
K27XKKRwHrM9yemywmK9w4yBWI1wpBC9Rv2BlM6w4ylY6xzwr52mEVR2kUPq
rSKLSTVx3pvEtwTrcJa+paxqBdPbXjMTU1M47quTxxTNDv3jKhVDfhu.rH.F
ALOP51fuW+M7sk47BlxBErty70V.Dqt8SQwgGloXqpYp.SmOMetoYgeHh7tp
2gIjkl8NFLXhD4OhvYOnWxWwiqJt3Jolizc6C9JoYXGVperg4HRX3y642VgA
IQFFljZ4IpG7j7FJLnW44G1G.QKGFEcZRzRK2hvuOCQmfgnofgJ506Cx4Jl7
dZwXHJLwpJg.36yT7IXJdJXpjxWKJ2OJkIgXdDG2ekIYJnXidbePD.D74s7b
UUPY0nnLLwpVwI8+HZj+3bUQ9ZlrCD4NtXUlnPHciXcfdnAdz1+jT1cXs1F1
8IjVc+xJXFG9GAKrFrCMOuBGIfvvCABjzRlV4cIiSWUXoE3LS3gwQSpvi7+j
vClBmRgGJcZDd+Yhr1js2fCshRN+7LMolGK+aadrgIWUHxtafgqQZyAsERLx
PxkfdG5BNIYW9Q8YfQkxkyPff58A.HbpxdF..ihhD6Y7XPuoHdRRpTvyXiJk
xXmeeXuMQwSR4AUJIiVlud3U54nYRxg19kD4aYoV26UBtpJ+m1sBTuv9s3HQ
qE4t3n+sKFH0OzE1mdzujj39p8AmVrPF.+KYUUzqYuR.XN6pi0navlFxfOJW
Gu14MFhh5e75ykRgatViDvPqEFl9OesvMoe4tcpATLL9rqV3FJCiGZwvcHfq
csBKx4+98lZ2Pl9eofnRrUl0r8qwH3vNZMqRkyopbA+n4fcy4jh5NiSZG.B5
AfLWxW6.k5AjLUDztrC3AjrKBtMjf9BITaHQ7ERvVPBk5KjZSOYJeY7Hg5.R
DuXk2kysPefDrSdH7gKByc+0tzyG1dDbWPJxGHQ5BRHeX60IN4C8TW.pw233
L85hq7F+8iyUNZXH4B+R2r4dlrpd1VPzYbbq69SRVXeMm6d0l9Vnjcedy7c8
Pk57GT5jG1JsarvcwtJHBKEqYR9175P+Z5ogzlMCmpSCeC0wDaROyeZ9ubfA
rBN
-----------end_max5_patcher-----------

here is my goal:

  1. looping a variable number of grains/neighbours simultaneously from a corpus, each instance loops one its own…
  2. set the amplitude of the grains/neighbours according to their distance to the query, so grains further away will have lower amplitudes.

from the top of my head this start with calculating the length for each grain and set the fl.intervals properly. further down the line I would somehow unpack the multistream to individual streams to set the amps. more test the next days…
any hints are appreciated.peace

The issue here as that you’ve made an assumption about how lists going into fl.frommax~ will behave that sadly doesn’t match how the object works. Lists don’t get split across streams, because lists going to fl.tomax~ are converted to frames (which is very useful for other things) and there’s no way in the patch you’ve made of clearly differentiating between the fact that you want to separate values to different streams, rather than group them into a frame - so all 4 numbers go to all 4 streams in this example.

I could see an argument for fl.frommax~ having multiple inputs when there are multiple streams (to mirror what happens with fl.tomax~) and I’d consider that for a future version, but for now you’d need a way of splitting a frame to streams or sending a different number to different streams. So - that could be 4 fl.frommax~ objects each taking a different number, or you could split a frame to 4 streams after you are in framelib land - I’ve done the second of these below.


----------begin_max5_patcher----------
1010.3oc0ZstiZiCF82vSgU9YW5T6XmaUZeRVspxDLCoShMJwYJcqJO6qujT
nEFvIwaV5HQhvXxwmuui+tXlusbQvZwAVS.3if+BrXw2VtXgYH8.K5d+hfJ5
g7RZiYZA4hpJFWFrx9YR1AoY78z7W.xcL.AzTQKKAaqoUrFPAWJ.TPUaor38
MxZFsBjK3bVtrPv6eL6ox7cE7m+TsZb6xgDF8DbE.kXtElkYtAeBB96tuDus
pfWxjlEFpavhMlkiX8meeVvoIJZk8yDpG76KWpurZhrNemXug0F1ZI6VQas0
Fvp6sBhs.D3UZYKCvn46bf13P8MLb3zNwezly9h5IdAq2V9j1ceDP5+HKNxu
tmYYQPvOVtWgiXb1Yt1DjghguEEIWRwnqSQjWon12pnH.81jb0YubgvVm58H
b3kDlbcBS7nTVtqnA7EQ8KM2RclXUkF1DAGr1LJZNDmaqUbjd33XUmoOEsBj
Ea7Ug21WcENRhmC046NBPgIiigVuXXhQTFgGtZLbNXnj97QcDUVsJv4THJJ0
FREdm8c3qvT7bvzZJein53jblDh9Vb7vclj4fh89wifHHD7gVdgrAT0LIJiR
sAUSG9VTOl.oorXCqdrDwtErSYZCqRNOfJqjoiVmKJE01uiYp+zkeL4W3h0m
MSyi6zEz.LPXzoj.5JXTNuOw3z0kFZAeHLdXbzCpwi73a7PYnGSiWX17X79u
IyZWsCXTxHSsFl9nDY5AUdj7+s7XOqdcoP08y3LrgJ4fRgDa6D.N3TWnYo5x
+33sZ6wgRtrRFR3f2.fPyU0yPHbRTjXxcGCGLEwyRQkBdNaRkTFayPfFrDEO
KsGXOKohMGA+IYJzLM8z0gUD4aoT6FcqfKaJ9GyRAodv9s4HgtA2aRcWObBq
YfzcS0Te1Y+klFOTuOzemUQEqog9L6BCfduqJqj5BVegL5sxc4qsQiQ1idaX
4q+coU3Nl12zzH5EFk8v2KbOIs6lGQyv3e65EtmxQjw1LrCIbMOqfxB9u9aE
XVP5w+YCQinsNue42cfsfSqnMrFYAmZ9A.NMGs9ROoqZqcEHU7P.9N.EYmyj
wIzAbB8.NHGvA4AbfNfyj8OwN.DwC.gbBnXOfjNEv7fD1AfzMPNcfbAIB1G5
AWDdjPefjSbxKZbWh1Q7hHG4.RXu3mbAo9kyzzdNscxKHAcY+ThuP5dgwCy7
ER2KwDl3KjtWpVrO7S8gztMRPereJyEUtO.xEFcAN1xvn62+JqtoaxFHTUd9
Y6gqktx71Bt8slx3CpYuVzOeSAfAzZUcjRUQjs0lkUvgXamjAUhMrZdaQWIf
JxofzTUKW+exvdpkGlheW98k+KbIqWqM
-----------end_max5_patcher-----------

thanks a lot for your very quick answer Alex,

is there also a way to dynamic change the number of streams by checking the number of the list-items?
when I send a smaller list it wont update to lets say 3 or 2 streams but will stay 4.

Stream sizes in a network are fixed - you cannot dynamically change them - you can have them stay silent by controlling them in some appropriate fashion (such as using a switchable fl.interval~ and turning it off), but you cannot change the number of streams on-the-fly - this is changed only when you rewatch. In this way this technique is more similar to using poly~ or similar where you pick a max number of voices and then manage them appropriately to your needs.