'real-time' onset detection example

I understand. but here is a good example of why I don’t - @weefuzzy and/or @a.harker will come to the rescue here I hope. It might be a gui updating issue… but I would expect not to be able to stop on a difference…


----------begin_max5_patcher----------
783.3ocyX1saaBCEG+ZxSAhqShv1fAl1axzzjahaBcDCB6zkpplm8gOFx5VA
pIDx3FPXb7e9c9xGmWW338P9Itzy8Ktey0w40ENNvP5Abpe1w6.6zlLlDll2
AtTx1w8VZdmheRAiiaFQb7PpHiqfoiqGrfo1rOUr6Gk7MJib3vj09KcCo5q3
j0gUWwq8c+d8OIcKrt4O7zJbv6V77iplUG0r5kbIWnXpzbQWJ3We4x5aVG0K
Ebyr87t7Jo5kLXTOO8.usXg9xxQZg7GrEBGZsEhzuEZxfUv+Uk9ef0B1Ocez
8wgRLJLRyZ.EA2H.3cgLZdg7l8LwNdUHVqPi5CZrlSBIVei1Oz9sCMoSnW55
kJTM2l3P7Un0zHJlD07lrTAeS9Qg58NdqiFHAqwg5D.H4MDtRBa2xfRlWgCq
5JRnOfo0.6m74o7nnAB7iY4rIOBvecLBiBSFJ5wPXefOTwCg5MI.QutsCHfU
kDmbe2Oni.D91c7yCsVANh.wDwAf4JnWyTX6lIbW.+PUALcgB398nX4vwmZR
LLkBLaVzI9ACL+PltSvxlXvkBVgbet57faFnp1Pnt7G3yozdQmLGKMrpp1.M
vOJ55pMPhhro1.ddsMvE+sKZ3MCgM6B.95nd83w+Oc3cftHOUN7TbDF7uW5D
rOpilkY3r8muVWMFYhz6CZ5bD5ud18JNdCx3ouzWW2POKqkukmoXCeOrZrwz
OeKbxbD6h8LYd4YW7U5vM0yn8BNdR.GdMblj+4u7.9X0i+2VCY9wxMMRzbLa
2+7AukKUoBnOy2OIybZ0fasPA2KgPVHj9nFiVIjU1N8mC5O8jWtkWpes+3fz
2Vo8+nznoWZcSK2dpisAZ+agmMxFFSLLN8wP5iG1l0bbNR8oo9boI2ByoM49
MeNiRI5.P51ZMsR4f1Udj0BrPYxcx1F2Nf3QIrMIiza.fAVpyXy4sIkO3C7X
1pmUT7LuTVOYPhpVbdJGLyQKgGSElGg+BUuR9yoMyODFgUV0GippIliklNJN
QMci5cHuxgINlVmNTo7aK9s2ibKJ
-----------end_max5_patcher-----------
1 Like

Yup, that’s a good demo of the problem.

What really confuses me is even if the Max slop makes the bang coming out of edge~ late, that it should still report the right value… just later. But it seems to miss it altogether (sometimes).

ok after being educated by @weefuzzy I understand 2 things:

  • snapshop~ is expensive indeed and sample and holds the first value of the signal vector (check the helpfile for the offset value)

  • without delay~ we might have a conflict in the bang’d version of snapshot~ : it is possible that the change is not at the begining of the vector, and therefore we are one value late.

The following patch is consistent, with bleeps when the error occures, but that is good enough for now I think.


----------begin_max5_patcher----------
761.3oc2X91iaBBGG+w1WEDebOi.JZW16jkkEZKWq2rnQn2ZykyW6S.sa2Vk
QN4zj8fVhHxW9vu+vO8kUAgaqtvDgfOA9BHH3kUAA5tTcDzecP3I5kckTgdX
gb1Op19T3ZysjrKRc26Ykzqs.HJW8a31B40Rl99C8vOep5rrjI0yFru2Zpb2
wB9gu0v1IMqFLDFEuFfPYplMXyEQwfu1+LE60Sb2h4A3vralZ40ZlYRBEEG3
zxvaOTm7E7A0Qp9dc0J0eqcD+SLgfdf8W7i7.xnzMJJSIZV2DkNNwnjQQdFf
M1GvhRcFV7b.6HN10zuCdD7nGHFlpckSHZG6DqdzH3Bh7tiT9AFHNxUnw1fF
o3DiyUMD6PGONzqAgEb4Py82Bf9zEOxGVbbRDJU4jGq80islDayBZxe.3GfI
8.Gu4eGVCyFE3GKqnx4HQVDgPxS8w4U4ZW6jXcVMHz94UjEzTy1ef05JvHKG
P2cxrx5tQmAOIwJvoiB71tbMpvZcq+hqslZq0G0mfLlXhN+lI09n3m79JPwi
fK3zZwwJoWPGlqr7Xh1xa9eTzw++EjiyxbIHGsfA42L2.nWpbAYRmqM0YVM3
4yl8dDz4UEBuDgCMQ32JayF0YKe.N8XqGM0HnwS2Fzj460tFA5O2B7y6h.MV
ZcAZ3TaPmr3P28p1RZqGwF4vI33E2Au9HUT0zBP9ibS9LhUvQS2dqGQXYA+O
+RK5Ulp+2taHpN2raPk9.MvuVb6YBYAmJKp3+1XfuYLUM6YMia.bUXnKBmXF
zjDB6fP9PmDGzQsaCmnNYNpyT4wEOi766YfljvHGDFOS.Bw2mv3o466huh5E
alLiCShSPNMkbINC1G.34TItDRn9FHSN1K2AgTepoIuaNLI1QBc+cy3OdoQe
LmIfcUZ+SsSmGk4CSqKA+HeHD9cIjojBZc8yrFQ+f0ZzUJ0SU5s5r05KK3lK
0ei1vF1yECiOU2Csoq3HYWkQmaLEScgXJwM7TUmQietn2koS4WW8SjmtmaK
-----------end_max5_patcher-----------
1 Like

Cool, I’ll give that a test in the patch.

I tried something like that, but with much smaller delay values (delay~ 20 20), but didn’t get consistent results.

I’ve made a post on the c74 forum too to see if anyone there has a better idea/solution.

Euuurgh!

Here is the correct answer to the homework. We must take the last sample of the vector to be sure that we have the right one which should have been clear from the info from @weefuzzy above.


----------begin_max5_patcher----------
890.3oc2X1saZCCEG+Z3ovxZWRi7mIgo8lLUUY.CjNHIJ1zQUU4YeI1AFcEL
lhSPZ2.JmX33e9+4b7w9sgCfSJ1JUPv2A+DLXvaCGLvXpwvf1mG.WK1NckPY
FFbsToDKjvQ12oka0F6EymqjZv2v6eS9l0EazqjZyuC2Z0ZR+Zoz5THD7X6q
JE5oKyxW7Tkbp19V53zHzH.kha9hG27IgDgN7axlYc9jmefvOxyY46cLo0nR
+5JiOgvFCuObXyGi7j5b4uq8wmf9Av0haVt1IwLJJJgWSYJ0.63H94QFi6Rj
2rdhr5z3QNqZNB.mHxW3lwjDipxL5IG4RUwH3g+nJwZoVV8jLWLwBF5T3i6R
EWLSoE5MJfJawKpuvpyEC.PDy5Ayn+oItVb5xH9ykmSBY9MgO9nDamw5D1c.
VTPgkv8FVZ+WKqT7Kvbv7PRLlaBeYwlx21H5yhLt+Qd5x5RUR.J5zPSuTdrG
oyXNwtClYirX2KAHX2UO6rg3QAUworHBuIHG4Qs8w2icruZfmupPbAQNtkZz
XO1zN4dTHKBwwzXdH0ZaGJLjopFF6LzFG2+Rsb1B4tqbGZSuK9zCC0JxTroZ
Ni4DdNr26SwVZa2Up20M0jKV4C3jXSAMty9Svr9GbUtnTsrPuK3Y4TbpQxiM
RdryCifo+WkjSscreojbR+mjePtu5Sh4QYc6d2jwFoNwofm1+nmWjo5hLbLw
nxGZdyE1I2gDbwxt.5Vslfsw6tf9NrW1O1APgG5VZw11znbWPy5enmIWoE65
NrIdr2Ms+CvKWJTEU6.jNibaAsXmf+Upka9efqxx+2qTzLUZr+wUCUwlpo6m
9sYVf+NalIU5rbgNqH+nwzzTwQCpnZlrxbWPmTA70yM2d3kcccz..Cd7l7Ty
k1cQOse5bSdhamstQ5iyl0YyJKpOSqZ+M0Ya1Kg17EigLGyw73mE.b2OYQch
zS8QPBfdPX8ki7IDq4bn2rmvds1g+f1FJYC4qqQgNV0KW2zMb3oN0GnQgPYS
7gwwgnfnOwPMWfvoVMuMgD6cU+ad4zmbebHp5GeEHE3zBO7LsmHL8z.RtIG6
SJQb..j4oet0LOeR7XehGaWdhxxWjUp1AabQc2sOWXVlSFYdLK29n4hzgUxW
x1O9XiEQUcCp55tS2TYalbap8rUv0E0BV9lr1fxZO+9v+f5jo+F
-----------end_max5_patcher-----------
2 Likes

Ok, here’s the newly revamped (and fixed thanks to @a.harker and @weefuzzy) version of the onset detection abstraction.

It doesn’t use PAs evil “wall street” version (where each algorithm competes to see who is first/fastest), since that would be more expensive for general purpose use.


----------begin_max5_patcher----------
4392.3oc6cs0biiak9Y2+JPoGRYWkZs3N.2jNUmc2TadHop7PdK8VtnDorYF
IRsjTtaOSM929d..IMoDoDkDjlIaZWsskA3Eb9.N2O.8O8g6lLO6awESP+6n
+N5t69oOb2c1lLMbW0ee2j0geawpvB6kMIM9qYy+GSl55pL9ak1l2fxVtrHt
rtirskqhKKecSr6gOYB5+opqMgkKdNI8oGyiWT55knBlgmhjZ1LkVJjXrPKB
XJwTDWa5gRmgad.oaWmjBOc6.B+dit2osURUqIQ1QGLh+Xvj1u+37JZrhHua
xxjUwuDmWjjk15Ib2jvMaZ07cstECx7OxrOH8zllRRcMgaZJO9kj56m0zZXN
fBk.DrM2hQS9ljO48GSVTbd51D6Pw03O+g5gjc1HMbcbwlvEta1LoU2863pv
BqDL27KdETxwuikvr8SqxV7CwQsGxSx1DmljtIOtHNsLrrZr2zcT7xvsqJeb
YVZYQxOZGADXFpu9WVMB6sSCMXG9+g7jvUMDvS4IQYolAQmYBSy0uNXMivRa
h1Di8JRC2zyMCKA.XYfNK.hbaw7vbyD07U12.styxrrUc6p49VEurrp6MIoo
6fhkYaFty7jmd9.267Lny0G5Ya6o3wsotdeDVST9XQ3KcQ6xvUqpXY693+VX
Zx5vx3xD2T.E2zYbZHPnOWrHOa0pNzqqmW5omHXM9h3ulDU9r8E0dw.b4Iap
WDMoYVNJ4o3hxtsUF9TQ2VJJe0A5sZZ67Jd3GKiWuYEPEcufNB0Zyv1V3Vm1
2QH2hr0qgU9Mriskz8GSK.N1BT4ygkHy5ohmyJeCUF9C1FiQlIBTQHLvhAgh
1ldAV5kkiJyPgujkDg.PGD.hRJJ1FWLq8qYURZ7hrsokcDVzuTSJwxPyXVFA
skWmqZwOrmvRR2NZIvD2pmVBMoSpa9m+vGp+vzyDU6n5XG0G4w.OYTWkHGQQ
xfJSvN.AzYnHbIgqkZhjikzoHsXWsImBHQ5GjTA2HT5iHxAglDyxlwgNJ0Ls
PwvJNii0TLi.vRvLww.G5oBNZ7MBbBibRwQEIO8RwgWBMcbXES7N+kVc7UNC
CNzA.GhOAG26ax33NjpYBEI.XPTTsfHLbGLrkdwdUDBq8.pVvZaw01qOMJ9a
sr0oCd7t9cizwADraIUS+8CTEYayWTO+WA8.JzgNAMUkIoMl672aV.OEA.xn
lnN4QQ0C+niBPFy0aTT+vO5nfM3fnpwZaTmXLDI5QmQWOFVVlmLeaoatqsQ2
mjwAfkpyCWUo5uwzwdrc3CuO3r+zgQWf2Me7s5l52j28Ew.BgRAKZa7YYPqc
6Uwd.0pKmwmwBXTMFCsDH0F+gHD9gcHhNVGhDNIy9AgJVkDE+FR.CLr3WBvh
o4yDF08p.RP.XZjArz3CiUrwhUbk+wJNmfs+3lBWLmhrdgKBl5K7R6Q7JrLK
Z9aSFKbL7ZDJPzJvpGJuhf4xCSujQSuRORuv0jrd652PeTg8.Uy.wHRlHPKA
QIDpgsP6IQHblGI6MnmS1XtlKmjIN67ELeQmj+EL3QAbmlFoCKEVdElP78nG
88nG88nGclQOBDTTFmGGgB2Fkjg.wNCF8G5gcjKvFuGZ.dFSgCTfCcUVHJo0
ds5Qu37ZHNND.4vkjzyEVnUt2ZBkAmbEPB0sBIbZCQK1Vlsb44BGUYVoBOTW
A7PbqvCd4ynrbPyFBbkDXh9ZVNzxyfjvVVMbx.DSaWjPILCBQn5q.DcqhhZI
ZNZ4Ai707vzmLQ+Z4prvQDqPm8wfWTBslokBlPx4BSrBcKqN2.oNP3vX7ab3
lWlG++tMNcwqWVDmoXKNQfkMbb.lSYBMKPyYZiOUAWgPNytUKob5q.svfs2n
O6X+3nOC11AVBUD2v9g9LXuR1prmdsM24Ag0njEF05g4uN1EhDsbFkFHUh2i
GBSxtB3KQciv2EgEKBihe6fH0NN9LDJ4LTmxfEbBLix3u6wGAiujvWODJ4UY
+1AxkwHVg.Mgw9XAyFex7chghlce1sbvnZ+KHLUwNcMwI8P3zfV0z.VzacJQ
pV0DPlo6ZI8UIeHb7PPyg8M31mhDyj33RK.euKbAnKH2cI3YAZIkKw7.NlS3
7oFG7vJBEqzZ.vYZpsIpIYjDsVqnBkDDZM6ZkvCCa7nnLh3HTl4KIQKXvnmY
oLSKr.rligFczJmfYLFVPoJkPcUIL9HypEX.w+jMkwG6Tl5vTFdZqebEGuTO
Md+U2LQOC3Cv7P9mIJarhE33+EMQn+35vMnOJwyPt+QlcdE7oyoakFb5F7RR
yAAiLNaT4fRL1f1y7YN6dJrL9MDso.bFzH8oiKOEBKUp.OFkRPu.8ciNDAmS
RKn6S+TelCt3nmhGNEb0gUv96CVnutvy0ag9ROmbw0Ccq7YRoZJvuAo8tgR4
.K16YtlPTdJCUJpGI5EOCyiwWTFWqmnAhN.jmGnB30YYVH7TRWUje8s.ulwt
GIadaAt1mL1EgOeQSztE2BMeloHUpC7kgdU9J6qReJHGF.vk813Ei2Dszoig
WWnAlb3KU.X9hoPCnlsv.eFUQB3TBSKUUklh7bPGdO4l1mb9QwqBe8MPtD17
8EI.fUkBd9Lh.KTLE3MjSpmNvSKLn9T.PcLgi1l6L26rLrwTdMh9k6ED3I4d
TeV3VqKJyLEqdwXXIN95elqHh6UdfxSx+HA9zvt3z2PetdRGQTMERwkT.J8Y
fCgx8U0F8+qqFknhMyfYkdpHEUkkTVFo.WgPJ991Y56Ejx2KHkijU8n3V030
v0Z5XxmPmE5+t+Br7yx5F86O1FOP4xgGwsUOqRaGSrSv06iI6xymmraL2ibi
9+TBn7K+Ujie4dXV9ge6Wx+R5eMLObcig.2apQWazBgQvmHtKw7cR5h7XSz6
QexFTp+sla48KYI59pskxu6SHL527aPNmqtOIk7.5SvM9vOYu3xpKCZwc2k+
r4WwqJhQsdJ+dD9Azt2Q0G9H59lgzCseHeoz7S.kHvEW+jru6e6MJMmIoGYq
Kc7bVUs7g9dNqNb1LO4bVQtQXALR5BFCSs7pc3m5RRw8P4gZxsJORxwFU0q3
VbgLxwf7.A1sQsQTRoY5Z9ScCm8zV+38fTeVgesacP0dqCj8UTb5Kwq.k908
1W4N02hJd.2XaNyX+ztk9uvZ1d65dZL1lh6w1TwDORuKM6k1ykdA+uuAzK2m
z68FcSnvnvMkwlxSJaM5u9GP+MPl9bvw7GNv95PorRF0lh1d2PpWs2EaYnbG
0rzKB.HdE.JVDtJ1rQoAWOVGtBrPIBkaTXdpS9NAnZFYe3vUQVdXtWv7JoGu
BF8n3jxmM03HPznrbjYo+hjxWQQ1vSX113fapFep5EQXGv0bPYh0ObSPm0RB
EKwhpPxPnjc283mK+PfOwDa7n.rn.VF.jcGwAnkfU6YeEvpn3EgudpvAQX4J
DJxLwNQpHP3IvfI8IXX7r0X7PywHvxUgvUFgBKKCW7CEmr9.hUHnTwmQnZlP
FvXUwpHP5IVDleYQV775jR.A.2MeJN+jIXPgfoZ3DTN7aAgJCDLa8wIvdhdo
9LV0kH5fwhp89WuW4ebmxdZvr.JGqnToPZHUuEEJB0qjJ4rIUYfqt1udjpOm
TygWULxT7rkMB2GNVySq9dDzOEryI.7qF2DvwisUg6e6bx5QQ24P+cp8tCjq
LsfrWtx1ux6NS9wZG+6VqlV4kn6q0wZNqVRJ2BVdcOdlQ7JY1CM1Z0T2cXOJ
H6jFA8JdafMK7os0ocYhQaj9sqQRDgmjHR7oBfpsFaK75qf4RIonEayyMQh4
PZFNnw.tiHKvX.0tYpKP6KqA7poQgyKxVYDkjlkT.FCsJK6jUHZ1E3VImrYb
JmfoJMybVvXDdJ8kI.Tu5Q3N0Yc+98IqiZBNfJoXMOPhCL6FipcD7kKWQg8I
QUUTz.eO3oW1Kwn+q+ySdpDXhcN6gMk+uxU2+tbv6iIQelyssoaLR+V1rYkF
8QevPYh+zNBDpfpdyKuRY6yCooj5yyDfxmyiKd9MjIw7+hb9ZzWh7IL4LgWN
uH.exOGvp8dg3DSTe8gi.cegDGy3iQejSxv8Z8wNRvtJFX7eGmFmGBZGpBmP
XS.EBeOjBuDtZKXwg0IavMx4uhnyDqKd3cGtSRgWfIlC1A8ruj9kzO6VJh9T
0s6Hm0aMdl+sEwF2QSiLm5cofvrxs4on4wlnVNOdYVdL7KyiqRMs4heJLI8d
3cLEAD1Cvyu1M2OYNl7hquuJBXQn44s68aR7ABF3vcahLhIkHwoQE6P72aM5
9gNQU492+z73xuFCiZv.LCEXr.CddV8pvCrO0sUT1WeNYwyP609gC1jrZU2Q
oY7E8eXddUh5+D.sa.hr5Oa1HhUaLFzlLvqG6s8m9w9MDT4QCAqhDPeLCBWc
7Xy.1kZInz6tQUsVrdIiaVoBSaGirwJorweqo8460IgoB2tOmBxMwfKY7l5.
hdL2xj8BnxdJDPeV9StTPGl+jYub5fUqxlYnJd.vlGTCyIG9bENaJVLGamk+
5rf7FfnUFUH8rUMtfIhtFFAt63opQh4UGbdADx.B8hRVtL13PCPZnqtefbhK
tXbpdld2CbLk2BMlOORnlW7KxQxlgaVqzRIErXwEoBkmhwTPGKfrOrtIg0AW
6l3yJPauDdFz4L8anLt1Jcm6MwL52zHdQJZ6sBzX1PVm8vQqGw3oSJoutCG3
MwOxnQLzngbMFMzisnfM7b0krkspddqShrF2TstVBxbLrQfhFMsIxsLPpyts
5ARmcLRmbSIcosVgoFIrcsPPwOXGDkKrMfoY0+kG.miwyPkmxxz9IYg.6NHZ
rGoHZrHv8kRYNIGvNsP62oGnNxQnNRvvhD7+TuP6JSZXE.P1RyczTmvLlMpr
8z2EBCJ1XkTOjnQo.LKHfAFOQ4LaotHvDU.fBZghKMyhFnQpYTJlvCLE+tOD
asyfZfszr5WiibxXvblGTCqFCKr9xYgUXaPeTD4LkRRzrJtTCeAURFnuKj3j
pSeoq8vpoonyuxuZR+uZ7E8pE3Q7pMgN6xW8HFCQdyLSQLFA1za1vgOF0i1I
Kxk9lTi8M48Eai5Uy6B56HZfgsr+bJde2Hk5Yj81Xb6eg9l6kKGCU4C4u7wn
ccmUR8ieFiewJyQJBgxwTl8bDiEHGnOuuPXTDh5ZHqkSGAies.4K6MMF8xA9
PxJer5kuTYGL0E536EXiT+qmCrF6qM63icJufJCE1uqKECHiXAjGLBJP59+J
EhxT7fsK5lJOb1qmKkvFio.6rn1mmTQm8.mNFcm0wr4xeSjwn.ibDAvJPYkX
mJjkomwLeIzJIWx0FycG60AcMSA9IxnJIqNQylMH89ZD2+J8sL1QASTxHzS0
G461VWC2iv3Z.gpoAfKvUkaKwUph62ku0rQki1d5KUXr8UQF0qhdoupwnJyp
z7hIpQID55DGkKZfSBFyZd7uFG4zaka8tJf615VeiuqiYE0dYGYmsyt4kry1
Xemsv99ae8g2556ts0saYc212cmLxzjCo0geS1rMaq2X3cQfNaYLR0Txz5oo
2E3EtXQbZYmkfZyU.POkHMeRgCzFk1smRMoGydOOljZPl3ikSioUyVlLMt6N
SdxZXzmTKzs8raGBtUI3zOI2gHLGMxTqokLfEga+DvzHH9dXsNtnHrdWC0+.
6DPqo0ydKSVspgfZejKTmmwIOkGFkz5HL2Q+jlYQqF+o89IR689u81n02FHl
APto89o8us56hFfIA1UKrpUKlOAMQ14tBSep5TBP0ZqtuIOaSVdywkvLvmf5
qeaYVCgVqVtYmN1+zWWtiwMK1tDxGwpK6bFGVVgshi4.MyB74JqxvMGZvzNi
xfrq+bXYF5OaNXDlbNuemPtA9uqkO7ye3+C.giREm
-----------end_max5_patcher-----------
3 Likes

I’ve done some more testing after recording some test audio files of press rolls and general fast hits.

It seems like the release time of the fast slide~ is critical to getting a quick response time from the system.

So massaging the numbers around a bunch I ended up with slide~ 5 1103 for the fast envelope and slide~ 2205 2205 for the slow one works pretty well.

Here’s a mockup which does a bunch of testing with click~ and @tremblap’s p sn subpatch too. With an acoustic snare it doesn’t track quite as well, but this is a big improvement for things like rolls.


----------begin_max5_patcher----------
8312.3oc6c01iaqbc9y1+JHzGBraWqNuOCahCtooEIeHAMHo.EE4VXvUh6tL
VK4VRp012Kx9auyKjRhupghjij2Hi6c8ZRQwy7Lm4bNyybly7yu8MKtM4qgY
K79W89qdu4M+7aeyazWRcg2T7ueyhGC95pMAY5O1h3vujb6eawMlakG90b8k
+mdwCVdw3sOFEuILW+.nhK9TP9pGhhu+SogqxMuPAbI3FOBUn9KLP8SDZIv6
+c+2Sx17xuHXwUMWJ+aOEZ9VVjEcebvlE6drn0ZIRJkefhVnt1e+suU8iabe
SDxPydaDNgswMIAqeLLKy6CLPqsUX2sUFxW2Hg51poy8TZqs1JIzSoUd2lD4
K8TaHDl5unGqSC0YC4FuE2FDe+9FzcIoOFneKrVZhrE6jozfGCyCS+TXbvsa
zeefoqSd8s4IAmJnv0vAYh6c4S53zgNJsnsQP5Aqx+AcxGkR.SXK7on3O+xf
6.IXcGnud3IYNLEg8mxFoWVbPZ3eN3wmFZSkPoK4T0HX33LE0WGJbwgBPXZQ
KrnIJGqGsI74vzrnj3CdGuYQvSOcvkeyAOhBW9aI5uHwM6tTTr4RfcWJM74n
xmGu6pAoRXHWhAaS0h+huxHK1+0jrNLMdajVTLWT1CUHR59hXoImrmBVYdXU
WV4s2CrZkF8OXFEHh.rGUkcz2uIY0mCWen7tH4ov3n3mRCyBiyCxKD7c2dc3
cAa2j+o6Rhyyh9I8qGpFH1x8uqP7Z8lpFfV1+MoQxNsxOx8oQqShUBQktA0k
KecR+zTUqQ8y8MF8mHN3oVdXoBfDS53lYxF41raCRU8REVuQk2LOIYS0as64
1DdWdwskCviqgh4IO08MSit+gdd1aSj27w99t02I6SaiM28SREh7OkE7bUzN
OXylhQqU+5+ZPbjzwVXdjoK.A1cSiGrGxVklrYSk1q4NO2xcVKUvWE9kn04O
neQGpLH+3QOUpDsXWu75n6Cyxqds7f6ypdkr7uY.8Ctz1aKF.+o7vGeZirUT
8CTIB4CGsdncsJWuO6aUswEt99vWN7NsYgqKqbl.Sv.SDln5135NRk1s0oiT
odDKMrvaBn9MkV4KriL8Hix5+HAFiweL1BfA1GvTyIPCHArnt3r2YP0VemNE
5xwPsGuMGDc3jnaGEG2YQWNLp3zvBGG0bdfIpdBtNTKnfpUXoPP0Nl18gXge
Da7kbT+IV5SoG+J14a4H9WNpOli5m4H9ZNt+li5ywB+N136YH9e5wGzQ8C0u
un98G0uOod8K0kuo18O0gOJq7S0tup5FPpaYtw8OlE5pVoWsIZ0meo9s6xVc
mjjHLlDPsOyxiay1Z6183NqhKspt0lYPTwqzRRufH53fHWSVAlB6NZf4BDAW
.fX1y28hbhd.0.SZuXI1BrDRL3m1xs.aIXRrDLuo2eqOnF4eInuJwX3XUWID
9RpuuOmAL+Awjl.jWTqDOUZu2sIQQ2VOHJ6B.P+m8f.vx4AQ4ZrjPbGhBgW.
PZZP75jGU9+mGXEomhAexTTihOBnhtPF3C.idnOFCUDrBKbU46PUS7EwncvR
9TgglXlvBGhgzWUCuKARD2wCn4W.vnbR6eVpM5CkAf58AoZoGvCJmQt926EY
YVirHfYB+LvTAs8GgzkPvnq1l9b3KiMJzR.zDNjIzHKvOj8Qg1fpuFnI70R7
lxHr.F+3pen9CWpThcd7lb9kQ.m3wGvY6PJy4AbxEup7H0NrBcb.mb+WOAbJ
DDsOdhyC3jStLFsubxvPtyC3jeAEvId7CuKARniC3jytbB3TFu4tvMolvMYr
wFuYIvZxuEHk6j3MYjWMwaV.fErddVh2jQuH3iezbwWveLCaVXiFIT1LxFO6
Rfii3jnrvQutPEvX4BCwb3ZZvtX3aazdtQDjNY3JlryzszPG20MR7pY5iLvR
5YYBinKjILRmfILV.hLnqmhH50Eokk.ID61XHQWFqVlX4jYSjY1WFPGpJheU
oJtCIcttH4RY9LXDCJmICvi.AdT0jYn5QndELo2e5H3aapc.8M4g.j3FhzQW
Di0wHHXZRMlR2NBmsDO9WNizgfoBEwNdbNzIwPd6177j3QmHaT1AriQJ+4Xg
niNsYXCxS5bGjcd0Fy8tczSJTCwL+CfXjKfXxqClILShVXH2gyc3TpgWNqLq
m.L5TDz.jlYBxHmAtxtDla8pusZS3ToTZXKiPcnNoSlVnQvlF6dXAY+FIGCN
JHA5I.u5RzpjGeLLtYdpqet30ges1VAY1.LMtzKdAr.uLQKSGDbMA9IlbTs5
lFYST7wxveMXn9b8C4YIaSWU1tJDcul.z5vr7n3ca2l+5N2g5O7IoMbxBHX.
RHFbNjvgfgHkDRbsDhFfDxNGPHdHpgzygDRFhD1Ndmjt1rIAQWvhNueQGeAK
5h9Ec1kqniH8K5jKXQm0unSubEc7QFlxubEc9QPc3Ern62unCbqnSGpyam64
gcwGhFeHRH9bHghgHg9mCIzeH5gnyfDhFRf3H34PBGzjYTMGnqkvgDHt3b.g
3gpFxcsDNnfSNKXHcnXHy0R3Pbof3mCLbHtTPmiIDhFhKEz4voGR4RAY6r9O
GRHdPtTNGBH5Rm7I5Pc44ZAbPQudNhZfMj9Xz4H1PF9RWKjMDmxryg4Z1PFn
nAbWGaHePSh9bfg7AggmiYhxGh0F9YQBGRfM7yQ3qbwP6kc8xYvGxbk4mivW
GBDd7QxGbyCqDeKTkJs0exTx39TPddZzsayMKTXKB5oUtxteSxsAaJJBY6JL
dcTQydayFv7VvHCtMajURSjIMNZO49mxBFouipglqdHHdz0WTDxTEzmcTg4H
T4W+hW0bxsy7UoaPAJL6QtYu1hhcU4V8gfrjzWFIpX1RGTzbiJDGgJJy8iES
.EEi1wVdd6IyvpfM7oDapmINclENcC.DP2YfyPzI5tEKNT.6HcaZIUal.3oQ
lccB1WIHr0.DncDf.FMBrupm2HAi1CJsEBzAPiEb5zQbOjZSTs2tlAKEBKkB
LeNkBeakBzbJEbakBxbJEDakB7bJEXakB1bJELakB+4TJP1JEcORs3hkSK4X
SI4mOkJ5e+SAo9zOLB2.OMRTm9QA2G133HARUMbUw4YnmtL6NMRLgBvnS5Qm
CFNom4Jpxqd1eVU.rG3YtB1j91EUcel+LbjqfH+C3QtB0T97.jqm5JWO0Utd
pqbkpnqTEckpn1.EzUphZAUfWoJpmCtn+AipnIfnjyIUQEGHoihpH3kIUQDv
3m.pCIog.uRIfanGAdQPal0ZmvqziLT5QJINXVXGonhUMYG.36CGbnGA3LLX
1N2cKpoTN4vwFZNuIolvZa4vwV90D8n768voPNSmX1HjiNwrexK8DNFhQjCo
DqY8qbJNEhQWoD6JkXWoD6JkXWoD6JkXWoD6JkXWoD6JkXWoD6U.kXSAoCuZ
HfAcMWctrHobJHr8UNkX54woJb9.y4byfYFqj+.PguvINwgnmD0Xae71vzAS
ZjeQHNniSZD8lcu1xKonUbrDIU8TzdhoMJO4962DNXTw37p.UZVufss68vRn
bsiNB2POl7qNMwiLXE7R.PnUHnmLAYc2SSmZ5egCsMJfyN6ufSoQVohWOTUV
DZjprc1i46HU1UahV84WN0lugRe7bjjiS4BVrubaaeKzzzn6OcVl3gjhEm8N
Q1gqfwrzIRNkFY3OsNX0KCN6hKpG5n8EOYBsyFCnorRmz7GNINKLecnZE.hN
AyKEcM.sQSe9jFvC7e.WpDrY2EAMrJAQFEDe0g0x0EK45hkbcwRNIhMSBVq8
ucpTWYVP3RBeEikv29ozbZ2rr5o+UgU2Nr.TZCqN0rcRBb2FC5LSDJYGErjg
o9BFFIfHZWmNMJG1UUL6mD41LccDxkad7e0wQv6qrtBQ44n12K8DzWs8Dvh3
24KoHeDlJv9BBleA2W7p0.kuOTcLMRkSw36j9B1jt35kqkRa9P07BaUeTmdV
OAGFPgpCAiH0LSgL9fOo0OhgbFlQNiXFkNkXF1YXF8LhYB9ThYDmgYryGlQP
foDynNCy3mELqfuG3ThYSZTpYqjyzth63TUZUYZ.RPSImensEt25LEY2z.vn
Zn.zP5N7zxK.l30ruPAgYbExlPUGB30rqvRHiNkV0ovWydBKgLg+TBYupcDV
.YDDZJgL9qY+fkPFEOktAAee4FrjBFLYZ8BBm9Yme57lRa2QeyDJYn4G5QyL
TDppRXOGuxmcbhXp9NMUEbANQ99AmPE4uf.sjS4XDAAEb2.S3uiTmfDiYTAw
4vj5vxvcvTe90hShxB8taSRR5YXddTMQhbfLxSNBPExqPX5NAF6zcwwcFaeO
mrY6igdqit6tvT4GpVa1MQIX1EAsAhPvHBTfyeMOOQedQt4gavg8nBH8UMoo
kflOYZAM5q44JV.ZLDaZAM1q4YKVBZT+oEzDulmuXIn4ClVPyYtSOClz39zN
8CPNcLyYqCD9b.YjN8BLBHC5LRVQmCLCqhzsUm.iAybFKqvyGl0lOfwfYNar
4YfwP.PCYs3A.5OBHi5LNC2scRNcBCKxTHNrIFLJJCg7uuXNsLMcldfP3p5O
fWxc2kc560bHWqzyD3kbAix.xYGS80H.YzYmZmj632XP59bxuJPzYt42U94W
6waKO86HW86Ne8OdN62Ud6WI28sH+86qbGQJ5PpOzu8r32hL42lr4+nYzukY
0eOY1ucY2+Qxv+ilk+GMS+OR19e7L9+nY8uEY9uMY++P1A.8rK.N5NAn+cCP
+6Hf92U.8ty.5Z2Az9NDnicIfU6Tf12s.0MfT2Hci6ezvcpZw9+HNSZAIyK+
gfbOktZ1CI4u3kG7Y8EC8TcjdYARANTZbWeomkp0Iod4IdAOmDs1S1YIMi6E
kksMLaY8WkZu7uJYqoTVfqcythjpyUJAVr3hlsqq1fDgur44ZXm9Eavr+hS5
TXbX8BMbYVysYZnz9v5lNOOILBBLnizWIGRXPhfIfLBfgtwSzZ591umTK7l1
Cg9mOT8CdvdgRj0PImuTP4X.mfI.ABfgRLzWEq1TfjGtq4aCLEfK.vLXswak
WVz8OmMVbES2OJVvsTkDcTUxar.Lgt.LaTQgF0.YFeobNA9xwxbjfBopAxsW
ngFloObcAriZNTG0cnVvupwG0nFD0DVcxwsK9bbZ6BFx4A743DbW.MGn3VIg
Bv0SD3SdVwe3kSgWoQsiePEaCeLYI1GiD.f7J9EKxLjLyU1OJvQ7MjsIZc3K
dTYaBfOEPFOAfLVPVRUAZw8g99E4jB2elwXB2sXLBAn5e3bXFahPnUXtntLN
m3rq3NKHOY8smbUdsPWrQtQ0rXeO03iqJ3qEkgqW7psRsCgg0xQrMRHQgXtg
Imc.Z68PzSpO23fnhRiKctKMtUK5kWIesSxW8KJDRlykBpoFko1LjWYe8J6q
WYe86S1WkFzxCSCW6ErccThmz3YurmhFIgB9lfR8AKwbfOGx3ESInnLxgGCa
BNgxuiAnFbLJdVgwhRYkYu9.GOxwuDPNSTCdq1lmb2cyJ7UrHuE3Ge73G8R.
+H4O3kjJ856oJnkgoeIIUdkGjV3qEM1zCnXSo8DA0oeCDIFOjdIrpH4d25c2
n4P0LAHAXIUHvBFESYDBUwfe6SQ+THd1TCtZqllzfxUxEzxMcWZ3+21v3Uea
rfLBXJetRcNBvGP1k5JB0Lz8cxRNguDTYM9ykQyHmzi2OXLGP79AYL2OopGk
6LG38CxXCS1jb+2NzZwDoqCErkHjOiS2y4WwYa2TzKrNRWQMCR+Vu8GP9EP+
wpfrUAqqj0Vmz5UUbX.pJQqT.FgIGrqVamApSAYaYpx8jXeyHpV+7Bo2735H
XVOmaHyDFgo8stVcEgnUqu0EE.WVCnmXDterUzG11aLj6.Xz2MK.agJrObon
57klhUesxdmnATd7YFdYsfrRCS1udmDvYX8NkNjrWB0MmlKN5JoO6zx7d1Wv
PDFf3S.DHgbihTC.Gh.bgPpsfEH8kPprFAJDBNhxYxu0kttk27PqouVd6vz2
osbxD2xA2bvONSsGaWy9N51+NsmjNzQuGqkq9CCJnXYqCqa4pqf8ABBPdQCV
Pf.LFCnHDmS4mkFtXHY5B4r0keM8O5ZE49oGCdx6CLvROy+AW14ZyQO1NkQm
MhB7Rpbt0BhToDWr+P.nYa6QfcUlFbePtJQCpj1lCasKMmt.bLdIiIGyh1Gw
F0e5N4FOxRZhbUFCDtdDGKrPCK1stUaPiEqJIDq2ZpB2UKI9tzZewIuC05Rs
BB4icb2QJJ0nuONkgKUmjXjuzShO2mTliNy9YNLG98v.tRiSsX81QC3DtxvT
VvCibrFUPVBpWpxm6bQg4JGcRzP9QO8ijXgzNj7ObeYvZpT8Bo1djjkHNzmf
fXAiaF4IrI4uHCxo2tU43nkvchqrbsNbSv2dQkBnp++TAUHtHgmHKgT.ki4x
4.XLxKl6b4D4JCXkq7y5soAGbrXMXaYpTxj1t0de+YKPTjqRq3GyxSTa4srS
1XO1r8fZ0LFe5hDs+QfPeWE3dX7Kd+PoRkGg.GYZr1VToP3rmilWSEwCREw0
YOsT1w1Q5HxKhI12bLtYJvLW2K3WyFwqYi3Eb1HtNrVBF2+l333KZVkgU+p+
nT4Va.Y8udgM4AlIcELE5FVQFJfoCdIL6Zv+vWdSVykjybtLs32GIiIH8adl
wouSpw79e4Ol9iw+IUofcW7TuS55yjO.RL6iPyGQ8+QwqRCUKtm2G0Lo9ur6
Q1+Qty6cE6w1e0G8.d+hegmYN4uKJF9duOJev2+y5ObdwGSdEySm+2U+U3lr
PuC9V90df26U+IJ9kO38tchz6O7K4GyU+ThZP4Gt7aR+t+kW.4yQT7Q1S2.6
U6P6W17YO4jfW.XmThOB3AsF7HEkgAa2518sL3KtHV95ArHKryvhWyFxpqaw
V0shqx0Q4pd4auu55DcyA+n5p+LoqbReEjsrMIewKL94vMxflN7SzU9yNrxS
upfHpzhkNfpuwBo54uUOIZs7zmwYkG26TEmkYCePXz7fON6bS4cJ+2dAqCdJ
OTkuqIO58m9Md+WR+d2tI3au+TmkJmqcdHTaIq5KDWQ4rv95z1gQuf5Xh7NC
vxVErITUYejSC8wfMxnBW6YJycSsxkwQh.CaBg.+1RfcKq8sNqXQlEtQ1X7B
ixePkz+RPxKI0SMTbUT927VqYZSUWjRh8zGumcgf3SkiIoSXMgRp0fRvfH.a
egjGAaqzHY43SmU+f0T2JwtLoZlDlpXNy6N4L2R9hDaWGtJ3aSN7Ao7tJ6jl
RL7oAdXmUluULqnBpaWc35tMAxO8Zuf77fUeNa58WB0F8YbxRHRfoLeLtfbN
e1oOjE6tgrqd3wnbIhkFc+8UOGRlF.R5vTe71fHx+lBQLeJ9fC7lSCePtZYo
x8PmrGQhITJj+ReDAvQHFkg1W3eGAos0qnSUbLhbFzbxTZy7MawMGCMtRoIU
JUgdpc2R9NmeKroNfzMTgjAb5yXXvdp+sApvG6D9Q++cVyZlR7pQ5meJYJfP
cX6TK1n1S7bKOA0NTdprkHz9K7dWYLLph8XT9VYjyuCrT4dAt78UhUtYpmOy
FtGrD1o4bmTUuQlULVnr5WO3VH8z8D3rhGeQsV4.b9Kxvbih8VsMUcrIcTOn
mdPYlhKrLnLd8rYvWLhnxbVHsA2lkrQYRriCpqIIPCUsPR6SAujfHP.hKvpx
RIZ2Aw0IFpgyXtnksg0.4lfUx.IvGwP.AwmA7U63zhZVyocFZ4ryzhh8Jkz1
UZ3iIOG58u+amd0DoAHCoD.0FWja1whl7n5DUPbUJErM9IkE+6prCvci06RT
q0Tphy02aLougk4OExUEVq7GRCyd3EOU9SQOWEQu1x6JHlsjNqY7ADLo5y02
VmC5rOnr1jgZZQypn9FCNT8PI5HaWV2G92uKLNLMP5SsfrsfczsErmvsmC1r
UFOnlRov0d29MOzR5iYueO8RQwxWhhQNciZ4OF+iw+fQ426iEOto493VEOTe
cUnhLk30phddrzLc91zXuaCUqIwsg2kjFJ+K0WWQvPpO78AQwuS9NtwS13du
76ujjlOppR5gkOWQCXUf56q9yqVZVOofKeZEugpEsMLdcVsF+6zS458U3b7c
6+saCy+RnTpkgGqZAp3ikee5nQjegsEjRQK6KODs5A40KYQRF42lMUkRk7s9
eS88U3D6iRn8IYir3etqtRTrSf8dJQNSU8i86+otCSm6ZC8E7Y01HNpIaP0K
l+IDmNyoS9tPGtTUyzaVzWTm4YaAV1X.VpopHgTGzoxIwS1kbnHqlHOypIxe
iESp2Ym6Mlj4IH8dUo8vzcncmtzqXLmLxRucFCj2pbniJqkMCy0imsrq5fEp
E1xdRcVFsTzoVMVR4ramhyd4tcLAOimLvdWNLJPfFlkIHwRQ8B5LeLjK6ppa
6sYu37H4KKJtR6PBtfwPx38Lznwm4TI1u03J28oalJK6g51RQjC.bK1i6cs4
fgUSLjd6vGrTznZx2UkjugzZuwrGiVqCkn.47YlyfCHWsBdGRXLkBZ8NyTim
HrrKf2HOdVnKRT1GL8rIZL+tEM7YVzDcKZfyqnoNdpqo1uSzHmWQC1CpglGQ
Caon0Ran1PaL.ZR8Hoc.tpDM.QDfzNtd1v9rNtmKUQPjgzXgyjkGDZHRAZtr
+ws09G041+rUzXPmajgODiLtcjrshFAY4HYBBzLvUlXIrwFYs4GzoNkr1FF2
0pxXzPDs4ZrNZP.zbY2SQbqkhwLFzKz1dDzDF0K2rDobHaImyfBru4OpR4Ch
oGr0x8lKDv2xv9Qf9PfoopDMs54fgof88SCCZqGw4b.LhYohiYjNZNECf0hw
rgFBaGFAszeKW5akVKofM6vttuCUY1.hDHepX2AOtIw9ZdKmFqssviNbD3IB
OXwRr5OTAmQXDgZvpseN4sVxkilwHNCWtVwpRJQy3aZ9IcYPDHam9nPLmrEY
swU3QrtN9p32z1vrd5F82t.LpL3We0jZQDrdWXQAPtuzmgfxILN23HgIvHD.
R7UEfiiSXllULgZC2VKszJBbn4slqYLNj.mlKqtDa8D56OiiEZwlUO9imMov
VGgD7LJETaCJ.Mz3omMw0JZOtLjVvfh0woDNXurwcMMMVKZbhqYDfYMuaNmb
K6EMjqQM94XR6.VGSL+LLocts983yosdtsjmf4yWrRySKCe559W1sLamGFze
9HEo6AYxolpmqJiuDyjfh7o1U8vvX8Vxnk6MiPkUVYXSmUlhk8lv0m1UB.sv
RhROQ1pMYPRyaNiH.1143AcsxhbV45TDPsJhUyQMNo2a.4l8dgbx8k+qYD.Q
1FRt6APjPuLrP5RAZ2lZTspr0u5LBODaV9rKhnuEhIhY.2Ht9CwEF77KtVub
PrNCoYe1YoqZacjdV6R.sGC9JqR0TqrVC1tHGrZUXbdErQnfEY3dHHS8abfu
PQXU8wcUpKOvBb7lRM2prGpx2N8m9SQwpZPYnM8C2b.rqR8w1JZcKdT1xhNb
9Bs0sUAbpsaH5Gdp.LpCPPjNbGrzVDQ+aRqSTnqD8GCyxBNrnmzuvO.TuR+5
cQa1rqg2RofZQYBGt39zf0Q0N9QMXFbm1jlo4aZ82f0KWk5GEU9nR+.RD+lV
+s1ezxmD4Cf9ZsWbg1q52jWB1xSFDeeQgsjWqhK9TZxSIo6pBnKkw5d3ysMO
YG.b3LVqTHp5VUn4H0gqQTeGcO.sYc+OQpFCz9YIRbB66BM47fmrUfOL0ZkV
J+CA4Id+AU8.cwTHiEeGkeAG6LgoPt5rNb1VM37HmAL0O+WLJN5eZfP867fz
b1HCUSu4xZ1YwW5hmiB+htdrFsQUzC1mxvKRt6NUx7qAyOnCW7CGjc1KL0D2
0oRYZW8IsX7vhUahV847GRS1d+CGd8Fk6zp234l2316ern5Ut6J6I8o3JssA
0ZM+yMk8OS5TaJXmp839tVTqYN8B09gnPiRsGG1JUVji.tQ9uTkOY84UP51r
GByVFDcm5e9CaRRd5v.J1qLuN7wDoa+30Kk8IOETNT7nYlckcSvhC500efpI
hsQIndrGEpBGICA5O3yV01r8Egs+8TBJUXP6zewTKdyko.1ndSBadQSv6w2h
2CaBdOUyKy9xIF3HeSDadQ3onIYqZ3XaQUYDoqlzTnMfg1n1Amf2Dwl1DgOE
uItMuIvTfd919lFsNtU1glhws1nPHlf2C0lWzTn3YidWMgo5JCMudslk2LAc
9d0vy1qFQNesZv.d0iabi09Ucx.GzbD0kcpuyxq1Ncn4oUCOesZabjgljPa3
19lFczZ13xzuwKxLonZGfMp2QsCrlZGTMMOfZ59foo9ARilUfZTtZZq62qup
pxweQeVD7o+XX7Vyb+pwnwO+1tXUqjOgcroYtaI0.0Hzh.gZhYwPLGYn1RwB
I8PZtqQ81Aj6vT7Tp+ME8YXM0e0dLzPIOqchy5lzrNHLqjyiada2L3Tk8lCU
710Y7G1tJnuNfVH5FWRhKlPkszCI18f1YMNf4TngIRjOV3a9MJDvp8PgazGh
EUdV0d8lqeBA.JDleS9pQUSQxE0q38.BjqkS46iXVbcAA4a9pnrcOWM1x9Oe
JL16uDDm48WBeL51jMq2y9foJQK6ipJfHY6PiCPFGYzRD..rJ6+cyqLZ2hFf
1o5g3BBFVuAd7AC0oV9zH3sAYzkiCDb.UXVoilBX8QDrR0C1NJrYEeSWtCH9
b1lHoEs+ak4t9FXz8p3riJ3QKKUn515wmGegnrcQnF5BPMIM3CVnoih71s3R
ShXUYQjZWvF7BGMhQzCdghNwEI5Dse3hgzUGcXWu3gK7iEZWGawdFslkoFq7
usYa3GfC0MLjyHFip6DPe0kfyf.ll7k3AKg6kK5twl3YRB+seKX3BH.IiLvX
jTuEdzicPPHDO8B3uKML7DjPM5o2fRl3KTthmdg6+ITc3LLXoSHCgiarb.EP
s8MpDQqZBoRwA5upKOPTe.PLUMfsOdaX5uSFl1fEekpHP28SkNKo5VB7PqYS
h.lZBnPIgVa2gQXLSFhJUG4EwtJAVebug75lFz91yzi3sM2Ae.GBzeTeLgA7
KBjmCoSYqZ2xq2di4XKo9vd+lIl2xwzpxe1a+6u8+GD0fuFJ
-----------end_max5_patcher-----------
1 Like

That’s tracking pretty well! I wonder how it would cope with stuff that doesn’t have such a high crest factor, although maybe this isn’t an issue for what you need it for (but equally, maybe this is why it struggles a bit with the acoustic snare.

Yeah, it’s all a balance.

For (most of) my purpose(s), sounds will have sharp attacks/transients, which simplifies things a bit.

I want to go back and really tune it with acoustic sounds, but wanted to post something that captured rolls a lot better than the previous versions posted.

the interface I work on with @groma allows to fine tune these settings, so we could make a few preset in the helpfile/example - tight percussive material, low end heavy, etc.

I can see you still not use my ‘first past the pole’ version where the median filter differential and the dual-average differential are competing. I will test and edit this post to see if I get better results :wink:

edit: the results are different. It definitely confirms that we need these parameters to be available, and more importantly, with examples for each settings, since your super nervous one is failing on the bass stuff (Tremblay-AaS-SynthTwoVoices-M) and on the full program (Tremblay-BeatRemember) it catches stuff I’m not sure I like. Anyway, all good research here for fun!

Also, for info, the decay time of the peak follower (the fast asymmetrical) will indeed influence the reset time of the Schmidt trigger (slower or faster to decay, or how nervous it follows the rectified peak). Does it make sense?

1 Like

Indeed. That’s what occurred to me to experiment with since I wasn’t getting a response time that was anywhere near the lockout time in terms of resetting. So I started looking elsewhere in the code to catch it.

One thing I started experimenting with, but got nowhere useful, was having dynamic threshing or dynamically adjusting slow envelope that “rides” the overall amplitude better, so it can still be fast, but not uber nervous during quieter things.

I’m sure there is some literature on the auto-release parameter of compressor that can help your explorations there. The paper mentioned earlier is quite good I think (Giannoulis, Dimitrios, Michael Massberg, and Joshua D. Reiss. “Digital Dynamic Range Compressor Design—A Tutorial and Analysis.” Journal of the Audio Engineering Society 60, no. 6 (2012): 399–408.)

1 Like

Getting back to piano writing with some more realtime onset detection questions for you.
I looked at PA’s and Rodrigo’s solutions. But for piano with changing pedaling and no need for snare-drum speed repetition, I’m not getting good results with your solution.
Here is a different attempt, but it does not work well either.

I’m using threshold and have it ‘float’ over the past 500ms of average energy.
That technique has worked quite well in the 1990th, when no other attack detection
was reliable - instead of looking at absolute values, I’m making them relative to the past
energies.
In order to prevent re-triggering, I’m now also looking at the pitch and try to control
a time gate with it (slower for low notes, faster for high notes).
This is VERY experimental and does not lead to good results yet.
Any thoughts on how to get good attack detection on the piano

  • with, without held notes
  • with, without pedal
  • across all registers
  • with limited re-triggering

This is the link to the audio file:


----------begin_max5_patcher----------
3546.3oc4cktaiiiD92IOEZMVfAX1zd4ktVfYvrOGMVDHKS6vIxRdkn6jLMl
7ru7PRVRVxl5zMlM.ssapCV0GqpXwpJQ88GeX0lj2oYqr9WVe05gG99iO7fp
IYCOj++eX0gf2CiBxTm1pX5aIa98UOoODm9NW0bTRv1CzrLKXwghOcH4DOhx
UWGLu0L9GQT0UTbd5Sh+wQplLVsx5+jeniA7vWXw6eNkFx0GE4RVa+jEBaK+
xwcMP7efqAkWinaYwM6U1VUWJH7u3rR1ze93ixOdZbL8QqW3q2jD+5n44MAw
6uNeicU7sOTxw1NWmuQWx2kiKpaNMMmayY2GVsiEQ+FMMikDWg1eXUvwiUZ9
gJWhDi98D0Mx8oxlXw5lvkMkR+Fq35sKaMHUvhbA+cJUiMu6PVc91jrklFeh
oHEcihQqGKtgknhsDGbAxOgPHR9sOfbFVDCr6CShzjzWsTfWsONehzsLtDyq
cAf0dNBQNAxK9kKv1yS+KOBF1352rOJI7UpBwAEMlbjFyhOlRynw7.dNJTd3
szcAmh3OuKIlmw9CEP.kjVKGeWPHsyKNN3fFE+2orfnBbb09T11jXIQTaLU1
bQ2I.EEHJ+7LynNi3fisbwBgIA92wAyDL4orMAoxg7MZodTwA4IIQ0OTIuDQ
2wyO7QVbbCTjmbr6Clx1+xUt1MIhCd3Z2a0Qxd9Tr9nOKz54OmE7s5THOHJJ
2LP8a+6AwrCAbJmoGBPfxCRiCDL5KYgoIQQ0vI8Q9VKGYqPaIj9FaK+EUGUU
XPb5riEBQqJGk2x1Sy30aiGrOqdKmsB8RPbF.fNejSaxMJ7Lmd3XjfYpbd3y
MVgoOOoQUKBUsiVq8F1SCSNbPnPTpuW0nJ+Eg1xKIQas9ochYUj5j+jUvlju
QsDiIoA6oVzXZ59Opd0QrXZXxoXdMSOWXQFT4HWXUtKSu154Zf1dJ8Dfu7KB
th5RWy6boM3hlUy+jaUaFvP0zISKJfcgRTv0weMlXSr8exBqMb3O.jvYoPhL
gPw1IFJbfqcEPAgnDD.CFDPKEHbjI3Aqvj3cBSKwgzIFO7rUBB1HEf34OX.A
RrmRHQX9PzqcyrnaxrW5a5SM7US66TRpXF.4o3bcjxU6phcNfAZ5EWOPJb8A
kTgC.bgAb8DKpgxIDIq4+aGN9KbKpanFN.ntFnbEvTK145LBvbRMLK5xMB+q
mewt1LMYOUBXX+kT.yLGBlX6VDe+0k1wymWeX1svtqVbvXKa2NZ5LXN2FoVb
DgfFOtLo1yMwJzWrAKqUnBMtbqPtiPiCuTBQh4E2SSs1K7o2RL2kUTxaVwIb
Z1SVAYV7WneXkH9L8MVF0hSi2ZwSrRobwRs1W2x1b52sqMVAoHW85SAC2uaL
ZgjC+a+SgCgh+VOoBgp0AcaIQhRS0Ep9RCdWWRD0Abg7WH3JTrDy8Ww9EdXS
Uxjx85uLDzb7TKtiLB0Wj2BAZ+7mSpvUFaebPzMAp7IKczAfDo9OCT5ZRW7m
zpePcYnRjRZ1vxV7OH.XAjetryMXCU1rbzVv78GgF4hMQpvf9mSpuq4xWl5A
aAloi1BlLBLCuPXV1wHF2BiTl9mTra.Fxz3lqAV+wcgankR+TGGOsKsV+c38
wwMOcVCzV9QM.rZAlGsFzaYvZxCsDo9+RGtiBORze4MhUnCWzUidMY1hnvmj
lYoiq1RK3VD2i7.sAbFtIRn6BYhrBpkxmV+WhXYlacDiTAwdDt4A+KdHJINU
W8+XhfDjrj5rCCIajJLkLaJKKLHm.W6OmPs1kZnNAr3wHTh9AIZvxzBm8RB+
Sgco9pk2xXw.WIrvQeEV53XZLY5v.oGXobgjs+y4.uLbwcXrBoHNJqjXzHBk
9RsHX0f78SDq.wvJIM7HVZ2RFhzqmW3giYFsxtbsx77naObycHvRs.EDB.lE
6X2FrrySttNpmnAKegfKEXErIKI5DmdevqbgKMdMhfeNsQm5J5i4Eyx8zrew
7j5nrn0KGlFo68OApygqbsVGLZCWtXouaivoMTskzJNe1Ag+qMN+6nqbGCBe
UfZyjiblNAaNbmaNbPZzX3BF6zagXngiXOYNpQ.n1KSXiiB3hkwrizfWCNb7
9tfgBgM87rtdCWVirT4vkEKrJ7sy05qoIcsEPqsklB7TI3IuF2bGbI.rXU.v
+vBdGWN.wK22Vk.D1avYGi39+KKGnXhT3XWN.wao7v099LSXNPo0EGQlWIKU
Z8+hXVPzcTYDmmLesQ8guV.6kxygLZjEbNbZPqgatiCNHU.xwC2aK6kpLHjO
uEoyAloEx5AnYqiyHd3IhwdozL+0eYHUAgInlI4nt.u7s0Qabv3kyREWV518
8ubH5ihoYSUliaZ0RxvCOqyR4UuNm9Bm5kqFZ88Ox11.sO8ngWWDNSZ4jn5t
6Qcbk+vq3py4Dn3ytgCPWQ5uV7KJVpRSxjEuk9dkmhyePAOyK+swBa0qO4aB
anID1zb8T+bgoUvbcvq8JdtvL.d5J+Q1vQKUc9oXUFPlNdNEUbh73siaYImR
CKDNxyD3SV04mszLNKt7g58qkKfSchFMt0WpPXCxLpPXneFoBjgTgvsFYEXN
iTAzTpX1vBSkKD9EOeTQAKda4BvbREdFREJs7FmYR5V8lR.7NSaH6toMv7Pa
PSG8vyn9DwTYHzbpOQLcbhLqTgaeFQPKovhwj1xqigIFRZX3LN1gQFaEZNoB
S0owy4L0HS0oUt2.aWXAeeIMkTEbIkiMmzPcq8ityjFraTadLLgb6ir1rIw6
X5rXyoe5H3ODTgo9l1BnM2pXFSZvk1aL0JzMaBD3bZ6FZaJYPlSpfzK6z0Ow
CrsGSXw770f6BWijIW.4s1W7GVFp.hZu04bSKoPn47FrEMj1YNGO3ZRNyYCx
e1RKZZQEiIXiEicmUAHnwxw3YkN5iK8KqEGROmsXAUQvlqhLmSqK2bDLjNvy
4BCgF6.l5QVaFoCyimw7RGNFiG1yJcX7rknY0JCB2qoTfyFcX7pfQdyJd.9w
P9.1qHjNaCKP2ePfCyUWlUebMdpOa3rNrf5S1cZmLNm1IUty5HuSkO92Wji6
h8y01oYYl0U6KsOyhk6Guzh8mVvSU9nYdsMaquUdlAggzXdsc9VWhPb0Qdmw
1NdNXUePbAxT707xaro453PHND4E3f8cf5ahmGzEe4kV8Qr+qpc+1F24crnn
x69CW.MBrIOOtq1mFrkUufYqgAf0He.zWSN.eO.Q+KQSvKHr7qD12MB3yWJp
DNDqDPc9Nx+b0+Re2t3JCh2mus45BpteCHjpSSNljVtGBuF6W65NwSJ4+ptp
dVF87Vnr9IKPblskl2UGDRgrp2Cov8iUuAqjaOtaeVuU.+b.mmx1bhqk4qL5
zusr18QIaBhx2IZK0SLX+q87dc6im42oYG9NLhE95mid68tQsYbkM3artBUv
d8diMOe6Nom7c8RLuVEIJHMq2dIfK27ujOj8zXwuZGJ.cBEsUw..GcMFppRZ
n9oMsZwkeSVE5MDV8PfPL88PdZQMyK0ROcHtZQ+zd8cYxPrZaH3oFaGAWi88
r0AGP+jJWg6SSdqFieyAdvYvtimVnoQYPCfeZg6ZS9G0aMBS.L4NPnbaZTqY
3BttlAtE.BNDwkZan.CmQunH+tb+A3ZumCbHsuMLbacD2ERpX4LQB0ahGXGc
LC6uIRHbBe4OTslsuo3Q8orLnNsuF+qKCzKqQ6a9Nfv1aB4+p0e8n4+Kq45q
..HW0LG39+RvHuNqmF.3W+Eqyldukb+s.fpkO80F6AZuD76MqmWxzSCqWsrn
mLY+a9NPoX3Wue7eYYPe628KngfAz+XaP3mSfiO5GS.hsd5Lcsba2igvhBtc
UTRXPTYPemlgzcQmXaWmDmI5egEc5mV+148ZXwzO1V+1tcbwQkuPFxrrASnK
.lL8OJ+YUm32eOiGxn9wnfOjtlzw.u8P3y19k7eaYgxkHEj9wUQBs7iii9sQ
wEEY6MwghsL9UaC3AMWplXZ7icDyB4qFnx0ig.RW0Ehs3mgdqIv0D7yGiS9R
lXEuqCX6prNR408JKVS.Am1xRjsT4DhRRNVuviEtjGKVnA+Y4KRlNBey+8TP
Di+Qo0iLVXKa.SxfYjJwtx.3TOtBxw2VaWtmtk8BaGuLtIMt4QQIuoWqp7Ei
RRm2jq2+Ior8LgLf.Z2qeUujGMGwDqgulUmijuNjtI+1N8JmlNimREDTajQV
zozh2bMJBndvWjcF+TLSZYVUF7j14hJHAD07tjcjpeo6bI0UGENjUgLZMDaW
t.e0sqdkdqUuaFDvbk7aTMy2nFhKzwqk0sKrrL8cM7xtFLttFXRWWI0.CumL
niplA5A2QMFitcAPO7dxyDdBNA8D1fNpCQSzr2wn4PmvjNF1dGONMBjQrLTW
weiqmfFNpBGaGALkkFqbpIFxbPyxvVOXwoURsdt7thn5XGFgPS4wQ2SlzQ3K
jWzyA23MEorOZ7FhrwaGxKeyP18aExluQHUYhnQl1z7Z6YXqQ1099iCKqZlk
QsQjMsAlIsqjEs1xfVgS+cl4rgk0rAlwrgksr1yTV2YIqiLjU3L4SO1cVwpm
QrpJVkBah0N5HWP4jJr0hXjFDw9Hsnfa93QmRPMDRAqsKzbm.Ftxyga6rbMR
mfv1HekriKxln9kbXsPZXxHqZagKS0Xwv0hpnOTHOe4uth9fqmm.4dp0ec4k
0ac1kPMpt1gYihUeZkMP5RMlQDhU.j5WBdF6OXIKw07mO9+.Kpner
-----------end_max5_patcher-----------

I’ve done something like this with @jamesbradbury for his distorted pedal steel: make a very short HPSS, and run onset on the percussive channel. That is quite sturdy. Maybe @jamesbradbury will share the final bit of patch?

This is already in the gen~ examples here. There is a proper object coming in Alpha06 doing that with some very good controls I’m currently experimenting on with @groma.

@tutschku I am doing some piano segmentation myself . I’ve found really good results using a variety of preprocessing techniques (as described by @tremblap above) and some of the less straightforward functions in fluid.onsetslice~.

The setup I used for the lap steel is applicable to the piano to it seems, and so the last bit of the patch looks something like this.
hpssonset.zip (861.1 KB)

I’ve provided a short piano sample too, although I suspect you will want to test on your own material. fluid.hpss~ @masking mode 1 is also useful, although not so good for real time as it functions best with a big fft window and thus lags for real-time use.

EDIT: Apologies if the patch is not super clear, it was cut out fairly hastily. Thresholds aside, the key is to have a really small @harmonicfiltersize and very tiny fft’s for everything. I used @function 9 with fluid.onsetslice~ as this seemed to be the most responsive. @function 1/2 work also, but you have to be very particular with the threshold.

Here is the “really fast roll” test/comparison patch I showed during the 2nd plenary.

I also have some audio files I test it with, but perhaps too big for the forum. Several options for testing here, along with the ability to add in some noise to test the robustness of the settings.

Archive.zip (11.2 KB)

2 Likes

Ok now that I’m wrestling with pd, some old demons are coming back.

In looking at (presumably) @tremblap’s JIT-NMF example in the pd examples, there’s a del 2 in there, that makes me a bit uneasy:

I presume this is there to time-align the analysis window of 128 samples further down the patch, but using 2ms instead of 2.90249 (128 samps @ 44.1k) to allow for some snapshot~ “slop” in pd land.

Since snapshot~ doesn’t have an offset inlet in pd is there any way to ensure that the sample taken is always the correct one?

I’ve basically coded this up in pd and don’t notice any discrepancy between them, but since I’m not using change~ anymore, I don’t know if @a.harker’s test example is still valid:

If this isn’t valid, would it be a matter of adding an additional offset to the delay time of vectorsize - 1 to try and “align” it?

edit:

not seen this before on the forum!:
Screenshot 2022-12-21 at 6.37.41 pm

There’s also also the *~ -1+~ 1 before the samphold~ too. It works fine without it, but I presume this is because samphold~ triggers on a decrease in value in pd?

yes.

I think that was it. It was long ago…

Had to do some more debugging today, but it turns out. my “256 sample delay” bit wasn’t working properly. Fixed it now and it seems like it’s working correctly.

Doing the debugging trick where I fluid.bufcompose(~) the bit, and comparing the results from Max/pd and in all the hits I’ve done (not super comprehensive), the results are the same all the time.

It would be good to force this in code in case the accuracy above is accidental.