Stuck notes from midiformat/pitchbend. (A New Tuning Patch)
Posted: Thu Aug 19, 2010 1:59 pm
Greetings,
I'm working on a patch to send microtonal tuning adjustments to a monophonic sound via pitch bend.
The notes that are played on a MIDI keyboard go directly from the Max midiin to the midiout to Live.
Running parallel to this, the pitch class (0 to 11) of the current note being played is detected,
and a single pitch bend event is sent out (via midiformat) for each noteon,
(the value of which is determined by the pitch class and a selected tuning).
Whenever I disconnect the pitch bend generating explained above, everything works fine.
As soon as I turn it on, however, just about every other note gets stuck.
I've tried delaying the pitch bend event a little, that doesn't make a difference..
I even tried sending a bang to midiflush every time a noteoff is detected, and that has no effect.
Midiflush won't turn the notes off for this, even if I try to activate it manually with a bang button !
I've spent about 10 hours making this patch, and about 4 more hours trying to debug it now,
and I'm getting nowhere... it really should be working, as far as I can tell..
I'm wondering if there is a known bug, or if it would be better off writing an external using Java using something else entirely?
If someone wants to check this out, paste the code posted below into a blank "Max MIDI Effect" patch in Live
(before pasting the code, delete the default stuff that's there).
To get to see the GUI in Live's window:
you may need to first right click anywhere on the grey workspace background of the Max patch in edit mode, to open the Patcher Inspector.
Then click on the "Open in Presentation" check box.
Close the inspector, and click on the "Presentation Mode" button at the bottom of the Max window.
Scroll up to where the only collection of objects is, and select the whole collection together, preserving their relative layout.
While it's selected, use the arrow keys to fit it into the upper left corner of the Max patch..
(move it so that it is just about flush with the top of the window, and the left of the window in the top-left corner).
This will make it all visible in the Live track after it's saved.
(for some reason, the code-paste method doesn't preserve this layout, so this needs to be done manually).
Then save the patch in Max, close the patch to get to the Live track, then add in any soft synth to the right of it,
preferably a monophonic sound, and set the pitch bend range to 1 semitone.
The bang button in the lower left of the new Max tuning patch will reset all the keys' values to the starting scale set.
(a classical Indian scale... it should already be there anyways from loadbang).
To change the tuning of any note, first enter the denominator of the interval ratio in the corresponding box on the keyboard note,
then enter the numerator (enter the numerator last so that it triggers the calculation).
After pressing enter, you will see the difference in cents from that note in the box below the denominator,
and below that, the difference in pitch bend steps (anywhere from -8192 to +8192).
For this to work properly, the interval ratio you enter must not differ by more that a semitone in either direction
from the chosen keyboard note, since a semitone is the max pitch bend range.
So the best thing to do is to figure out which note of the chromatic scale is closest to the interval
you want to create, and use the boxes for that key on the keyboard...
This patch should be very helpful once it can get working.
It would make it able to play any octave-based microtonal scales on synths that don't have microtuning.. (like Massive, for one..)
You can save all the values for any new scale you enter, by shift clicking on a dot in the preset object on the left of the patch.
The Live box above it will select from any of the presets stored, and that can be automated,
so that the tunings can change automatically in the middle of a Live set, just from a single parameter automation.
The only problem is that the presets don't get stored with the Live set for some reason,
and they would need to be entered in again each time you open the set.
Does anyone know a way around this? It seems kind of redundant having a preset object that doesn't work right.
(I know it was from Max originally, but we need to find a way to make it work with Live now..)
Please let me know if you have any questions or comments...
Regards,
Tom Jordan
<pre><code>
----------begin_max5_patcher----------
9339.3oc6cssaijij84t+JDLlEn6YcygAYvaCVL.6f8k8g8x6SOngpxppVaa
KYXqp5d1Ay+9FQdQhTVRNSkLSI6k6ktbFxkJFGxHXD7DLx+929M27g0+1hmu
Y1eb1eY127M+8u8a9lJQrfuo44u4lGl+ae794OW8qcypE+55O7+bys0ezlE+
1lJwO9zxUal8etdyh1O5SqWsY07GVT8w+qOsb98y9yqu+t1Od0WdX4p6Wro5
aEZD937Me7mWt5y+zSK93l5QkUJjg.DtclwiBO3Amk+Yg71Y.8em8W28Et9K
aZ+FkQihmW9+VMJ.5qpQ7x6pFVjl7CF+Mrr+w29s7+41NBCeb8COrX0lWfCK
+zrut390eb4l+1rkOO6OMS9iq9NR3huR+1rj4yVQfz5Ue+OtZySK+7mW7zrG
WRZ8rOrX0cy9576+xB5Gue8uJ9wU+Wa94EO8qKedwrC8U7oO8829iqtaM+DC
Zh1Ay8KWs3iq+xppQjIuSGHfLx6cU+gRB7eXwbLO3x47vtIgUYdAoBrU5r1H
jdq1ZtsZMZtVMpOGT3CeYyl0aUz5+g272dbQ8H9lOLe0muIdn0IEUyJTPF.0
syBRc87c6+8HJJ7RMBTmkJcD+LjcvuaIv1UyHiiU7CGUs2oxYZpmQD1ATPSV
.dof.GowSnC7Jy+Pmm+AEbVn0Wd3CKd5nHwR1BY+0AYBT.qYe6AyqYOn5NdH
gLt54tE2O+uMS0QCk9.PpSupQ4TNMsuUPYYaJuGtcFhYaUiAOGP5gEO+77Ou
3EnjVIyrM0oPGx4IZPih1gOXq2No1bxlAfAwLt54gk2sjFE2jamJVgU67H4H
AjZkPQA4PKUPW11TIDxHJTGo2+8eNyv.RZNqux5cZvP91R0jQs+90yuqxKQ9
cgbRvg.kfSaH2FZTJTRqliH1jMOHAbzi63Ce9ique8S0elTPV7HGZA8SHTET
e7OsSid7oEOSQ3Meyx0qhfDuvFTjmTR+IvQy+MIvABh.++3i9wdG3Ci1nTKQ
ZjnsZgCLUAAoHf1AAd.t8GeEfOdvej3iBlb56FrSmqaiQSyhVvij8pDIGWNk
lWgpDlL4+1k0M1.keBQG.DniWXNZniWmSzwhSG3fNRgTfxMhfSliIZBCIxaD
TXQgfZ7.m2rNcznRvAPiimSGuMqfiYB84vGKSvXQdkCEXsGn7I84Ebb4DblR
rgigB0R83AM9r5wYB8FGnPuBRGmC1XgMgbhMS4NUHEoozPAYNZXSP9F0jBkV
AXTd6HhMPNwlvTdtFnvIojDvwCaTYcepIDaTJNoJfwiwBazuQW2jjTkxNFw2
j0.i8vEJkpwAafr5uAMWnTpFIvIqw9obWnTpFIvw+VMqgjTpFGvQmWeNWnLp
7pwXqJs4MZZCwYTMRPSVyDWcgxnZjvF2a0rMiynZjvF+a0rMiynZbvFT9F0U
bRFUiD1.uGxnZjvlyJay6W90EBt5TneqluyuN+osZ7lurhTjmWrkT8Gm+D8Y
aV7zOsX07Ob+h3w3Kgwamcymte87M27ZrEBHkTEE.nifDgTZTFdQDHTlfRxH
jIEg5VoIRfNE1jwxwFvzWKMAtvNzUEH19ekGn7W5.6fa8K+77ut3teZ9lMOs
7CeYyhc+zyMneC7y368eYw5O0JtUdL1d+xU+BOGDyjdxuvCqui9+VbrOd4pO
stZHdyA9v0Oc2hmN1eSZ9tFCN3e0mebwh6te4CG6u8yaV73QGyK9sGWuZQcU
OBhi9O9l+18GUudfV6VMAghC+wKWc7u81ElvAArkaHa6nE0GT8940Os4n1F6
8E90kOu7DeW7LXsxPoDdvw67UqV2Xnr8eyC8O08qW84tMn3+MqQHxCR8GW4t
n8O5ouCxzlraNpSzZK+9VVaGwAgVIEVkzV4LPSazX.jKkMxGgV4bJt1BbmgO
BiyHTfCsjyXGsrRqMAs+jeu8vQQrW6vACD5rN18oD3UNu.8NKjYbmyMgxn0o
uH3txd0i6ztT55fDxItyI9zVVrWBb2esi6PPKB5fWhYF3orpLZq0qtLNZTW8
.uQQocFpqyxbB7RGWOdNk8xrhWe0C7T9DnFQLyt30bgmqAMW2eWBfGu1AdqW
HoXZ3s.yJtSo8XM9f9Bsf2bsi6ZoTnPmRwGhig7JaBYIjFCkUhSUUbql.s1W
oCrSmIB2gq906JSUU454hBNm3N.BevY75KCtKu5wcvHrg.Btrh6nMHLJiRdg
Vue8uwpVQarpwJPIe3t1aqNWLvdQv8q9LVoLbjVfOnfbB5nV38VOGjzE.zy5
cft59LWccluYXquUBC3jF0sUAuqwfgCd2pNzsdoamXKppufY0WgWUGuiQcAV
OBQTfImH6GIgOOLPkCDTQIg1DLtlvhJBbkCETof.qt3VxI.TwbBp2sX0ZRSm
uY8SCCZon9rbV8.J7RGZbb7wmOrpq5wAzRd9ObSwZUUNgUZ3s3ogCpTvWVxv
2vWOTGEGVc3cVXv3pxGcWSGWbUm4Kg5mV+zCy2bxa68YQvn6z2RUi2Ep1Hhu
ilZzA1pqrpLaWBQ04csTFgK+9IXIH3cfpZKIPDzJuyU4zS6n8osCgk.ODpN7
NJphfWq0m96MqoT67W23txSqWz5Z2q4D24c.IfWYtP3d3JG20L4LlfDxKtiA
kvQ6QZuPq28xqabGnL.BDH4yLra3ClBANIiKBrCW4vtQK3L63tMUVwcoSDjF
cvdgvc0UNtSY5IsZvkY2LZqUnMdo9R4lQeci6UGvl0nMYF1UZgWQdYtTtYvq
7nHkffaWEAr9LHLb81WAOVZEaEwvmK+.NtBV3NRF2opjAn9Jjezu27FLyU9p
ckIH7VsOufNnEfwaCvEBzuxWqqHsmL4AWHqvNeYmrJEWOmWDT+JOOUn5lYXP
dC0Lh5Ly.ZjSD6BA61qaXmuzGRum2OME08gPf2A77oFPpcvKcwbru27h5tb1
8vlod7Cu1bwV5Z1q3ty1c5xJbfmlcn3Sp3pWVMQooPUB5plR0INNKc2ONKa3
l3QQcUQGWp1eZ48K95hmdNcN4atY2X8GLtpNglptmJh0MMPjOq81wG2Yste8
G+kE2EWKv2b2hO0yul0OtXU7oYKuM8+j9atb09Koh+md9WteyOk.QJwA+7OM
+iKN5e4zI61RN9lO+zx6VuhGDI+MYws+y8Wpp+9zpvu42X07GOve4MqWe+Gl
+TTUUuc1fVnOe0xGluYwlk0iGkb6eukOT0P7R9tpqx6e94O9z56uO4qp9S95
A9j6V70kebwut7tM+bSATG8O+tVzbbA8GaBlHeOSw5EuaKX6i354n86VGYVn
Bft55jPQ6DPu2vKkpWPEguG8zy22xvFOXZIPHk5v4Ovcv3Ye2cK9HA82+82z
9Wnohxa8EM8.BPYUhJ.35pJW.h4X.RMieipt+yMKeuIV3tKGvK9n9fUFqfV4
n3lUXtfJc2W6PJ1hOu3ort1IYesz81V7aO9zre7lua18q9tYOt9W+tYeG2qh
+Cy9ceRM66IeQz+k9e+CUed8O+6Y9S9wD383WVrNrG3Q2G73IMJLn1fzDjmh
mv4rbuGUo06SpywI14D6FdjFQZtlJhCrq6A2cVv3q4Sf6quFSU+nTo4Kalxv
jDQvav30A2qBlp9ClvDst9G3R3UJNIPmFo1XrRE3nqQq2UcgFMBxMbUnZHLJ
KUat54YBcSpOo9TiRixh0ZjzYz6VrxE2nyIr9frpOpl6EqMsNjwew5uelGn3
UtNVrVAwPvIzNI33xRUMJKVA3c8h0fCqX9UgB.rzSb4aHbZc.FCGqXNAyJE8
U2iZ+w+N3Q9ZQmKEZsTwGHflrekt.ekt5T.VvgUe0wBvJtPod6fPzVvVlXCL
a.DbL.ZWIOc.3YWVn76mkijPW03m+7CiaOu9KO8wVToIfJJ07DU3tEOugmjZ
Bc+uztld+eued4c2klCb0Lyx6db8xUaZFe7UroI7P.pheWx4AR4+JvFixshm
8W6zhhdqhPGUQ84ohflBAtMzMuiILzwmjImkWSpK6DOR5H1UUzdd53HMrOvv
4viay4Mr4kYx1P970oj3ZdsHD+jRCQBSeRKqeSBTcJFMIsyhtzPB.WUSkpNN
rqb3.WMCaJrxtMtsCZEXcnxMdAzH+yFA1bnX6jOVJYW8.FttVS04w8AlEuni
69XKjqgciPZ7G2uWn+Yn.YNQyd4jGk9mue8GleeC2CunGezkSZ+DezqcH+Gb
Ds+u742bPlxh9E2VzuTpbVKX4q9ZyQjcdk6qea49ZM7KXDkjOhnC+UlWx7fa
dy.1bnkATw2+mbA1NqHDT0cooI.rUu2XNkhU1YMRvLxLmZbElSKLmVXNsvbZ
g4zByoElSKLm9Fk4zv0KwoMsozBwoEhSKDmVHNsPbZg3zBwoEhSKDmVHNsPb
Zg3zBwoEhSKDmVHNcHcsGbaW6ISDmpca6WOSLwolq8V0SDXmIhSiA6ok3Tq7
cFwoX.4WCHVCL1W4TnPbZg3zBwoEhSKDmVHNsPbZg3z2nDm5JDmVHNsPbZg3
zBwoEhSKDmVHNsPbZg3zBwoEhSKDmVHNsPbZg3z2yDmRIs09Z2HODmhAy1W3
FSLwo1q81BdDXmGhSS.6Il3T78FwoFPX8.+Jpab4M0T3MsvaZg2zBuoEdSK7
lV3Msva5aTdSMEdSK7lV3MsvaZg2zBuoEdSK7lV3MsvaZg2zBuoEdSK7lV3M
sva56XdSgPPDvfxmMZSMZgBQ.gom1T2MuUv5LwZZLVOwrl5euwZJE2jFUJ+X
2mdwBsoEZSKzlVnMsPaZg1zBsoEZSeqRaJVnMsPaZg1zBsoEZSKzlVnMsPaZ
g1zBsoEZSKzlVnMsPaZg1zBsoumoM0PgMBRCDxFuoTtGAoQGrSNuo30NuoQf
clHNMFrmVhSw2aDmpsNgio0VM1DmFJDmVHNsPbZg3zBwoEhSKDmVHN8MJwop
BwoEhSKDmVHNsPbZg3zBwoEhSKDmVHNsPbZg3zBwoEhSKDmVHN88LwofUHsZ
vks9zq1FXOFR8z2mdMvMuY.67PbZBXOsDmZTu2HNkRXhOqH4X+BN0nGNwoVs
oN.vgQbZW9ZJDmVHNsPbZg3zBwoEhSKDmVHNcGwoWuzlpDlBsoEZSKzlVnMs
PaZg1zBsoEZSKzlVnMsPaZg1zBsoEZSKzlVnMcPL44zTFxViIajlprBuBPX5
6RuFyMuQf5LQYZLTOwTlZemQYpwXE.smGxYe6.BKsFuZLtqoP4tlVnLsPYZg
xzBkoEJSKTlVnL8MJkozhzqVVSGIhnJrlVXMsvZZg0zBqoEVSKrlVXMsvZZg
0zBqoEVSKrlVXMsvZ5+eh0TsDoHA.JHGJsC5mbnxMHt7LFmvIsRlcPCEBJ4e
wGrSSeiUeyaFrVABavqAHefM5ENz6bgoArw2aDmBnvDLFl34Qk3TstPbZg3z
BwoEhSKDmVHNsPbZg3z2nDm5KMo2BuoEdSK7lV3MsvaZg2zBuoEdSK7lV3Ms
vaZg2zBuoEdSK7l9Nl2TkUI7V1ROOrlBVAX71.L4rlpuxuro6P5LwYZLTOsb
lpeucYSQGYtZpVoNtTl5JTlVnLsPYZgxzBkoEJSKTlVnL8MJko1BkoEJSKTl
VnLsPYZgxzBkoEJSKTlVnLsPYZgxzBkoEJSKTlVnL88LkoJJDakCXx1xBoon
SKrz2pa54LMbyaFnNOrlFi0S7EMU9d6kZJsOmy4TUGq4XxZpJTXMsvZZg0zB
qoEVSKrlVXMsvZ5aTVS0EVSKrlVXMsvZZg0zBqoEVSKrlVXMsvZZg0zBqoEV
SKrlVXMsvZ56XVSA9DFPCZrYh0TsOHzTDSZ0zSaJbyaFrNOzll.1S7kMU8di
2TzHTnzJG6FzqxLbdSAouhiSccpdmMwoc56ovbZg4zByoElSKLmVXNsvbZg4
zj2soElSKLmVXNsvbZg4zByoElSKLmVXNsvbZg4zByoElSKLmVXNsvb56VlS
CZgQ58ZStHNEsBuT6fouG8pb27VApyDuowX8zxapxeNXc0+daNJV29waQ8TA
aUliguTT6t5dfrT.5.k2XUpzRH33SqzYEJPR.UuAZqRI.OhHeHGFf9ZzHl7c
S+XvqBR8QPb7UP73C9zmrNZyOc27MyiRnp04d6J23T4tY2uKsJ6l+kkq9576
Wd2ehgv1E5snKq.u1uio0adqK7dNg2l+39Lk+e7u+u8uOa0pYKW8Gu4L3+9D
SUpfPgZTSlDVJ2Go2psjZZkBSfR0COI82xNS+s+ZoHM5JtTUhEdqTkhKzO5T
FoBNItn5Ntjy6g9+7L4IwpbW6DfRKzdIXns.sAT.VojiGVqDlShOPmwGW3M1
5FMuUkRQaie6Lul1iQETraPGgIzN6FWlV33NqFr+CKd944edwKV47CZ0wW5j
+WJ1j2eZ6bfeoX67bKfvVcPRZTnLDz4YNcxwhGHqXjEmRLhTIKZL7AQMpXjJ
mXjWNgPDZCBHnUgwFhzYcYD5mPLR6QggoDXbgHqKmPTvBSHBgDr3UFt7LYHh
Pk.NFPTHqqhlTLx3Hbw5LLokdoW.FoTgi.FYyJFAJ+TBRTXOJ.CRyHCRY0cD
Ey1D5wlhp1Q9fBiMDg4cczjhQXUibRpCiLFk2.HAPMg1ZnzHzTb0iMFk0fil
zXr0Vsv6TUm00nBQYMF6oDfnD07dmzfo.DJIWTNO2S5xC.kyL7edw8yfiamU
kQ6si.XAM0UmTU8mTdsxLkGK42H23i7BhORL63iNy3S3hAOTJ+UniNinClYz
we4PGSH6niIyni6xgNZWtQGoOyni8xgN0WuorhNgLiNlKF53C5raYk6c0wKG
53xuWYHyni9xgNX18JKsYFcTWNzQkeuxtbGO3kCcj42qbt2Q+xErrymcuxxy
JZviQ5d0MHbV8uWdIIzVkkfCqb7ZkuB.zcV1052XrkxLHuCILxrsTPmycf9g
ImUcdYgs4J5mMtz04Llkur5w4e7WdsEMmM975qYr0kxMZy1ZFUNi3s51+x22
2+IZ.m4S0pCFTfu1t5U.mtu3QkyskeX4cKeb9SOu33.ys69+iVKc6HuxRIBx
fz3IeQdTvUnfyxGqyqgittSl7YYD9KOe+x6dcezIfx5O8ItX.i1.4IxEdSw1
d5JCzRZpW4UrmGAFbtpdWSnFErGszKesSaEoPe4BJyPeCZCbpuzdT7kw2UOS
lWjtbU9c820EfFxyF8.p3FzR1riy5wsxPDMJxbzQZoVX0NOyBOkNfUnHCQZs
B5xVfRIfP02V58vqFS1+pBzfLu7Ro4iK8+ib+.TtjaUyKub.u311oAgsoHZs
tJ25F9k7hGBbCJpRzQJxzLOvgALvQ4KF3nbhF3V+4OvMxpcPw5XRSex5pegy
XUBGh.BMhlFkxkAkxlnTUOYqijJQoP6ToT3vsMnjsUdxcwjZaX0C21HdfOc1
Fxgi370of7MygILcHtILbDOdfOYHtwNXCWc0UpZumZlMzZqfhxBAXRmMLCWo
zwtXadpwaThRMYdiLpg6hsNjszmZmobdg23k5I0SkAFtRUyqc5SsyTwJ0jMS
g9wZlpdGdkTfRiluPdS2N7naTmoRTpoalZ.6vaPifxAEM7EGixTTIsRiIV9z
nB5AOujL5k9oB6kCefKcQKnZepoug50Bn8s3INQ5jNLbijnw8jMWnGdT.lZJ
I26oF2XJivZ71.LoSFCOJfjA9zMajgc50pDWspnYCcf1TbaiZdxlMF9N8IC7
Ia1PM7cy0dHNXxlmZlMnDc0au92S0rgZ36lmLvywrgoCC7PO2sCQ9rK0RjOo
NJrBvXQM2ecptVDFf6yV6jOIZfJSZfCoMskN.mbM.xiFf.6bU4s5IWCjYRCL
dAHMfdx0.eHOZfgadPAoiaxBSrF3yjFPxMH4HZxU.WlT.JfOSfdPM4Zf870.
cvryUjQKTzhHGbb4nDhjqnb87dDikOIZrISZL8yGTiijmnwAT3sx.2BLmXMF
GvpTItyUmEizriIemFitfvn.Up7IQi0WFM1n3t.q1.StF6tPywFqVHUVvO41
wXtBhhhgcqlcL4zJ4CF13V4ShFmoft3bnNnFGKOViiCybZ03gDjFMRoElRzs
WXlakOIZv.T.tWUcHyrsxmBEPmoXzX4VavagSHOdJKNt5IcJSmof5Pu4flYI
xiz3j3vmVM1lovXUtCpwIxibrDG29j5WQaxjBaCGVgikGOEGGm+zNEmIGQIw
sOoNh.elzf33vmVMvkGMHIt5oUCfLscVbbxYSCvtbrO8zxeniI8XTqBogf5h
5e3oOY0gWTqB5vvOkV0XPqeZTl0pQ8MPI8ISUgSts3LRdxhlWR4uY3JLLFri
mFTpKhO7zmZTpT1wyfRIGih5KMrMW7KwwjmZVZlTTeYXo4dmIZlpMtzHypUC
uMVopepYwXaULl7TyrXZM0M7YQ+nTZZIAl4ZqO.49O0ngVo8kO0puIUzVFzW
2XTXvowk4hTizmrn+kEM7vo8ZuCgMS70kFplLdWhjmZcgFykGL7RJxaFCJgS
idSFwk5dOUa0ESWbkngpT3XTBHoAzIicZl7TqGknxCIGST5wnRJRCwSFUbN6
8TiyRk5kOs8Ohp.CVz.UXWm1jvMoAJ55zgIgwuUS5Rbh.uPotk+ZYCGZ+V1a
..h.WcZgX4CUCvwnT0RO3KYTcEs2SMKbhJisbXu65hsgquml.Edpso8v50ZA
4h164F6Y7z0V4CUCTifFvF2PSO.lGonU5AyK0fZ4CUCfwPCn.OglN873OGzo
PsCSpCGaXDPUlsWnok0xnmTacn9knZs7gpAtwPC3q8YcaId7U.6Xrv1q31DX
cGwkMAonQNjkIKdnieyX3bzPdva6xni73GGiwefOV2lNI6HO9GiMmLHHbsMK
3Qd7OFaMg.EOSSCXcjG9iw9RZmVna6Npi73WNFieZfpaadoi632fcMj49L9U
bSNV4zVtuGR4ZfF9roz1v1Hl2JdfierKi+dezvwCTeUKZAIKZSySSwPVUk4u
4bGyj6SvGBbGAleOa4cA9cZyN4CUETiwUhL9D4aO08lKAY5SN0KuRjCOiVDF
iaOX7Ixe5ScutXvs1C7TiBmbyByfBKGiKgW7Ix2dVKom7R6kvS8xKgWFTpw3
5pkj.8tjjk6+TiFxuAbd4Sn9E2QLb3WOT8nzqDhYfnkkgltiP5SMShI8JggO
IpciQaEHlAhSyxPMARA0AdxodY6HHCJrcLtU+QLPbZVFpOPdm7.O0nuIMCfL
nulwnmpDy.wVULjnvwT5ZUvAdpQgS5EKYPgww3JRkvNQy0fpgchjmZ78jdEo
xfumtriI1yfuf5dhmqoeYWuDM8IvzzSDnvj210olH0g651mk9TuCA+DkctTB
GTTfomO3kdxjEPSUHmaEMMpGNlpGE9LZoH1fcp2VQSi5oGU0KzJRZ8Js6fhp
dMBPQIUc5LMnPjroAFTCEFjHD3JR5.h.Ik+2dSyQxlFEDNKEzSt5AzI4zsaF
46DMMCb44MvCHuekjOaf1A9VQSx.WFNqAd.ruvkvVQSy.2edCb8KVjuSzzLv
cm2RE1RL08yNQSy.2ddCbL7h03aEMMC7yauetSgu2RkchllA9YtqtmeMkl3N
bmngNv6zImNs740Et.B9IcHo5BEi9yaSCtYDHQsBzbfJB+12H1shmhwtVN83
I7Z1Kp9F9.keBCnFnN+j5LJ26op+PUWZUoO4qChhO2bqGbAcinIQWkmotFs3
AbXpngNv6TcuElVmCpNU2ZUmQSuJuH81Sw1KqeWsvE.fA8brzUhF7.uK90pX
hqOCbmY6oQyaJrqrASepUo7dgUY.Ny17nTcgChJ1Qg9b30tsmFsqt+pi74y6
bZ9n9pDM3AdW1wtpr.5y.mLJaOA1FDG4WJ8pfAxEf2kMrs8r55LR01CRsYcS
SMMl9TiNY.xQCX.NO5rnTcpLFqpQf9nTnd6ok1pF0UXW5SsJkwJBVmNa16tt
vIPUgyzGkxiaOQzFSCCEzfTIk4xxv0ki82F5oeJxaZ6gdZqe2zr8l8D+TqWK
qWfZZYouQzfUptbz9UkgUeTpfYaIY2nFXcCTO8oFkBIUj1SECpboTcppk5oY
CRirlRxtQKrpXcp4oVcJnEAz3b4Rk5TgL0y8S3Jstspq6fNYzFgN3BXHWJUm
ptodtyugaiEMTX1EkxQ6oZjVkNWJUmp9f95mHgwmfkhswI4RvzJ0BEsrzGKd
vp.zYUPdlpfi1CBoHtXtvneFc9pqFwQkS5FkTBT8xQwxkIh2ohDOXMtKoBBS
a.81tjeTeuGJF9XWAige0x3TRZBwW2cpXwtpWM2aEmEE30oQ022kQ6l+4gpO
Xs7YtYpav0GRD1PZZTHB3vIMc+xV3XlI8MV43pUHxRmuRAzLDpypot00YcPd
l5PjIMhT3KnjK25iIdmgNZAA3AoNi146MYbDap911grAg0QIggI1TbUpH0Vq
WkSapNUZB99dI92A07H0Ro8yLF1TFMGRD1bWt1kWWdLo5TgHz2CCHodXhLo3
63BE4szlUKJcmUA4YpBwlNA9N3Qia3Dxi17jBWf7yaSDOXMtSgKz2SANdnF6
TuoTmNjnF+7wIsmkEkPGbZz2hiw.b4jR4xYR2HVxEbX8agq74znSkRow02yQ
HppqhspHm+JZyVkNmlUlPm0A4YpCwwdxTPnXOamPdjYERVmViDLYzrxzs6Ae
uu2+6Fp7BLsMDXBzLZr0rZeQ31JDc6wFkCyp8VucLGk8T8LjWCK3fPpYEWqg
dDc5LZVY5TYQZz88H2iJb7HyJsADNC3jgrZVY5rNHOScHx7QyWsafOTjiHcm
IklV74L9pfNxmIUm1atuMS03gpSwMHyPfWnoqqYyCIhWNpn8tXsOhhkcxyhl
9pFW88lmPt.nULRY5dV7Mi.L9f1lSiqNcLJXeOt03KoPrwEkVrpVaxnsEzYU
PdlpPrUjEEFCyu4IjGYe43F1GE4TNOFErSaR22V2a7PMNWjl6exgDgMWIkHR
.ywVVXWNRFUece3MBW.rpzijguZNFMnAHiVUX2dm8z2irH9VxDejEZB+0FaH
qlUnqy5f7L0g3DojVAHAq2bB4QGZAvUphR4yYjfX2R5uuGaQzPMIEeo4EY82
HpIq+XZnyhYUWNUFUea32JmPq8AeZjfHXENIsCaN2rpaWZRr2LYDcYrrdgEX
Vxts59+a0VsQGKev5fty5f7L0AJ0CqTUclD70NKHUZ9tgbT4LYm.F39bfwR+
NHsKPh7AqycZGZWuanMQi0.MW4sVl871qZ2KEYATnAqsZhNh9pVwYQOe0Rsp
uWXMZCJfbBT8xBhOAFPppVdZ0BiSEBIxGrJzoyvP65Kot65yVQVXXvSwLozV
eNsvzgNqBxySEhLjPZX6AZ22vIjGYfgdfTYevlS6qtcSI6c+eHZnFYKwZl7f
hX6HJLPJGyaSnweq3rnmup8Ue2.KHEja.qESsu3VIG8SJYVsu51c7T22ZMJt
utEuEFR4A6q2bNiFXlNqCxyTGh2pB.g1fA+wEGuAlBEx.srExpAVm1ztuu4P
RFqw6VA5WrAVsnXKrjpJIelX5NUsv8TQ4iyMTGBbxVXJfqzECWNnYzDqSGog
puGoQ7qKw38vHnWQQ5l0fD6z84P029bV5qpxclRZOmBr0pfSHOxFilx3FKkR
oxoMVmpS891NPk7aOXcPYSW3wUNmiD.1btvS0sBwnuMDkXzNn1cFmdr0Kwdh
XuAdjlladGZssFA2JevZZ2dsXZ5aQZFcyziLwHIBmFkxrtKVmJFIUuO61jaW
ejsTK6NuTTrkkAENjRKIq6do5Rd+8soCPYePwiok64RupPa8VOBY0xpacJhd
2VmiP6XyHT8BKKbaBjAjxTzbaZIEuU9.0TXTdkFmzpmaamy1jl6bbGAo0yR5
SMcOhj8PFd6V.biwa27j1.csJh93t6RySaa4KgC7TsBmj2WFzWUWBkzfSZMP
t+Mc6X2GN8DOp5RYKKu9FSly3tj2VLJFmupCtUw9LEzbfYXeqvoXzqFxfu99
LFp8Xj7DHc0WALJSFP677wYUKanJEX5ZM62G0p4x7SHuQa7bBzJ9JO5AfCZ7
XxcjNaCRqCuMo0NuS9f0Vrq2Uo9qs.kAo.s0E8KqVfMXA2I9.OW8XnGpNjj3
9c5V4CVe67kW3bzWkNYZD3gr5DePx7aTiuNiyuptdssNG8EYJk.OG+R6zH5N
wGjL+F2Ojy27Kz0avY+0WOezd1.kA0dqZOlb9Vd3AKaIG28a2JdvJqrq25yy
vUEnRVx5IEzeB4wSsIsJ57M01oXYsC3sgwodiWzz2EaNKszmZ5BiIm3XFhsS
F55Eh6Lld0X5zH577z0wjG6oJ90jP97TI8c8p.eFZKMWFqUnrtWhdL4IKli6
a3Yawrz00qO+Y3mBsI9iPJ6Z73hIch7EUcoGSZx0akOXcsy2V0yPWsoQNI0V
u9DxiWGG8JEHiKiMc89FeFJqJ03T4jxp2SFGQNqUjXn8jTZeCPrS9f01N29J
NCsUxmHR.wl29Ga6d4akmL5oG9Ge6+GPhbZLW
-----------end_max5_patcher-----------
</code></pre>
I'm working on a patch to send microtonal tuning adjustments to a monophonic sound via pitch bend.
The notes that are played on a MIDI keyboard go directly from the Max midiin to the midiout to Live.
Running parallel to this, the pitch class (0 to 11) of the current note being played is detected,
and a single pitch bend event is sent out (via midiformat) for each noteon,
(the value of which is determined by the pitch class and a selected tuning).
Whenever I disconnect the pitch bend generating explained above, everything works fine.
As soon as I turn it on, however, just about every other note gets stuck.
I've tried delaying the pitch bend event a little, that doesn't make a difference..
I even tried sending a bang to midiflush every time a noteoff is detected, and that has no effect.
Midiflush won't turn the notes off for this, even if I try to activate it manually with a bang button !
I've spent about 10 hours making this patch, and about 4 more hours trying to debug it now,
and I'm getting nowhere... it really should be working, as far as I can tell..
I'm wondering if there is a known bug, or if it would be better off writing an external using Java using something else entirely?
If someone wants to check this out, paste the code posted below into a blank "Max MIDI Effect" patch in Live
(before pasting the code, delete the default stuff that's there).
To get to see the GUI in Live's window:
you may need to first right click anywhere on the grey workspace background of the Max patch in edit mode, to open the Patcher Inspector.
Then click on the "Open in Presentation" check box.
Close the inspector, and click on the "Presentation Mode" button at the bottom of the Max window.
Scroll up to where the only collection of objects is, and select the whole collection together, preserving their relative layout.
While it's selected, use the arrow keys to fit it into the upper left corner of the Max patch..
(move it so that it is just about flush with the top of the window, and the left of the window in the top-left corner).
This will make it all visible in the Live track after it's saved.
(for some reason, the code-paste method doesn't preserve this layout, so this needs to be done manually).
Then save the patch in Max, close the patch to get to the Live track, then add in any soft synth to the right of it,
preferably a monophonic sound, and set the pitch bend range to 1 semitone.
The bang button in the lower left of the new Max tuning patch will reset all the keys' values to the starting scale set.
(a classical Indian scale... it should already be there anyways from loadbang).
To change the tuning of any note, first enter the denominator of the interval ratio in the corresponding box on the keyboard note,
then enter the numerator (enter the numerator last so that it triggers the calculation).
After pressing enter, you will see the difference in cents from that note in the box below the denominator,
and below that, the difference in pitch bend steps (anywhere from -8192 to +8192).
For this to work properly, the interval ratio you enter must not differ by more that a semitone in either direction
from the chosen keyboard note, since a semitone is the max pitch bend range.
So the best thing to do is to figure out which note of the chromatic scale is closest to the interval
you want to create, and use the boxes for that key on the keyboard...
This patch should be very helpful once it can get working.
It would make it able to play any octave-based microtonal scales on synths that don't have microtuning.. (like Massive, for one..)
You can save all the values for any new scale you enter, by shift clicking on a dot in the preset object on the left of the patch.
The Live box above it will select from any of the presets stored, and that can be automated,
so that the tunings can change automatically in the middle of a Live set, just from a single parameter automation.
The only problem is that the presets don't get stored with the Live set for some reason,
and they would need to be entered in again each time you open the set.
Does anyone know a way around this? It seems kind of redundant having a preset object that doesn't work right.
(I know it was from Max originally, but we need to find a way to make it work with Live now..)
Please let me know if you have any questions or comments...
Regards,
Tom Jordan
<pre><code>
----------begin_max5_patcher----------
9339.3oc6cssaijij84t+JDLlEn6YcygAYvaCVL.6f8k8g8x6SOngpxppVaa
KYXqp5d1Ay+9FQdQhTVRNSkLSI6k6ktbFxkJFGxHXD7DLx+929M27g0+1hmu
Y1eb1eY127M+8u8a9lJQrfuo44u4lGl+ae794OW8qcypE+55O7+bys0ezlE+
1lJwO9zxUal8etdyh1O5SqWsY07GVT8w+qOsb98y9yqu+t1Od0WdX4p6Wro5
aEZD937Me7mWt5y+zSK93l5QkUJjg.DtclwiBO3Amk+Yg71Y.8em8W28Et9K
aZ+FkQihmW9+VMJ.5qpQ7x6pFVjl7CF+Mrr+w29s7+41NBCeb8COrX0lWfCK
+zrut390eb4l+1rkOO6OMS9iq9NR3huR+1rj4yVQfz5Ue+OtZySK+7mW7zrG
WRZ8rOrX0cy9576+xB5Gue8uJ9wU+Wa94EO8qKedwrC8U7oO8829iqtaM+DC
Zh1Ay8KWs3iq+xppQjIuSGHfLx6cU+gRB7eXwbLO3x47vtIgUYdAoBrU5r1H
jdq1ZtsZMZtVMpOGT3CeYyl0aUz5+g272dbQ8H9lOLe0muIdn0IEUyJTPF.0
syBRc87c6+8HJJ7RMBTmkJcD+LjcvuaIv1UyHiiU7CGUs2oxYZpmQD1ATPSV
.dof.GowSnC7Jy+Pmm+AEbVn0Wd3CKd5nHwR1BY+0AYBT.qYe6AyqYOn5NdH
gLt54tE2O+uMS0QCk9.PpSupQ4TNMsuUPYYaJuGtcFhYaUiAOGP5gEO+77Ou
3EnjVIyrM0oPGx4IZPih1gOXq2No1bxlAfAwLt54gk2sjFE2jamJVgU67H4H
AjZkPQA4PKUPW11TIDxHJTGo2+8eNyv.RZNqux5cZvP91R0jQs+90yuqxKQ9
cgbRvg.kfSaH2FZTJTRqliH1jMOHAbzi63Ce9ique8S0elTPV7HGZA8SHTET
e7OsSid7oEOSQ3Meyx0qhfDuvFTjmTR+IvQy+MIvABh.++3i9wdG3Ci1nTKQ
ZjnsZgCLUAAoHf1AAd.t8GeEfOdvej3iBlb56FrSmqaiQSyhVvij8pDIGWNk
lWgpDlL4+1k0M1.keBQG.DniWXNZniWmSzwhSG3fNRgTfxMhfSliIZBCIxaD
TXQgfZ7.m2rNcznRvAPiimSGuMqfiYB84vGKSvXQdkCEXsGn7I84Ebb4DblR
rgigB0R83AM9r5wYB8FGnPuBRGmC1XgMgbhMS4NUHEoozPAYNZXSP9F0jBkV
AXTd6HhMPNwlvTdtFnvIojDvwCaTYcepIDaTJNoJfwiwBazuQW2jjTkxNFw2
j0.i8vEJkpwAafr5uAMWnTpFIvIqw9obWnTpFIvw+VMqgjTpFGvQmWeNWnLp
7pwXqJs4MZZCwYTMRPSVyDWcgxnZjvF2a0rMiynZjvF+a0rMiynZbvFT9F0U
bRFUiD1.uGxnZjvlyJay6W90EBt5TneqluyuN+osZ7lurhTjmWrkT8Gm+D8Y
aV7zOsX07Ob+h3w3Kgwamcymte87M27ZrEBHkTEE.nifDgTZTFdQDHTlfRxH
jIEg5VoIRfNE1jwxwFvzWKMAtvNzUEH19ekGn7W5.6fa8K+77ut3teZ9lMOs
7CeYyhc+zyMneC7y368eYw5O0JtUdL1d+xU+BOGDyjdxuvCqui9+VbrOd4pO
stZHdyA9v0Oc2hmN1eSZ9tFCN3e0mebwh6te4CG6u8yaV73QGyK9sGWuZQcU
OBhi9O9l+18GUudfV6VMAghC+wKWc7u81ElvAArkaHa6nE0GT8940Os4n1F6
8E90kOu7DeW7LXsxPoDdvw67UqV2Xnr8eyC8O08qW84tMn3+MqQHxCR8GW4t
n8O5ouCxzlraNpSzZK+9VVaGwAgVIEVkzV4LPSazX.jKkMxGgV4bJt1BbmgO
BiyHTfCsjyXGsrRqMAs+jeu8vQQrW6vACD5rN18oD3UNu.8NKjYbmyMgxn0o
uH3txd0i6ztT55fDxItyI9zVVrWBb2esi6PPKB5fWhYF3orpLZq0qtLNZTW8
.uQQocFpqyxbB7RGWOdNk8xrhWe0C7T9DnFQLyt30bgmqAMW2eWBfGu1AdqW
HoXZ3s.yJtSo8XM9f9Bsf2bsi6ZoTnPmRwGhig7JaBYIjFCkUhSUUbql.s1W
oCrSmIB2gq906JSUU454hBNm3N.BevY75KCtKu5wcvHrg.Btrh6nMHLJiRdg
Vue8uwpVQarpwJPIe3t1aqNWLvdQv8q9LVoLbjVfOnfbB5nV38VOGjzE.zy5
cft59LWccluYXquUBC3jF0sUAuqwfgCd2pNzsdoamXKppufY0WgWUGuiQcAV
OBQTfImH6GIgOOLPkCDTQIg1DLtlvhJBbkCETof.qt3VxI.TwbBp2sX0ZRSm
uY8SCCZon9rbV8.J7RGZbb7wmOrpq5wAzRd9ObSwZUUNgUZ3s3ogCpTvWVxv
2vWOTGEGVc3cVXv3pxGcWSGWbUm4Kg5mV+zCy2bxa68YQvn6z2RUi2Ep1Hhu
ilZzA1pqrpLaWBQ04csTFgK+9IXIH3cfpZKIPDzJuyU4zS6n8osCgk.ODpN7
NJphfWq0m96MqoT67W23txSqWz5Z2q4D24c.IfWYtP3d3JG20L4LlfDxKtiA
kvQ6QZuPq28xqabGnL.BDH4yLra3ClBANIiKBrCW4vtQK3L63tMUVwcoSDjF
cvdgvc0UNtSY5IsZvkY2LZqUnMdo9R4lQeci6UGvl0nMYF1UZgWQdYtTtYvq
7nHkffaWEAr9LHLb81WAOVZEaEwvmK+.NtBV3NRF2opjAn9Jjezu27FLyU9p
ckIH7VsOufNnEfwaCvEBzuxWqqHsmL4AWHqvNeYmrJEWOmWDT+JOOUn5lYXP
dC0Lh5Ly.ZjSD6BA61qaXmuzGRum2OME08gPf2A77oFPpcvKcwbru27h5tb1
8vlod7Cu1bwV5Z1q3ty1c5xJbfmlcn3Sp3pWVMQooPUB5plR0INNKc2ONKa3
l3QQcUQGWp1eZ48K95hmdNcN4atY2X8GLtpNglptmJh0MMPjOq81wG2Yste8
G+kE2EWKv2b2hO0yul0OtXU7oYKuM8+j9atb09Koh+md9WteyOk.QJwA+7OM
+iKN5e4zI61RN9lO+zx6VuhGDI+MYws+y8Wpp+9zpvu42X07GOve4MqWe+Gl
+TTUUuc1fVnOe0xGluYwlk0iGkb6eukOT0P7R9tpqx6e94O9z56uO4qp9S95
A9j6V70kebwut7tM+bSATG8O+tVzbbA8GaBlHeOSw5EuaKX6i354n86VGYVn
Bft55jPQ6DPu2vKkpWPEguG8zy22xvFOXZIPHk5v4Ovcv3Ye2cK9HA82+82z
9Wnohxa8EM8.BPYUhJ.35pJW.h4X.RMieipt+yMKeuIV3tKGvK9n9fUFqfV4
n3lUXtfJc2W6PJ1hOu3ort1IYesz81V7aO9zre7lua18q9tYOt9W+tYeG2qh
+Cy9ceRM66IeQz+k9e+CUed8O+6Y9S9wD383WVrNrG3Q2G73IMJLn1fzDjmh
mv4rbuGUo06SpywI14D6FdjFQZtlJhCrq6A2cVv3q4Sf6quFSU+nTo4Kalxv
jDQvav30A2qBlp9ClvDst9G3R3UJNIPmFo1XrRE3nqQq2UcgFMBxMbUnZHLJ
KUat54YBcSpOo9TiRixh0ZjzYz6VrxE2nyIr9frpOpl6EqMsNjwew5uelGn3
UtNVrVAwPvIzNI33xRUMJKVA3c8h0fCqX9UgB.rzSb4aHbZc.FCGqXNAyJE8
U2iZ+w+N3Q9ZQmKEZsTwGHflrekt.ekt5T.VvgUe0wBvJtPod6fPzVvVlXCL
a.DbL.ZWIOc.3YWVn76mkijPW03m+7CiaOu9KO8wVToIfJJ07DU3tEOugmjZ
Bc+uztld+eued4c2klCb0Lyx6db8xUaZFe7UroI7P.pheWx4AR4+JvFixshm
8W6zhhdqhPGUQ84ohflBAtMzMuiILzwmjImkWSpK6DOR5H1UUzdd53HMrOvv
4viay4Mr4kYx1P970oj3ZdsHD+jRCQBSeRKqeSBTcJFMIsyhtzPB.WUSkpNN
rqb3.WMCaJrxtMtsCZEXcnxMdAzH+yFA1bnX6jOVJYW8.FttVS04w8AlEuni
69XKjqgciPZ7G2uWn+Yn.YNQyd4jGk9mue8GleeC2CunGezkSZ+DezqcH+Gb
Ds+u742bPlxh9E2VzuTpbVKX4q9ZyQjcdk6qea49ZM7KXDkjOhnC+UlWx7fa
dy.1bnkATw2+mbA1NqHDT0cooI.rUu2XNkhU1YMRvLxLmZbElSKLmVXNsvbZ
g4zByoElSKLm9Fk4zv0KwoMsozBwoEhSKDmVHNsPbZg3zBwoEhSKDmVHNsPb
Zg3zBwoEhSKDmVHNcHcsGbaW6ISDmpca6WOSLwolq8V0SDXmIhSiA6ok3Tq7
cFwoX.4WCHVCL1W4TnPbZg3zBwoEhSKDmVHNsPbZg3z2nDm5JDmVHNsPbZg3
zBwoEhSKDmVHNsPbZg3zBwoEhSKDmVHNsPbZg3z2yDmRIs09Z2HODmhAy1W3
FSLwo1q81BdDXmGhSS.6Il3T78FwoFPX8.+Jpab4M0T3MsvaZg2zBuoEdSK7
lV3Msva5aTdSMEdSK7lV3MsvaZg2zBuoEdSK7lV3MsvaZg2zBuoEdSK7lV3M
sva56XdSgPPDvfxmMZSMZgBQ.gom1T2MuUv5LwZZLVOwrl5euwZJE2jFUJ+X
2mdwBsoEZSKzlVnMsPaZg1zBsoEZSeqRaJVnMsPaZg1zBsoEZSKzlVnMsPaZ
g1zBsoEZSKzlVnMsPaZg1zBsoumoM0PgMBRCDxFuoTtGAoQGrSNuo30NuoQf
clHNMFrmVhSw2aDmpsNgio0VM1DmFJDmVHNsPbZg3zBwoEhSKDmVHN8MJwop
BwoEhSKDmVHNsPbZg3zBwoEhSKDmVHNsPbZg3zBwoEhSKDmVHN88LwofUHsZ
vks9zq1FXOFR8z2mdMvMuY.67PbZBXOsDmZTu2HNkRXhOqH4X+BN0nGNwoVs
oN.vgQbZW9ZJDmVHNsPbZg3zBwoEhSKDmVHNcGwoWuzlpDlBsoEZSKzlVnMs
PaZg1zBsoEZSKzlVnMsPaZg1zBsoEZSKzlVnMcPL44zTFxViIajlprBuBPX5
6RuFyMuQf5LQYZLTOwTlZemQYpwXE.smGxYe6.BKsFuZLtqoP4tlVnLsPYZg
xzBkoEJSKTlVnL8MJkozhzqVVSGIhnJrlVXMsvZZg0zBqoEVSKrlVXMsvZZg
0zBqoEVSKrlVXMsvZ5+eh0TsDoHA.JHGJsC5mbnxMHt7LFmvIsRlcPCEBJ4e
wGrSSeiUeyaFrVABavqAHefM5ENz6bgoArw2aDmBnvDLFl34Qk3TstPbZg3z
BwoEhSKDmVHNsPbZg3z2nDm5KMo2BuoEdSK7lV3MsvaZg2zBuoEdSK7lV3Ms
vaZg2zBuoEdSK7l9Nl2TkUI7V1ROOrlBVAX71.L4rlpuxuro6P5LwYZLTOsb
lpeucYSQGYtZpVoNtTl5JTlVnLsPYZgxzBkoEJSKTlVnL8MJko1BkoEJSKTl
VnLsPYZgxzBkoEJSKTlVnLsPYZgxzBkoEJSKTlVnL88LkoJJDakCXx1xBoon
SKrz2pa54LMbyaFnNOrlFi0S7EMU9d6kZJsOmy4TUGq4XxZpJTXMsvZZg0zB
qoEVSKrlVXMsvZ5aTVS0EVSKrlVXMsvZZg0zBqoEVSKrlVXMsvZZg0zBqoEV
SKrlVXMsvZ56XVSA9DFPCZrYh0TsOHzTDSZ0zSaJbyaFrNOzll.1S7kMU8di
2TzHTnzJG6FzqxLbdSAouhiSccpdmMwoc56ovbZg4zByoElSKLmVXNsvbZg4
zj2soElSKLmVXNsvbZg4zByoElSKLmVXNsvbZg4zByoElSKLmVXNsvb56VlS
CZgQ58ZStHNEsBuT6fouG8pb27VApyDuowX8zxapxeNXc0+daNJV29waQ8TA
aUliguTT6t5dfrT.5.k2XUpzRH33SqzYEJPR.UuAZqRI.OhHeHGFf9ZzHl7c
S+XvqBR8QPb7UP73C9zmrNZyOc27MyiRnp04d6J23T4tY2uKsJ6l+kkq9576
Wd2ehgv1E5snKq.u1uio0adqK7dNg2l+39Lk+e7u+u8uOa0pYKW8Gu4L3+9D
SUpfPgZTSlDVJ2Go2psjZZkBSfR0COI82xNS+s+ZoHM5JtTUhEdqTkhKzO5T
FoBNItn5Ntjy6g9+7L4IwpbW6DfRKzdIXns.sAT.VojiGVqDlShOPmwGW3M1
5FMuUkRQaie6Lul1iQETraPGgIzN6FWlV33NqFr+CKd944edwKV47CZ0wW5j
+WJ1j2eZ6bfeoX67bKfvVcPRZTnLDz4YNcxwhGHqXjEmRLhTIKZL7AQMpXjJ
mXjWNgPDZCBHnUgwFhzYcYD5mPLR6QggoDXbgHqKmPTvBSHBgDr3UFt7LYHh
Pk.NFPTHqqhlTLx3Hbw5LLokdoW.FoTgi.FYyJFAJ+TBRTXOJ.CRyHCRY0cD
Ey1D5wlhp1Q9fBiMDg4cczjhQXUibRpCiLFk2.HAPMg1ZnzHzTb0iMFk0fil
zXr0Vsv6TUm00nBQYMF6oDfnD07dmzfo.DJIWTNO2S5xC.kyL7edw8yfiamU
kQ6si.XAM0UmTU8mTdsxLkGK42H23i7BhORL63iNy3S3hAOTJ+UniNinClYz
we4PGSH6niIyni6xgNZWtQGoOyni8xgN0WuorhNgLiNlKF53C5raYk6c0wKG
53xuWYHyni9xgNX18JKsYFcTWNzQkeuxtbGO3kCcj42qbt2Q+xErrymcuxxy
JZviQ5d0MHbV8uWdIIzVkkfCqb7ZkuB.zcV1052XrkxLHuCILxrsTPmycf9g
ImUcdYgs4J5mMtz04Llkur5w4e7WdsEMmM975qYr0kxMZy1ZFUNi3s51+x22
2+IZ.m4S0pCFTfu1t5U.mtu3QkyskeX4cKeb9SOu33.ys69+iVKc6HuxRIBx
fz3IeQdTvUnfyxGqyqgittSl7YYD9KOe+x6dcezIfx5O8ItX.i1.4IxEdSw1
d5JCzRZpW4UrmGAFbtpdWSnFErGszKesSaEoPe4BJyPeCZCbpuzdT7kw2UOS
lWjtbU9c820EfFxyF8.p3FzR1riy5wsxPDMJxbzQZoVX0NOyBOkNfUnHCQZs
B5xVfRIfP02V58vqFS1+pBzfLu7Ro4iK8+ib+.TtjaUyKub.u311oAgsoHZs
tJ25F9k7hGBbCJpRzQJxzLOvgALvQ4KF3nbhF3V+4OvMxpcPw5XRSex5pegy
XUBGh.BMhlFkxkAkxlnTUOYqijJQoP6ToT3vsMnjsUdxcwjZaX0C21HdfOc1
Fxgi370of7MygILcHtILbDOdfOYHtwNXCWc0UpZumZlMzZqfhxBAXRmMLCWo
zwtXadpwaThRMYdiLpg6hsNjszmZmobdg23k5I0SkAFtRUyqc5SsyTwJ0jMS
g9wZlpdGdkTfRiluPdS2N7naTmoRTpoalZ.6vaPifxAEM7EGixTTIsRiIV9z
nB5AOujL5k9oB6kCefKcQKnZepoug50Bn8s3INQ5jNLbijnw8jMWnGdT.lZJ
I26oF2XJivZ71.LoSFCOJfjA9zMajgc50pDWspnYCcf1TbaiZdxlMF9N8IC7
Ia1PM7cy0dHNXxlmZlMnDc0au92S0rgZ36lmLvywrgoCC7PO2sCQ9rK0RjOo
NJrBvXQM2ecptVDFf6yV6jOIZfJSZfCoMskN.mbM.xiFf.6bU4s5IWCjYRCL
dAHMfdx0.eHOZfgadPAoiaxBSrF3yjFPxMH4HZxU.WlT.JfOSfdPM4Zf870.
cvryUjQKTzhHGbb4nDhjqnb87dDikOIZrISZL8yGTiijmnwAT3sx.2BLmXMF
GvpTItyUmEizriIemFitfvn.Up7IQi0WFM1n3t.q1.StF6tPywFqVHUVvO41
wXtBhhhgcqlcL4zJ4CF13V4ShFmoft3bnNnFGKOViiCybZ03gDjFMRoElRzs
WXlakOIZv.T.tWUcHyrsxmBEPmoXzX4VavagSHOdJKNt5IcJSmof5Pu4flYI
xiz3j3vmVM1lovXUtCpwIxibrDG29j5WQaxjBaCGVgikGOEGGm+zNEmIGQIw
sOoNh.elzf33vmVMvkGMHIt5oUCfLscVbbxYSCvtbrO8zxeniI8XTqBogf5h
5e3oOY0gWTqB5vvOkV0XPqeZTl0pQ8MPI8ISUgSts3LRdxhlWR4uY3JLLFri
mFTpKhO7zmZTpT1wyfRIGih5KMrMW7KwwjmZVZlTTeYXo4dmIZlpMtzHypUC
uMVopepYwXaULl7TyrXZM0M7YQ+nTZZIAl4ZqO.49O0ngVo8kO0puIUzVFzW
2XTXvowk4hTizmrn+kEM7vo8ZuCgMS70kFplLdWhjmZcgFykGL7RJxaFCJgS
idSFwk5dOUa0ESWbkngpT3XTBHoAzIicZl7TqGknxCIGST5wnRJRCwSFUbN6
8TiyRk5kOs8Ohp.CVz.UXWm1jvMoAJ55zgIgwuUS5Rbh.uPotk+ZYCGZ+V1a
..h.WcZgX4CUCvwnT0RO3KYTcEs2SMKbhJisbXu65hsgquml.Edpso8v50ZA
4h164F6Y7z0V4CUCTifFvF2PSO.lGonU5AyK0fZ4CUCfwPCn.OglN873OGzo
PsCSpCGaXDPUlsWnok0xnmTacn9knZs7gpAtwPC3q8YcaId7U.6Xrv1q31DX
cGwkMAonQNjkIKdnieyX3bzPdva6xni73GGiwefOV2lNI6HO9GiMmLHHbsMK
3Qd7OFaMg.EOSSCXcjG9iw9RZmVna6Npi73WNFieZfpaadoi632fcMj49L9U
bSNV4zVtuGR4ZfF9roz1v1Hl2JdfierKi+dezvwCTeUKZAIKZSySSwPVUk4u
4bGyj6SvGBbGAleOa4cA9cZyN4CUETiwUhL9D4aO08lKAY5SN0KuRjCOiVDF
iaOX7Ixe5ScutXvs1C7TiBmbyByfBKGiKgW7Ix2dVKom7R6kvS8xKgWFTpw3
5pkj.8tjjk6+TiFxuAbd4Sn9E2QLb3WOT8nzqDhYfnkkgltiP5SMShI8JggO
IpciQaEHlAhSyxPMARA0AdxodY6HHCJrcLtU+QLPbZVFpOPdm7.O0nuIMCfL
nulwnmpDy.wVULjnvwT5ZUvAdpQgS5EKYPgww3JRkvNQy0fpgchjmZ78jdEo
xfumtriI1yfuf5dhmqoeYWuDM8IvzzSDnvj210olH0g651mk9TuCA+DkctTB
GTTfomO3kdxjEPSUHmaEMMpGNlpGE9LZoH1fcp2VQSi5oGU0KzJRZ8Js6fhp
dMBPQIUc5LMnPjroAFTCEFjHD3JR5.h.Ik+2dSyQxlFEDNKEzSt5AzI4zsaF
46DMMCb44MvCHuekjOaf1A9VQSx.WFNqAd.ruvkvVQSy.2edCb8KVjuSzzLv
cm2RE1RL08yNQSy.2ddCbL7h03aEMMC7yauetSgu2RkchllA9YtqtmeMkl3N
bmngNv6zImNs740Et.B9IcHo5BEi9yaSCtYDHQsBzbfJB+12H1shmhwtVN83
I7Z1Kp9F9.keBCnFnN+j5LJ26op+PUWZUoO4qChhO2bqGbAcinIQWkmotFs3
AbXpngNv6TcuElVmCpNU2ZUmQSuJuH81Sw1KqeWsvE.fA8brzUhF7.uK90pX
hqOCbmY6oQyaJrqrASepUo7dgUY.Ny17nTcgChJ1Qg9b30tsmFsqt+pi74y6
bZ9n9pDM3AdW1wtpr.5y.mLJaOA1FDG4WJ8pfAxEf2kMrs8r55LR01CRsYcS
SMMl9TiNY.xQCX.NO5rnTcpLFqpQf9nTnd6ok1pF0UXW5SsJkwJBVmNa16tt
vIPUgyzGkxiaOQzFSCCEzfTIk4xxv0ki82F5oeJxaZ6gdZqe2zr8l8D+TqWK
qWfZZYouQzfUptbz9UkgUeTpfYaIY2nFXcCTO8oFkBIUj1SECpboTcppk5oY
CRirlRxtQKrpXcp4oVcJnEAz3b4Rk5TgL0y8S3Jstspq6fNYzFgN3BXHWJUm
ptodtyugaiEMTX1EkxQ6oZjVkNWJUmp9f95mHgwmfkhswI4RvzJ0BEsrzGKd
vp.zYUPdlpfi1CBoHtXtvneFc9pqFwQkS5FkTBT8xQwxkIh2ohDOXMtKoBBS
a.81tjeTeuGJF9XWAige0x3TRZBwW2cpXwtpWM2aEmEE30oQ022kQ6l+4gpO
Xs7YtYpav0GRD1PZZTHB3vIMc+xV3XlI8MV43pUHxRmuRAzLDpypot00YcPd
l5PjIMhT3KnjK25iIdmgNZAA3AoNi146MYbDap911grAg0QIggI1TbUpH0Vq
WkSapNUZB99dI92A07H0Ro8yLF1TFMGRD1bWt1kWWdLo5TgHz2CCHodXhLo3
63BE4szlUKJcmUA4YpBwlNA9N3Qia3Dxi17jBWf7yaSDOXMtSgKz2SANdnF6
TuoTmNjnF+7wIsmkEkPGbZz2hiw.b4jR4xYR2HVxEbX8agq74znSkRow02yQ
HppqhspHm+JZyVkNmlUlPm0A4YpCwwdxTPnXOamPdjYERVmViDLYzrxzs6Ae
uu2+6Fp7BLsMDXBzLZr0rZeQ31JDc6wFkCyp8VucLGk8T8LjWCK3fPpYEWqg
dDc5LZVY5TYQZz88H2iJb7HyJsADNC3jgrZVY5rNHOScHx7QyWsafOTjiHcm
IklV74L9pfNxmIUm1atuMS03gpSwMHyPfWnoqqYyCIhWNpn8tXsOhhkcxyhl
9pFW88lmPt.nULRY5dV7Mi.L9f1lSiqNcLJXeOt03KoPrwEkVrpVaxnsEzYU
PdlpPrUjEEFCyu4IjGYe43F1GE4TNOFErSaR22V2a7PMNWjl6exgDgMWIkHR
.ywVVXWNRFUece3MBW.rpzijguZNFMnAHiVUX2dm8z2irH9VxDejEZB+0FaH
qlUnqy5f7L0g3DojVAHAq2bB4QGZAvUphR4yYjfX2R5uuGaQzPMIEeo4EY82
HpIq+XZnyhYUWNUFUea32JmPq8AeZjfHXENIsCaN2rpaWZRr2LYDcYrrdgEX
Vxts59+a0VsQGKev5fty5f7L0AJ0CqTUclD70NKHUZ9tgbT4LYm.F39bfwR+
NHsKPh7AqycZGZWuanMQi0.MW4sVl871qZ2KEYATnAqsZhNh9pVwYQOe0Rsp
uWXMZCJfbBT8xBhOAFPppVdZ0BiSEBIxGrJzoyvP65Kot65yVQVXXvSwLozV
eNsvzgNqBxySEhLjPZX6AZ22vIjGYfgdfTYevlS6qtcSI6c+eHZnFYKwZl7f
hX6HJLPJGyaSnweq3rnmup8Ue2.KHEja.qESsu3VIG8SJYVsu51c7T22ZMJt
utEuEFR4A6q2bNiFXlNqCxyTGh2pB.g1fA+wEGuAlBEx.srExpAVm1ztuu4P
RFqw6VA5WrAVsnXKrjpJIelX5NUsv8TQ4iyMTGBbxVXJfqzECWNnYzDqSGog
puGoQ7qKw38vHnWQQ5l0fD6z84P029bV5qpxclRZOmBr0pfSHOxFilx3FKkR
oxoMVmpS891NPk7aOXcPYSW3wUNmiD.1btvS0sBwnuMDkXzNn1cFmdr0Kwdh
XuAdjlladGZssFA2JevZZ2dsXZ5aQZFcyziLwHIBmFkxrtKVmJFIUuO61jaW
ejsTK6NuTTrkkAENjRKIq6do5Rd+8soCPYePwiok64RupPa8VOBY0xpacJhd
2VmiP6XyHT8BKKbaBjAjxTzbaZIEuU9.0TXTdkFmzpmaamy1jl6bbGAo0yR5
SMcOhj8PFd6V.biwa27j1.csJh93t6RySaa4KgC7TsBmj2WFzWUWBkzfSZMP
t+Mc6X2GN8DOp5RYKKu9FSly3tj2VLJFmupCtUw9LEzbfYXeqvoXzqFxfu99
LFp8Xj7DHc0WALJSFP677wYUKanJEX5ZM62G0p4x7SHuQa7bBzJ9JO5AfCZ7
XxcjNaCRqCuMo0NuS9f0Vrq2Uo9qs.kAo.s0E8KqVfMXA2I9.OW8XnGpNjj3
9c5V4CVe67kW3bzWkNYZD3gr5DePx7aTiuNiyuptdssNG8EYJk.OG+R6zH5N
wGjL+F2Ojy27Kz0avY+0WOezd1.kA0dqZOlb9Vd3AKaIG28a2JdvJqrq25yy
vUEnRVx5IEzeB4wSsIsJ57M01oXYsC3sgwodiWzz2EaNKszmZ5BiIm3XFhsS
F55Eh6Lld0X5zH577z0wjG6oJ90jP97TI8c8p.eFZKMWFqUnrtWhdL4IKli6
a3Yawrz00qO+Y3mBsI9iPJ6Z73hIch7EUcoGSZx0akOXcsy2V0yPWsoQNI0V
u9DxiWGG8JEHiKiMc89FeFJqJ03T4jxp2SFGQNqUjXn8jTZeCPrS9f01N29J
NCsUxmHR.wl29Ga6d4akmL5oG9Ge6+GPhbZLW
-----------end_max5_patcher-----------
</code></pre>