Multi-stream slice offsets

And to “unpack” the streams you simply use fl.unpack~!

However it might be preferable to just do a calculation to set the amps where the maths is the same or all streams, but the numbers are different - I’m not sure that you need to explicitly unpack in this case.

I see. yeah the number of neighbours change the whole time.
I will have to dig it.

what about dynamically exclude streams from a network by only use 2 of 4 than 3 of the 4 streams ?

I knew about fl.unpack but i was not sure about how to get the n distance values into the multistream. As i just learned Fl.*~ wont eat a list (with changing size) straight away… i would like to prevent using unpack for flexibility reasons.

All streams run all the time, but you can do things to stop them creating output, like using fl.select~ / fl.route~ / fl.dispatch or by not scheduling on a specific stream (check out the switchable parameter on fl.interval~ for instance) - obviously this management will require some programming specific to your purposes that is a little hard to describe in general terms.

For now I’d advise packing your distance values into streams similarly to the above (fl.chop~ and fl.pack~) to avoid unpacking further down. There’s some interesting things for me to think about here in terms of situations with larger numbers of streams and feeding max data to them - I’ve captured that here It is fiddly to send host data to multiple streams · Issue #106 · AlexHarker/FrameLib · GitHub for possible enhancement in future releases, but for now that’s the way to go and for 4 streams or similar it isn’t too bad to manage.

1 Like

I tried that, but obviously I need to chain the output of the 4 fl.frommax~ objects since ft.tag~ (the next object down the line) doesn’t accept multiple cords in its leftmost inlet.
here is what I have so far:


----------begin_max5_patcher----------
1364.3oc2ZssaaaDD8YouhE7wBUl8N2s.8KonvfRZiCS3EARJW2FD+s28Bor
TBo3Zp0zNw.lVjhlm4Lyryb1Q5qqWEss5QUSD3O.+EX0putd0J6kLWXU24qh
JRebWdZi81hZxy1qpi13dKUtpPU1tqJup18TPwvMWd.72c2b4whpis4pV6SB
0c0r81ma01O+6DT+y8PZcZgpUUempLcatxbKvt2y8LZ+2CJGhQQmP3KkUaOy
VfFK34CmaKGRa28orx6uqVsq0c2zDTLJAxnvDJiw3RIZCP.owXFAQwbnjRkT
tbC.6dbT3kjKq7D2LW6aqWaNr48fik9l5XI3XBSfIPhfkHvTH+WEGKV9l5Xg
vXJIgffDlLQm0JXKoisT8OZePuCnU8n0rh9Xd7u8D.gSh71KFMsiZ.5SDnXt
HQyYtjZ3GiXNhwiQR76srmj2xrGBW69vuSxXZqz23Sf+jNbRCcfZZvwyZ1b1
uWOCBGirYPIXa3Kgc8Ln.S5z6eBjUpC6Ojl68pEjbtKW5IKSxsAWH55rkDT1
VmVtup3Iu4I6lqJvsQSNO7UEFmk8gSStLfAgfObrLqsATz3Mw42Z7kSbKdYu
BYyEpllz6U+.0QZpRf5C5W.8mpyrzOtqTuvbTHCe.9JzDZBq9yPzLYnvxPlq
w1xxP+KEMyLUXhMtYK+PXKbzCC6SUoujTU7bSUQVxhsqHwKHYyJObr8NHRSF
P2qwm8ZxYulBP9WVdl9AlVilt1DQ5Z57ZnUKHdB+yHXyL8moS7M5tLBvd24J
fyyU.moqP2b15Jbcrd6cEva1UPmo7LlqastvzqlmXDUKMpb.BfADvHpuYCvx
wEorMs7dix6w9qOdArSzVhVJ24+H3WykvBpPt8YMV6SuUVf+6JAKt8ckfbUJ
oN4qzt9GKjJ8OVWUX2JlcKo9KZkN2tBXKWIBW+Q5hs+q+KGjqJGle3A1t40i
q9jSSb5cRVrE1sfLvVuYHBM9Ntz6p4zR3qJ1gXScQRW0Ko4jEIZl097PZlV1
JZlYq8zi6RSWzgEzuvzaVJIybIIhE6FS.zJZMA+9llyLVZJ47SDKm6LR6Gx2
xSy6SaUufNmRzs24DKrqOwItQ9vfwjD1BUrcW0QynezpEPPuIs.MUI29eMmd
UpS6Zxb1VqWJoRu3rYFatCEwFeW9b4VPNXKXjYzRFPMTxUSl8RJbeyltg4AW
zBTGT0ayq18E+ioHw7hocpcIPaO0Dn+rzdGQ4Yke+mfsEEy0uj5MUGq20aS8
SRG7LP6UMsYkosYUkmcSb28Ln20Wf3dfCK.3f8.GymaxMCj8gfmBIZnPhLER
nPgDZBjvxPgzTwIyGN3MiDyGfBQhmOYdzPvH9xgDZoPZ4.BQ8.J6FAC.VLOV
OIPACponkQf4Y1SQ19CUZUUM85m5F8fsMKSu2tNoi1VQ2j4IP9Zc2JR1jjIK
Keg07ctAB1MdBDzJzh6zSaNKDl1zYdzP4E7JwCeiHYCZS0bRRB.mjHOhrRZn
PZJumDGJjlTVTHpEQ8Q.FUFJjlx6wfgBooxHXnPgzTY4rPjQP7ILEBA4LuTQ
DBfPKEPvEBHpbg.xrgxoEud4MUUa9x5M5tg8VNq3ETYZD8Dt8yRceyDwxmO6
VkZKdA0mGoIOge4mqFVdxRIluEzlAFFLa02tVCaqTtLlb9OH5IakREwA0T8s
U9vlJ2MhlNi6jDxPXcTeWJfWhEczgWyA+gYyjd3vCp5lt+aKnQEoe188UUrw
dZVo6T6TzhpUOj0e+tqjVu6SYspcsGqsFZzib2PkiJpz.WdLqa8tltZHsC2p
LsP0bH0wL6LvV+s0+O3tJW.C
-----------end_max5_patcher-----------

my split frame to 4 streams version works for now . what I don’t get is how to address a certain interval instance without unpack it. let say 3 of the 4 streams are up and running while stream 4 needs to be stopped. how do we do this?

I’m not quite sure what your intention is with the fl.dispatch~ and if you only want one input then fl.route~ is simpler for this purpose anyway.

Blockquote
I tried that, but obviously I need to chain the output of the 4 fl.frommax~ objects since ft.tag~ (the next object down the line) doesn’t accept multiple cords in its leftmost inlet.

If you want to take individual streams and make a multistream you use fl.pack~. To go the other way you use fl.unpack~. So in your patch you can use fl.pack~ 4 to make the output of all four fl.frommax~ objects into a multi-stream to go into fl.tag~.

However, your patch is just sending different intervals to the different streams - it won’t stop the fl.interval~ in any stream running - that can only be done using the “on” parameter when fl.interval~ is in switchable mode. I’ve addressed the second part of this (switching) below.


----------begin_max5_patcher----------
923.3oc2X1tTiBCEF92sWEY3m6zslO4icl8JYGGGZMVQgDFHU6NN1q8MjPUb
0BAAop3HcHj127bNmbRN4g4y7VI2wK8.+B7GvrYOLe1LSSUMLq94YdYw6VmF
WZ5lmfeub0MdKruRw2oLMeU5x7302tGPO7p7X05qSDatnfuVYUf.iVBW.vjv
pOBPlGvKgfyq+NhsYIhTtxHEstwjKMJnU8mn.um6obq5PWQ0sZaR82btUPOO
v4Uu4w4yqtsXBXDQQCjQ1Ilw0WKy0LBPc6IQQQtPI9Mnj91TROJkKZ7+If3Z
+5.Hl7Ih3qJjY5ttuMfQAFfQVfwsCL5M.FOIAxJ4lMo7V.ASXUichug.5g6t
yQivhh3LthWbAWDuJ0Ltg8iwDg5CBSTDaoeyKbz.fN5qAyL+kjlWAnAvbvWC
lsyKe2Tx9LP4QxLkGeK.Z+qaKPfM+DIn2KwhOwqv5P1Whd+Crpruj2Y1Wp+j
.YYZxk7hV.gEZBTYLqaBZ7YTXWjvS4YbgZsLUVT60Meyl2d5WnA1jwLYs2SJ
bqPtpwXwPwy2LikOBiGkhmTiG86jwCGENkFObzWHi2wyM8i8.DNn00bMq4Po
lcUwH8div3vOGYlpAYxhOB9VDejyKVkJ0UA2ZN+fpEupKAF1+JG7OwKPqjUK
OC9M0gvGnYF.kAWF03JLzumPSfSd8gY7xx3M7WYAvPn1sA0IBptwfvt2nhO1
VrHt+oCN06FSEuYOPJ.5MyxKtKNsaeNgZ1SCBB6+o6DchosHVboLauCI3QFH
886sGkbhQ7fibudxIDb1VQhpDjUBNq79DMsUoba+ndp8xg1fYDp+IvFjEvHi
WZh3+OYVyXsp8WZVJkaKVe3m5vwjBddzdIuTkHhUIRQyNoiDAniX5cVIlqJA
GpR5bw.RWJEX6zvUB6hR3wPIjKJgFCkftnzf8SDW7SrwvOQbwOwFC+DwE+Da
L7SDW7SrwvO46hR3WzIYQ0NpqRjMHooNIMcLfD6hRjQPIbOrlCCIjCJgGgoW
QNpyPmbE3nNCcpEyQcljIV+2TfmlXAGVPHtGROLHcI5.MFB4fNiw7WWx6Vcv
ECWHnKJELVJ00pV3nwRotVIlPGKk5Z2EjwHv6fytckfuRI6l2iyyuiWTV2ai
H5pWtwdJMgKLOlHrORLOVvuK4P+M0I3EWnKLQoqJYagYf4sy2ddDdYRc5Bw1
j5kh03okzTYjHVWSedrkDSATyeb9+fbh1tO
-----------end_max5_patcher-----------

the dispatch was meant to reduce the items send to framelib-land. sure this is not needed since the streams willl continue to run anyway.
I also tried route to do this… wich didn’t work too because of the missing pack before fl.tag…brain update interval was set to n years :slight_smile:
so fl.join and fl.select won’t work instead of fl.pack because they will create one frame and merge all the data from the n inputs while pack does the the multistream thing, right?

You could use something like fl.select~or fl.route~ to turn the output of a stream off, or to stop the output of fl.interval~ going to objects further down the chain, but you can’t use it before the scheduler to do that (it will just control whether parameters get send to fl.interval~ or not).

fl.join~ makes a single frame. fl.pack~ does the multi-stream thing. fl.select~ Is for switching between different inputs (it’s a framelib equivalent to switch or selector~) and therefore does something different entirely.

ok I put everything together: the max list to framelib multistream conversion thing and the fl.interval~ reinititialize thing to get instant interval changes.

the reinitalize part (now patched with framelib objects only) seems to be a bit complicated… I guess there is a much simpler way to do it?
another aspect thing that iam curious: I don’t know for how long fl.intervals~ on parameter needs to be set to zero before it instantly changes the next interval. is there a way to use per block or something instead of the fl.chain~ part? look forward for feedback.peace!


----------begin_max5_patcher----------
3115.3oc6cstaqaiD92IOED9WsXS8g2ur.6O1mihh.YaEG0pHYHIeNoaQyS0
9DrOY6PRYG4HYI5Kxwt8Xf3jPRKNyGGNbFxYn+i6uaxr7WiKmf9mneFc2c+w
82cmqHaA2U++2M4knWmmFU5Z1jWhKKiVFO4AecUwuV4JWfQTAdSwqhpl+bR1
xGKhmW4e7LkZJQBuzXghyIJB4ADQNE+.xHruSoSwneo9Ajrv8Tym8q+jgt4o
ls9k70UowUNRgTWpunpeeUruilLY6SA9.IYaZO0V1ed+812d3j4Vrie6igoJ
7QxvjqRF1xuHBUzCKSz6cLV0KKqkedrbV72.RnEGuBklTVgnnmJhdINMYVu7
Mep7i7Mk.fAgQElMuT.Xvv8hChyCNPZRqwE0beM6e2jmRRi+ZbQYRdViVe2j
nUqZT7cM9HVL6WycOH8CaKJIyWDaaQEweMYym+8RiJ.DqBfq0ENBexqR9j2e
L4KhKxVm3HEegvnWMI4FmxfQfxUQy8eX6v4lpeeLPJMNjUns+RRX1ewMM.ZP
PXYZ97eK1g23MEluJNKIaUQbYbVUTUMwus5EwOEsNs5wmxypJS9ONRf.O0tp
+oZRryJsLgi9+2EIQoa4fkEIKxyrDwNCE1h2zcf.la1i882YFWKxhV0wGFDk
.bYOUVBL45xYQE1QpYotdftoxp77zcqZ6mKM9op5pWkjk8ATrJe09qrHY4y8
7YmkCU9ReOaWMkOtNyW6ifPQ0ikQecWztJJMsd17tO9WixRdIpJtJwODPwaq
LNKBXzmKmWjmltC+5q4qcTyBPHed72RVT8rqiZJL.MOY0FgnIaGkWjrLtrZ2
xphVVtaIkU+tGzaTz5Y0SherJ9kUo.WraCfoGfdpxmy+VYcC2Hn0D.deQ9lS
papZbmx6SE4tpIeJcZZb1xpmeqY0cnijKkdYX2zT+rzlpAasJXymWmZCGPiX
GZE2TtaEhZ8LiBj.Csug.kJqqBDUztI3JxPnh37iJrKFp7TQ9KPyGRRQpmxL
RNUZ3TgPSML.fvdqHnCAPR4srbSYbJ.Cug3CCQbuMENHhg4OfXbtaIOvrigv
H04GiDWLLBrC32NNDhZngMKSpO+.D+JCfXflm9PnluDp9wKE9VFul+b9J.uP
jiBw7qmMrLkhreLh2KF8Pie1OdQuxjunR0ILCTQu8knXCJQ0MFErDEa+XDKH
IpaGoIxoIMwu8klnCJMQNMoodLsjNnzz0fjjGmHChScZZPvvj75GlbO0ivHa
lYZ8FUYvbnVrsL29UYeeuHxH3oFtQEyAmFhy102YGIjsH90ys44dh7Xr9Vqm
JDLlT3AOg0logAOcOVNg2q+HmJ579lHkljsusFvw3156F1JyWWLeyPYsqonc
4yEwkUIYa2Rse9cuO.qsZ1vWRVrJOIqplR3JwTgcCTcyFs+mo07UacneInQ9
CkQrVpEDmXM6EMpTAITpfLlTAMTpfNlTAKTpfMVTA9PjvGMpfEpzIcLkNYgJ
cRGSoSVnRmzwT5jdHxEiFUDp9WqwvimbgHT4B9XJWvOjQjQiJjgRE5QbDYyC
OLrXznBUfTgdTWS0DJVHGQpHThPLliGgJa1lX+fwZJ0TcqcqmK1X4ln9+14Q
jWrvenz3OWlqCK8Bf6nbrksXcZWpstt4UxmLuxNAdkpjGDuR+j4UwIvqjCjW
Yex7p7n3UlapITUaV0VU2rJuSeIuuYDaLwdp7KdzGABOFUUUjLack2Gylgfx
AcR4KSymEk9gi2tqCR+92ItyTfOQbQ5k8Ml8MNt2X9hKaGGP93ehP6O.n3Wc
A.UEZFJEkdfbqF6OkeUub6dBoO1931YQYKasq0cbHsmqP+Z8pEQUwnpmiQv7
n3huFkVdf.Q2g+Eseb4bE4e+8K7uX0yu7gVoT5NKbgMlv9d3e88v+56g+0oD
9Wa1i4tN2k4EwvjlrknHTYbQRbIB+DB++9uknnrEHh8O9AfpAcnnukT8rsYo
VwAzh3zneGk+DxsBaYDvbwk+HpJGUDmjkTkjBh+6pAdZSJvZK07709s9lOPT
VwcmtSWmuAQ3VvR1ydzSTGydzegOOGFvb1CzgwvBAXkhlqO1Czgv9jOPmK2Q
FFVnK1I1Rj3vBjQ90c.o02jaXQwpnhJT114fve.EkMOtbn.aDSbdcrq7nTLU
qkJNwXDZBgKo.1g8PH93hzglRVyVNOO0aSxO6zKCuAd8P.W53JrPqof+MDe4
B9mO9VBKahfUsNb30q0pS7rViVu3I81EO6eB8+3sgC5FAwOalRvDEUJXVgPP
gnEIYaUUJe.wGNZSGgy9ldMAVDrv6ZixvzTFkSOAvReKCVAGR2cKeI3sgr.B
2aysb7dWGMyCgWD9TE0njBthqLRvENPZByrgSAmHUTsQwXZi0ctAwK8sLdsN
K4o7hWdCgQewaYxvg4rKMmX0SH2cc.JeP3RcyOiDHsgmRVm8.cOIbPC3DxaY
gpBfrheCQCRPhpYdAILmKwFrzXszUaFDhBL3A2ytnbcGWgEwKAWriKryKo3f
vQhcOzA0WXilv0LtvpSyL3JjB9s77w4OGkj8F5KfZrpxMdzGFbI8SL4bLkxj
foF1yggMr9K1sdLqVkL+2JsA26WraCJJMOe0QYQFFOkBuoXDLCzsobFlSGVf
idKqZyG535.runk26f1MW3ZZ3bnJNVqUtInhAvqQHQWzW3.jVOrGRchXLVMh
IUBXkTsUtK.DqmzdQGbZu7vUXZv3L+val1P6Ehh0duPnTU8TVtjHrmSDKDiQ
X2zdDD+5JXYzePi9IvUJxOdT3VWp5LrAwM8Me9DGjrVm6UYmXV.xZja5UGhK
lYOuuA8+jKCamyU3g.LxMcxGGX5Y28tgS0dILpgJ.GGTlPRVah3VFu15tNIX
20ovhnsk0NRu2I3aYuE90bvYgiBtjzZeT0RFCr.l31zatOkkYTklBMVxt3Wu
DzOyMJROXxKq637XNVIuqavKn7eitSjuQMeO82BM8213dvNATH27297eKzjN
PvtFBwcwXlFHjPSRIxXFj6gNfvZGF3ibTaGLkoGJ3dY7NzqSLX+1OJgkCMRp
VYOREcGKl1QKujQpOIzjVZLEVEgRDhwLCYDglgLhQMagBV8gYLwhfyntASOE
BQ3uRJ2Y6RoR+AAg4FJzBL0FvtRrelzNmaa6VdImeHLGhPA8yNExDxqBgB8k
Vc9AMJMVoanH3QIxXqLMjD.kfGZpKLW0kmU1KzL6RTJI1.dnnX1czBpqs6Ls
a4kTJHbVOXNm0lyYJcG9D2tkWT0TglrRc.Qcnu1kvYlZm7IDMnKlHnOrAV5n
twRXlcH70EUkS3jFc+j1HIMD58mgXLy0WQn2eFhw79yPD58mgXLu+LDgd+YH
Fy6OCGUvCkJ3iIUHBkJDiIUHCkJjiIUnBkJTiDUvB07IxHNQkEp0SrwzwGVn
pNIioRKh7ZX2aH3C6JJXbHhCfF50tltMaSnlxb6+NmZDfWlL6llVmu1LIytc
pRlMaR6nkikNA7oeSc7WjbBeOoG71PO88zh4PyMXIaplYewMTvbVvzc64tP5
K2f43yStAyOBf.Fspfwjd9Bvvlfc1WDEUC9g3haTlcCGgWTshxLXEWYYc+gK
w6lIopCjIcIF91mzpH62UGvPxi9r2rwoHb5IK9vffMAcOGff7FFDzat5nUJt
VhYZ5wgA7aXLnqo7GCFPudwfdTMlaigDz+hen.DW0FfFPmHcO5D46UmXWAQ3
XhFaVf3Mj6qLp5Xi9kRzWJ+VBfK1AlswiYvKeXvdnxvMZkTosKePI59fJh5L
8MKzYEdhVuHIGLGX4x3h2Nz6UElzcAa.JY.YFoQp4Ofz8BBRwUGHLOM48PTK
XVGqlpvTpvfwbBQhE9PVqOV+PUnVlrLCLrYX.v0hcOHcOd7QKOqQkVVbp2Yy
y12A.1vgmVHen8jLjd5CjytaV1Q20FZHc8tM5itPn6PTPnsaIpP196cMaMmH
dYHmLQa2r1KKQqkmLQSLWZjlnBfnoM735n6INNfdhnNC8jl1buOGX11o0SjP
0fbV3og5II+bzS7CPL9z4IxP8D4ho+kzs9WxI00Tbys.eeSvNGh8Tb.h8T44
pmFZfixOW8zfpmNGBixPD6ksUZ3sB4C2fY1N4C2bYe3VKq8MV19usx93MUla
6s12MT18+48+efArWbA
-----------end_max5_patcher-----------

… and what is the proper way to pan multi streams?
using sink~ =2 (as i do) streams will be splitted between the left and right channel straight away. I would like to set the panning of individual streams. do I need to use 2 separate sink objects instead to get flexible panning of my streams (as I found in the fl.spatial~helpfile) ?

I’m not sure there is a way to significantly simplify the reset here, although I haven’t tried to build it from scratch. It occurs to me that your timing for fl.chain~ could be a lot tighter. There is no need to wait 20 samples to reset the intervals. I’d probably opt for something 0.25 of a sample which I think will sound instantaneous.

There is no “correct” way to pan a multi-stream, as there’s multi-stream fl connections can be used for whatever you want (not only multichannel), but it also depends how you are doing your panning. One option is to have two fl.*~s (one for left and one for right) and then two separate fl.sink~s (one for left and one for right) to take all 4 of the results on either side.

1 Like