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

Quick report back to say that this approach is working (at least visually, not tested its impact on matching and training), and has a subtle impact on the dicts produced.

I used apply gain instead of normalize as the buffer~ command to try to keep them all proportional. Don’t know if that’s desirable or not.

Here is the “before” and “after” of running fluid.bufnmf~ on single hits (left) vs multiple hits (right) with ‘averaging’:

Some fairly big differences for some, less so for others.

Now where it gets interesting is when I run the ‘multiples’ version again with @filterupdate 1 on an audio recording of a bunch of mixed hits (from a “performance” set of training). The regular multiples on the left, and the @filterupdate on the right:

They look (nearly) identical. If it wasn’t for a tiiiny change in the 3rd channel (circa 0.49ms) I’d say nothing happened at all…

I’ve fed it a 6 channel dict, and am requesting @rank 6 as output from the @filterupdate 1'd fluid.bufnmf~.

Should I request seedchannels+1 ranks (@rank 7) and manually add a channel of noise to the seed buffer?

Super cheap CPU wise, but overkill programatically :wink:

Ok, giving this a post-holiday bump with the relevant questions/concerns all in one place.

=====>First this bit I missed above:

That was due to me moving files I guess. Here are the audio files I’ve been testing with.

Single hits (there are 6 files here now instead of the 4 original ones, as I added some extra hits for training):

And the multiple hits versions for the @filterupdate 1 testing:

=====>Next there is the issue of @filterupdate 1 not appearing to do anything, as seen in this quote from above:

I remember from @tremblap’s example, and my initial confusion surrounding it, that you ran @filterupdate 1 with the amount of ranks you had +1 . Would that explain why I’m not really seeing any changes in this?

If that is the case did you just fill a buffer channel with noise?

edit: tried that and it didn’t seem to do anything different. even the extra noise channel didn’t change

=====>Lastly there is the issue of normalizing outside of the algorithm (which @groma warned against).

That kind of throws a whole monkey wrench in this approach as summing/averaging outside the algorithm is central to this approach of training it on a whole bunch of buftransientslice’d examples.

And to be clear, what I’m doing now is taking a file with 5-10 attacks, using buftransientslice to find where the attacks are, then analyzing 30ms of the attack with @rank 1. I do this for each individual attack in that file, and then sum them together, applying a gain multiplier equal to the amount of slices found. So each (intended) classifier is being averaged against other examples of itself.

=====>Oh, and a bonus matching/post-processing concern from @tremblap:

That’s a good point, as schmitted or not, the maximum should stay the same. I plan in incorporating the derivative example @weefuzzy post (in another thread?) so that should hopefully help or improve matching, but it’s tricky at the moment as it’s hard to tell if changes to the classifiers is improving things since the matching algorithm is difficult to optomize.

Ahem. I think I might have just found a booboo in bufnmf that would explain why you’re not seeing much (well, any) change in the dictionaries with @filterupdate 1. :flushed:

The algorithm will be doing the correct thing internally, but I’m not actually returning the updated filters when @filterupdate == 1 (so, in that repsect, it behaves like @filterupdate 2.

2 Likes

Heh, I wondered if there was some kind of bug.

That’s good to know, as I wasn’t really sure what else to do from that point.

I look forward to updates/fixes!

That is why my filters were not updating for the piano thing! Nice catch both! That’ll teach me to try with 89 dicts to start with…

1 Like

I now have a fixed version of the object but I don’t have your code to test it, @rodrigo.constanzo do you want a private update so you can test it (and the other bugs) before alpha03 is out (next week I think)

Like an alpha alpha01 of alpha03? Private updates are boring!

Here’s my current (not fully tidy) version of the patch that works with the above audio files if you want to see if it’s working. Or I can test it before the alpha03 release if you want.


----------begin_max5_patcher----------
14727.3oc68s0jiibbtOu6uBXF1Njk5gScuJrQHeFIsxVO30ZCsxGGmPxwDn
IA6F6BRPCPN8LqCO+1O0E.R.haE.QwF8nVJ1d5F.jnpuJyrxLq7x+yW+UKtO
4igYK79Fu+h2W8U+Oe8W8U5KotvWk+2e0hsAebUbPl9wVrK7oj6+wE2Yt0gv
OdPe4eN1KM7ghKu631jiGhCOn+Ln7qFsV+nxO9afrhG07bG9z9PynXwh6j+m
2+U9s2GbX0iQ6d38ogqNXdBgveI8NOFTrDbmGV+SDZI3zmQ91i1c5kqt1+6W
+0pebmkywsgYYAODVaRtKIcaPbzOG5AW17TEVephfsOU6ZZBg.8LiwU+CmL8
SyVVJ2mFs6PySOPCSOzh1mCbjdvi4H8+f5dN.GwbXebvmhixN74lGvz5CXJu
3QWEGs+wvnGdTOZkiQJmPEDeFvGyossnkE8vtfXEUZS+l5+VGs5PTxtfzO08
BL..TDx9hkDFDh.L.kvDx2rGg6qWzwUGRs.a4WbcvgfbjJGpLSwSr2ktg7VA
2mkDe7Pnbj8nFb9coIGBhC89ygYGV9TvGxgI0ytIJNbWv1PadteJZmArCNtN
JQckROPbRx9RiY8PLY2gvcGde1gfCgEi+xiT4Jdx5Bz+9frnUmfUCgajje8P
ZnDfMODnxs2nXZ2cXURpB5kqKM8PIoQODIWBkSyGN731bHCrrqm5zyHWxODs
5mxpNr1GIGPYOFsoX49huLEkaWCkCga2mj+QQWNRxmTM+MqwnCG2II2LO.g.
pOz5FP1jDGm7zCwI2WYjT8gxhOlpP+lQq+6iRYkG9T6KbY6CCWWZJTbGsH.y
ujeQyUlJwag6C2sVtckbEXUn0xwwhwIGmgnJRDo3bvRBRPEBAiC0r49zoWfX
a6c8WW7cAqjB1Sxdz6O7seya+OxBSydaZxZI4Vxa+gOsa0a+9zjeTNryd6+R
7weWx2E71uWMaByd6eJTRDHWm81scya2Djcvaa977sZl72lKRP9jAOU7Gdee
XpgLcUn2uXUbXvtv0+SJAF+0EEit3ncgqRNZHjIVuRvG2JAmn2DEBXvKWIvP
8sX2D0HFJkGDdcyWHw+x4KQbyTm39ia1Dl9Yu0oG2l8dovS6URD257dSbRvA
0ds2GnDxYC6WcP.BfSO+2pjsaCOq+zIX.sz62kFJ2hy66SCyjB9791ypIXqx
VxQbwytQtsYlTUTM1olhmu7ocp+CgweHTt0TPGpnQ3LEHHDvk9WvSXHRvvVg
mRuyMJB5QBYsIn169vv8ViM9rtlkjVEBS5SHb4u0vzK0vRofyGjhRy2GsPwl
EA62W5xUznQN6+wD8Wj3tSWJZm4RfSWJM7CQEed7oqFjJmaGjSriolE4OxHK
N+0H0TJc2wnSKE50gSJCJQbEwQ197UK8BSwsKI3fVVqcgwNDdY0LVbuT0fU+
jY66hg7hD4FqQ61qnu2I0lKere51qC2DbL9v6KS5BQKa79EzSMdySD3+lznf
3SSfGRiVmrSMHprRntbwqSpoggPfVdxnehcA6a3CKorTaI17MUprdL69fT0B
08wgkjiIoiSRhqdqSet3vMGxu89nc6t.EOjru8alpLWo8aeeh7la656Vemr2
ebm4tuWRSH08N3CUQa4F3w4rkU+5+XvtH4l+gEp8g.mtozBA4D8wrUoRcGqL
eM24CMbm0RZ7UgOEs1nNMnLwf7wi1WPDs3zp75nGjp6W8ZGBdHq5UxN7ICnW
5RGuOmG98JMZiyM237CTwWHUMV5r.rKMMo8M7qJM6a+i+6+9x2nwc8uTlFo7
mn8M+aSpGBn4fEZI7D7kx4ZYa+KTA+tQBFUjp2fGF79qKpuS3IUCaWles8DW
XEH.YrkL4+ixH9DHAH0KPdw5B+aQK.2CJqCV8YOnGZv..G2CBfMBvAZewPoy
Fxfe4mGLCAG1IGQteX5iuv.HMRQHMIiNSfmUeRZzzmkZlAFNLAlNXxH8fwts
jMcIJUNP.KodTOfGc3XCy+5DpJMeTQhXfE97gaRYKcGLTnVPCtMTJWZnUOXC
DwVhk+OBlBnBp1apRyItsPk9ac3bNcuk6PPAjlBwvDgAcMsKKXuv9wxZlnGi
6VG9w11N5rprJpfVzgQORU2uYvKK4X5ph4YATbgC+jJkcHZWvYmFdhiplSLW
aLUxtMOc1Piz9HC3lQFzxQlZW6aLnMngF7lhZ.aGZ4yAmLJZfNtEBdtKGE7g
fEPGMJrkAq80iSttO2+IJaLW+di8zuO3vgzn6OdvHqpr+TFjcelymH2ptSdE
nAyBG+oHHGjGjCEa8UqO+rWnRkCnCRqMMl+V1sUcuuRWNvBPq4FSjYiUxT5E
yix8fN17jFWeRKXiZRqOlYKNvepwEk9HwR4LmKUYG.oF62.fZNuKRZbe9NfK
91u+2H+1kp1qNit6Tune33tGSNlEtX5vpVbe4Au68t2Zec29gKoIMtydRjlf
IHa5cz8.YLDBmxXHDzaAeQatpNX0O4sOMYkzpkyGzgTv3afdQdP6kdLtC5oX
km4uDRP9DBFmqzMTfVxocszylRG1q7JXp0yV9HOQUJA01430my7Q+smy7o9F
vRyMfol+gge0Y9u5L+Wcl+X8esIDRxFgCFn3qz8SBn12JPjuPfDP096HLbIk
KE8yv9Pyt924wQyFWauJY68RSO71J+iLukday7d29f0qkyLOjbWR0+UAVpDW
Hng5SKRkuqVDP0ermV+7zqHgZ.qOpqoVd39PNQ.HLgPoTl4TVocs.QuMKPG2
8iIQ67HsSMSaFpQ8bBU2cw+0K0MGrTbI5QjWSRdig9TA.vkWUE8uyFpasROd
uSGqSG7d7wuY61uQ9oFJUKran7TDuzKFRMmtgwzHE38BvsqLv061Uy7l.tYd
c8FCQvIvyzbnCwnojLxL+F7YgxPiP7LhyzaeBgPb9krAafyRu1yr0KuJ4MNy
8gLvPFEtxUpTrsNzE4vQAw1QQwv0IiBDolS8a4HSb9n.Y6n.4xQA11QAwQiB
nsqHHxW5NYusflE.9FDdICIrNJP49K52wQMDEnLi0RfIM2jB1EFa8H+TXdH+
VOcPfS0bIUZL0Zi6CHUdKqRhMtpJOSVN+idC62hrxoXtHU.I2qI7Sl9u39Gp
7F78YRE3IXHlinD+6r7RkGK6SS1mjdxeTKoSmCL2DeLZ8x6OtY21Me16cOlr
WY3nGF48tmh1o+cFQpo+lCm98nCgoZ90Lc9bIuYTr7RxuCiefeiJYvjl6lFr
6m7XE29390pHA2dGCCAKt9iNxjPgLLwAYcxw3CQYwQqay8uMbjGmyCujsxgc
z8QEoKDbLmTP0iQR4Uz77ep3.qxjCkBGIAal7rLUG.cmUWoBsYS7o5vti4me
ZDl0fxGJgbbIQeIbVhMrWluUA6V+I4OLylBPovOGSpS8kqoQePt97gAjwJi0
w9Frx3jZN30.y+Be4KLIzCx2jYvvW8k+q9x+Ue46LuI.E83MAV9VoDa8mB7k
kOmNUlFF4gUXvGJa16RttbuqWr7+ee6XGtkHI0JOiaka6LvnudyQAe1336OD
9w8od+8afduQ9SzfotPSAwEzTpDrAVtQAhckRgx.7++hgcxTM4bSSE1.RJ4k
2gCItIXhszGXtzQbbK82Br1ysMZ89jncGxJBvatIL20EhFnzd6h+xgibzUEM
lSfSyr0itBGNHTaHYWvw5xAw.nkgeI61tVLYLNIXsJ+cTZMBFPvucJc+eLZ8
5JZzO3RmjIMtHpZ5C0mB7QbNlniHNe7z68i9wA6QAg+jgBHeVanf.L8nvl3D
42g8Q7pUQJs4T009znKG+zqSvf.4lhpC1y3GFJ31U4GT1yra0m7R13cHMXWV
j7gxhkVW84FKCJHqc0MoqBdfQoaJ.cNY0v3muPDmIbZHhCyKzXBzRFzGP7Ab
DhYWPhqJnMuOYmNXtxiR7pqStOVw+UCvUvz1CRXEZYAJQPhZBDLpxLsEDlAF
g3DpahPbDkn47ah13FFi3YOop5VR03reoFiFYoCLeclqY9Q8U6.wSYROHMV1
5s.P9WSUf77V7piAi2M86DtPd1r2eYIydsnPPNxxVU9LklGH2P9zW5lF3V2m
hg0At0cy9W1lcza04xcr2WNoAGbyT3au2p8GGVNPPoKFH3XBDvqCYZXC.1qY
NQsLmHuzgILdUw3+MDl6jiaQpcpOEJX9E+uWO7kWO7k+l9vW5qp1j69Wi87z
heN7ydQp0bX5GBh8h1oxLgnLUoAMI8P3ZOIpD9bd1C26AuNupakHFKim3gmJ
DlJND2TqI4WFTROeoix9iqTRsGLzhmFns5N3WE1lmVels0mEf6ajhqtt5b1y
KvlKVwTszvFCn.yfSUZLhBnyFQAlRI5WNRBXyGBVh4rnddDDLxhrzTTikxcw
gs692VnEndadYRsKyTYutJiDCLEGboF.RkAx0Mv446x3.Rw0CjFNyICGCTnV
NP1I3cyRHFgsYegiO44m6S+lMfRlkqRKHps4iiKSGmqtxFc8iA7vJeYOqmmO
9YM4SryGI2hy593166K31eTNkqltCHeBDxYDNfJD5vGugKgoUt1ck6jFUL+v
pCHQobS0AgfgHL.wm.HPBQ+0C3PDfKD.eN1LH.HNASfBgfinbV0PPu7p.ELD
G2dY9eb8.hCv3AWz7yaAUbneobrlJpNJOkOLfmghmu7Yh1db6YiwrncKf5uc
Kz2ILVzatLNc2EMspAdnhTjaNTQrwovMdTp2tyTLb8Cge15EXxDTjwxm2MdX
pDzM6jVLYp0EgSg26VGdexQU+lgPf.cRasN4IctZQ8d2gGSCydbySqOeBrVD
3EMPSwZ+f7tnxJ2EBJUylwqVvxL8ijxUDD2EUJOF8viVmahX3hth1JSBlQHZ
deLb5yjxVCsljmruQ0I5ZN.xqLBl4PcWT77jhbr+lHE478Qlluj3kZJxo5.g
+vpG2Fc3f8A2wHK1e9BrNb.f5nBHuhdzQvc72dmaKzGZhTBy+.3lig.fdMO4
d8nZe8nZ6vKjU2mspTtzvvODDeTk25qNllJeLsXuQT11Fc11wzR9TmMCVUud
3HHi6a5XpFCNJGgqt0w2cgTYpZC3gGCL.j2gDuCoIGkDPYIaC8zgO1DhZrdP
Mg4nrn9rkR0MkV+RYrh1eiw904ApEsw.Wllqp2iAYdqdTZNR3ZuUlFmWf4AT
wQ8ix+ZupRPjFH2Mo3yH2LKV93OEI+8eNLMIqUXlLXXlzCL6Cw5JsKw2+xhI
EDaRqcvb.lWGFeHPggZrTusxzQK1W02RXxYOLJmjb9P8c3wnLuLS+vUEBHI6
h+jhyMuK458zig6LzipS1nerCOXrCzG1YDwoRyrZR+xU0gvmEh+LJB6Imy6O
N739QzajO.MbSbcYNur7LA91d5mcgBJ6q8LtbHId8vKjc8sWH0jaOlheNY9L
ukljeES69jxhMg6kYZax724wzVoZT3uH6eRIyPqmjtalOzoOxNZ+hlY57IPJ
JG2+1mxyBz0myybgI9GHPcQhspRg79ala2zpHP7fqh.BncEX2dSVdJzfEz5U
JZex7oV5VpoYL.5HKpdr1VqEDRk0TzNTVs5pFe9fSirFCv8udFtbJInby1Z0
zZexbpJL7fzpq8CGi3SlPIF.USGEJb1.QG7FQmkr6JBS4yGrGvoAFLz7oj0G
M0cNvAfLpVxN+hF4B2e1zWRO9yQCuX3fsWB8cCiLBJpYuMb9.VG7h7hFtLHT
uzRCCkZbeeanotQraYgwcEeys.STpUTUVy2gIZcHgLluOxHRBOe1Q6u6WOB4
08ztQF.ID1T4Lv7Yz9Wig2hIFa2AoM1tAGx1EHJvul5Aj4iIKuYLjaWE3NMn
pTCKofNg.iMMKDKQ0aUW8V6S6AuAJl1qVoiXWAFuVCTSLmrwINb2f4uwvoyo
BMYiyLR.34JQvuZTEfOH7ZKAespuJjPlMrbMWvFFBLAuxd1kYqylzu.hwyOb
5W+qGtjee+IAiZR5ctedmQtwqKG4QZAeX12orrisKutFww9yuJB5+rjOy6cY
qBhCRUA0yHRdQ9UxzgAkUaEx7mghs+G+GGk.INXZ30L+i+bRi9wbLBrIvicr
V0H2pcxf2bIzvqj8hcszPlvbuI2uvXeQJPhBlBkkZPm6atroQlrozIQYwqt2
y06QsNiJf5hqs.piPSCn0d3HbBsvO+nE+5PKBchHwZMHFlS85PQuwKYqGB00
zpBZO7dt841sxnC6JGz.GlIsJU6spcxIPtdTXS4MmCc8nvpzs24qHVUvzgn9
J16TpoRSH4lTFuSIBBC5CkbRpXuwHdt98bzDSXakDfCcXZ7KFzhryFE1VMA7
cY4DPfrksyuOJMAMOkdvZA1kZ30Jq7YEk6rKtmKmWVUe.bo3DAbfB0ZGcY9B
S5I5qiCdDPfnRPDq5l3XSnz0v8b47ZHhI6Xdk2JzMho37S+gKG5Sjr0bpZk7
SlznHl.PfZWiJpHa8h64pIls8rXteeqIBBeoNXeD9Ji8XxgNh5yY5icmg8WB
6+tPNp9gOjuX2v8bInXECHuOPwWoHJ0jIJJQXLDgSoBpOVn7wKuHKUt3dtpj
7XqpiBWJeia694rdkCjifp16Ipl7MfPC8cdSpxgoWFiH4mOQC2yUHh0c3EW1
hW31Vkf3traYq+xsg4S.b8nvJrvk5YwsVOKWV.q3VqUjSKmX1p8f9jKcGX.F
zvvYE1LqqvaBGBFLgkzmTW1erX11iyJ7bh6FE.qUQzYCCvP7NT2c7s7sAof5
aQR0QsbG2RWwWj+OHEQEbgOPcKj.TzURt3dtp16YMahK2RiZqQ6bWV66n1tk
F0khwo1RexbopNXqKJitTvE11sz3tThwI4Q8qwUctojz0l5qB7YdrYgsBFis
jJ9Cuzr6SJ7W6dMOYANZxBGzVHeQ2lEGX24AeS6qdPb49vD84uuBRtssUPpu
im91T3QKu5SVL1RCV+E+OP6cRM5sqMKsNLN3SdmJXB8WpsfzEWa2iqwVlj+z
WdKC+40Aq9r0E0NeTWE0NB2TPuwvKK0f4UrO5TNzas5nk2aEsshcBu5EKLVT
aBK5g77uAauU9k5fHPJz7u.J+0xj1qkIsWKSZiL4X2I459IuMp++fSxmtyFi
SEg4K9k9hJJD0TYpflsnYymvE+TCxFRkDXdWDWy1kaFWWDicBaLG.LDdiKwC
Upl0CXVyqF5WspnmE6i1p1CFiDY4MFRv7oV6jFFmGcddKttRTVGIn3fS+PDj
oOFMLwruJcFgXA2mUfX+hf6knj2anf+oACdTWgcDFPicDSk.9licckuloIYY
eVJn.L7r3GL1jgMuLheWsBJ93fWH1WCuRa1LUB2YSBeXLkSpbwvyeA+wBtSP
6LCIsFTaAHyrkJd1.nI6B0chogWLEXrqBPuaZ.VSRawLwED6FmYRcIB8MXvv
kW5rMavBCAHNuloKlO607FxH.JpyAJi0tyJfhNBfh4bfxT7zmU.EaD.kv0.E
IuOuLm.J9H.JemCTT5bCnFgHJhvcJ+trjj7YTobcD63Q3NCknKKIFeFgRnQf
RLGhRfyxvmQnDbDnD0snD4bi5ZtfRi.jHtBjLwtTtva3MtTKW4Les2FlKqR+
c6WrZGBbcLjzskOSkUOEtNxzLex89AYtC1zWlfsJ2Id9.6rUI6O0y9rmOu5t
Lo5ZH14dgE4RFylxFXr4nQM4QlICfg34Pqs+W94A68GD5Jcs106lBcQhV.K7
W4boHN8O+YuNsWpM.k7rBnXrwAvzyAlvLAOK2hMsW1HRLSbll1KkPnsf5spL
ZoOKhO6AAppX0vO9Kf+7f8GqsYy2hR5M9FUGcU8WRMthP.5vKrTOu3p57IP5
NnqVcSg+rAWeyv2hR.lEXIFfK5xRyDIpAGRVe+HvS3yKOuvj8pHSL0MipSpi
EOQyCd8YGdlKCU2BoU+X3HKddPolGHB.zrQLZv8YCmPESlGDpPqq+4y.iyw7
WjFmKY2JGHHuPLNm.aw372XB0h2fsv97ho9ylE5iqls0SsQtIVvthPEyrFQK
94vqcaNuR.Nxx0FiXWrOj2uVsABfWKD3jhxl.OGprFVW+hbZsSv557SC0YkS
oXG54cnQfsmpifm2gFhbqyBSqKRPHvrcnocexscE09psiKSuWtsEyHrKS9bl
sXAi4x5Ugs0YG1MmXw9g1Mm825gFj29PyMxyw7gHzzUjUXaKbRMnkfiIqrdn
w8u0jUHwPDI3JASHaAHDxgTPHaUbC4x5QAxxhbHl63AgMaWAoNdPXkDOWtmI
jNHcabUMzARFzv.5rxTxbnrW2jZjcHuvYCCaGDsNF9BoLgzR92eJIKQVmB9m
Z8NKdLZ85JICcG4XYy0GCBzD2l5fbke6JRDWzzuZr2eXQkivewnl2BAsspFA
jSm9xFQ0ZjxGBNShMvxGBpqpGB7ZpdJxYXzV4Xrb5eqlDEWjBNe4l7Nl4DhX
lVnF+Db1acGoBS8It4N3q08WjjM0KnCmgjsxw8Ei4J2WNUOnb1cdUS4rzoRO
S1iIoGZdYpxyU.pM8djq5OXwWQ9vo7J4WWVH3nD2TMNVKEouK89spkOu+bZf
7Eu6AqKlImxGlJm7f1Qnec8iS3ODF+gvCQqB5nBnXbkNxPyf8oBNAfvDh5zb
Ls.CXezMkKREvorpnbuZ398oIqjxl+WRhWO.lTRGRkj7cqhCCRiSdp6Z4Cq3
vAILHDAX.JgY5B6XX2rT3+1qVo.ykYapQJBSniJXfWKUJuVpTdsToLxv9UM2
.iny0M5.Apg5kxvCG.FNuPIwWBwLBDS4j7l4JEdiCxpp63acldiFVrAXO.OQ
QA.LOvJgbRcLd9T9Z9kdvkCm5k7rR8Vfrj5HK6FS8NxZeCWbCp8MTSqQEgWB
ATAiR3BJzTnCOm0XO6DfQ61j7YOoh32Go1UqUjzeTMzwSkYp3nrlp6Tc+K11
J5gTgV8CNpNTCA3YDy931sB8rxtS7Yuv2rBim6aVQL8g6uD2rh77ppUAx9xc
yppY5si1rpn.K7RXyJkYFCdippEyimqMpHD9KgMpVGtIT68mgRq5Cu1NBtul
ZiKUwjJDHJSfk5QokCNe5H3G7t269AuKjnaJv1SZuFi0USLjSvrk9RLChDDH
2237MLZFgTQdQCGo5tiWq3zrlgK+jRTwBNFPIBfOkCv5tiGxu+Lt8VIXa3IH
BoWLpehHSQmiAEKgLBiiNKy2e1jLx6SC2GtasWv98wex6gfncWYZJMBoR4.E
GPVJEJgETDE6aZC1PHb1vs8281wnfFxew.0BqKZo75s27g9YrFcA4OqdYAoZ
JFljuzutnqWHFdA4zYtkWHPdVif4rFf4W31dA4rmUZ3SfKoAv8Eh4WP9MnPY
i.R8d0a7lmyNew3fPHeNX3EBHX4oJb9Iu7x2qfP9yqmUvLTww++B0ufP9r+T
rPLiyWY9ew4XPHG+rR+V.sX+WpdFDVs.l6HWChQlBTk3EfqAWmdba1aVGsR9
tG7NUL9bvEgXSMBPZG0WltHDxXWo03TDxzDZTa7HQF.Dl2gtn23VuhJlnCdH
r4JeqOyG.FgXQF8JwGnAefDSwIDcakk0ElHAjQTotX3qEP.l5CiFOvym5B21
rCIYAa2mM7hCGjYUMSv5F7DDXpTVb+kLki2UXlwTs6x6zqyCtpSwk5voh.WG
UDM2xLy4IRmO0BqzvGB+3duk+p29KV9q5ng7Psopf1nhrU9u9ojv5z0.wDRy
Z3.US9DkexDh4iuR+Ud7gSCQgWuS2y28hfU85cfOEiY9PBXt41c0YbEMh54K
xpC4ZPHkjPRPfTJpHeM3vYyA2n6Te6MQfuQ6SOf2afdQdivfdJdZzLhBAKka
0hY.H3jMMPe5RSr42ItwtwssOkIeQ6z6B5UMNcrCyH9WGlI.lbBhQVJU0Vpw
M7TRL.IrWFcxuaSDhXLWlJjzVPDDXNU9asEfcoaPU1Pj.xYXk4qXIK4H3FIW
6oFJ0iRiXTokyT+SGOOT.mM5NTQ7UgOd0AXiEd7sUfCLQF3oxKONiKPm5P3H
jE8cNxKLQXX+q09FA1vZBWRj5ti.HHQjmonj4SXy7lwvEBQWuJW9REFTfguj
fBIExOj..YdqtEDOcpa4CMtM.JPKkZrSH3hPuZFEnLUDXokSAzh3GAgE4J45
JvKDhurRehGR7mMBoTzUftnrvsAOLqorFHAlOfdA8EA7EfaMg9SD8DASqROM
ih7wr8oxk5MWxAJM3QxF5o94+v5y5QLdUHPfIBLwb+pfIFNehNxncinVohl.
ePbBcnvpnyLZGwMwGiVu79iajTQ6SxB+7HfJKbFg8rkfKXKgf4S8F+DXsa6l
O68tGS1qTJ0Ci7d2SRUSU+Ni38tMaNb52ijVHpSl7LU+y.38tzfc+jjE9cah
hk2R9c0Sf12JpimPTGCtfBkBIyHogwQGjx7D7gq4FhLYw3bAVAH3Kvp4SyuX
UxwcG5JDMHsgSTavoAcBqmvKHnJdYyw9Sed1nceTvtDScqRsEqRk2wbTZH1T
ozKkeoQBH3bJdTFkMAH9zs2pbCipTWj4yQFMtzx.hDSuLKNd3ZfbKSdEu9Ow
wVMgBZKb0TA2oUGVy0kELXdhRciY55pyiF8vtjzPOUoOw6vSId5hfUk3vQUR
9z6DbIUlUU+dX0fjrQOGlqcuT5Ts3MlyWxXLA+b3hnZnQO+dzHL7m9rWVbjT
N+gfztBboVakYzoHCNx85JVkpTpCOhcxI+P.X9zEs7PCO+el.w5EIRFCsjNl
DI6FIY+3OOFe8.rOyDGXh2gofk9TUFJJ7Iz7.+mMa1HTZkylvTaBucjMc6t1
iYP6r5I2Q9b+7ttD7kuewvhq8vMfBSy8BNiyH3q2YE8bN1VVxYLhv43ZQF4q
Nqn4pB.b5PclBhgB.ikGMO2bWUz0giOh146Uy4VXwCnTe3ZNH0eTw90UqBAG
Z5d14Ao77QmghMA6lCpMiBAS3Ff4AiCWx3T04Bb17wLmShuNHEBkEIeLsx6R
IY5N7fJBQ8d25v6k14rJTE7wXu2sOX8Z4TUdOhv6cY+T3SdRjy6cllX78pC0
DrjT72adZs7OEZwgqSdRKEDJu68phCp9uTeOsZXEenFVw6wrJetlXkiHKkSN
.TxQWn5KzvVqsPXFszL1cVrYikqzH19.alIzh44ZIaTEbdXophLMx6LYu2FI
Lr1KZmW1U1JdG9tK9lJNaiYGOjNebjq1OtCtQ+w6kkrXyj5lWMiJ+KYgwd3g
aSkcgdPujHJNo7ltJCKAIel.wTJDKTYj9rQajGBOnJj7d5.HavFuysL78sDr
fLwReNivA9DdQT2YU6+EdaUVwJGl0FAFYB0Yg4m2kMEKurPLkm2QylZV0vc4
OyexhurB0e8QKQb.02Gynn7.5etFfYlHI9Z7M60l0Q4rkMkVVPNd13U1q2I1
rovG14nEVJu5xcEmS9v9vHBDVF6pM.sX+vFjTgPyOuCUy7pS1TQHvg6Nidxt
a6j0muIozPHLTtKIRxPZRdKE3MirQUJ05PhWvtf3O8ygCV6SpeeZeZp.3lZP
nwm0nalAfiqGiS4Wo8Fl8xMJWa5v3c2V0aq2h25RyotrMd9m8w3IM4iyw1FY
qt0Ie7XKRutOCrxE9PHOGEHptD1rJHd0QUe+PRXeHH1a8QiGUlNmlPo8cv+F
2jvUfCQR7H3XPdV7I.2VGnzERocFf2piooxmvS0jiFtrYROPAgg0U5JFWKi1
GdakN2Y.hn80ljL4wzjiO7nF.xFNB.5AAvFhAJGtTJYQHvbwEEqyYAZrJMTA
FA6kVaHILz+9VEKhWxFuUOFraWXblx4ZFSdmNtIReNWRxAYJaeBtoqNgmOrP
AqW6opuOpMQ2dL9PTNRM8nTeLZbtojxwfnkrpkOWnILjlIHlQUCumdLINLGl
7NloNNhjcwexaSZxVu+MujTu+TAY2Dhh8wrJLmhOAC0G4SU+mP4yGX7oGC24
sNYWnmJwOUnWC5vccfElza7sIVlmxT403GvLZ2MEtnkoKEZI4NmZFRb+jRZr
vHzhMijY8XxSdaC18IyFd+elNHoZvwqde+3wrCQahVcpMAh5qJ3UPQgnnk7K
X.YyH9u8AGyTZX5sJNQ9KqiBhSdXBOWNw0CkFOLADpfuo5wMvmQ.YVXrbL6E
3sobGCcJfPxUCgDlNQsUw7k3RKAmSZgTnzgAKi5xfw1.KTemCruIo0MNYoHV
.mEZt1nvcql0hdlzTHuT.PlW55lEy4lLp0NyU5yZEn+LcJq7JgRfat.i5hKr
aa69JR3XzxyGaMzP.b6.fIuMufYSWadACLUEbFCrDgvzRkyIFbd0jWFQMF.i
FP9wXyAbfEzVgKwWBkXfq+rDaAdnjW9vC5J8veAyVSQZN4EdGUBMYcToSnTS
cdJDc9TIO1G7SUpLSPuQbngnqrh7opxisPSAQjYyAROZdN90VwBMZ8zXHZMi
X5L9s+ut32plAd+4zfncx4wecwviqu9z5mfMrWM1poPyGtqg2vx3vII.FzIV
gJ58tnXMNm5XYdGh11klxsEgBWYBWfDHcrBQjPwkGBFZY+k9yZFmKmCmAhRH
wWsP4HqODllkaVeoIzWsHX+9R25qZ3iqfxeLQ+kKtqxki1YtLnxkSC+PTw2G
txcBRkfvAIBbL0z4G9Xkdit5qLQZzxtiQU3MzK7kFx5kUU2iHaevJyWjhJn7
iTxF07jyiXxuQy+vtvsDRxnGTQqe35KmNKR1GJkdrOMLSZ30IOiT4QjxiCNF
e38s2SLp9LaxG0s9.s1YL9pEOjFsNYmZPUakTcqhWux4ylCC5xIp9o1Eruku
DIksD553Axjfvwr6CRUKx4mVNp7CbHIIt5sq74iC2bH+Q1GsaWCH9gj8c+.o
QO7XOeG2mHefs88dz2M68G2Ydh2qxE92mE7g5qNGBhiykgT+U8wfcQaCNDpj
ingCPkGvDUAOlsJMINtFdXt6GZ4tqk7RqBeJZ8gG0u3KIpjern8EDkKpPorN
5gvrC0u9gfGxpe0rCexrXcwkOdetrk2qRrBUXCT+gjHPXlgp6qZT.xkRoqc+
9jVe496ldLYVk.KpaI207yC9xOZ2RvaUkHophX4+Ch7kJ.HLIXtpjpygDDC6
CY.0oLpahvMnMPGZDTYmup694X7MO8p81J+iLukdayJkRTd.8+UC9ZyYzca0
SsCfr12aGBUaOD5qAwcKUc.qspqoVZ49PNQn1vVnbCFsnWUz8hK84ew83teL
IZmGoaNGZ6KQHxBqVCZqKDzJZyAKEWh15pxCGhg9TA.vkWsMeoMK4jzZV58t
MIox8G7d7wuY61uIKawX4Nf8C8m6fQ1f4kRGPCXaEvhtA.6kgM5vjtWIN9sL
H95FiHf1ijzNilzZQT5kirSARJb9CqvoCVglZgzM.WuEjqFbnafEzAvhF41Q
HNSqpADBw4WxVrDN0znUsyPoOPOJEpmipmqaf1TG8xouJHC8pO6jZCeHZ2IS
z9KmkY5A89uFEQvnGgfgNBA23QnR+WqGgJxya9HjLjQXwz4lNBQ4jVVMBIOa
iPzPFgnmiQHdHiPxMdDBGxpLped4R2rrasVn76v52a7+x6UoXbz8GOXDg1jO
8Fks+ODmbePbtE8mrGpE2C700m.2ljE1jGmvN69fsbxYT1TVfunnklLdswzf
EBwyni7v3RD4+Dq7t3fy2pquWVU.UD9RFDxoTLunhD5OuRrZf7+zEvSKpVns
zF9FPiSqTo3S+5FT4CsHSYZHghw9yOxO4+tI5iCupy4OImKYiUCAAe1fRJ+o
aBDVczYM7vB.sX3Mw7NfqlRfOevLhUU6OQu3gCTce3kF2Td2.Nv6FxAaJ7Ed
Plf4ScPlPQrJMrIqRh+aXssY3pSLQk1FDmXZliMpGAQrDymKmFdVX7H5twSC
LcJ9IgzkTFg4Wpj1LeJGgis2HfgScqQ3DeGGbYpSxAylRpUpbpF5kKycnBxI
8Wtjrm4qAMS423l63wsg6NN7R9r+Uku5kIsphVF00TuluKXkJMvxdz6O7sey
a+OxBSydaZx5znGRd6O7ocqd62mlniLf29uDe72k7cAu860VQl81+TXPr5bN
71scya2npl7ayWDdavw0QIu82kpxyb4S9cpD.cu525KH6ycgY85BChgaos3p
luFL9+727+82W9EDb7Px9j8GKN75JJgdHbatWJW.fduw6eKH8gvkOE7AEZcm
5G.j7xeW35niaqdcr75+v1f33pWlHu72qdWUuLUd4+TzVu+bz9p2fkeie3wj
ipP1We2meM58tOLb+viXtdyeBP6QLGwFyDeMpmrIpmP4U9DjIS1xKKGTzqg8
zqg8zqg8zLMrmpWPvqJS9a+i+6+9Qe1sjIJdm7EmqhTM2ijddBXfdiYrdiI7
gcjsvEVCVPoRKL4+SZSiTYFRmgG9rLLVVGr5ydPOznAKN1BzJuHuZhTWJ8EC
o0u7yiloj2e.UjWctrg2z.fMRs4SaJd6mkv4pOsJN7ydBAX7vJX5gUiDulaF
NOO3XeaWnnE7nd.O53QxJUT1qYaCHPQ.lChub3sUmW7mGc75UoHV1Ic3cCIx
oLXIDg0gCDASATQdZp0bgx9kXH7wISXrlYPLD9YMF9tYwGEmLjX6wuwGV2bL
Fu5G2jgNo6QN31NxGRPowwyJPevCc3rA0GRf1ULOusgBn+PXF4OGiP9Pwvac
3TNDgBvWC.qwe3eWzFqK5yhR.8MP4Ofdpe9Or1DgVuQUXGyJ+6CuFYPmlZjA
kyVBkZA4S88Y4GsClx+BpgChoSS8P2b9phkvKJAlynFNXC8zAM8WzHpC+9SC
8UikOCnznZQ+GbO6YuXpSPWe2vymXJuYWcAUuyZwV8b134CzvSPulLO7g3WK
n0as8ptAHS.vUKoVrrHx12Y.R448M25MnNa.IXKfTi04NmPQMVfou5oWQIgX
hAllJFdcRvb5UT2J0yPUSJyUBvpoDmeMqLZSES+ppv04B1PGEBwkluzxnPPb
8nvFr.Kb4nfa4nPvb4nfMjUDnKGE1fE51ut6.CpkCCFw0iBlMiBnKGEDKwBj
SEXfrbT36TrvZgmbGNJ31J1pfL1MiBaYUYtTrUcW30F0oKoK31RW.c5JBvRQ
3bhqGEVshTWGf5tu74YnAg0WPq6U3IcrU2AksIfygqc5AAzxAAxUCBaEuQbo
VYLa0Ji6REQXVKj0kBVX1pNjKkwxrUOjKSS9ocT.GhlgtRMYlsBxXtTODasX
.4RE.nVKs.55QgMpp6RZSpshrfXWNJrkrvkJgPsUsPpSoMQlBkf0Jjc6TERO
zP1HAoN+01n06Sh1cHqnywoipMromafLEM9p+EGa7.qO5ze8bC4D5sVCO8Py
FFCUJpcwZykPddukWXZ+E4gCWk+hZpOaXIVqOZN0e5RL2JM9QtlYCaizO+9n
nIFjT0P5DpD5CRA.Dg.I578eIswa4pok0lVRbohnDaUDk5RkxIVKV2kTZDz.
LUibKEwX8HCRwsO1byNNDaIjwtT6DqMhvkLSXas0m6Rn.aqlybWp4L1VkVwN
eTXydyPlCMqCaqPVtKs1GaqB7LgKwBq84fSoKrUmsh.xqCkJfFMw3D5kMRHU
M1p26QUwM8E8uAFG2x8bId.lDkrv4wxBSULNpNmQnk5Sauiag7g0xJcipY0u
iqvBq0Lyk1XhrcuDgKUIBYsTbW5PJjsxOQNeTXkewvNzK5Hq0zwkPgs5q2f0
3WJ9TxcaJ3SrkRQGPLghfDgo18PMQrSC2yUSLakChc4w0ffSlzXUC3MW3ITJ
wEWDQpmkoV5xtb5.mloCA77Ocr83X0QU.wUihg3dbWoLGz1yUrA+15XSlg9V
5HTjK8Ws0.DBbq8TLz5vMAxc4dIlwAypwgSWp3VeLKbgSGGVGqbN0bQHmLH5
CmIiw5PABxQNEOrdW4hj3yMiCqinDnSOkXHiOH7vsiC6je.c53vV9VhuSGFV
ytvbKbXsVe5vPwcrK1FSEtc2EaINvLWOJr5nJcpjT6OE+ad35Y+XCRP253bD
RG14.4tEPacepYbfb13v93y0sDz1xb6TE1HVqX.voCC1r3jsO8sawFPNUlq8
mJnS0K.OfP.FeSE4hGjvD7MUhKxZijcpumgHaSrNHxoN7w5CD.5zfQDZ8QB.
QtcbX8wY5V+LY8wBbhh1QiCqUexoItCzZG4CgNUpq8txG4zMCQVuYnSClOHz
ZcTP8dzQPeDTGzdDlXofJDBFO+v0E9LSOWs06..3KtSw21E2wYHAanHgCGGP
qGGNSWdn8Rvbp5ZPqkfAINeb.sdb3t0EakfIbpBPP3PN0M2NLPO6JyCs9LHE
NeXfrxhS2JCafwZX66ovXn7nWxTDULc5kK9K.sTVOT8uJBOeH1DUCNL77Ogo
VX3jS4IrMfTZmi3bEQQWw3aojnbtAFnZ7I+ftkA79uqRGeongGz7P+9G1DEG
uJINo0tZQQMHZg4opzgHJ9b+EOftekAEx4yR4RMGwz+l7WnzKKeilOGr3CRn
De.R83DFhSn5eSnBZA0uAZ3ihN+NAPeyaB3K.DyuIuDT9Nu7iFr6g71n.+h5
6+9zj8Iom54DKw9U9bGOj7PZv5n7xaCnwxj2cknVRkOYSE5+EaUMjlxeGMQs
cZQ8e63p.aWHCiCUkemJqHbAiw0vo..EByuQn.DpF5TcojvoPr9wQ9Xgu42n
P.yu9G7TY0p5qFIeXMw.jwQlERA..I0+BTkgM8m88Q6TsHkvSKtXo9mLy6tf
BAwEDb8EWIcbkWuOPU0zzyWeJgyMybjuAMnrK9r1yCbhNnC1fAPRVkQPbh7W
nBvUg42ZbBeIi.iBLvspPry3ley7scS3CJAmkarJR4b+w8g679gfcYd+P31n
6UsgxJnevpUWR2hUq2ZbiTLsTxQHETeNko66+MGdu9qAXKqWUJOc73ZnxHbf
lPPQGfaf0ober4un6jMUYIU8r0Re45sQkuAI8L0rVKIS33AvQo+7E+nWVHCM
aS+V8O5KeNnA8QusrPltSTebM8IBvobM+TVbz5vz+SUemZD7MvbBxy+vwi2s
AejUoYV08PcB3ntXJJkOz2BpgD7zlf7blgaC3bQMrb.R.IRM2P9kEZq11lPg
2pgds1TgaVamBQdkDbUvyV+25QvEW0U6zBtp+aM+QeQo8bcN0gSQbY4yb.Ty
50+RVnTdqbmRIapWw+13igk67ScOxaRWJU+11rYvoIgtkkCugShzjm1cUyhy
ic5IYJ3a7r328ofqaR.PRaQLhx4XLxviifPH91MI9WSCCuxYgdUP0GXvFy6T
JNc6l.emTx9tCAW0TPP.LlwlTFPNAzKILenO81MO9+EFGm7j8Si51JP8A.Qu
5PHMama1Q.Jz5vK+bzaiNg6Nt89vz+UoEeW0pE+jcTTopPT8rAVdWJmNIRMJ
1plEiZ+CFQRp4mypyy8DgbAvG2qEXOuS7yya6W8tv.RNDnGz9XBC3m6CFNrt
dIOSK64eGEeA80ONxmns1GNZpGbzS+23xdugQkH8OMKN52YohDtYLTs3fWT4
symEmatFMT6100WaSqQ+bmDq4hIdkBIdgyPZrmEj6z+kXJWQhiMYpHIu5Hcd
otgl6v.mpUUsuTKeOberpY+137AVe9.K50WczhFZrdoalTPBdIgKk+dpQRWq
YVzP2OahlqaRR2FHWViSBNfk5Do55zpwu2SRx267dJ8rI3V.DhqCHDxUcAQH
jaelmZ5Pyo9LsXQkl2wYnvT88+bCcDllaYdkm4BTqybMzVqC40ALHkrqLlhy
OkltRs55FEfSHiN.7MPgTfoXgs7ym5xhM19IYMRiaXyQfobFsOXWXr0i5ScY
S425o.vbJlGoRAhqMctZRk2PcMeave.M1SDzsX8xyilretlOW8Y.sKGO64Da
tT4wxkFiSGwphbWuCmZdC8KCAiOSLkJ2g6PX56Mca6xy+tanIsu9wHR8kJuu
BxzwIIS59JJkCLZ7Xs.jhlNhhsTN5itOJN5vmpRSN.3PIu4LbjsOXUjBe9FO
bwkBOqXCrY5mxjEFyk6+JUHdpuH3mytv8Wx3UhNLUhmaVeN+EHGixUBIzVhm
oWNkUA6V+I4OLyrB.pvXG1zscgooXsa6lsp44m8dm7CkFr6m7Xdu6wj8p2nG
F48tmh1o+cFw6ca1b3zuK2X0zWSx7n.f7dQwxqH2Dp+MfZZqWdqa.EGkcnSV
CgvzdkwvKWUnha3FOnkdeW9fyZg3RaBJd1x1zhnmDJV9zOV7GBi+P3gnSGDd
ic8HfoEdioZQEXepfS.HLgni2QSzmzGUn5stIvDFGiAiNt8bXWbAJfaBEXiR
nop0Yc2kBKZm.AB7WhfDDkgDLFR9mDc3bViDQRZuMOFSV7se+uQUkF.L4Cs3
N0q5GNt6wjiJOiOYjTsvh9qN0x05mAhztR7k6vXcAOTIRHsZAPoLVdiKG4eY
iK2YpuZLPKQp.KZ.SaHn848EMY7tl59.MyBgifrhFLGh32svCryYLHbmxWH4
EZToh4AOg1gYVq.BhtXrJZzutWhBq3vXFT.K3Nnfoe2k1LzUsGPkF+4eu8LI
Hv3rqMedSIKI.N0Gcl.AAmdyZUVrqLm+yMOuXMvdbBBZNtqz8LR8Q9nhgAyo
8T+RXZkqUIL65vb3N9EsFKUX9L1leZe7FzPpc3WvpZxF1v0x8KMLUs0wjMaj
ZbVlZuxRRYaezetpcWNyJzkw1Y95T8tIWkz7psLErTb3WiVv52D1h2TkTCXw
iQqWGtqcFPqe0V7lKmpri9EIr4MgcxbrZqvqsfDeJli1PwTTNjtt2DyFZyyk
dqw+hr78.lf2Crm2CeJVi31Li3SwTpZsxomDFYhI4Y1LKoSwrjYCMOYJV4nV
IAAMEuIq3iAjIfQlxsfv27pPW6qhZCMAdJvOjsqTW8bxFdrKl3USWd29pIs7
puNtahuEDMhofSfXCOGaJjiPD1tRBm5UR6d0HmrRZkzyoPiAhMb+kagii+MQ
rV54U+prQNyTfdXa3CP7o3MYCwHbJjRisg1COE6biI1R6c0nG1V9oqdNYydb
vov5PrsD4W6loHa1VAOEfGxZ1oq9MYCQNyE5GX0aF5hMUP1HpGMEF0irxDmo
PQjp0tCKZChi+MYqDjqkcCZESvTvtAE2pkInMD8NQcbn09dYx42f13LF3j.u
TaMr5Z2HERtYjLHa10YJTLEBuUpVoOr29khPljWkMqT9Nw5kA7tmbi1r6ceg
2oN8tw2f2MskM2I2f2Mrk4M5Je21rbycColMtsspWjurKqPIlHjfBWxgDjOg
fwTeSSVgya4dSNcqMyCmff1ZuROrplyUKX+dUpSl+w0uzEaC9Qy4RJtS+mQ6
L+o9n5VjF9gnhmWGF.KBRWoxd3UGNlZNxvOxLA5fNTJS2cLJeVqiW+KJKJlI
eOkCkKRdg+mutsL4rHR+atzmLlxdxHK4IirbmzbxZ1dhZ1RRZVjMB280smaE
UyqhxThMTFSZdA3JJcIiprkbUkrjqtbkL1RUhUzoWlowiKeeGYQUXbkjjIiV
sgnGr6xOxXK8HWMCQ8hkPyLFVTfDt5wRkzqt4gwfSPdaK7AionGLIS3RE2fd
Qd6JnASxvpRfPMcqEiUrwfKNAirvDLRgT2h83pxcX2pX4hMfETW8UfAtZJq5
ERflGUis3ALUCvxEI.qGgVUX.lnQX4B.f0CPqR5+IZ.VI49seD1SB8OQCtpI
7dyitdRx8Qlf6W+DnVhraM3ZUVLe0CvZIotExcrLwzGURoOrIjwDRcTwplQp
Tex73JIue8+6W++G.P3Vm1
-----------end_max5_patcher-----------

I found an idea whilst cycling on a cheap and delicious didactic test. Stay tuned

1 Like

actually, can you try this patch for fun and confirm it was not updating? (teaser: it is updating for me, and I even have a bonus transient detector!)


----------begin_max5_patcher----------
2878.3oc6bs0jZiiE94t+Unhm1sVRWRx2mG1J692H0VTFrfVSL1L1l9xjZxu
8U2rQBrMBPlNoljpBPaac47ctJoywe6wGlsr7MR8LvuA9B3gG91iO7f3R7K7
f5ueX11z2VkmVKdrYqJ2tkTzLat7dMj2ZDWeMMugTU2d8cUjZ1ik1PKKVTQV
0HGi3nmfyA9InmBlCf7ey9.7+TMpt48bhn2Z6lh8aK22jSZDCNrsySaV8LsX
idGGx6Q+3X9W3.edWi06aZlniKW96exOQq6oEs8Nhes+5wG4eL2Rz30zWHqK
q198yP2gd7ITDNQQxlz8pmSKJWutlHdZOKQiP0Ue4PSQOMBD0NGhEr.OwWQd
ZSik6WulTUjtknwQaGa4.279Nhr2lsNuLkIFL5Oxo0hum0KaHrW1PvjyFBCP
VvFvSJaHL.9iBaH5ChMDD42KaXZ.7fHueT.7XmA3K22zTVLyRfCcNLxyW7E1
u8yto+InvxzhM8ScANy35VRcc5Fx.tZ1uKKsgvHJvtpxUrGEjQyRW07o5x8U
qHmSDDKjFBCtJQvQPxfPgKNLSBi6IBJwR7XXY+3nWu3H1g3HWhuEzxH0M.uy
.ZIJUITrqQstdNj+EB4csnF1YnlsFyhvXM+peP91ij5r16bWisOgV5P2cWKJ
fP4d8CxEu4j3GFtAzYbiQsnHMOeViIwwPoalPWaLA6A0LlDEck1R7RtOVfU3
E9b3ELPhWQtFuPx3guY7J9thWnyZIXpvqH2HdE4L3xYgA5K8eDAu4v.wQNKL
vBxqrd7DYgcbAg7ElQqeC6ffh1QPAwGhNgspSc8aJ0.YYSJIMoHpG3wsRdgT
UyjS0d5Glktam1kePqIbj32KEcTz7tKQKjWxq6RUjWnssOn6poULZrgQf6qj
Xxag9yNzMkYLOP6ocrEAO4w1NrKP4DAR7onXA7D5K8oEqoKwXfaxKW8URlFD
yDV1QJnE5ZmF2NirNcedyh0kEM0z+TLCQ3m589qSWQFrwcdQ+OUzz7VBb1lJ
ZVYAeRX.17K2NbbSeBddfNwHdhhzc8zXFumALCbyZFQtudYZEmWrTJFhauYS
YYt4s5ZWNYci516nEEGghMk6F9lUzMOORaWVxt41w5awcpWruPd2ELktlE0r
XsLetz7bkVnY2+VZAcKaUXMTIK.C6tIoHkQnOWuppLO2fdk24kdtSFSLdE4U
ZVyyhARWXf83zcsBQy53xYzM7flLtVS5lZyqbhYA1k1uToltngrcWNiJLe.i
cFUWmT2dkw0Gyt0Q1tHju98iCTZfY5fFvGzctJPgDwlMphxRyP1XgWZ7LZF7
PdGMcNXzyq85By5JyHWIjY3HyU3gzCs+.9zrvu1IfAZPv.4PvXD4m+E.4XPB
mHVEKNTBPIhMu3rBMzhgEYRFDjv2GP5eCBfSDJIEl77sS0ZLTJ9iFkZ.TlgV
D.AnWJX4eFvBJigRtEXAg1CV5KoU82iggQezpiFlyctlob+kvIAtybdvcwZ9
HH19+jxV.kG3hUP8NiuOejLfNoLWhcfkvZ+7CeOlvl+cQg0bAvlXGO5UZQc5
1c0bLz0haRqZHiUCcdHbP7x6i1.mbq1NDs0kGuE1NDSJyk3eIJnyOWnF9ez1
1Z.KAKcLh0pkJ8LXqaTCszg.L7cAuD8pqCaWBJpShC194sDm5fXAT6FsIzww
SdZQF4sg.tCqVNmVLzxjDDI+98inpyoSRHpXg.lzKeCwoEc6cvW5hrj+bVwO
uz4.KVBlIhyOGhm34.1h4.yKNKrsoaNfrXNv8+LoSBnk.wQJJUYx8eCNISLe
K4PQSrTBzVNz.nCZRlY70Ga0TCOgvSxEH6fmn4.1x4f+DhCd1JlLkSBrkVS7
lv4vsKTdvomvc+.d851NZVDCg7vI5Fw1cst+I7xMqJykar+W.x3i59.9TfwL
Oc0JlKasmG9TL+oh8RvnP9uhfIwPeQyMZIOtNQ6VPK3G5.os8ZmQlpUGPf4Z
fdEaf6KZmYaYTFU2jaeLMCv4nnnFGdLHVerW.NgOY8hvA9hegi7CP2qo9IqO
6b7V9YU0QBObxSvXLpf5lsoJMidHCa0ndTGuNj8un489qiX3plhaaZTbLC6l
26u5uossDm.QIBYKOkrE+WrKg5okrvRUG.RzgcwWcZsk6Jq5NMnm7RLZ29lx
N.P28sNqz4Rwmpod4RDxPyuJoYw70mIFCwhewPWFp3JIYUez1Ay3mtS1B4IY
sHsoohtbeizXl9gUdQm3xl7xko4pySoCVF63WNbFMOdvJ6EdvvCkJ5uxmGf0
kUfTvpbRZEHix2C.1yBVRZdkPJ.oqZnuHL8W6fyNlY5Qdpn1j94X2kgjbR17
v+elZtTtYUk6YKjSL5gPsjVphwkZHUKjmFmN8cpiHciE9Qvf3XCU9gx.CjJQ
b77ws3wQnRmdbqpfWqRvw+Pe3xIaRW8tQaQCxCoaJJYSob5pup+f8tqhGDgN
jbI8jn.9xr5Z.Z5zsFat7+56pnwNj0koTmdZ1f+aYd1eeDWDM2KxWl5r+7Ht
fOq3hJGqbh7B9WxK5lW7g3e1jW7Nq7BNHxUxK3eIuzJunrbG7yl7h+rwR1XO
8XObg.S3uDXLDXBieBFFEhi94RpIXDol.OUlL3NoF+6kTyPw8S2xVb4KDPyy
cII7x2Ao44kuxHdPSIPUyP7GnlPx.GUzp2vJ.BTILpuJ2qhGaE.njIuFozqs
GyBh5VR7YoPCRt5ZT3Ul4ynnoqHcrsTNFl5BDQepJZCQkHclp1vDdcecafBb
VcavFPVeLyBinmCGwc55UaSaNCxhfw5k2U.zBAm4ijb4dn6p9in13vNP+I1K
xIU4FN49WafHWX+.CcC8G+wa.4BqEL6K+36RsfgbWMHOj23LB6N6JqI.ZAvC
TkV70ZvqzlmAEaWK+wZ5aLmvYzUMNvCrLwIZW2zgka2K4GN4AiHIdJKZiTfj
CyC.44TY7IaYwe7G6IEqXAGk+tKn9P8cYXbpOY5I9JBONKLnlmcHfx0x8gM+
cschcckDAXQnUjwDP3AjwCSSESF3efAK4UUhn4sOLk0a7GmgozF9MxV8OcF5
4qdQAjL5KOjottlZyWMCiu169AOLU5EIioQlCoHOKbC2eVp0akAbmp2e7Yp2
+a9kf.tk+esUtOxc0f9.hHqy2SydhInvrj9cvmIEuv9sg.ymkXF+xpUB8YtA
3CEk6s+th.JfIOrENwGV3Y5CjqUXgsHPtwHvyTwWPvmPxOP.eeDDNQRSJkMO
H5ZklfSszzQFbtL.vByMApDJ1yElahmZyuc5VpnW9t6LrfTY8Z7MnwDcOr1l
y8ayVlFD5.hGKcqJqo3nqUMH7doEnrO7YY90KLM3.cAEHnRmdTjSb8huWghz
Z6zwfRHz.SRbR3H2U8CWXa.dP6H7ZC4H3rZGhVYlr1RP33znSAEmlGgFIT4P
IxX3gjm6D315QJ1lQJxEiTjMiTrCFIeOKFIy7lc1VZ1tRZQihgEDIdEG5ACe
JJf+p94vecqSt.KlbGwU5RgX+6vPG0+PGL8CsOt+gFN8CMd..GeGF5j9GZzc
fWOvP6cSC8QZVCvqCbfhNBeAJ52lwKqnIjdlW6J4W6FZX+C8MJDgskpuU7Em
XKQdyijMtgvtXjPPKFIW3YEYCIgbgBG1lnEPw2KENwHgbsUaarb5BY9PaDDO
YbjwVdzawH9PbzaunidyEc5asngeiEc7aqHQ1LeTYXHI09K+hixF6u83kTxE
WW4VboIotJAsGH6tMyracd6PkTQ+j7EWFENYZYrVpg3EmThDsoh9fkFwUVVD
WYIQbckCQ+kBwvkAw.k.QW566HoJSsC63h5k3fERWmqrFtLIKVa9qG++.v7u
EY.
-----------end_max5_patcher-----------
1 Like

That is in fact updating, so maybe the @attribute version isn’t working correctly?

Biz… can you please put a screenshot of the state after each bufnmf~ action?

@filterupdate 2

@filterupdate 1

these are the activations. The 3 on the left is what I need (filters). They should not move in your version

Ah right. Yeah the filters don’t move at all. They look like this all the time:

1 Like

mine move :wink: Problem sorted, thanks to @weefuzzy’s fix… (and cool tutorial on its way probably). watch this beauty @update 1

2 Likes

Does the FluidNMFMatch piano example in SuperCollider clog my CPU because it can’t/will never be able to run 88 FluidNMFMatch’s on a single CPU? Or is it not optimized in some way/compiled correctly?

Max runs the example at 50% cpu (50% in Max, but 100% in Activity Monitor), but I assume this is running across cores. SC is peaking at 250%, but Activity Monitor only shows about 30%.

So, I am wondering if there is some kind of inefficiency here that has to do with compilation or if this is something that I need to hack to run on multiple servers.

The multiserver solution is ugly:

(
~s0 = Server.new(“s0”,NetAddr(“127.0.0.1”,57110)).boot;
~s1 = Server.new(“s1”,NetAddr(“127.0.0.1”,57111)).boot;
~s2 = Server.new(“s2”,NetAddr(“127.0.0.1”,57112)).boot;
~s3 = Server.new(“s3”,NetAddr(“127.0.0.1”,57113)).boot;

~audioBufs = List.newClear(0);
~fluidBufs = List.newClear(0);
)

//load in the sound in and a pretrained basis
(

[~s0,~s1,~s2,~s3].do{arg server;
~audioBufs.add(Buffer.read(server,File.realpath(FluidNMFMatch.class.filenameSymbol).dirname.withTrailingSlash ++ “…/AudioFiles/Tremblay-SA-UprightPianoPedalWide.wav”));

~fluidBufs.add(Buffer.readChannel(server,File.realpath(FluidNMFMatch.class.filenameSymbol).dirname.withTrailingSlash ++ "../AudioFiles/filters/piano-dicts.wav", channels:(0..21)));

};
)
~audioBufs[0].play
~fluidBufs[0].query
(21…44)
//use the pretrained bases to compute activations of each notes to drive the amplitude of a resynth
SynthDef(“playPiano”, {|buf, fluidBuf, numArray = #[ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 ]|
var source, resynth;
source = PlayBuf.ar(2, buf,loop:1).sum;
resynth = SinOsc.ar(numArray.midicps, 0, FluidNMFMatch.kr(source,fluidBuf,88,10,4096)0.002).sum;
Out.ar(0, [source
0.25, resynth])
}).load(s)

(
~time = thisThread.seconds;
[~s0,~s1,~s2,~s3].do{arg server, i;
~time = thisThread.seconds;
SystemClock.schedAbs(~time+0.1, {Synth(“playPiano”, [\buf, ~audioBufs[i], \fluidBuf, ~fluidBufs[i], \numArray, (21…44)+(i*22)])})
}
)

Do you want to keep all this kind of boring pretraining stuff in SC? I think command line is well suited to a really chunk task such as this.

I would imagine FluidNMFMatch would be used in performance, not pre-training. But maybe I am thinking of it incorrectly?