Training for real-time NMF (fluid.nmfmatch~)

I would try running it on each identified segment from transientslice~ + 30ms, one by one with @filterupdate 1. Not sure what windowing would ential, a fade? I wouldn’t, given that they won’t have fades IRL.

Do you mean taking each single dict (say 15 of them), and then running fluid.bufnmf~ with @filterupdate 1 on a buffer of concatenated transients 15 times? (and THEN summing all that together)

Yeah, I meant a fade since an audio file of 30ms chunks of audio will have discontinuities not present in the originals (hence on whether it should happen on the unsliced audio, or a buffer of concatenated transients).

Hi guys, sorry I haven’t been following this conversation and it’s gotten a bit long. So I’m not sure I get the questions right, but here some random bits:

  • NMF is a learning process, it starts from random, so there is no notion of mathematical equivalence, but it is possible to arive to similar results in different ways.
  • The dictionary elements will be normalized (each one with respect to itself) for each iteration of the training. NMFMatch also trains and does that. The activations will have to compensate for that, so they will represent the actual scales of each detected component corresponding to the input spectra. The dictionary elements only care about the relative scale of each frequency bin.
  • Given this behavior, I expect the easiest thing would be to process mixtures and sequences. Rank-1 NMF has also been used, but I don’t think it should be thought as equivalent. While the result of NMF looks linear, the learning process is not, and as I said it starts from random. I would not normalize or average the dictionaries outside the algorithm.

Hope it helps!

2 Likes

I can see how using rank 1 can be practical for training it in a supervised setting. However always keep in mind that the amount of trainig examples also makes a huge difference. Every time you do the “same” gesture, there will be small differences. If you tell the algorithm there is only one, it will have to “compress” all the examples into one. Same when you tell it there are 4, but then it will have to work harder because it may have to compress also mixtures of those…
On the other hand, skipping silence or unwanted sounds is generally good.

2 Likes

Hmm, some monkey wrenches in there.

So initially I was running bufnmf~ on a chunk of audio that included multiples of the “same” hit. After some discussion on here this got reduced to using buftransientslice~ to find the peak in an audio clip with one transient, and only running bufnmf~ on the transient + 30ms (also testing +50ms), to get a more accurate representation of the transient part of the sound, to match against.

This led to some somewhat working matching. Not perfect, but at least in the ballpark.

So now I’m trying to broaden the training for the classifiers by giving it multiple examples of each individual hit (still by finding the transients via buftransientslice~).

Where this has diverged is that I wasn’t sure whether to take the @rank 1 dicts created from each hit and sum them (which you’re saying I shouldn’t do that outside of the algorithm, because the scaling will be off?). With @weefuzzy (and @tremblap a while back) suggesting that I then retrain it with @filterupdate 1 enabled.

So with all of that being said, in order to best train robust classifiers, should I run it on “raw” audio (lots of different attacks, with decays/space between) or just on the transient + 30ms?
If so, how should I go about summing these if I have multiple versions of each classifier? (or did you mean something different by average)
Do you think that running @filterupdate 1 on the source audio again will be useful?
If so, should it be on just the transients or the “raw” audio again.

edit: so when using fluid.bufcompose~ to “sum” a bunch of dicts, I end up with dicts that have values > 1 in them yes? (as in, the waveform~ display will appear to be super clipped)

I’ll try to find the patronise flag in the pref and lower it to ‘kind daddy’ instead of ‘self-righteous uncle’ :wink:

update: sorted to new values:
Number of posts a user has to make in a row in a topic before being reminded about too many sequential replies = 20 instead of 2
Number of posts a user has to make to the same person in the same topic before being warned. = 20 instead of 3

Is that libertarian enough?

2 Likes

Ok, rather than re-editing my post above a bunch, I’ll make a new response.

So I’ve made a patch that analyzes for the transients, calculates an nmf @rank 1 on each, and then sums the output into an aggregate dict.

I’m not sure if this is correct as the dicts it makes are huge now (as in, values > 1) and appear to be “clipped”.

On its own that doens’t seem so bad, as the output of fluid.buftransientslice~ spits out tons of really “big” (for a buffer) values.

But using the dicts that this new summing approach has made with fluid.nmfmatch~ gets me no activations at all. So I suspect something has gone awry.

Should I not be “summing” them this way?

Also, does the @filterupdate 1 flag want me to trim the length of the buffers produced by the previous fluid.bufnmf~?

When trying to run @filterupdate 1 on a dict (summed or unsummed) I get the following error:

fluid.bufnmf~: Pre-prepared dictionary buffer must be [(FFTSize / 2) + 1] frames long, and have [rank] * [channels] channels

Do I need to trip the dicts down? (so with an fft size of 64, I’m getting dicts that are 64 samples long. do they instead need to be 33?)

I’ll post the whole patch once it’s working (and tidied), but this is the bit of the patch that’s taking the the output from getattr samps (the amount of transients found) and iterating over each, `bufcompose~-ing them in-place in a buffer.


----------begin_max5_patcher----------
1610.3oc0ZszaaaDD9r7uhE5ZkE12O5I61C4RCZAxghhfBCJoUJLlhTfOhcR
Pxu8N6tjzhx5EsXLR8AgUK2Ym46adryR4ud0nwyxdzVLF8qn2iFM5qWMZjeJ
2Dip+9nwqidbdRTgeYiSsOjM6iimDdTo8wR+z+BR0LWVUYhsr7yarg8cbbJr
l+s9owK7qG1iqIBRiLoUqiSAo75fVO4lnx4eHNc0c414kg8hf0SwSPDtZpjp
oRASi0BCSIlfnlotOoSwsJC11f032Whaxuc0UtOlbYvsDMCEeP.OKJc03IGC
3z8BbxoAtVLUazZIWwk3.tUjSfa5vg6MQyuGsIOatsn.sHuZcABitlfhQjCx
FGfBX6kBjmjBnT0TiPIUTBwP3XIEPOw.7hZ3c+qAbFsx9bdnCEP0DkjgHLJC
ni9xDbZuyBTbOSnDSoDofRgOUFom.HZRfkdMRC5DNLOa8r3T6BToc8l1u0Wx
.uWxfexvBnPvTizvEDClSqICJE+CfL.ns1Bo16xFwqRyxsHXcknxGxPeJJoB
JtVurDfMlmUkVtsycaniI8snfIjP3wnBpHJATiIDEwCdF6fnFOfg.V68eGUj
DCw.kQ4kEGzguLIK5.0Cwh8Bc1oqGhMSwthAZHIPJB0Bv3WuLfqQzdetmV02
DdYHmVL8U9Xtpub5C4N4gcD7KCtRvCSvTAyDpwKkmvsxFNfuLoJdwzYUKgb8
MYE1uebZXe3ladgmwyo6oRV6geuFt8Vzmtd42Q27grMEwewhXTzMODm5GK4n
aVtrrcbboMOpLNKsvk+gQ2jGkdOh.KJNAdDrW9iE5OMJHuPZjAoKXkfwUFLt
IFRP38fF8KwW3dmVj8Z0MeWtsHqJedChZKrgdRUKfZjwoddZ6U4vnaU60Cd1
5xkmgnmRWMVzkoqFK9D3hNH5xsKjSpKV.8CftvmkttbbwNGcw6h9r7E17CeD
9vp7c7xs5lbQ597hcbMBdwbr6j1SqJxPnpVC9n5xcnvNpJTjIZylOYyKpWsW
KPo5Ol44a8D+WiSCeE6+Zt8SwMq2eV53nbnTXITGrJ2aYieTxGGDMC7boUw0
NO.efJKJ+bxtE1RiVGD81pEwYuqLprp3t2ZSqBEgATsLpJorKWLaETjOYdVR
v7F09D3Hk5J7iCOcR8zsq88H7TpgSHZfVlxHLEU5GACDhsB7qkgzHDWvMXpa
obIUwE9QZJSvbiv6HF8IcgIlfFvFMlGFASQ.cssXvwQIdKmpbcSVOKbUmMY4
M9TPTS65qJyVkGsH1FZv2mdFbwA51GJkCO0S6dNolSWCDZbiLaG505L9ip4Q
GyADMeNrwcHU3zOtwiNt.PpejJL2V3brMwtdWQUZoT4ITMln0gQvtPocks.D
dtiK5JMEKC5CtSJM3MzXLg2UXWuFd4tKN0E3aa8PLCbaVmXzVWLUo4rtdnwK
yRKaHHH45O2XSQuKBZ+3c10wyxRV7T2DyV0wBgtpHJO2nMBtREvG0DvrP1JW
Go3JAg4WA0v.ACVHA.aW65bRFZCTNP9vYFi1MiP2lG.WBTn0gQOi31MiP1Dd
Hc+oBiB6zOuID+0sk24EC2yzhyCs9fKWqs0MTtc2hySrPc1m1S+UUffJHPRD
1Yf9UryLZ2KayGGI79173njiDQGhN12ns2ztBIbEdCg7bE1Gv4h2X+OOf9rE
6mpH56KRhgyn+a2A3GKld2HuNezzWwEZKvUDkt6M1uTq.Q2V8VU6purzfNA5
6.XHvc.Ar+pkmIyCmF.cZPMaepp6TJ3J6CsenyKfd+F1KgUeoozakb1T+74i
NRxoR65QaxdG8bw9orqstYGmmWL79EN6nKuOaqNb2tp7fDYEduO+VRk8ZRea
rjnfiK7Gz0ZfF2Tje.FXd1Co81BextDs4lrePV3u+4n9afXJz2YnHohwngbG
JgPXCuA9lbq8EXgd1i49KzIu6P0g23dKTYKsLp2lmlikxvUKjXv37TozPLhg
2F+GaRR1C82Dg6FnBU2HZeWVXA30OYelBCFqGJ.TsdlM+Mvcg5s4qZaIT.Gn
K7HgrcE2Aw.yCM83rvi+9E5mssutckbHhwTmoopuzG3OLCZN2S3Y3Y781COV
Qv9kZXt+e.puJqh7xSDBuNJ+OQfCVEahBulK+ujvUe6p+C3Mm51B
-----------end_max5_patcher-----------

If you’re summing the filter envelopes don’t you want a sort of average/median?

As said above another way is to sum and then normalise them to original boundaries.

That’s what I would have thought, but both @tremblap and @weefuzzy seem to say that just adding them in place was the correct move:

Ok, here’s a working Schmitt finally, after getting some help from a thread on the c74 forum.

(it also dynamically adapts to changes in list length too, which the original version the person who responded didn’t)


----------begin_max5_patcher----------
2957.3oc0bk0aiiiD94jeEZMVLXOxXv6iEnWrGOLOsOMOrXQiAAx1L1ZFYIC
I4tS2Cl+6COjTjrEcncLS6MHvVlknXUerphEOT8q2e2rEkOqpmk72R9Xxc28
q2e2c1hLEbW6uua11zmWlmVausYEpOWt3mm8fiTi54Faw6Rxypa9wka1l0zz
QMakkl99+dgrqvh8aK22jqZrOOXaothZ9xNkiYlMK4mZIsKsY4lrh0OVoV13
nhnf4fGRP.p4KBQZ+EZNnuR5VIqnqQvCeRppVoqU7ta1SY4pOoppyJKFvR2M
Kc2tAEe2fpXvjetz9fDOzWTVgqHPeQUpOk0UeTeooUZ4oQKL6qrR6rmYjYu7
XJWopJ1mYYEWg+18crjsenHcqpdW5RWkMcWcjeAgfRnASfP2W.N27MGL.iz8
zqyKW9KpUCY5Yk6TEYE6pT0phlzlVtum7J0So6yad7oxhl5ruZ4An9oNE8mZ
4wIIZjBq.7OqxRy6Eg0UYqJKLLwn9BSwcMmV5r86lOeQXr2QQ5tIprVATCLd
HVqEx80KRqLcUKxUC6ql0TVlOlTe8xUO0zRdWVQwAnXS4N+DqxVu4D0cQol3
1S8rsTpebegi5iZshlGqS+zXztIMOu0bc7i+4zhrsoMplLWW.BzSTUjpEzM0
KqJyyGIuNJeZBJqzZ4KUeNaUyFaCMTYPe6Y65Thl02KuJasptYbYMoqqGWRc
yWbf9fh1un0J9wF01c4ZoX7MLxg1PS1gN1FU9AN3VVtcqVyu2fbnWtJk5So4
60MZxx8UU5ay51a38lmUnVVtunYjM+XmgPwvZL1gHX.kI77wX34TspOAOGS4
PBGAYbISvoFqaiUAFOvp3HWgvtx+s6uu6hGh.RocdrJoYSpCfRZJSZpJ2qUf
pK2pR9j54cUmMpwtXTSngKMzPkr4bAkCnTFi.XHCRBk2NnV1SN3JWUrtYSxl
z5jkaRKVqVkrrRYT6Rc2P4SZvU+qc6pJ2UkpGMoqN5Ayx029myzW+UUUYsWX
l3AlIWLLKg34FEQhTN2nbpG8AiDPKLisC.w.2Bv7JUdSpACsXocXkyUWDc45
hLhUgC0pRd6n80rIqNoVynZ20I5KKKx+hwxcYYkg8S97FUgSeTKQAfcXOXG3
xwNmKNHRdr2u1PcH7aB2et.gSzh1t8itkgwDew3.D.cVS74nC7mIvtHiuEPg
M53bz9ozgRtoLekGT3x8pynLyXgDavfBxsibmW94WUruburXtsK1I1b4siXa
BMR8mp+yFeF13jZLQmMs3idq59NwGB4uux+no+df6yj7jbel5mPdGNDywSC9
gASE1GjvEbWPgv4hiBJzRZ3bi+1BP9gHneHB+pPTHvDiBcXA0FcBhgkPF.RY
nGRjjCWBgugvzhjE9.IvEpGsPOpsAjre+Z.kPGrlQ2gpCWinGfQHDLNzoNc6
fSeMOoRs1CPwkwzfqUSBpGr0nHwkPNQ.HLgHLMIz6FBsVOqqc9vH96fSIF.c
TLJT3MCD0j.7gNmHvD3oPmLSzugANSXfYPkaDCrLeHCI9HCgyrlVRBAioRr0
2i70GJ6cRsY+W8BN3KbXrQdne37TifhiluM71ArZRxR7BWWZfQF347PoIG2O
Dcp2IysZUdBzCLQouww8C1tCSrwPBYLoD4bIgucFQ6O7Au9qo336UBKsS8xs
VV271VrQKvfmMr4JY14eGcdEDEHOJ7.xsyTV9d+paWF3ddZhWLppivR6nSHv
X.f6FQHDT8cRo0sl1d.VL8MLOvKXTAF+vPvHhao43jqJ7gTv2iEUXp43bC4.
ztURI+wmfI+U8mHOPE7TKX+IsIe84B5MdUHgbyXx8BL8WNILAiELAcCcNU7E
PL91Cm9vG744WJiLFMk2at7FZ8oxO4B4IOwDmIAsPdODrYGDX2PHN91Ad50f
96Z6rj+Q8xz7zJyg5wav87nYzgACCaExj2fts+tu6DNj3fXaq49RdKEQueSK
VTWwNl2HxCZjL36tGZXPlWr3oCgryLdpkegw9+XGRTPbCVZhXte28MYep91k
EZjCVzcPs5+zuDObhjca8ZXa0ZwJ0yWakrShYrngYZkhqBnchiiPGZgeuPKd
rPKB8Joh4+PLzAVWSyQmf5CsdCmWRuaBUHXCzC1bhi2yor6d4vJaNmTdNkpV
gvPeZTqtbe0xNsg9o1lLVHVopaxJ5O71e7EX7farrZk67vGlahyk2Lp4AwZl
PfSfI+Tb3BVfbgYbu3wEz.4BYK6FGtHTkEyhKEWt.Fhdg7naba1pckYEMslO
BJ0NQPN1ZgCwPIUXm1rYZg1nvlfVjjKaWGNDSQTDQW4YouGUt.E.W3bfcxNY
J0N+Lh1atoejRDDFTB0dxMm8KW3AGSKlBFLTmZwBd4f.6jsqoWzXivG8gcLC
ePur6cThBD1U+hI.DncMBE8KQ3Dzld3LPTDVVnXNG7ZZzcBDEb7dRSsGAjSP
BKzeo+CRQTAWHAFRHAvN88ioEKMP3YoABilFX37AJliuCOSut9UNXL2Ajx40
yYVX+QLY8ywi1IXcovpEBk12zFDPfn5QcwPjoPqjLAsXJWWogfZikvLLC6Pu
SCFBhcn2o3X5ICMj+nFEWvtCkulZifvmaOYfBoYkgXZ.DQkbl0om1A3b3qSE
xQGuSkslRSPKlfRP1R7WCTjlYsRcu1ZlPaXHBmRETIVX1PHd2qz1AzhkNGNP
ASDynJ47qW3FNDjgI1YGL1UkNPCCzeRhTytqb3Hz8QpbDsXgHgFseGzEOsif
3hXN6VyISMLt.GQtfF5L86X23fEAOGaRDiJhG75MPiHVfCM1LdLmWNMTaDZT
whP0NYhXhEhPwhXZoZEwPrQnhXyEfP4hXYoRCMZNVLGGgwOqIyEU1HDECoLl
Kgl7bVugo4h1B6RgLyLYIjUO5xHJOl1zTksXeiauHFlSbNqL2w57xEo4s4ki
9yq5DI1i6eg4re5.oPR6POkWVre6DIVHT2dCoQ2JcS2npdzkpRFr6PSeTIl9
XRL5Mja1SkUaSshKye5HRGXncRFtCNZatIxa1HBdAh+VUccZ+Ql8k81GLOAN
Ow8o6hg+ebIC9u6YMU5NXD.iulYto10xvc5HXtUyh5CoPW.RM9ETdz6j8Tok
JOBGvuDPcugVv1jN0Qu+wu8NaehfY+qmPF3hyVF51XDmLfgWeYvq8Zept5an
8JgEa6UuhOk8sW7YBvfd+n3tZedSVcdlY03m.CfWNFrrrnYUZS5o8.M7ztMq
V0nEGM+4n5D2ARq+7Km1+jcaCkTAm.PXBwrRR71Lp1fGQ2q9ABbsPPyHy6yl
B7PwHQ54VjrWUUnsPCy4NGDF4dfzYq13C2fSXOLxmVQ93fPGMcQegAOXQMOB
VCskDx.ZID9k.tu3VhQBnkDxqPKQYg1Rn2ZKACskdq8SHwk0RNUwCRgilF4f
T23AoswiSYi9SWiGlpFswX6RZcGn9+x6v09UYk+nMiC93+QUr2YK2kWDGCEK
VaxkWKKyKOJiU1YdOyQsO6P1cuFubHIABEZXYNFh4Hl8J8ET5vY13pCrqRDJ
QBPlakvPbB0dk.goXyUfCpF5k1B.ktV.HE.h6JcQPcaMrZ5AqZyvh7AoIPSR
LqrpOUSNGK6u+8MkqqRWk0dxq.ilAwCsZRlDw2g4JP2XPc0YnlWemwu3Fg5+
Z5cOUGw.X04mb3GcJcuQdwc9c+W46UeO7T7R5xk5FXTGMFxYDtAxY88dRSQv
HvfUket3r4vW3KpV+iHspGQhC+2eI87YP.RRIV8WNGiQVvTfLmm6qOC9CUJ0
EvgVzCa9ybEjIXF17Zyb+OUtdhRml6F9tt9Q6a6JUB.8GDio3dylmXAUt.ZN
XV.ScnF2KWQAX+1EppenLe0YCtFUQfs6mJQPpkSgCcecUXvJm6len+3z5ys+
4waOb+w99YDFCKa0h4bm9rFukWt9ra7TO4e36+s6+czMPZcA
-----------end_max5_patcher-----------

This would be so unbelievably easy in FrameLib…

(low effort comment but will perhaps wet your appetite to embrace the frames)

The schmitt-ing, or the (potential) averaging/median-ing?

I guess the answer is “everything is easier in FrameLib”.

List schmitting particularly. FrameLib is not really applicable to offline stuff.

I’m in bed waiting for a flight…but here I go to make an example :wink:

FrameLib version next door to your trigger.

I think the FrameLib version is much neater but as its FrameLib, you have to have audio running. The benefit is that this can handle lists up to 32767 in length without any finicking around with your vexpr objects. Theoretically it can handle a much higher list length, but they can’t be created in Max land. If they were audio frames its a whole other story.


----------begin_max5_patcher----------
3861.3oc6ck0iiaiD94d9Un0XQvdzoCuOVfrXOdHOsOkGVrXvhFpsYaqDYIu
RxyUPle6KOjbKYKYSYKpYxjL.iaaRIwp9XwpJRVrzO8p6V7T96TkKh9KQuN5
t69oWc2c1hLEbW8uuaw132sLMtzdYKVlucqJqZw8t5pTuqxV96y2GkoTqhpx
iRxRpRhSSJUQUaT5OeaR0ln38qRxixyZt0zjL0x78Y16GUWX19sIYopJaiAe
ov78UMkBpKcWb0xMIYqerPsrxwBbt3Av8QPhz9GJv7GL9APz+s9lRVYo17m9
guFJVXJ6me0qLebum7+18oUIkoIqTEKNGMuLNaUh9CEwQZfGjTjj.uW+MJiv
ALy2.RA.K0jZKRb8l7xpmhKL2GEb7iC0733.njYebDHkIrONgfg3ztOttfGZ
XvCUCWL3CBJGR3HHiKYB6CjysHJf25Iano2anIKkVWXopRiFZHqgNsjC8vM4
nkp2uS4tfEKtW++Wdl4YUqhqhaCkkIevdwnS.C7ArEQIRCBfO.sXBDxYcwhV
89hEGPhh3spJUwipr3mRssD32DLNUv.QD+ZPvfO0BFpODuZ4GW3uBtyzUHkN
318GBs4ygQwxj0YwoFrr9a8wy3qQSXl5s568DCA6hdN8wxsIU8xw3d4X3YTo
ir5xQ.KuRw1efNGG2KGBWztITE07UMic2hmSRUuQUTlnsO8BAc2h3c6ZU7cs
tECZ7C41Gj39CEkj4JBbnnB0aRZtezgRiKzLZklK2WXo6EuiQV7xiIWqEIae
hkTbEp6WpIIaOPlVzrbW7R2Ma5nZptMzAdQJo9GBZKoEcO75z7k+nZUaRdQ9
NUVR1tBsk6rp3pZZ+P0qTOGq0083y5QjMi.g5dj9p+4ZJr2JM7fk7+6EIFQz
5KYcQxp7LCQzomvTbSy8ZsscmE91Li8Jxh20yMqEAzvx.UVpYx8kZEqlNp5A
5M8TKpxyS6V0AdIU8bUc06RxxNBEqx2MbkEIq2bl68obckaO2y1VS4i6yb09
nVln5wx32zkBqhSSqGl18w+t3rjswUppjs0ZPOToSY2lxkE4oocvIWMuomZV
okwWpdaxppM1Fpsvf9xS10HDs3Pu7pj0pxptkUEutraIkUu2A5sJZ+S0iger
RscWplKbpixMHxhV73KN11dXaa0ZcJ+X64pxx30pCCJOVSFpaEmpMaHMZPmN
L.wpPCbrBsKnT6XEaHxhlxs5uq0UbkLcGc5c0q+b5CZYx328wAQD30hHRnAD
XXqQMp3VQDzThHV1aPVFbsrLRhcZkstbCZ97ZYYXaJrYJZsG1XugrUJKKi+E
.9PkSI9.FE9f97GebCYlH3AJGE7.mMEN6TEOYbPI.5bvX6.Poy4naUKb8ZIL
KfxyE5NnfnGtdPGjzR2zs.J7uD.EHmLofBaJAEW6dELMvKKxB1YzuzloPelp
.orJuP8wnMuur5vxxLktxAsCXnN3Rbqdt.gy2.FMSnmbP3fFTsTCwN5QdyJX
AyGzn9e6iSK+XDLbBLTrY4utYyNx4CT1ktu7iSOf3F4PgVoDB+FwiYzJ75Bk
dlmEUahyB.rfbFcHHq6IN0v2.tLiFhiyV8wnuopHY8Z8LzSxJiLKSRz2rMob
qgOi1EuRWb6auuMBZ5GygEVS2vZ8RzqFLoy3DtS1pBwntZHgT6umSX6FjuHy
uxYPvPEL.MIyI.+kf2uN8ySkyunuTzO6fED0oRAbySJnOb4kE11nfbf0xzRa
l56GvJy2Wrro4cJutOpKUtRUVkjcXY9ecyHZ604U20XoArmzvozZdwJ2V2.C
BgocxzeJCFHzAg7jHfn.1GI7jH5gZCbmjYsN8CeXADeP9Jp.4AjJLKbmecSg
jHDiiHZccaSVsKOIqpV4FlfrQEfaKeg.vge0u.F5SK+zHf4MCIvWfgfehYH9
3XHDSbAFBDlAedxOmxNKySc6OuI1PfbFAAkTJBwETjMNYvBsXmtDJUHj1.GA
I..r9BvbBiC6FRN8AQ0hsH2tYU6xT6efcAoFxIMX+0bBd8zIOL5AOGmV28iY
X2Lp.G9Unzzv7UP9RjdyPQln8.Sl3gO097ziKHAVdvWSHP3mAtaHmazwWmMD
ysaPjQPXAyU0QLb7Skd3lg3s90rZ60SHBO2B17QLQv9kepKrIvzVXh9nUO5h
zpGiqpJRdZekadqsiztQEQPqSyeJNsNdeNDuX8DvPu5EhapBiwzjxpue4lsI
USTnL1DGstPYj3BR8qHVFExeEFLiX6ZTxsXFystKbA+2hkwaKVFg+VrL94Xr
LNcQwX2iqSWUbEJ0ahS2qaznk6KJzWlUm232ZlqNLCXLmi2D7C3iOYA7SN7N
gMnaNGRoUdrJpZSrCfLGwoph78ZAnx7spn2nd2thYD0DtUimJYOn8WhqcShw
H.Fxfj0agw4PM1bgZIO6fqTU15pMQahKiVtINasZUzR6pyGE6tf7mMmSrHs4
oh7cEwZSIM2i1RVp9xsmerOnJxKGDlIAHFXvOXDDIR4CFgSHDhQBnElcymmc
tPhgLWv7JUZUrACsXo0rxLJKxr1kwnZQxKJ8glKXoZSRYTolP0pqizeMOK88
lQtKyKLjeza2nxbxiZNxCrCO8XmSEmY4yNQ6mVXqIhHlmPh4rp+bdAGoYsc6
CPzlAAtvMCv0yxqqBMQcvxOLLLaFA1n8yQqmR6J4l7zUSOJvnLiwP2w0QPtD
eOapwSyeaHYaLG25TJIuDaOapUMtFo9Ck+QiNCqeRUFuyBkrui8gP9k3+4ZK
z0lsiRuB1Ecd10LmMqGe8bHi41p7Xazu+bg.1rBPWEDgujd.nCGnV2NPLrDx
.PJCcejz2H049KASvYCldJ5ooWNRn8.yHyP09fQzFMDBAiCchQdhQOoM8avH
6eGDmlq3N8CoQEp0WQjpf7RZxrEGFgItDxIB.gIDiTZZvXKTNeHzZ8rt1M8X
TsRIF.ch+GT3T.Q7YavFX5CArZzomQZHOi6oDiGzCgMrYBaRl9n.qFYHblcr
kjPvXpDaUBI8yV1Ygl4JrJ2+gqAbv9I1.EmL6YnmfSGMz2eAvBOaiwRhRBli
Q8Z0eLBSWBllK2iJUoW0AnvOXhfIV+GgLlThbZivizt+vA38bEg2+tuMDgwb
MDgcmvXL+10QS+7ar0v64x0JRgAxSr9S3S1.OlXwQje68aZdf2u1Swsw.tdJ
Lp8iRqTSHvX.f6LCLFvcPIyOCPU2ZZO8yCrwh.iereWDg+Nk5gnIlNedvmpx
BlQgdmiiu5+NqEA7bMaY6VIE86eFF8m0ehldiCrA8XERHdt7KCe7UQyNL8mB
CLAcFO6yMCHFey3zrKN8sea.lXXMH0mtct7VOYqx4cY7tpExi3yXMSjmYVYa
rbjKc24THIYysDzeUONK5uUtLNMtvDQOg3zQiAs8bExtUgH97q19q9pfpPpF
Zj25AklC9k81HvFzkc+MictwWL97qgF54vqqWeMxkxw5YEYX25ILmA9RTgDa
HOvuccSTvu.xRY0dKBljrLkfNTRh4ha0ZPxbLgByPnoDzXCAZCGNB+RJOuQn
SpHFeHzZvfXHHI8sPkVlXCtOUWNGMIDCgMCGdOmcbWPNe5ReONRbP.ONRrSO
6aCbdjjglJ76nYExy2K02i5LKjG0YluGQLZHOwSLgmBFTQH6Q7FKvgLMN3at
jfETrv6rIAMjXgumyKdHGox88.4goglJ7YLBmDvQpTekN4gLUmv88XZxC4HU
tuiQ3gLkYv88zayCocDtuFUYfKkLD3tkgggIV2wP.AhBkTLDY7DS7fwuryVI
0rdWGuY+0qubO0ERoCeFuJBoKW1GNbDRGC2uHM9GScGPFyp2yPDNkJnRr39l
NsdpKjLlWh8xKwXBB2wXBoYAIX.BDQkblUtQKm7.7x0B4nS2jLFykluNstPI
y4qa9hfl0ALObj2NXe1LJAGaWBMhdJZLC5qgOncOiDl341sj.mVWHYLuFLAu
jLGS5RxGPo8vl0UOlKb06otPxWd4r2EUdWKxintLyB+vOBUtKABG0r4BkeQb
+ICXHmHEXLyy+74xkZCll7OywFScGT7yTkMqfp+GjhnBtPBLUgDtTYyo0ELg
Czz4Uhy9l1EC3w5gN3ZwI0MqYdBvnj.C0.RIaj5HCGULQlfnNcYFyLFWanDA
gAkPh40dVKSPGUWHYrwnpNbTA1G+LBZxTz6YDKuTer482k0KNrcZEPssWpvF
1E223BRO0ER9xq0aHndw46L8kgb1shQIuGrdDuStagz3t+lyDiLuY8ERNG54
z7r8aO6qDxmyK1FaoL1XeIQBcuTaftvD8z2vX8GKDcNFbcNwoS9qJ0gdGBml
+1ESx6AXp6jIU+d.Fcxgpsy9hcUu7KGhEL6J6zvCMZyc7.FdNdfeUuJiCqTH
gMoRgGxnTSlTXXYesy0s59tY1mx9T89JdrulfYHqGlXsuGbB.gIjAdKAexKD
XCBcI.ZjuPfaifvoFAM1a1mLBvqoTyM5148WR3HmKgwAa81L+JxWbTTasC1q
n6V16X1isxWyxmOkFd9zgYufpusiP5QCwmfFh5CG08Z5NE4qtkYDOaY3T2xT
lmsLZpaYjvG4G4b0udjTVWuOCK7ZaZzT2zdISIj8KTcibMxillBOoq0oR5nr
SooQNJqTdTFo7zrQ4vYhxiyBk1YP3RIeGoF7kC919UI4euMeJ93+Rks2ontI
qO1EJdZsISkcHq11dtGMZmqy4sGR7ksy.tHIABE1WN8PLG4dM0q+Bk1d4.b2
Cr4lHThDXyVtDFhSn1uIPXJ17MvQ2F5k1B.ktV.HE.h6a5hfcSotKzthTm+H
4sRBhlTzVdwgDo4CX4gqeeU95h3UI0wUFny7ituVRxjlAONSH57Eo4dZK4cn
y3Gcdp7uM8tmqinEr5rZ19iFgtajVbQm7+Hcup40Je+zR7xk5FnSGM1jqi4F
Hmcn2SZJBF.BrH+sYilBegtnZ4OhM0KiCDE9Oee73IP.RRIV4WNGiQVvTfLA
y9zSfeWgRcETnE8vl+Y9FjIXFxbpIt+iJUOg4QScl8nyBZbAzrpgZ5kpQTZm
Q+cNJsu1dXZoR.PLULv9sOoJ9t7zUil7Mhh.a2OUhfTKm.aq9ZRHvBm5lu6P
vBeQsM5QNDFCKqEG4bmfoFXk3tP6SqCMC4rmNPpU9U+7q9+fbqPPo
-----------end_max5_patcher-----------
1 Like

That’s handy. It freaks out if you change the list length dynamically though (same problem the original vexpr solution from the c74 forum was having.)

For the time being the vexpr way will probably ok, as I’m only dealing with @ranks. So when the day comes where I need a 32768 rank fluid.nmfmatch~ comes, I’ll definitely use FrameLib!

From a purely educational standpoint now, what is the problem with changing list sizes? Comparing to your working version I get the exact same output with no problems. Is the FrameLib one not adapting properly?

Yeah, it freaks out, keeps the previous list length, and seems to wrap the correct values around (not exactly, but there is some repetition in the list it’s dumping out).

Original list length:

Changed size to 5, and reevaluated:

An updated version for anyone who stumbles on this thread and wants it to work in FrameLib :slight_smile:

Solved by making the final output shrink the right list if it is longer than the left list.


----------begin_max5_patcher----------
3915.3oc6ck0iiaiD94d9Un0XQvdzoWder.Ywd7PdZeJOrXwffFx1psUhrjW
I4o6YBx7ae4gjZIaIaJaQkYlj9A21j5npOVrphjEK9Su4tEKydIpXQveM3sA
2c2O8l6tyTjtf6p98cK1E9xpjvByks3ojrzC6VbusJ0WiSShJM0AqJ7or7cg
k5RXudYYGJquNTUo6CKWsMNcyi4QqJsz.i.d.be.lf0+iZ9AB8.H36qtG6io
786ir2vhE2GrXYX5lEMWR7ZCgls7G9Z5hlWUd3tnxn7GiRCWlXtYftpe9MuQ
+w8Nx8oQOqdt0O0xnWLz8hOjDjDk1KnfFMDfkFtVhLHA2MHnW1Gs3JXwUY61
EkVdBO99rCAoQQqCJyBhSiKiCShKhBJ2Fo9743xsAgGVGmEj0fCIwoQqxNjV
dDNbpDSWvALL3v4BMd.IFLBRMhIXbKzoE6CEWC+u6PRYbQR75n7yJkuJLccr
5iHhkz.OHoHIAdu5aTFgCX5uAjB.VpH0Vj3lsYEkKCy02GEb7iCU+33.njYd
bDHkILONgfg3ztONmkrP19SXF7AAkCIbDjwkLg4AxMBZP.u0SVSSuWSSFJsp
vhnREZnfrZ5zPNTWEOWkkVtNrLrMTVD+AyEiOFKvMPKhRjZ..2frXBDxYcgh
VM9hotq+W7xEHh3WAxE7oVtH5CgqW8wEtqd6LsDRoEss+iPq+bXPrHdSZXhF
Jq9Ve7LdwzYpaevSIOVrKtrWNF2KGCOiBcj0ZGvvqV84WvZWup5Wz9UDkWwW
ULlxkj3jn2EkWDqrN8JAc2hv86aU7cstEMZ7CYlGj39lhhSsEAZJJO5cw02O
pozvbEiVp3xC4F5dwKLxhWeLYJkHoGhMjhsPU6REIYZARUhlE6CWYuYcCUc0
sgNvqRIU+PPaIsnZg2jjs5GiV2ljWjsOJMNcetxtcZYXYEs2T85nmBUp5d7I
UGx5NfPsuH8T+SUTXuUp4AC4+Oxi0hnUWxl730YoZhnSKgt35W2aUV1s12ay
LlqHMbeO2rRDPAKCTYghIOTnzqpanp5nW2RsnLKKoaUM7RRzSkUUuONM8HTr
La+vUlGuY6Yt2kYpJ2ctmsolhGOjZq8QkLQ4iEguqKEVFljT0Ms6i+kvzXkK
3Qkw1l.DnoRqxtsEqxyRR5fS1ZdWO0rVIiuJ5430kaMun1BCpKOdesPzhlV4
0wahJJ6VVY3lhtkTT9dKn2pnCKq5C+XYzt8IJtvpNJSiHKZwiuNtk1caaqVq
S4GaNOpnHbSTSmxA7aeXsYCoQCZ0gAH8OBlKnT6DW3IKpK2n+tRWwUxzczo2
Uu9SIOnjICe4iChHvqEQjPMHvrCkgJtUDAMkHhg8FjkAWKKijXqVYiC2f5Ou
VVF1lBqGfV6tMlaHccjgkweFfOT4ThOfQgOnO8wGaWlIBdfxQAOvYSgy9n7k
ZGT7fNGL1zATZcN5V0BWMSByBn7TtpAxK5gq5zAIszMcKfB+KAPAxISJnvlR
Pw9duBlF3jEYA6L5WZyTnOQUfTTlkG8wfsuunrYVYlRW4flNLTKbItUOWfv4
qCihITCNvePCpRpgX58HuYErf4CZh9eGBSJ9X.zeBLTrd1utYyNx4CT1mbPA
I+kcwE6zrUPw173zeb5QHaWIJrRo6shPync4M4QpwhlWtML8idn+j0LDAYbX
wpX9FvkYzzbX5ZkfSYd7lMpwrGmVDnm3jVhR6CWqJt8s22BCM88BwBiwbXkl
J5UClzYbH3w6hJ9n2TLQp7.zJrcCxWj4WcMvanBFfljQIf+RveXqB5oxcXzW
J5msvBhZUo.t4gIzGt75TcqUPNvraZnMc88CXEYGxWU+5qVGzftT45nhx3zl
I9+sMSq1wWXV9Z6Jo3lC8ikxfNRYh4lvHifvfAeuWnAWa1jCCN.uPXRGILXU
yqWHBtiDAwisPPWIBtkHZcc6hWuOKNsrpKNhIzCW.yrQyBEz7KOQ5nQP4cut
UYI1E.Uu36PNiffRJEg3BJxDGBXAD.TkPoBgzrx7HA.fUW.lSXbX2PdnOzPc
+Z9GYWtfJKPs+A1FCPHgYPVleMmc.bUsEdt6Y5ZqJ7WvVUHyF+Vs90bpYG6J
DAl6FOHaDsdmUaBz1unFoa8KeoHzUaU8nw7HZGSPFpsJnPr5EM+ZVaKblgXi
igpaLFlgf+xxPnQxOUciGleP9gejiie7i5VvHE68CU.GorpenBms83yVDnqs
HTO5VHdDzvrpDfNBel6uEppv5PUagNdjV+nM1qdLrrLOd4gR63VaG6ciJFg1
jjsLLoJBfZhfrdBgn27JwMUA1XRbQ42sZ6t3xIJ3FqCrVavMRrAs9UDciB4u
BCuQrYNJ4FLiYm2Etf+aQ23sEciveK5F+TL5Fmt3Zr612oqJt7nn2ElbP8RC
VcHOWcYFcdieoYt5.Ofwrd.SvOfOdqFXm+81alG+FFNmCoTJOVGTtMzBP5s7
TYd1Ak.TQ1tnf2E8x97YD0DUaGNI6A0Px4pQhyXD.CoQxpkv3bnFatPs3mrv
URT5lxsAaCKBVsMLcSz5fUlYmOHzdAYOo22XAJyS4Y6yCUlRpuGkkrD0ka1O
YeHJOqXPXl3gnhA+fVPjHkOnENgPHFIfFX1NATryEjLj4BlWGkTFpwPCVZLq
LixhLicYLpRj7hRen4BVJ2FWDTnHTk55.0WyRSdutm6prbM4G771nTq7nhib
.6vSO1YUwoGu7IZ+TBaFmD4mAJAyl5OqWvAJVa+AOD+YPfM.z.7GPGoPSTE9
7CCCylQfsJ+bT5oTtRtMKY8ziBLJSaLztAdDjKw2ylZ7jrm8Iai43V6aI4kX
6YSsp10nn+PweTqyv3mTo16LeI6aYeHjeI9etVBckY6fjqfcQmmc0iYy3wWO
a5XtoJGVF86OWHfMq.zUAQ3KoG.ZwApwsCDCKgL.jxP2GHcMRct+RvDb1fok
AKmd4HgxCLsLCU4CFQYzPHDLNzJF4HFYRSDGmtHNAmlqHQ8CIA4QathHUA4j
zjdsFzBSbIjSD.BSHFozzfwVnb9PnMpQcse5wnJkRL.5D+Onvo.h3yVmMvzG
BXUnSO8zPNF2SwZOnGBaXyD1DO8QAVExP3LSeKIgfwTI1nDR5lsryBMyUXUd
3CWC3fcSrAJNYzyPGAmNZnu+BfEd15iEGD6MGi50p+XDltDLMWtGUDkbUaoB
2fIBlX7eDxXRIxpMBOR69CGf2yUDd+69FeDFyUPD1tmiOMiQMdEQzO85aM7Z
tbshTXf7Dq+D9j0wiIVbD42d8llG38qcTbaLfqiBiJ+nTJ0DBLF.3Vy.iAbG
Tx7S.T0Nm1S+3.qsHv3G62EQ3tSoNHZhoymG7ulW7ldiB8NFGW0+cVKB34Zz
xlkRJ32+DL3Oq9DM8FGXC5wJjPbb5WFdCshlcX5O4GXBZMd1maFPL9lwoYWb
5a9FOLvvJPpOc6b4stWWky6z3cUSjGwk9Z5nhTOy1X4Hm5tyoPRxlaIn+lpe
VveuXUXRXtNhd7w9kFCZ64JjcqBQ74Ws8W8UdUgTEzH42Jx.97dYDXC5xt6l
wNW+KFe90PCcr600quFYSBY8LiLracGly.eIpPhMjG32ttIJ3yf7VVk2hfII
uSInCk1Xt3Rs5kbIiuvLDZJAM1Pf1vgivmSY9MBcREw3CgVCFDCdIMv4qD0D
av0o5xYsIgXHrY3v64r867x9SGBccuiHl8MBtv4s3KzmaEbW2ZfTfOoBW2+H
RetQiDtJrfg9lJftHWHuzt0TmvlMoYcroGNDCkTgYT05QPxrYqkSpyS7kooC
6RWQetMtjiRd2qTAxoDc.5RMxTpMetqzlqaGoDAgAkPhNg0i.VuGNsNexXPW
Up4sL3fy6dRulHIb25CCbo8Fq8jRfBDlIGiI.DnYNDEMSgXO0Mm6qYlqXNGb
wMYdECoyUEGu3018p0YpxjXtT+AoHpfKj.cUHgMsWbZc9RBDNJIPukFQftSG
HeZeGNRstCKbvXUIKIaR6f27CeR5iQi1YHcoMUr.klcZCBHPTkUWLDoKzvI8
TmO4qIxDTkuDZyLri0N0xDD6XsS9oqmq6eegW8hyY0gxKI1HH7GLAOnPpm3H
lB.QTImYT5oOPufWtVHGc5hYV0Upm57In3TeoKlLOj5QsRsaaMsqMLDgSoBp
DKzqWDudKscTc9RlC6HiI7oWkb9z4tgEAYXhYzAcUUobzPC8msRpdwWN1Bci
mJmTmuPDW81m6yznA20z1.2mitk6Zlmqlb8Shhv0Q5yI9DKbdL19LIuwcd9F
ndDKvt5aF2miKm5bpMwqXgqRmLgOwBWynRTe1SkIbrOBU3ap.3JU3qdpTW8l
i4S6HL9nFLmWICWDLjReNEZxwLeCeQmyg76olLzdL2.sgI5MepIil7yN0gNS
gSxddwjbt.Ss6LopyEXzIap1NqKFdJOVj0qJ6zvC0S2ukGvvywC7q5nM1uRg
D1jJE1jQolLoPOezkK.sZ9t8itb1uTGfwi8bClgLCgGKoBNAfvDx.GavmbBA
qQH2OXyc4DBtM.BmZ.Tat4P7Hvt5R02ncg2eMeibt7EmcNebRDpWQmNm66lq
n6J1aY1iMmWwxmOuBe9rYXufpquGnCumtzR20K4pewTm3P3DvhLhCuIQmEM9
nXb35YRlquZzj+pgt9pAS8qFIFwq1+3Kre3E3egJX+xT.+2vB8QW1ijVNa5q
26JkDWVx0pD9nzwo9cdTZ37nTv4ooeygS8lGm1MMCYxlCBORw+q6zuCqiy9N
SBj7w+cT5Aqoo5zbYWjY4FcpYqISw2dvV01ipxi7MY5y1YUdjj.gBcliGCwb
Dy7M0Wnz1CT0dOv5ahPIRfICzSXHNgZ9l.goX82.GcanWeW.nz9F.RAfX+lp
HX2zT+BkuWUILSdqr9nNmzkk2j4Pe.Kat9CkYaxCWGWEHcfNCH79JAKcdU73
T+n04q56osfXSiwOZcM6+nacOWCQKX05mP6Opk1uQZwFN1+yjCQeM7bzR3pU
pWPmFZr97CfqgbVSqmTWDzCDXd1yoilBektnJ4Oh43L.6IJ7e89vwSf.jjRL
xubNFiLfo.oid+om.+17nnqfBMnGV+m9aPlfoIyol39uQIIYOOZpSuVWFPiK
f53nSQuTEhR6z6uydG9slcOLUB.hohANraYT92lkrdzjuVTDXZ9oRDjZ3DXa
0WSBAlaU27sMQG8E01n54PXLrrRbjysBlJfUh6BsK23aFxZOcfbI8a9427+A
p41pu
-----------end_max5_patcher-----------
3 Likes

using framelib here to process scheduler data is also quite impressively overkill - jitter would have been my next port of call.

in all case, nice one everyone, we found a bug and shared solutions :wink:

If jitter is your jam, there’s a jit-based list schmitt-er too now:


----------begin_max5_patcher----------
1459.3ocyYktaiaCD921OEBBEKZA7ZHdnq1tEnO.En+eSgAsMsMSkoDjnS7t
A66d4gjrjrjC8YSPV6MyPxY9lKNj7swibmmtmV357qNe0Yzn2FOZjljhvnx+
dj6Vx9EIjB8vb2RKJHqotSL7Dz8BMcuofnfXPfSi+y862Jwmv3zEo63Zc.fK
ox2sMcmHgJzpLnjJaoVQSm+7mAfpEvLNw2xnFifqqy+TxJiHVrgwWOKmtPX3
FFL0ahS.R8oOT8IHVRpdJRAy3UxEpn8iwiUeLwRq6hzsaoRzz05lj9paufy6
XvEgbGFAe1Wo0n.ix66o9B5MDD.W.D3zWkZwQHPrIemqs9GLdP+yyLwrsDQN
a+I8TPrAng.MBi0eBuk3b3DAm67u8F7Cs11dgw9.esQDi0wLHrNI.4eKi9GH
zQ5xmVjwRR5O9AdLFQwCiwIuGNi0.D6g0eAt8QNm.lqob6AYjMIIVBWTPfMv
E1bgn4kfrDkibWwRnuPyKXo7FQeibIYYMHOpwTTllmS0KTzjZRLtgjWMob5K
rp4CqoRxkvQHwxtbMzc2GTU4PsLoKo47crZ+j1IUpRZ2AmHyhyHKn83.Txr1
HghzlGnYC..JVG8GivGLTRu95jzE+KcYSM2MMixY7rbZgrtNQTBgZ1KoqH6R
DyVkxEEruqUDfp3bO7WUpn8xTAEMJ9ybFIoFCqyYKS4JknkCQQtRbpTaytAM
AidDbRVOSVF7IsLCvrPBxcEyI4J+07DZSGlqHMMoMq54kPWIJYmw37NVQQZ1
vLyYq2bh4NOUxb6oVaMmhY63FtyjgFhYEjWZasEjjjxT21K+dBmIy1nBlwE.
8pYR4DIP2TrHOUV9pIdMbdoGNKkg5KnuxVJ1nETyfA4vYYUAQt0d4kr0zBQa
ZBx5h1TJDeyXzaPZ27xT4YB51rDIJZOfV8G1LusYQtVzOpilkT0HmbfeuaQY
pezeVP2t27atZCuKV8RVma7WTdRZyI2WAQjt2nf3ofX4OAw3HHFBhhp2S.40
LsuRHcyNGp1oo5izpn0H1pelwA+wFYH7u371S4OweRHQDv4KNfeS8m+vglTP
cLi62Uiy4SexgwgNeQNj54TtNx9DqI0YgdRTtTcY6Uwtg3ZqIlQn4q9maENz
66UVV8BCOZsWX68CYbGncgMMhMBOiPidb99fP81fvoxjX4OgAvXTL1GIq8G0
cqwicwdOFKyeSxIacj9ZYwA+y1DEbcln.LdJVZZfXL.6E.8kFkfogpbkXHJz
KvyGGNwIx+Cl4Rm5.ld1lK+qybEJ6W1FyE5Ci4Rl2ANaqD35rRkEcQlbrONY
ZRjbJiw.aPgcsDsxzWYXPnuejeLJz2bdp2C5fdf9g91TGJbfMr0Zhhe+1jhz
c4Kp7Xk9Tm15grADAiW2E6WOrerZfV4RNakv2Rs.eGUhvywR.5UIJIZnbitp
gkrsN+Dv5aUAdgm7GFoCWg9liH5+NGQ71ch3um3jbFGHFDc4m5uBiHyogCeX
XTcnSyQ0cJVrYKSHK33rJIkHPPGf8XO7VdY.l9bA936v0lIOvJqHgIOZt8fK
3vMZJ2JmJjGWwb9olWA563zWH6QeIQPZlbzqIPGHDoi..glu7BGzDTRr5TKH
TEApPNLIzMKq4hVmVVf51E5rhkjTG33YuEEeMWPVyxAG23x0GiPDh7cLqqqA
hsntlZM0yP6odWz4G17Bx++DcX34fNUWtm.cnReWj2GF3gNG303cP5EcAsJe
cFnSOh1MOY.a2VEJg7w8ofa1ivP8GDdnIkiLqVKo.ajTa0IMeo41ZAO.QG0u
n8tNQGZgnQQ2B6ajERBBtERJ1FyYvMPRPviJ5DYi0CEeOhNsRzX78H5DYimT
8xaUmN3hkjZ6fGSdfpx7CRRXakD3gT6rzO0MDAdz9EcdWKkT67dVcdKqieGq
geCqtuek9sq56cqT6GO9Gi+O.X0peG.
-----------end_max5_patcher-----------

But on a topical note, any thoughts (@tremblap, @weefuzzy) on what’s going on with this summing vs averaging problem I mention above? (before you disappear offline).