So jumping off the original thread on “the other” forum, I wanted to make a FrameLib-specific post/question(s)/thing on here to tease out some of the details.
The original post when something like this:
Something I’ve used in C-C-Combine (based on @a.harker’s suggestion) is loudness and pitch compensation where I compensate for the discrepancy in loudness/pitch from a matched sample/grain to what I am matching it against. For loudness and pitch this is fairly straight forward in that I can boost/cut the amplitude and play it back faster/slower to more-or-less “accurately” compensate the sample.
This works really well, particularly in terms of pitch compensation.
Now I’m wondering how viable it might be to do something similar but for spectral compensation. Since
fluid.spectralshape~
andfluid.bufspectralshape~
output all the spectral moments, and combined, they describe a more comprehensive spectral shape, which could potentially be translated into a subtle/vague filter shape (withfilterdesign~
?).Obviously it can’t be as absolute as loudness/pitch compensation, since there is more risk of overly/incorrectly compensating the match.
Have any of you experimented with this?
Is it viable enough to do on a per-grain basis?
Towards that, @a.harker had some nice suggestions and posted some very useful code on that thread. It sat with me for a while as I was working on some other things, but last week I had a very fruitful geek-out session with @james.bradbury (and @anon98366487?) where he showed me a bunch of framelib-specific things, which led to the bit of code posted below.
Now, this more-or-less does what @a.harker’s code did in the other thread, but this is taking a step towards being more generalizable, implementing individual offsets, pitch/speed, size, and amplitude windowing parameters. As far as I can tell, this is all “working” (some more on this below). Some times were less straightforward than they would seem (e.g. having the speed of a grain also impact the duration over which it plays, etc…).
But once I can iron out the problems/details below, I will implement it in a concat resynthesis context and repost that here.
So some questions:
- How would one be able to have a variable amount of control of how much of the spectral envelope is applied? (@james.bradbury and I couldn’t figure this out, with how the current code works). Basically it would be great to have a 0-100% parameter which would go from no compensation at all, to “as much as sounds ok on a variety of material” (i.e. probably not actually 100%).
-
Is the source/target implemented correctly? I’ve copied the orientation from @a.harker’s original patch, but I’m getting some weird things when messing with the offset, so either I’ve got this backwards and/or something else is going on (see point #3 below).
-
There are some really strange breakpoints for some of the parameters where the sound changes drastically in a way that doesn’t make sense. (these are highlighted in the patch). So either there is some maths/implementation wrong in the patch (which neither @james.bradbury or I could spot (though still quite likely)), there is some odd window/threshold/interpolation point being crossed at those points, or there is a bug in the underlying code (least likely). As I said, these are labelled in the patch (in blue), but going from a window size of
46.45ms
to one of46.46ms
creates a massive change in the sound. There are more of these than I labelled in the patch, but I think they are related/harmonics/multiples of the same numbers. -
So far this is a per-(short)grain implementation, where the spectral envelope of a fixed size grain (
40ms
) is applied to similarly sized grain (10-250ms
approx), but one of the things I want to test with this (once I iron out these problems/details) is applying the spectral envelope of an even smaller grain (512samples
most likely, ala the ‘onset descriptors’ approach) and applying that (with variable strength) to an entire sample (which can be up to30seconds
). In the discussion with @james.bradbury he pointed out some straightforward stuff, likefl.contolve~
andfl.sink~
requiring/maxlength
values that support that (much) larger size, but he also mentioned that this could potentially be a use-case for the non-realtime context discussed in the other thread. I’ll obviously test this, but I just wanted to take a temperature on whether this (long sample convolution) is something that would be better suited to an ‘offline’ process, period. Or if there was anything else to think about here before getting to testing that stuff.
So yeah, a few (+1) questions on this spectral compensation approach/idea, which I’m super excited about as it opens up a lot of doors in both the mosaicking/concat approach, as well as some general database navigation.
----------begin_max5_patcher----------
8025.3oc6ck0iiijb94t+UvsVCLGa0pySxL8IrWic8C9.FqMFXriQCVRrph6
nhTVjpOlEa+a24AIEoXRpjWRT0vdFTkJRIwLNxHhLhuLx+7aeycOD+4fj6b9
qc9iNu4M+429l2ntj7BuI6ueycu3+40a8STus6VG+xKAQo2cu9doAeNUc8+q
fjTmzmCRBbh2rw4GuK4SAAoI6hSS9w6xe2aCiBVGeHR8QPYWb2dwGJJ0OMLN
5CFeGxGx53sw60CTvJ.kSAbOWNfg.t76EWhBfbDmiYdbLjgjWhyYDJwivoLB
jyt2AtB37+l8cFtQMrie3O8NR9vK5vKgQaEiZ4sf4CO+z0OGF8zG1GrNUO.f
HW5Jv8NhwvJ58Nbf7Ov3Re6huo3Co4eU.4E+Ku8sxebuk74WBRR7eJnFeFRH
z6pSCTiz.pMZ.gTz.TQJX0OkWpAZHmcnuT5W1En+dt6thOvCOUQHgERDW38F
eUYIQ1GC00O2S682DFn0TfEeWOFtcq566C4iw6ziJCuC0Ogce7dx2PwHWo0k
+iV+Hinhb4ua+CowkYKRESCuqnm1p3LHOyugc6i2EuWNeT+kPGW8WrA8WuNq
+B87VzeWzemJ82l7ygW47om8S+lDmC6b9TX5yBmdgI+C+pVcwURQuP4+w3nz
jveVQH3izgQePx2aj+KZ0g+kfseLHMbs+cMO6vEplb.AJa7H.Q9KW2l8PU5A
8n+Z0CB1CtVTvmDDYMl11X+MRCBN.CS8g4W64vMaBhJS2V6PVnxorBvT+RoV
zWiAintBZkyCBkUGg93ZA0af1QfKh5.D4gU5CXU.KHrR6.O85CMwYfqbj5DZ
tib7ZRufeY3MP8bDt5mtjqLmo+wQOwQIC85bXxXjqhaJrBMUgIe6wFc6Jazk
pl6RYSFSrAq1oNOXZZIYLrWCbWgjVh.Ews0OC1RKH8ync2HZ7HPz.NorS4q.
M2TP4fULWjIxFz8kUxv547L0u3Kgk+JHr7yEvscwsOkKqTpACMoAC6tFLlsn
AunAeo0fItqHtFzf4cUA1S6lIKR1E02E02Kk5qoDSy5r5Kgun9tn9dgUeyyF
gAMX2tpASJxgfZUaWzTQ0zpZdNLQMRC1aJKTccIoZJzSs1MWuyPgnFov6KOM
Mw+i423W+uKuUkwryc+Mxe7q+Ok+LHZi9JiZ15VGue2ASIoCy5blOX7UTBj5
R3Y+CJWztxXFQuhWvEIMHaC+XfSXztColnKP+j6YDB0cBHjyk.Yyw3iGwTRj
E2+kNGxmivIFScNDMbJmSfGc354cYI6OIl0+X79W9pQpyrBJskbkIjg7Sl2w
.J5C5gkIPysY8U2beNGd7wf8EIQV3XJL5GBitqIJ+QgPJUZPpkWrMLIMyd2H
N8VnzXLqMcFQCXsUIOOcYTfWtY1Zl8WcNkKWdEPLSEBPk1daKDv+39P+ssTD
.IfNDJGLsANNuutzJj28OGcGDR5Cl3Bzii+8B5JMX+GBh7ePGYEniBbDJyEt
dtA3bV6v4CnzfWxvKzcIgQARZ8d4Od1OJp3OREraULe4WPLf2sI9SQUtvgcE
+YbTRPZouqWDTwSE+8Ca8W+Su3e7Sm7+cveevwXGpIGBizy1tejMGKK4ajfP
9cGhVqBDM6MTI5YN2E3wHXH1CQIpnmAY+nIDH04hBjqvlYaC3M70IkGqkloj
wUDyiB2F7wf8IYgcm8E8l672sqzkeSoOhjU9mzrC18EWJLReIXwk1G7wv7OO
n3p96EzZpfPOrWO28yt4lyjeMwaDllODVT1MkPMaHoDex47h3F0UlSIkyucY
ycJke0zbnqqd5Nicj6IW3w130+TvlxCt6h2EDIhlpDf0pb6MAO5eXa5GLalp
58yqcnwaZztkbokgahijChJRB4kyebh.YTVxk+7HwndGQ96L7gEpeB1RC2LQ
PjGRdveuTPkYoAkeyz33sUuUwmaavioY2dWXTzIbwz3cMey8gO8bKe1GhE27
k19tU2I4CGhz28CBchzOju3hiuO+sayliW8q+y9Qgu3mFjFpEAHPwM0VaeNY
893saqPu567QC2YiPGecvmB2j9bkE1Jui3sGtKWI5tBo7lvmBRRqdsT+mRpd
kjzunY5ktzgGxlC+AgU5caETQ02PEvdVdBaYqgUtdaVEaHPUsWgiuCC.srQK
cMZsSCeArJ5DVMacMauq0PUeStagLqHiOSYmixw1On7Yz.SA0WlBjH3AdL.E
x.5+gD9Zfxn4U4sI+eLQ.MXKXYfSebG8ETk7azmPS9EN4iax+PC9HZ1Ow48U
zj+hJ9Lrvuwo9NzqOD4pV9qKUYtk3xpxaM6.wBmH13H4rNSrzgRKNUrywxYb
tbVGLm0IyYbzbdmMm0giENcrwwSWb9zhCny5DpcGQs6LpcGRs5TpIGSlcN0f
CJqbRY1Q0oVPN01bs6eNazUsSG74c6Ewl67Nmu8u5Qny6EdZnb3pu6zOP4jm
QO8lMY6tw0bSUvhRrLgUxLU3xyshKSrOxnSt1czcVmcUb3U0o2DyfemCzycU
arSbqrSj0rSjHZdOA6j4kkAHF0TYj5K2Tu.+4.KUoytK9SRM1e7Gumzpxp6o
2rEOKmUWtcGJmQamxVAkREXl3wyqBhndUnsm5D5D1h3.hGpsCldY+hegkLQb
d5NQxTBnlFbddI5b7xrjnH+0rRgWpw+Ng0YgVO9699uEt5cxq7ce2uA1lEFj
2UeNfHh8lmCvg8bNPSA.Neme7dg2.ZaxJHcndCxY0lbtZ8LjaHuAuqnxXF08
gCkelYvA6sRtvRXtlKySgb9QhcNWrzjraaXpCPpk1FSEzJSEasRJBQW4JUNc
KsjcDx1XVt0rie3mCEwW64xZy..evgCpXe5De3ZqoU74XkZHhb72WLdZ0J.V
mo9a2GHVIkiejy2nR4z2jUnBmGypTgS5y9oNO6m336jjFDry4Q+MRrAH9Laj
Waq7MKujfnqYatxNkfzrbiMz.aHD3JBz0k4kavln2tCxLOnJgR4B31TlrlAB
D0VaJM1YsVv7oSSAXa4FsWbNO8dsgosSWqBtWQV0YrGrKH3mpU+WiqhgLTCt
ZuXDwxMjQL6hyzwfj6U1hu8Vinh5agkQa2wOvV6n3rM0Q9OGJKJq73m71xmS
Y+7mnMAe9jT6ViWWMakRKYmI0RJtf780tfHI9v904DTNy1oNqYSPRZXTQhd+
iG8vY3MWEFl0JcbuTo5K8HyZf0zibxoCrM5ApIEZAJVqVO7RUAXytXgi0LoD
1UiIENnddcfzlt2klUQ6Bqx8bh9FYUWVhB2EhhdaPTxz.L9J0WuIonNYzAao
QG5Q.leUHJfQ9dCBI7MhlGnKRJamNc8z7TdvPVROMnlN6z7fcwPdC1RlUBIb
WM2cKHjvcv7PCS6FHQU5lkwRfZWLr4C5Zd+A+zz8gObHUGvoIfTzq5s9z13G
72lUE0hjP2PIYeacBXpw7hFcl+PX5y+NeAA1.tWnt8F3KHBeEjg3h+OqrGnF
.9BDRGAvBs.LFa.FCKaG6oVpHS2dCHk6TEK3hYAWLK3h4VBWLsWUIr2fSRuK
tw5X+5qrRmEV.CFQQtY37zT8j3uRgEf8oOdnYONi8hQY8VO3quxHKqMGg.Zg
KN7Byo27EFKkLgcyWnNa.wx2JVrgy267sPm24rNN4ay.cnfwu56jW2O0O5ag
pWSV8ch+IdAXEm4RnsVXNTK1VFrwEBfnaYWl.XGT23EwzWIH35W8tyLMXvt9
f4FjMXqd7fq3bQs+2HrZhqi.KCMv5dyPcYM56iht43m1Vu+rEaWqZ+pNSq3t
OGuOsRk9yKwur1Z9eLNbiy5sgq+ojU80xxfK4urKpWThQjd+TTaYiyyh7ut.
0EINqOr+iAEr5j3xhjvTgHYSbPRz2j5HVWmPl3+v9C6R29k9x1cGJaWOeAmg
MF.9FhsufsBqYUBtjdG12FP1FrpjKckmDsk5MnGkb6.9jTmGj+WaKafO3kkU
FJZ.9TEhaoVNv7dctCeqynscMrzF75cctCFlTYtFxVm6MIvnF75bgjwAApKq
ys95bEblIactfgZaIegYlWlK81ZYtUa2cFP5d3OGDFk3+xtDMlru2Q1u8Zey
DfFxFoAMFajF2LvwyPFjQi2pmWvv4bACmiEuVSDswrGdvvZcyLumVytAsvGa
NH9YE9W6Bdfvd2FPMoKnEDZGRSfWQ3.0IHJim+PTlNEnaBb0z1TbbaA1zM..
x6DBAQ2Fzi0VCHye5oSV2tMLXqvgtsSg7l8Fr6zFKfdiftaTWnIz7GisjtD3
yMhPB1oHEN21j3pOOBBF0s8w0md5nz4VPiqCFtgvQ1x8BdtaFO2xd06+8tb7
b2Dbto8FN2.O5JJiJVwbdM68ZDN23E3beo5ygpp3QQpTUS8T+hHaO7Kv4dAN
2Kv49VDN2KnZaAUa2BnZSFvgi73BncXsknQaku5f9MCVUcBUaSYirAyv5iSl
avdWyBr1Vf01Br1bv5CdaBjbShpsKFl1P7rCy6Q.zUKfYaALaKfYaALaKfYa
5AyV1gpxqevrcui+tca+hS9wRlyy9aeL+hOIrA47th2S7iOlDjVG.b1JylAn
iCCyNIK0Atffd2Vx4E.w8pBPb4pijr840ufPD2B5wVPO1LE8XKvsZAZRKPSZ
AZR2hPS5phkmEjhzNRQ9mi+Tz4vJBtuXEgCfhkT64wKZc6vlfJBhs.UjKJTQ
Pb5BTQVfJxBTQtIfJRWJE+gcKEheoP7KEheoP7WoBwioKEh2lBwKB85Uag3m
5dQ6XTF9WMsh1wBUCKsh1KBpF9kYqncAUC2lsh1gipA.ukVQqG8WxvZXd23d
PbcDJYFtPDvRu5YAZBWMnIjqN9KPnI7ZqV9KE+9UTuF4VoRjX5qvSWsNASga
.TK8K6Z56sTS+kZ5elZ5WOIu0pCzG82GFeH4z5.k37X7dYFOhNr0euyts9e4
A+0+jSPzSBcfxE8owkG1z9Ota8PBBDuB6w.zbP.nWkgNSwHS0dnojEOw7yrU
64XJLwl14vchU3ksCWvqbwtnbbR.fxiHQfqoTmek3DmVRwjfsApW0.GAOLNB
NaC.4cgYA0WdeOVZeWmHgJmikVVleiKwu8k2alKyVg4h4c7bMNZSPyAabimz
Qn4LWDQOrUXv6E+ntJhf7KtHhRIq73HW27haPZTDQdMIhd1+EAK7oNKgXWbI
DlAWA4THJeRDf2jDhBVwK+OB9Uj7JJpOxKuKt7BA7VQ4dTWZtnA23LJgro7+
Pr4j7pEXcJ7K6jHX+JwR9boBydGy9rDpPpl1g7EGxOFncDAIVIKdUjXsDkC3
LyTTn.fKV3BgRfEbUhblgrFtmFK34.BJnMdswiZkd76q+bLgfTrxITSxiKuA
O8gAowYLtiABdGQ98oI+uR.WMeZlakhrdoJlS.c+wrb47RaW310xQ8Hv2pkH
+JLtduluLTGCY0WniU7QPCLp1WgVaLnhGV8D2ejmYJCIk3b0STu6oYFoojZW
KUOVklmRu8WB2rKNLJMIeyiSE7VFhK9+LrvHWDI2cEyESQ4t7fxi4cI9CpeG
Km90YVB8pwR.xS.lZ8pxY.KAesXIbHbEo1Vx35yQHVxPfYJSSxf.41wQQKhk
FRm43NdAWK0HOr2JVszGb8Uif7qEGg5RVgpsZ8Y.Ggcs3HXQ39t0Vc7Lfi3c
s3Hpd6Qs0eNC3HRyYdVvQLDcy0vtmZ75Zy3kNeFuTaFu34y3kXyLDv7Y7xrY
7NeFtXaByfOeFuHaFur4y3EZy30a9LdsJry4wvcZceZbk5usbw9OWg9yF7MV
feSE2+LE1+zh5qGbpepYopmYoLrnGCmjAvCaSCS1FtoHIEUqeQdALDRj8hAP
Zv9On2Krkx+gwbtXr.eLUHDPfNgU5LVAgkROm4suwc4IQDyf4e80ya0wri1Q
dPkLWeLAnOtcUZr3M9UiLl7jN0UhGPUkOlVKyjlyQWiYjbznwsAQOk9rYhzs
qDoKRmTct67hHka56DyzH1HMhZlFoL8d9.n2SgYalvY.QJqZxWcdexZ+sANQ
w6eweaXRvFm2K6WCNgQ6NjZjCP5IGfmIe0MwfYAGHveywsOky6ODEll3Hqgw
VgoXSzNs2Reurc6G3FPGG0YpjjYpVOelVa+1cUHxe06EtiMQfd7tRfBePpc7
FNuAT2WBr71cabnR4N98QiTIqqliEgwnDiDtUDIpIhLu5iiOw98MIQ85pDkS
zwqoEnzdOsbHz3gWdvbbTdtiYbTP4wVtrGTnRIyYIUTagLUZ2Y2QpMM9oi3J
qJ0RFWpU2VCzTq1fj7mcUvdbWSNNptB5ZerDEMFYAc1jaNYBAHIc5h6qBb+k
nJIkQOHtfNGIn9fVCpv2x8NZ2jP7Ec9XUriVEZClnRJuyFX45nAz8UBcQiKi
LTSnBcrHhcAAaLREcdoIP.WuYvEwxJ2KavIfLZNtEc3Y68SC9ZdnZu6u+Eig
qQockzX5UhP7znDgxurQqITdEe+FIErM1HEDY3KhufxcUpNHVyhwg1M+DOJW
5f56vcZ7bzrtvi6EZ6MrjaJoyyN0KPIKFOOz7ORcZmcajqfqWLJCNWzuI7IW
+NOhOH7lP89kjzXEb5LK46rG1LxGgTNX875aTfIgOEIQY2TDd+wrRnSyjiHR
XhQ0kh01XFzflmOzHXAaYlRl0PH5BaNnI+35iKBi7jN6syUu8bHPklAgLA9w
aYFu6jOiOm9xNYYuwcnQ75q7UGMyk1g1CGRSK.6YUJYRVvmDv6CZEeSg.0Ry
YnI2blG.nBVOKx14h4rsgeLKWyN+cN55z8iQqi2u6PQhXE2H0e+SGM5YZqYT
gch67Byz19v57jj0xNw3KxByZ1fNry0SAJ2vkp9KxDZRueVufvdtXYYOWZdE
Nt+Se0QOg1DgBb6bpH4YMCFkYLu4QUvTcQWiRRPmkjEVnYbcRz6KElE64HKP
8OrILNce3SO0P5r.f9RwYQayXyj0Ygm9kYczFjNrKWxMcXW3AXD95D2Uyj4u
wDAdLIYS8RonHskb3rfeHV75F4NuQphiLwWX8PvqxbjqtWyw7lGgX8CxFMuy
29b3SOGr2ILQ36RP0IuDGmJIfuyDsy6NsqUycc0gP4wurIE94vGS+ZdE72Kw
wUhy6UWUhPqLLM7o896LPsMTsBzYCllAxTkcmKyv064NSSycg8kH08wBWu4B
MF9nPTahBY8jB8J2uNlANosq5uhuqbmzvUikmabo4vtdyeG2u2jhP2ACPthP
VJRgyFLZ87W1EaTY2i0yL+mIbmOvPqgYyd7dV6NWrcDH5hgLzcNI6Dix89aE
Si+Xv13clJmLCzSIpmdciP3P7BU9ob7LmJGFxMbVSY5blJG10FNeoLb1RY9b
kp8yTJSmmTEMQsybNRU5Ljxkn3WYa5+rDlH2BbGw6swCPpyb3QctCNpVOznr
3.ipgCKpyePQ0xgDUqGPTsd3P0xACU6GJTsdfPclCCpycPPY6g.UCG.Tsd3O
07A+TyG5SMefO0M78W6PdxvA7zYObmpevNMhctk5KktKMfkyz4axRGnvUMmH
hTgWp24WeI1y1laifE88MxbH2YSOOwDyIKCSdfR.K5Fgc79u1b6gA2aFRFzc
z3b.ytkXHxoOMyRPCTGACZXGkLmYI+sMNkA1W1gNCExx6q3C2TrifOuqIFhG
quFX0EKhHTLj1WIEM3JRQcjtQ3NkVQQMtCcfbGDtN2ASsf6fZk6b+LwCjKuu
SmxqfpAsG5Mk1y69Zky8qFOHY5lsWPE2Q7aJ2QgQMotvGnwWPVKxkeaofz.2
fMTsC8AIj4Sqr4J2n59Acz5u14rDSQ6Su8hlCFbRrrMbZU1CStb0ZeX2T1Xy
PEUsMZZM2Q3gYfwn5CDdSYtIrkvYbACS2ARX04O2VKVZa7SMwcn7gErGDoAQ
E5Fpqfx6aWAkbg5JnSdy+rM1CFzW1SV1mtR7Gzkp4nhgCb8QbCw+Onli50sW
nZau3CBmvd5nss+trCjrIYL3Y6f.OkbBOaayP4C2oYTXqRQ8VgVstoGSGquN
je2i+UkOU79M5ZxAttzS8VkVwHCNIiLWam+4Mk8TUWbGl.1X2hxzw30EjSZK
Mvp03wrmFNQ6loUmccWQ7.z7y5XtalNNv38tjJ9t117Y8N2D4rMIFithbZ3z
YywMbuKp72VR0vTthgF9JOzvCPLv5lT.ccIUC8SO6IU4FInKz5zL4hZqs6bl
xjLJvfYQW415d57TNHrbLjK3txMJRxDFMKz5d09TJPf3tvKZOPxrPGyZCLbu
h+ZpF6ntrxnISNB6hWsIaT.5PrUupaOn8.Hqr9hK8aEfr1P2zCddB7VEHq39
B+5Efr1GfrB0kJCpUTV.x5BPVW.x5BPVW.x5BPVW.x5BPVW.x5BPVW.x5BPV
W.x5BPVW.x5BPVW.x5BPVW.x5BPVW.x5BPVW.x5BPVW.x5BPVW.x5BPVW.x5
BPVW.x5BPVW.x5BPVW.x5BPVW.x5BPVW.xZW5vxc+fwNC2iTcJYlOcX4VnQZ
OaRoyNZbcbzGi29w.Y168+b14yiLJCSmOqGOY6mrdje1QnMSevrAmIMI+hCI
csshyeDoy7tTmjQT2x8uUK3TFvo5Xw8jmi.9OETi8sOX2V4Sz.eZ5O.6fxCf
.Bj5RxiaFVbZ5PmGGC8Ob3wGC1+0ry2Im0Aa2F+tGQq7CMchly3cgmAGMdV1
AyCDy5KR70mTh2OrCa4tphwAStJVFbplU5TEGXpNfUlNWO3vKksbt5K0wiLq
O+W3Wrydt404+RtsmLOa+o3nm19kFr7vwStkmrxVlapgdEM0btXAxrV+dwp1
B1uyQDD9KgoEwFX7n3lStXGxP5vBr+LbXBCKH3m23u13btNeFwkYRAh.pUDS
nZHtdoNdcBiLdVvw8tT1RgPsbkvFyyNN02Q0xrpYTmtx4L1U8bCVdAyMUHwR
ogplDw1Gj2k5AQsgj3jQ3IwIV7jXzQ3Iwrg6wFEZBYySp5v4jLf4AAZ6XpSy
1x+0PGa.ajr3wfeyrgKLFZqbajrRqskdSUKMxE3QCq+ngS+iFVsFMmTkj9+r
oUnHyOah6XHag1PkL2IgJs6YSL+rgWhmMZRTps4QS3SBYa0itxa54vMaprGe
GKw+IJUML2FNEZdV8ngm3BYjDALa78ex.zJPUbpONNP4byE4pVWnFG7p+5pP
Rd7dPRik71pnfPigWYrMrBuw3IYUTPvw5IAs4IAG5SxFqxrQI5IfsxoASSWO
q8rYj0dOab8TFHlC6IAs4IMTQqmUgfCFCZxlfQcGEtmqsSAgM43ABgHkmGNU
e.9pOaa4zw2yiciVPGFsP.33eN19gbsQgwcLTXbg1FkwPmD3ZikT2wvOjMx5
wvGN0Foj2Xr5KhUg.OFSqw1X9EOFzD1FZhRGAMOnUobBxFC9GzxkLfGE5hZ8
hSG9yhXMcMbdH1pmEcTdV1DdLeLBDGZUnMvSBV3TuP.Z11GTsZMFCuBQq8mP
hZERbc08T+0fG7VEjn23vnXVDYFbTh5FZUDSPJXTnKqrM3MJyW8HV+rFNcgr
ZADiQN8gVURD5nXZfZEKjNJhKpUl773SQVtr7gSmjDrp4em+gONRTfMFVfiQ
PnmtT8I0fIgYsl5veVVUpkQYRgUg8VLfF3yxpI6fwQ0.YKKb3OJanppaYfx4
1YXObqLqTEy+i2C2tmNchHcHpGoya7d5VU0JvXrLN6dTmvlGKeGV8rwWlDWV
vNOiHeLRnXgcnyHfGknVAfNjRfomKC5QrJsLbPWhgyI9maY3fuHCGOaGNzKx
vAY6vgbIFNmXUokgy.sdAthVNAyIKmc.NcygwxowkZoFhFeimzb6kiiSZp8m
zP6q2L6atQ1eZSrWsy+z8y6SvT4QHedXSX7eP0L1+v+VPzAM5OyaY7U4VO7z
iga2VTQ9x6YvbrclUu9h9l+wp2CVg3DHjIqdOFh8PtpWIdAkVt4Pn+Lv7ODg
R3.j7sRbQdDp5ULDlhUv.3jOF53yB.45m.fy.D8qDWBVsASbmezSYMeduRcP
8c6i2EuunK7uByKd+GRieZu+lvrVIDnx9Z79Lks8h6dZaT+tWDLzv7OSYkyB
gw+5g09sI.pvNIdTHVwOPbLiqeEUDFBuJ1HRB1JTUDjRkOsGR7FUBCnqGRyL
Y..jT8CKAdr5y8gvHodaPACFyQPW8yLWBg7XDbUFbE7EKl+7erKHx4O3Gk37
GBdI7g3saNdLQXi5UAquAMLKk5U0wXEZVLO.kwzupFsbpNlKEn4ftx+4oek9
aZRTwJXSUnYNf.83pgLmR7TCCFAw8TDD0sf85uds3KrxmEKkcJlDImVjyGIm
nAITfd4zOpGSPxZdF.xX5WI9VPnrO6nLg3mR1FJrn8CRycVNw.lgMni+XjFK
u3+Y2hC8CyCiFmszHvkpHLOYnCJUXYCBOsZZwzPuLM9wkfK026rwjjvtLhWV
MRZTfPgi8vpxFva7jE809SIKI4VBp+pVrj3wjdzt23qp+wlk93pN6vNoX4lF
nEZWJYVo3ADzLlOlZV58by+z1CAuC11nxjkTnmKQ6BnX.xkWBNACv8weJpyi
viiKZwbS7DMB+sewu6CP.R3+RaJyCiQ54NHwxwvi+.72uOHnGiPE2CK+mNvI
YfCi+f6+Qtyq+T6itxawq+nZSdQ4..qU+EhfC8zVVfLnx9GUvwoiJAb3kGB1
+6Eg00YlqTUDnD+TgKMpZjBKaMaTFf60ATHGgVa2wk35h4YpidYQXIXbbbK9
xmDBRuDxFNLxd6e4s++vddPdw
-----------end_max5_patcher-----------