< Back to IRCAM Forum

Spat5~ ACN order incorrect?

Hi,

I’ve recently been investigation Spat5` ambisonics. It seems that channels encoded by spat5. hoa.encoder are not in true ACN order. See attached basic patch.

In the older Furse-Malham coordinate and naming system for first order ambisonics X is front/rear, Y left/right, Z up/down, with channel order W, X, Y, Z.

In the ACN system the order is W, Y, Z, X in the old alphabetical nomenclature.

Confusingly Spat` has adopted a curious coordinate system: x = left/right, y = front/rear, z = up/down. Varying the x coordinate value with y and z at zero changes the output of the fourth channel of the encoder. Changing the y coordinate value with x and z at zero changes the output of the first channel of the encoder. X and Y have swapped positions, with a channel order W, X, Z, Y.

I haven’t analysed the higher orders, though these seem OK.

Spat~ is apparently self-consistent throughout, and all is fine when using only Spat~ Max objects. Things go wrong and are very confusing when interfacing with other implementations which use the correct ACN order.

For example, I have been building a Spat5~ 3rd order loudspeaker decoder to work with ProTools, where nearly all the available plug-ins are for binaural decoders. Richard Furse’s 03ACore Panner uses the correct order (apparently with Gerzon’s original coordinate conventions). The decoded directions are wrong in a confusing way. Simply swapping X and Y channels in the decoder doesn’t seem to fix this, but a rotation of -90 degrees does.

Obviously it would not be a trivial exercise to resolve this discrepancy, and doing so could cause all sorts of problems for existing Spat~ users.

Ciao,

Dave Hunt3OrderEncode.maxpat (13.3 KB)

Hi Dave,

I believe the ACN order used in spat5 is correct.
Indeed, Spat has adopted a coordinate system where y-axis is “front”, while Furse-Malham are using x-axis as “front”. One alternative is not better than the other.
“Converting” one to the other is a matter of a straightforward 90° rotation around z-axis.
You could have a look at the spat5.tuto-bformat or spat5.tuto-hoa-* patchers for further details.

Hope this helps,
T.

Hi T,

Yes, I have extensively read the documentation and opened the help files.

I agree that there is nothing inherently better about one coordinate system over another, except one that uses traditional and well understood conventions is preferable.

The basic directions of X, Y, and Z as defined by Michael Gerzon are the ones in all the literature, are in common usage, and persist in ACN and Ambix. Although his left and right, and angular rotation polarities do not match that used in most visual computer programs, and are counter-intuitive, it is quite acceptable to alter that. Many others seem to agree, and it appears standard.

It is another thing to rename the axes and carry that through in a way where X and Y signals are in the wrong order.

You are right that rotating an incoming correct ACN 3rd order signal left by 90 degrees in my Spat5~ hoa decoder does fix the problem. I’ve tried changing the gains of the orders, and everything seems to be in the same and right place. So everything seems consistent, though I still think it is wrong.

However, this implies that anything I create using Spat~ encoding needs to be rotated 90 degrees to the right for correct playback of an ACN stream. To monitor correctly I would need to rotate it back before my Spat~ decoder.

Ciao,

Dave

Hi,

I agree with your comments.
However, we also have to deal with the repertoire, thousands of pieces created with Spat over the last 25+ years, with the convention that y-axis is “front” (regardless if they use Ambisonics or not).
Therefore, it is unlikely that we change our X-Y convention in the near future.
I understand that this 90° shift wrt to other HOA tools is error prone, but it’s an error that is easy to catch and to fix. I hope you can live with that.

Thanks again for your insights.
Best,
T.

Hi T,

Thanks for responding.

I totally understand the amount of work made with Spat~ over the decades. From my investigations it is clear that the effects are not just confined to X and Y components, but to the horizontal components at all orders.

So, I will have to build in a 90 degree rotation, or two, in all my ambisonic Spat~ patches if I want to produce ACN 3rd order (or higher) B-format audio files.

I have been trying the Dear Reality plug-ins in ProTools. They produce the same effect as other ambisonic panners in this regard, requiring the same rotation in a Spat~ decoder.

I have also been working on early reflections and subsequent reverberation by converting to A-format, working in that, and then converting back to B-format or AEP. This involved a lot of conversion between coordinate systems and much confusion and head scratching. In light of our discussions I’ll have to look at that again, though what I’ve done seems to work.

Ciao,

Dave

Hi T,

I’m still trying to get this sorted.

It seems that if I send xyz messages to spat5.hoa.encoder~ with x = rear/front, y = left/right, and z = down/up (the Furse/Malham convention apart from the inversion of y), then the encoded signal is in correct ACN order. This is equivalent to a rotation of 90 degrees clockwise.

The same seems to be true with spat5.hoa.decoder~.

So, the problem seems to be that the coordinate system used in the xyz message does not match the Spat~ coordinate system. Hence the confusion.

Ciao,

Dave

Does the attached patcher help clarifying things ?


----------begin_max5_patcher----------
17034.3oc68l2jihcsun+sOeJxn9q26gaZlGtQbh3HI.MABMABj8Ibf.DfDh
4AItw87Y+tW6rptq1N6pRamYUt6myr6JURBrYu1qgeqoM+u+O9Ce3T98v5O7
z+qm9SO8G9C+u+O9C+A7gfC7G93u+G9vMu69od03S6C942tEl07g+3y+slv6
M3iGj2dJM7G7SS7u9TS9S4EgYO0DG9TeRVPd+mN+j.7Yme5xOHy+oCl0dKIK
MrAOBze7fmyyZx7tEhO+QUIdoe1om217oym5ydRtzV2jbNw2qIIO6yuYEdM9
wIYQ+kpP+lmmtrBhjT+wmnknd9GrvOXP+6S+2e1SPcx.9Ifll7SCzo1SnYJ9
fvA9+7e7e.+ye7eR5WSbR8Sn+6O+glp1v+7GdZzjUOsaEqxSnq.83mfFSDsr
I9obDUs5oYliPj47z5Whxx8EoruL86EHQLHhhHym8Mmze7IAJAR9+3SrTz+M
Dr2GJScdake3SIOyN8Ct+PPB7HhVg+zw1gd1ep9QcS3sm9O+OARX9Sm77uhn
hne8Gbfy6WgpkljE5m2lgGJtOQJpBqQOIXtn+xKdFeNwl96JaLmfDrbHiYhY
wrzh7+MqI0IA3m.l2SV6ag00dQg+MKf+3yqf+H8Od+wvSTO8CzOQ8guJol4E
H0LuHol4EIneIZlDll8QIeJNLiL8mQzd91z7nH74K3Ce3o+62ONZmWGGMb7z
vyMOyUS399xUS88U4L8OyTyw.e9esYpAV5+AYpkjeaXpEwbye23osdA6PBLu
oLQuvjVPBOQEE9o4KZxK+Erg+FNi28RyX128YL22uY71WZFy8tOioX9tMi2+
RyX926YLuv2u0X6WZFK7tOiY99MicdoYr368Ll66nlqiuzLV5ceF+cTyk6KM
ike2mwTe+lwGdgYrH068LlUfGCV66wL9omdh9om9yYtzuHLXl+Q.mIR+tyiH
9LE6YVEVI3e4o9Uw5R88H1DHJKElxR8FRYe2wFxx+aHJKyaHk8cGCJu7uEnr
+.8aNk8cGqK+uM3Ye6oru6XpEX+MAOKyaNk88G6N8uI3Ye6oru69HH7aIrAu
kntd+8Eg82PVvdKoru697v9uPXCPOzmBq9edAOgjn9hAc8WmNTmDger+omve
Igg4KEpRbnYEjw+fESdnE+qbM5rm+ufr72DzVz3mAOMO8gyo4dna8mt5a4+5
ACW5eH+r9BTO5u8TOte+P8X91S8n98C0i8aN0iW32OTOtu8TOle+P83+lS83
9cjUCgu8TueGY0P7aO062QVMj9lS8X+slUie07i8z47pmqHk+y+ym9XgnTkD
E270q2A9WHsKemqWpmMGw87xBMK0mbS4ekb86kJlBV42+vMfKeLNw+EoXJ3n
d+CJ32uY7KULEbzeKBc+2qY7KULEbLu+gT+62Z7KULEbu+IQf962L9kJlBN9
2+jn98aF+RESA26e4i7cTy0KULEbeCBr32uY7KULE7u+ESAOtLk+tLieOJlB
92+ho34hgmi9+eVwTv+9WLEb+Fhx9FljO92+hoP52BT129hof+8GGzuM3Ye6
oru6o7Wf42D7ru4o7m+cGWGO0uI3Ye6oru6o7W32RXCdKQc89WlyL+FxB1aH
kU382Cf+EBaPZRWHYjWR1OEe8NupeZ98y+0+D8+8KE8xexlTgWE5hZBq9KgY
de544knixe7f9wdYYgo+hiUElhVi59EWL5Is4im6Osp8xQsm9KD1dFYR4O6K
QQVjqWeLF9r3FRTj5K0Uc+b.6eq+zOmDf+HPuq+rjAT60EF7W7ZZpRN01D9y
ep9iKnebEEVyRaCyO+oC+oi+4KK2PqAve+GD+ord7K96o4YQew08+p6lGlqR
3EuWIYIMffAl18Yz0ewIUGmW8yRRO8RixmV.downEMF0MOdlSi64+Nl2+S+3
8RPf+EED3+siffjvm8sLRPf+YAAFFgO0qo+aAgWPP3ajjvnamRbd5+mOsQQ7
+62aAieMauIY3rG9Gex4Iu6OuKWTjmj0f32v4RD9++7GvYT7OiVRc+aOqy4U
8dUAj+4Ls7pmF+Cne+FbCSZfSqst0KM8wSnmi1agAn6mWCZrdgavSdYAn6+m
0L8jOsONrJD82Cex6oePl5ofvnmpiSN27D7GdQzBreUzBRuPDRYeG2TN34dN
sNLLjhe1ehkRFhe3a1VzQVXOZp72teFfdL4Iiy8HqxQTiv+mm9uxqBBqPtI7
eEjf3Ipgs1.1fm9u.tb7lXxe9C+3Cudff+m+vWDQ1mSAeYeDjeYUaeIXUH4q
O+KdQDEjG2kwL7z+BpqfLMX3+6jht+J8ZHh.ZN7ETp8RlTn9mzRGrp7R1w9I
14S30ZrNjOuJI9mfE+EWeXwaPOzzTebGN3yVRdlwIMu5SZOkkEnDk3XoYEY3
4Px.3q44KDtt2PkaSxy5PGGXvOWEV1h9LRUTaMRODRuG95S7eRybzSdEEoer
FEpe5Ge5VheUdQbdVX8amKIrz+Cnj4u2RnP74sZhOIw7budB+xKVZKzu98rC
l2HWUNWj3+Rrr+T7JBucJL3WEuE8Wbq2vqsI+bRyWkFgyVE+ykuGC+GwM8EQ
LcIo4ufLqUkb+mE7gYB77a34iLkkWG+zLk+W+nUcXU8O136UUfXM9Qkv5qM4
E+n+OwK9WNm68WZp7xPplqPGhrHK5SS9.uFuO9Pxxfrc7A7e6oOLe70cSoNO
9XFI5q0SlGorY6HRxQmFSRpbd7LG33j6yLbKfOnnea87MpimclbrXDo6Lzoc
5j0VEUEK1dWA+1om1a4OcJIgPi6iTCyQ5i3p0UBTmnrPYsRZwrYTZJkq1kKl
43psws55pcS81LZww56IaWxRlqVLlce5liJqWVupaeU1Cx8G2zM1X19fj0qC
TloOZ7ZkYBoRbRCDqaWxH3axXLe8V5ciCIz2kdQHQ5tg2IB91GsBtsKI2n7l
9M4psC2HUnNNHlxHpbS7xsgA9TgS2VdeYqXSYfAyJFtUpsODDWkZyrSTwbTP
zAVU1xqyiK7fKY+.MMs8HxXYqP9cgJVG7ohEFR3bMEbU4traU5pTtqGBha4K
kKDXSluYP5L5hnSmkeY688Na2nZcY1I1NC1tKGKx01LRc+47DKgiGDTtwu+V
7ncJaLN0R4IYmNdO4YGsGNZFYjpFFF8LDBDRF95m3te0wC8ktS7L9ULlb2D2
EO+7QiRWCJgyW4PSGsGIDdiklEmIbZzDs85EaLVrKZI5QYQrovC4Jd8ybSH5
L2y1EMYmIc67pjYwMB90k9FaPyJSC06CQqFFsAMuZpGYLU77z8WB3y836EcL
oSlOVSe1jayhOJdRLI7zFa2qWy6RGurZczg1fj4HcnEEaGjZX72I30vkVlgN
vyySYYVS4D0U97C6ydbIc3htJqhty59YZ8yzqMcScSiSNcIo6773rzUpGN02
ObVH7QKGihAqKZgfOkNc2sUpdAO7Rw2Vo.4aDbFpjbn4UeJ8PpR4oqk5omKU
aYUefuWSGMVYs3Ly6INKTVHMr6vkS2m6czemKhJguOsM2sZ1paHQydvTDQoh
OVVaqsZiBknP2T4tX86yRbFmxiV9JX2dfeKrfrnuq7ParLUqr5N1AXETYSrR
TDbOIFFFTHNG1Y1QGQIUf3Ut2AOOgD7gRszzmmK0ZSvevbRFhpJKNJrapxt0
ClhSkmnhHWDro12lZFnb09Xt943YE4GxuZWzkL0LcbjF+5oEYzGKsNgWFAJd
dMEhivEw8seD91xepeYvlM.Gmtp7v0lA0cGbaRBFRVbW+g9UsfqNqJmGez5A
LWfkycQqPCywXoVBoo6xdfDkRS3jNyXxOUJwgUYy9jk.WJ6TB1Dt5p6gBsRL
UFctaVdbS+vghVWe3rRXXMBPzsioDh2B80FDqP7i2YT5PDHC4kDWI1pOZ2ti
a2sMKO25VjNksWcbj9knNuvEnypYQ8vV07ziEoiOncesVb2MyPJgNUWDmKyo
GVmnJCrzViVq57edxhj281mZShT7IXgDBxc3cLtuY01fkBWmUD0itCwiLYG4
sPeN09cVUsR0sBHQUFAofVGs.VlSI4HQjBuiGOFOWOZtxCqTuIdNSXnFM+wQ
6GKRIKrphs5HWDmwmVYdiSNkx+vxsWlE2uht+Huiv8qK6IDCkMcIUeA8U6KW
ZgjihWTVsc0URYsFr9qMHqHUWtdIyTcV7rGEU2WnhWQF1tzvVZfYVthzbjxy
yqmkxbSNObwX0EJJiGQ+Hf9g3tgaHNPljcsEycXsYVVFDasZy9w2Br1w6Pg9
iyOYWdbbEedly0cJWIcqKl6Wwi3OUzDJf+xbxtE2lsHpuoHcnu.I4uWk2xXC
Ymarrx4YwWv74KlChI4W.1hKai+2G5eenuCG5K+swhUDblHCBHK8qQlu4lA1
Umc6z8MhmLYdLeExBX45c61gD4HPFFmljll5LUvYZLRG4tHOlFUxY7GlitDv
TvjdaFdaPld+ixEEYie1Z354kgWQVxvCGgzkncyulYNZFefUzjoAADfYcUjE
h4MBL0MT0cxLDx2BeLje8d2FPrJSvRY0ImMHC0axVGsF8ydRsNx0fFcDdhn7
VjXtRbaiybjJ3AYZl.r8XVjpFvtVIgUo7AA5BhCqi2dAMVwcsgDv+ydAgtwA
r16b.gCgkbJKInLclP0CM+rI9jfU3YH8sSBDYGgLaRhTNZjgz8NxB8EKx32w
Y6yVmcPp3.6lvgopINJIjlCSjVO6g9CE35Z7EZr3JS7rjWptY9QzT2FcanNi
ffcphyn0sp2nYCKU4g8qGodV7gY3kCAbQBBxMlJy2prKTcw9YvmPFEbOJIKx
MAA2hKCoHD+A1EG3VjkEuXLX5X7yieh9cRvNQcQfzoxhP2YK1rDQxh8Nk3cd
2o3cmIFB4MiLk1QrWWLx7jd7F8wWBk4RP3G7VLrwT49QmK8WuVWWFJUlLIna
RbRnXRBrpKtscXYzMw4gaOExvHMxLPbnfkhpdg70yyr5LZQfQ.asiW54tbBX
21oB4cIadPwswfJbZsg8gii0kkNifp8P1uXm+BQtP4aStsxONjpk+PzFS9MI
UOV4gVTKsGZkaTklato3L5obYCxHtBv9McABf2ZjodEMFVsoamecebvU1iYV
yxMEaz1pZeEYcAufy5IUKayRETeXB1rd9s.9ZmPifkzHJy9QAR7VmXmD5Hp0
16Qdn4TzAQ0vMhjlcSTX5TPLaHFSV9pE476tZqcXEhQX15yjX1H1gaxCNHbY
Ar4g72vbSYpbkO7wB.EWKfEgYzrZLyBdvHZzCRW8JocJmmLckt5XWcxQjqmo
jJ6Jg.6zesVXYhvM4dFVBMRxlSbigECM+lG9ZKcFsjTvKTXxMopaVXLmrC4O
r2GsuNak67sV6QLrysQr4KAxTmdZuNhYaOox3MCmGKQpJgves35wrIskx1pW
qp4PLjULRMGFxWQMup5Zs9.iL8gK62NmJliRTLQaQ7wyHPsEJKC4VNEAXSbj
i7iP4LBDUMcbLBymt5d2SRTVHKsDU9kGnS1Q2iTsLAIWnMIjcxTP5Q0j3AgH
65o7qytNHryDoRa+j0TVGpcTKcTwJed9VWhPo2uWcBY778au0udYxHaC5v7G
46tk0MdoBBhhC.OlU4Fqhgf4M+afRQKSXFsAwVLVNyjOoC4qR6h6qDpRxYL6
KM2cebUU43EHroUMAtK8NIowjJy6y1MZQ14wq6NOpGHbcfWFG2rWRA4.PQvL
.gCfO0oh2p8nNxUjkmP51PfEMCFDntz2MsbR8DV5n4T2VjU44bx1Ue88ljcH
7tDqQ9XrB6TVQCegkL4h.Jdz8kc1TtYrLxdD0NG24cjcTv4oyN1ECbHTIyIm
U2tie4Rzibh0B2p34kR8aosH2SSOZ8.iROOR23I9g47gDBlzHciqvb.HWWxV
eMLjqGA.uXB1eNzZbdLximH7+nYP14z5qaeMoWdkqd0Fap0ZkC8GudPaRYQq
wDliT6rCqfUQIjtgIHjtKGqZ6DYHYx4e37jxjLVvFRUjQ0n8H4xyyW0Oege1
IjF+7.y7EklVaF4DHu10m0k1PYc4zotQ6QqeYF04FatMcegXm.XWquGn4cfd
t9GRmLmhrXY4SeaV4NxcIQnmsy2cLKHWq68fsabsVyrxsy8onT31GFJf7PY7
JDh2wxkDTDGevs6lwLixIkdQKOEEiTIk3dzGKFgjcjZFY1b.PzWgjm.mG1LP
grPtrBbXvtZ2gvs0HUwyC3NHeE6u3FBgPBvJURiQozz6NS5nNXSa54mEPaPM
tZ0t6noKxSasBOCRJfWcpT1Tm7k94r2OHeerkHktQYzNP85zVNO4TVPs1lCL
.54ylgxJfFSiramr6FaSZyu8PQNUMqJBgt9Fiifm7S+HqMAe6JDF385GBBjH
md1aJZU7xV6vjK9WEuPElweblGI8gqWj4PlTWI8vUpU.oP8hOsaBhnr7LxMN
JFEBcN+zTpHJvPCWFx8g9A9UHqE5oxC2BlvyJZJOkXRu3MzCc98DjlsIObW8
.4J4fuAPEgkNEhdB1PES1Ixmy1gTyuo0T2UZQpKyg6iOq2Djvb3ltVk6AyLx
XIo8GD0Nl6GcRyb03HRrdNvYVED0VXCKSa30BhcFBRmNhTkdZU5iSoI4TH+U
XDhrpKrrZCh4.8vw45WQt7XdD4TijJAGxAjlMRhWZXFt1JdU0CIbMlPNjncZ
KXykUP1mnALrucx0K9bRWU25V0t6tbC054IQS4M7NX2hzUb.I9UhLIyGrsoJ
RjB4wsFnnMx0nzMhpglJFoGZWo9n8yurvX7zUUN5It5Nft5MGtgvQ0Cra8fd
uZoS2AWNiLEiRvJF88curQKC4kiJ2sP4ph47M2AHRO+HWdzpbLxPkpOhIZDh
OZoQJmtRW8T5KqRj1uMTv9PqrX78lhxJsX2CYWqH2VZk4J5Xe3.WGf.4DXwE
PJkfUAL2jadxTtMAWTj81xpbW7Dhw+vJrVdrEGfOfjblS2YGDPKQ1Bj96Xz0
OM2LWLAsL6razNRRLoT2ItoTpU9.wx9wHt1N.rvXHzIH4WUMpLMKcqrrGNDo
jWXVepbomgXey05.JIxKlQ5W8oDp7bcEZku6dymFwfNEvt4.A7gEDgbVgX1v
XUm0ZTdoKUIEsLWyrABMvyfx.jajjXfRtgz2.DmabLnB3PVshQNiRbyi2QGc
a1o2Oe0FjvDiEMZ06J6AvmbGP1FlujrzLGtToMN+QS2bWCMF961sKBzlr3hw
idjYINso72nRRnJ6ldVZ25GHz0tPXiRvftHGM9LvDFcPfJv.BDFsi7voI1i8
CVYLDsZ+zVIOB5TaFPzuGhZmdcCDVp4nk1a44TX+1qPx7ro761TX0zJtjX6G
ItDbgACD2tPRhTeVOBcY0OnCPlFFqUxTlVTF46xvWsxXBRCvb2cRm4OFXn11
YH0BfYOLD0nMaMIBoS+gyfXa7cju3J1lYaY2M9AFBzTjoncOF3sYGeXF8ca5
XRRbHfvwE375nwp93Hoo54LwKSkvnyeQ+BDzn33kMNUOPhxYV5iDoXR2b2jP
r1npm+14E1GZjOcUrBYIVaxtpk56rSZq8j2556bl2TqzXcKXWHkuzFYJFVfW
.JAWLVY15wyOuHZ5pQjUwVUi0uDoeIa4RkwHQec0S22ErEitZM.Abnlit1SL
JjcJc0pvTb.EZuWJtXwCq9yGOUI325IwPVkZ2t7Py5VzuWWOdlfLq+h.iL5i
sWpn6N5ZzR2TdOsuKieG4E46z9mPPdtrRoAAmMFAAHLTDX4nFHlNY99XF1Vj
KAHiYlDbpXoIL3GRRvFLF7BRdlZPtQ7Z6IcvxY50y4P3P52Zee65FtzkhbON
7nm3x9GWlsIdlbPXa6TQAlPjoOvrBXLaq.ykdgwi3GDtMvb5TRypn0J9DFZY
NmD5KQJyrsI5WTxwdWS6f33qjM9yRQ.KNiluwyynQxXYrwKsOFd1qHWIBIQ6
iHCL8PXcU.ShaHRpoNmi0ZfbiP5F8EBEkIWOJUB9kHDvHPuWX7fJx+MvISGd
0d9Ib8GQXb4RS7DuUSu+T4tPRoVO+EZ6OLxRiYZ4ns2OxVWsn6Rc0Tyf34mV
fTE6vftgr523zYrLCCusdtl8slaryCFOErVsmG4JwYMEapBa.poL+jvkLmdn
BQNU2ovppFgfclgyXxMgQEUQ4VGjNr01Ltxa1467OtPMssZQ1EewZsYil0Nd
oPy1.DVjYbW1Yy+.BaJY3cjBLCChnYq1mt31fA54YJFjL3HGWVYYM5KGPZ2v
MztigrXerjew0HdQhUtkd9koM7mz.9ucSrlrVdZCI+EKtK8LB91DMTjSkpcq
JPH5lNu737RDvtSRHCjU1itVUtMa4g6ISPL7jz71LG8k1eLY00h6yIIQ9KwC
9.defGP+NgG41zn16m1mjBARdlQ1HxY3n0uH.rDMTjpuxXbgokgqtdWCBXJc
xB2QV7iPfwXtdwX+5xQV1GVgbXXKh.frBOEhw5bgVU5MbEmVrAyrsBw6ntGr
FcGcSbHcKUN.wwsw6.AcRr+HGsoqtrwtLdaaDximTpEY5zYmbi10ilhtRGue
75FL36BcgLzpywUHjoSNRFse+xSZsL5y8758DzP3E3Q3b0RL3sC8P5dCHijQ
XrX84MsSV5wzIUs5pJR0wVBGG.5U+wj6dq55lO2YlUYHBsJMMYFnih4P1wK9
Q6z7nq5I0RBOXe9BkrZdaCK0zEkStNvexaqs0djmkYoo1mPJMmV38Xt1J0o1
SxWzvFua3118IWnQ9Ekf7M4wReH.ofAJzxrExwPxjIR87qitnNy8TvFWlNgJ
M9r1UIBs8mW3Zo456lDsUy7PByZkZghCiIAHXd7Mq7dLRakkY1zsapCzyFAo
Vh65xZyknkZbZXfX1frLvgr2GYvOLsIU1rjfUWaryIu67yu5eXio6nM1SJtH
4bwvRoZ090R0dLVsJjYHW5CMDh1sfwBgVOchI2N4KP3z2x.5B5.3QIbKpTa4
JuPQ4J06xbskgumrSl61EpHZ2CcVhozitWzbm0JXe59cFVh9xqBukVQX6LE4
GGyti.nmNzntkwFhfCjLhqq7IqVoNNlQd1RwsstBTLcKjVqhTaUZFs0dJcVO
gzPotNxzKMxkHvSl.9ax4d2k8h7QtE3al2PU2DciOOXQ9HvyArJhde4kHvuY
NoHmMUmMub5Z9QZ2GiPAw6H5LyqYoKyZoJZjlQDxB9AlCgxHAaLTGGjUKGbH
cLhHnVuh9wbD9NHUM8iV0MRgmgaYM.GZrrH2xztkts8gTthEttHulNZVTEnJ
paOOInMSe0dSoP6PI6vS1LlBiuCNXV1ZZScEfbgfI6FCJGSkjatu3Vlfqw4Q
5jhKkUIFCgpW4Acrx7wMcpMmGVbqRd9sXDy3Pd3Zepx4tSaYk7SFMm+1g6qB
tm5yYWZOYFso7iQx7j2OVVS6DrBVTc.bxNJINJFaHTmI6bc2fTED5uDrEldS
49dDJXBFCegcaPtnCh6iA09SI6F5RtX3Ub0+pfdiQh0Z2SD0HkRTEmGJ2+fU
1kw55ilHEs1EYH+NQlotk+3v41l37.5GAwGHnB8ArP2V2bjR+TbyMavqd+Sw
6NMNB4eSGXaIVacdtDUXwEHHYjlAhJLQOFoHboeenqa6nyTlxZGtQgjlpXVa
i9Dxfd04Eki1YWd+NamPCRWbddXKfwrgPfPdSu5AcdDlajArccLpXVGjQyQg
qmBdgYgCww9syupHs3fJBAzopDecczRw4rP4V2oH+xty2doWZicFRRXZKnBy
DI+tVscQptVfpty5cSxefnyY.TbG2kdtr8ghSmxrSNuc7lhK.zcAVvmx3QHs
wQfXPB3SCIgrDFxeBxkJYEe5XO+zXOojqmH4PVE8Fpk40aZQfsNpt0dxMDmq
WhPB04EH+1JsN6+vK3Q1sCf23fsYjn30Cifzy.gYYUzJtDN8vzYSvjFVHQUr
3UZGv2c1kxwsjXWNfz3RlIi7V7DgdfE8P9TmLy9oIGlcspnXH7DMEybIBIjE
jS5ODlKcNGoMMBlxifnjEPUFDcf+ZvbbZRiPn.Bt0QPRobNZmxbJvoHkCHni
jvvSLA401CEj1gj4GauQVPDsiezTjnR4nU8dNA1ggLyWdZaXX8J+QUMgZlZ.
P0IXtRH6NZp6WOJCh60LDtist2UX63msMFhW3TRbDaiAmGim3mMIBjf0dH6V
0yPNKMpc9x02YM8Nw5f7ty+v0URTt5h2ONoq1V5Z+zaH1x0E4oKvAWDo88vX
gE2UMQruYrPHV613d0J0Yexw8XPvPf9ljRG3qtxsJzrWnfRsMhJG4tnvoQzF
hltGxWIcch5BEDnMSvUyvoZrjSy1pqrxk8R2kLdLPOaw3C5qXGYNSjmxa3f3
zE6mkuieKxRm3xxcx24ORbUhstAoasrX7L5yycID16USEiCYJ32aVExYrp6y
iK1M+59sqP2pRmPj+mNPHYwPNgi2OTNm7QX.0nSBKNWIT2FSs3xEeUdcYegz
o6uK65tKXWafTLBc2xpKWqTv0EvUDjJXo0pEjsEvghNFxmJNpJQxHai.uhxt
I2SXzUOPC1n0WU5U1zrHvlXsvvwYW6SrporWBp5rAMu2MXN4UETjOOY6sSau
T7rm7PDjhgn9JoxRifsTVhPTeuwcv8DGKk2BAdjZBJAl1PLUfpJk57MN2.MP
UZlXK8ANyQy2dEBdC5VsZjFAKxZGZwcMhfYFiTrMR2Xnz9VOkqeZj2orSHyR
ySNL2DwoyvWGrTmC4ibZkIwTuJpX1KWlYsEgDGWECigbnOB45FyXDCojBxpg
9QGxt5VphrGM4NmohdL2aq2BO53kkaW3F4.QyGgGYbIRzQy7wCQcHkCkpOJ4
75OEu8xh4P.Fgzpni79w.qtb.NaGYVQay88cI8zc477AFM8Sa6SC7Pn+0QWD
NSGHOlYkBIXlBn.gLRjqRUx3sw+N5VizxuSzJj5PDQWHq4YF45Pj1lFpmSkB
oCwTxw1DtkOlrPp6F+NmqUjyQqmmAGb.+YAMVmwD5mE0CCu6eKSkYt9lBMD6
xBZjejygXEsBYU.JXfEmDnqGjmmS7nu71djLABwE51SgrXXBEAgHR.kPWWv0
z6YVrfFcUy5Yl4y2RofDB5gPSgUpGbigye8JtKStO+1o3U6a4OJuZtfr7deC
gdpIkHlOcjsnovOAuM6WXibFEAeIbYpVn2M6gahJ4GQxhsrKIt2pfCjIN.KP
.Gx.OYSaNbYo2Ji4BHRbEWyk9VjrXV1C+mwe.tyMUJQrvtvZo69kxgilskBX
xf7PC1tIskueXENMEfUIH4DqscuphIEyqcE0jSk4oBEtkYpzzJwH6kbP9Znq
Nhs7HjLKbtOLZSardzNC8.CkSwwigR9d2g3cjfdNnhPRb9XiIfLJZ7wpjwwf
.YbaDoCeQeNQul0YxQwqnTJpoO1C4qnGREVODu7MPnoh1cakm097KV07xpwy
rtjllRxVNUF8LaoAQLgXxJzS1Br5IHBLXKKyga3FzMG7h7Lx4s0GyupgjK3U
f.n2AC0lHU6YArSkifzHhXNWsMiYr+73Yulu4CTHBs1Jvu7dKxkRMbgeM25x
NEth0mmO6CuWkPIttIahqxaihQtH7yuKzPNWU4U83kdMd7MohGedum34p3S.
28Crx+KeAOx82W8NdNuxOzqt3iS62vxf7iUAovGqBRNRQJZYIAQdNYAAzO+1
TSjPYp+JJJRdZ9WQQQxBEE45QOWTjqOTlct9WqnH8ms4mKJxaS82aEPnQRvs
x89E0sjwyqZ8u3OQYQrh8JwIciuG6XrMuZl0h30RY02rOZYunY6XaU9QaUOt
bQ8oi6xWWr.ofac9wMJWutazDjRvsNyqlLerh8k0oyevKIwDttcBCxzffdzU
EVCNtGb52tvgfpcIxkKpsMrs8gO4r3+I+tvN9tORvfYIONZtwSNcdhxcG.w7
DHcy7ox8KsrrdNYOPJV55q7XVYODaqbz9wQsPway3Wk.H6luEYqQkbFaNBgS
.ttIXSknWHffadAg2bFjZlNCo5IaTTsfTUZTQdCBpd3N0Olojn33syXz.PuQ
Q1JanNA4tXmSzAbLysJOeCWOZ37ZL6.Cjg6YEYwKb5T2r2XJR+9xfKS41Ldt
XORAZLfMXllL6P9N.2m4XNdDjt4ygHT3lAWSKDo+MPgSNYNRqO5q3kA8KO5N
aXmzdSKGqhZH2kZnkLKgbzXsU4vod0sqGfx8Chf9rptLnJrTryn.erw235VH
DASsQt.Jcr0d1nsvXrSwqpW6NsXmo3jk.J2IMP4UhyhYjBBIV1L5NM5yjjPI
LrCWcpqaDAyiKgZEwbRMb980dLw.phoaY2ivnEyhq8PjSYiTr2IBbOye9LEP
lX1CkCV85w4GWO4XWs38zyyhKrDmGd+1rJ2G1NQVGukdee5X7Ew7vSxt8Zdj
MNoTwHO5WncZihe6TD2.TAKVyhrQPpLrwPtPzl8F5dL0sSPdZ39H8NTqlicq
f7tkf7xrMLPI7b1QGc13Ya46NuLdV9DXpeY0awgdouSfA+F6oaBmD8XlFWb0
gnQx+L+XH77rHF+wJa1SwfSA27Tm3Xkc5aroT2PsMlCcljt2VO6d.DYRn1WV
OSAmpctSLxxJaTbmWWT2QH3c+H9hV4ndfQanfd6jRdvb7QsR5wUEKiKn5Vzz
n5VcboA76YBycsnrOa4iXSFa2SUSV9oKaqVlUMv9PFnr956As5een+8gd6jx
9ouq5fzcn.4u15h8w74HCEMf6Z6DGLk1sD7oLZMR8AH9LEYB3BRqB1TCDkOW
.sqBX7vIwvdCxF4EbpBzEAIooP4QEqgTLps8709c3hqCFodziUwHkGfUr6yP
Z+uIAIhCzIuVgoALxDAgC41t5Aezoxr9YA6ygDxpHvLSAOLgeJkMUhDFk0a1
L+xtwQji6oVdeqkkpQ9biQPpR5Z7ElQ6jXInDpeKyamnwFantlFyz3OA8+OG
mJvQiyfcjHvOWb8QAQ9c.4GnNNYxfZFkPw9IlAhmgvKtGoOMFmv47k9yYQt5
Mzuhdid2nUqww19haJNVnt3KC4hY2Th471jgIIiPO8Gv2.Hc5IPQYWQS0XCV
7trQy87vNS+ApFZKbcnEg7KU497PYQ3SjVVTq0Xtt7.tprfJXXD5m2zvQgBW
vd6bFu64h8K+x1wyurdrH2n3l4cLchDPoFza0xa0CkHcOxKYwoc3Jy.xKb+Y
sgyq4yusBRAGx.3wQ60lTLDF7noBpJpDnfRvY9D7AKJ2TJOYpzlv8O+nxlXF
HKNZi0DQiEjHCuEqQtoeRARwqy98aTi1XTrIZpPef9Em34HS16oleYKgoDOk
miGylU22zAtJNGYSRK35ANqNnbB1.QsBvwDFDkMKKPxaM3iKtlAwUNPoiZ4y
Se.IxHj2zmFwjDwTYYmabs2KcwCbohshteUGCumTcG3erNOxh7JvF6ZI9ady
VrsfQNEpVuExPD8VFHcf.4Ip.c+C4JykGADAJSNt2xJBwPlbjxx51hADABs9
.UL3YfC5LNhQPL6DgNiHIkpJ0pUhCAtQQ.L4dhoCVCTAtcUhhPp1wIG2mLFW
tIKVrHRYct4IbIyEIJbbovHoaLE63YVU6EJQXPRBzhfro7QqgHegysdWChKp
ChDjBjq7IzUtIibTx2gVyViy0hM2hCys6WX+bWwrVy8xHkwa5VqT2oUudY8h
pF2a2cnp4W9nQGpYQbvFAvimww2EPucFsvkx6adXyEqhCRT6rg1JwY9R24rP
AqLARKWFTd9QJayKJz1NCAJMwlx9HQiUhGM0iJOSnjS6hlLPHyDhaiAQcyGO
vETvHYtfKYdYA65nrZtao.wiE2XHZ3aMN3.VRSHGuraahLogTjKStYdepgGN
UGHcVerD7NOU7LEuY5lAohhCJm3PxX3Xlzweffueoz1VksFT6mTdX2lhV6T0
TWqqGNZU6d5ziUsx8TgtGSJyxNC0HJTVqhia6VddWv8c2KZlMlZx3Fjtqyr3
RuvApBCGDLa6rbi57HpcyqC7xMctyNnNpYy5cT42WVldLaC+jxJd5bDTEumK
vRDktAGvQjFzBlxUDAVm.gRVivGLJPcJLAzQY3jk.XtkFFSlReaY8CO6qG3K
61Fd0VSvK0UHe6ilSjJhSpp0hVS5QWEAElSBTuAQ.EcLDJK1aO1THWwOL5.Z
POrAWbAvSxT3etcNZBuv0KxEICL2VJMZSpk5U4EWzs6SkOWU3kvYXScsurDo
daMDkvNwaDhaP70sEbgcIYBQV27K.nnw.nTx8GyuFC4kwieXxDj9dpfQWs8K
jGOafR3ZetnK0vBi.AGaxTD90iPbn6n3TucelUnsO8hlUbyMmiCSVGVdDIFD
zUjOjFmoIIMrknsz7LhPbPqT6QwxcDsdUi0qKYLdD6XgjcsJOpBUCiJDXVeC
tIg6klAgFKFmw.jmTHNdUHLYRzE9JHYKuMP0hVsVCJ.DGGjOVELz0bYqbC2h
TCfDKVJGyBP1w0o4nI0Hw1nYDs0HOqpL8hQb8HUESB3ztYm2WzLLlSurv3Ae
Oxp65RsoGHtFFs7zHPFMAB+0CS60C00vSzRHQOKkSa47FuxFZ9kdr4RHlaMW
Cjnvx6f1d13ChwilVB5TbfSLqGA2mgtMsdE2dUSfxg6HInHXFKGE.UEQjdcW
lQswCZOjVJ1fDIjmZ6lnzwWTR1rwjY3fUl8CdpimBAUvmDnMf3NVJE1cs3AT
ueKWDBw+ZVpSS+l6RPbYOiqhZjoFBOdarsxE3Ac9vBjqbif5pjYy3ZxhD0SH
EDKfU0bVFQOYCbYgRVmoVOiseyxDn18W4dhaclo3HxnSm31F1VUUb6.YDg6d
8sQo1pjEDzalojgVltx5iXOFg.8Krlkt1itcIO8cj6Yc6gLPbZVxyEvETWqk
dEdf2Q8lrSEmfKW+IqRAc8PUfg6zn1DCgy75iNf3ru8bEsGB2fjmK1bn51lf
z76d77U2kaF8XbGHr7PNumDIxr7nEmK8djWGL1Gucvxx3RRjj1jdkwi.lakE
sh26QnLpdtVPA+ccYU883tIuiHegIyCoSQ5zdDzsFPONVP2Ru.gjZDjlnHeO
bQ0HjUOjsZCwFZjh95ryiW7b4p0A0OCT6fNPiaEUmlQ1zuueHKb95LeNDemm
enqkkq1D1pEqeTHG6ZaVWUbvkmQFiMAuXBv6v5Fv0SlHgD56dy0zC05fZDja
iZijgV+Bwfh7xdJMxXjtVGo1ZkPeJHlCJfcskWXBkfFxHBmqtvoDTIaIV1Q.
WpB3.uV3.BKAz0c.tMmE6bWfSEUZiDu2dyNiwECGG2hV3Xpj1m0KEm0KGqlq
w5YmHZPSTmQcl.BiO38KTZV6.3Nfu+QPmd.N5OE2+jAYcQMWgJMb9FnKP6fh
RE83Cs9E1L5ZvNugDkEtKyfTmRBkf94DDCpoC1K78IhWGmru8zLbugxd.RyM
tvdfY.IKh9VpqsFIwedIhcoZQmdysoTlVqRjXtWHG3dh+hVqudiVCYUPetlW
UeLT1OmgzgLF.S.5ghvQNGgha9oahQtEA3pR3JfAaCtfqglGgjDGoAMDnXiS
7C4cratwfCSBTsWSlOT.FVw0YHkS3N640Rr7fuwwPk9DgK6N19jamSXxznlg
aqNWypAlxYISKqio2yUcTWxJXjRPm1Yto9yio4oWrcT3waftnwq7cfmXbdIw
0ZGjte5GK4ssQ3IatCgTvrxUPaCtlWGA9BXboF2WhsLLBBQvQTOUAflqZnpW
M.cR5wpB4q2OuDcumAoQq2l9t8X6b0NJy8c3dX0c8k917.8.4hGAmFJjO5hL
na3s3BY2vh1pisFGotmQxxOhhWH41g1fMPiUfCIlHa+jIsEIdPC5FCJ+sRDE
EQDgr8PPGbPJLfd27LtYGOSHgy8Ctbk5Vxf.bLiP7wTnxVoxpKVuPXxcnk8J
bFPX.w8TSjdCT8I6SuuGmx.CIdjYNEDtB9aqxjoP9dcztklkub3dQvQ0b4Ct
1r2bsHxItC45YQQV7XtvkjLrDTdyl3NaK2i98Toy5U1oPjENXNFXbGCMnBwJ
4GL37tEKhV+Oe6vlMivvLCAjrrSIRH5ippwUGNTXy4ZDTm1xrrXB.hQ.p1EG
.qAD+jnSt8SCEcfFOLCWpm9HTGGGZmZpujc6RxMHOFBpIUqWdfvI0ntIiRLH
Yo43DqGp04WNpqrKzTd.Bg1ykBL3sSCx5r2R1kYk4i6PK.INPdlwkQLx9ETL
AfDTjXP2bjmbOW9ykhGMx8JhgPAhOyH0iiNIIo6f.Ujl2leffYXvl5vxDKUW
cmdGmDWh.JeyUGsBqzKYNn0pmbyTF4iR0TntCmh6gfUx8lA086VNHQBIyBXx
voMpMYk5c13kqthK8YLngS.lXs6BifSXIjELY+XhSVK2dniBb1U2.gJaT3tJ
WqTkZYW0ZRiGoEoViLss3tZsiaWniJotDuCUvI.9PORrOUlMZpYPG3I0P88I
OFGr83J0ziwjUPeOWTIS0F.dboRekB38vVhT1NK5X8BgqMWmzCsIzD21YE2P
baiKOXp4kVGvKvcktszPciThqcXKxVxx5Plpbyi1p17dqZcK2fPiHduJe0Ql
FNSC99joPOb0WHkTqnNG26XXGJPLuSmcoW.6xDnqrlWRMeI6Q.kZp1Xz5gLu
i8DVCOACsT0ZMJODJ5wOFVkG5o6sHhmPvidqeWUpfmN4NBNJhnDJVBMFnWb1
GnPsu5ly8jtf959.+qdMbAdDS2fLRq2fdl5PfFHwcadOzuK70RgHI2sL6Uag
ZLUo8TcxXEnRlhkn3ocKRRMLV+HcaNxLGx3Fqt2oR99qtVObUkBGKkySuUuW
44FgAflhaz56920FLY3VcPDZXECjkWHonIhOLINVeMLY.gaQZyidDBSg8Ciu
Tzj3Y0coG4bDx5j4QI0GUZcd5N5a2ILvNXajzKQOyhYmg6YUxNnQjuAJTXPz
y.nLL6Wqce8X2JrWCPHvOdsaIvvu5Da28Nv0rhUHR30iD6KGqkryZnJW+nHe
dHeLxK2P2S84nEEAiURasrnlok5QObKmeUJL47GxUNBssxEGvW2HcavrGTBH
3L3BMK9jlakHrOFXaH39xFI2UWnU6OY6A0CPLU5uubGhkEJBmBqs4DI7Izdh
FH4jYVirGJzP3smluFYmn001BgPq8HmQImrc8A6QjfeVsOjUH8MudLdQ0vIj
dE6d7tz.BWoeW+Q.ctr.BewJDqsxd3JrVT0MdCjO7tksf69gLsBLpPKKRkYE
L2ezAbDui7yJ1jX3Q2AN3DyuejgPh7NJir6r02bKoklUqOW2y22s5lqlPIxe
i3iU7KKoWVRR5iqlU97wHpL38OfWsCWjWc8.GBNQuGgxfpigD.Z4eE3FVKqa
XCw0.GHE6j.hc7iaB.bLFnmrwmjtduCy6brsJ11ZGRKvEWijCBJmoJIJJ1cE
4yotZcPTtIKkNDsF1MAWllqIvMtnYN.OcGwfoAnCdWW+9866v9uNQZs4dGDh
RKa2bQv+.s6NPiUf6qLJGKefzfqRBfEZX4CnIQwYEpZ67Gx7yJ426e0Z5C95
Ey1srquf7dwtyWk6MzhKnLAvcG4BrFPF4vk9U6yOR4PbM.LqocZPe.bxd00A
bMRcEhXh.xGJb0mCUiSk1bwsHBBjpjIAUSE50MDgHzMEpTkpEHB0Z1G2Z6.e
gRWj0GrJWM0wdcZO47jkIiJKpVdzn3.AcoQJMM+8qK2MoAB9A3+9TLDFC1GZ
68MZgZiCCmQ8tCNFXszkRG2HwKCF81L.5sNCnvUMo1IsG2HDL8SZuzHUjgXb
1Cj3j0ByBJ1.sWQ20kGhTqxkjxcFrGgvsOc.Aru1JbcpLBjA8FiwRIdh7tmD
pVb4Qwh1gvNucsX.yPCX.l8tqtagUMD6q4Zhmmhb.gB8f3A8DqU8pX9TDvtL
rjvFjSbtcAI38sCjPQ+ty.p3EaWVOTDRb8JNcXcP4J7XCBn8AmC1mIG0Akco
dc7xjvIRYEZxSkOVxWe0kIXC+M9ItCMgtz025WT.ttqkXcEont6ATzmcA5yP
FDmhiYlFiAsh6UnLzV.JA7m0FT.tT4.BG.XipiSYG.yOWGuH675fVNbUVBKB
vtDRaBxD2fUuJ4YjhDKbxbfxtWCjsVdw+PIBVNTcwG5LmKve69U2x6mjhlPF
cP5pLh70JoUJd2gZ2QK17Pg3g.SjZNWs7EPiQCcI2LlvQMAWswVkv6PKcrQN
Gh0SVdnQAmMTnoHFMcYjxVRXfmvrnbZIrMdjKB4LUEWdHSVQCMXxJ.NmrepP
25skriIy.9mEP7.vENaT0AMKqVYFYCXqbXjvnqxV6ZsjjuWEbRE8XEu+AqAc
4hGGmYRpan7vI6ZewiAyq8.ts0iiqQLqGQB.KvHKN.84FU3pnKlGEF0iK7uS
5ppphnUUBWHrwAKIBEMPtD6plDdSuA5UUbu5ILCITWO5.Iz1thjKfZzdJDHJ
MHbmQmpNP..LGQHtH3woYGWcbzQduEs80Op5q3eLj45k3ZcM2O7.QwEy0mIw
.s1aGJ1O0D.qNEfWqA6DGiIrkiJrwJdQt2GB.g4akKSf9h4jGA+M0pypJzLz
1DUgzlSBghYlgN5.07fdIbXIPJMH5Q.McFAouaLTyzYP.fwsMMfHJWsH2JJV
dRnwQ8ffDCejjtyohXdBdiGNWsztok2qUWZzXsKD4CEN8wJM7VsKPZBgtKtC
5qTr860f2PE8xoVQYBV6uwoxZgD6vQqF2D1f86vSHFmY3nNhCwN4doIMCs97
LdmOpqs2kNvcufXp58byyOpNunlHPVRvrhh5pcVFT.kPQCg0.g36mgcG.Dr0
wEFjotwNpk6uInxAqzagjgqAaQHDSetkrfFdBRIP3tomPydmSB5ZZtVcH1kx
AZsjQGN5U1eU7be8NhZDfhgqqgsUnNrlaHfs7qmxSdD3N8atsb98EaQJo02h
sURRh69GHpUXHpSfnQqWUua4rtJjE2PNaIAzTMNUZWIsW7wjbSmGNHVXapT4
xaP6AMd9ERbLhwU2Fxc88Rao3F2L.3OygxJdlLMBdrAxB48wBqW5Mf9iiWNb
n+BDlW0C7ls8KZ0sGgvYE3Z+fWBA1FhbTPICe8ZnCS4FFmyWegWB4nDt17P7
RUj3dOA6m8nIHPbOPvrJrDnLeXqorwq0DA2wSTjjI6n94tI05BsH3HVpvdky
BjuhoJSpy3oJdXiTAsFYzNIF1Qg.x2XH3cjREGjFizioGQ4s77ZB48JrZVqb
olxMMAIfSGrcOAxT6LjCA5BLFdQkHeo2MzoQutpSsY8.qFii1wMTkV2VApK.
mUV.odY8y0cHn.5LviRppds6nc3EjgiTC0sI6LFXupVKQmQunjwgnc3v0qzz
GfFrDBYAT5Ad7GnqUrB2IkRbS.W1D3R5DR0QdKGSEUm5YJqStzW8rcrtvqlZ
IwskfEpTZ.QzrVw6SP7m1yZXiKCd7vEoPm2ncNNKdcSBVqS2uxFQA5OCNjSb
9Ppb2MOZjEP49Ahc0W2DYsKZn37RIg9M0qKw69O3RU0tTVsY9FXCmgxSAGya
P1yY6tiawd5hqV3NDbgQSVP1zGQnYrw65iIJxKpNDhP5dd4iBxGUjqNzbZDj
PKbKYf3XK8JLijUrNb.grRWY1ZRb+vA99ngKJOrgdmPU5RU1LAdGWr.itm2v
zLW5oalkra2.R8xZj2tDTD7gp3c5Iv3Va.yicH+XnVFNIBYyi0SNscDtyDYY
jDj8wsm8HB5I2cLqIiE2qZXmaQMe1iptEHMyPP+QNoNc.17kv6kEqnxW0axD
o3FyS0lCAZKFZHqy3dVblxXrQR71wkPHx+qo4Amco1qkr2rcP6ABWAn2k8l3
N44O6bM3u0o5iatnVvPnAgTbNz0b53PdbGoTFW6g.Rfwqj5ypCZz0V6RaZTd
eI7HxzFhKqRzOwMnIn2HFxiHsRPb7XYsKDSYZ7WBo+RC1ulLw6A.PHcwQugy
4.xSP2kOVQO3Qe7AjQNtGHmZSsfhGEpI0ccszHXk1Jp9hFy4yP1xAmnwkKo8
8s1iglUSETLhT3xtFJWeHCw59iJ0xyUJLZnm5NsNWcEtmPhaYWh6N+wBz0SP
++iaKmUbLt0sWAZGEH+Pvd1.xgn4UHGQVf2bQfP5hEGQCObgI.VKfcljT4df
wdgrKEHOoG2Ht.v2f00fqDT71Y0FXCE4LBpmipsh+xys4yW.9fSdHbQDDYgm
ai.Vv2xwPj+v3TmBVQfc6rwvFfB5AXJDTDbvWf3TShaqYnj8w4dJC1sofxTF
wJFM0957WcwcUHKSLZnMWY8twxh1avUC5k8aVs4R43Qom+GqZP+h6kr0YdE0
w4M+OO8e8oc85mjeoJbT3uisD1uvlcszy6pnre7sB5yux.Yn+R6Vi+qvFz5u
BMrnJrHLK3oerOD1TkqeABGizG96equ7Wmv8w2PAxLuB51aZsC2VG9D5QsN7
G5iCCSgs14g77aOkj8inQ9k1DPo9t95mU9izKQN3E6.szyuZ2X+BuT2dWesX
Dj2htq+feZh+Uf1ki3avEcceRVPd+K8Zui+eIne7ej9w9sg98U23qKRya9ka
u0ebGv9O9zO9YaA1J+J610rufDp3eGRnecUaehh8oe6e0UscKrt1KJ7ugj+i
04sU9g+H8Od+wvSznuodI0ae4207uZ0aB+ztN8ya5zzeq0u87rE1JoAoRhi+
PPB7zABJuYaZzLeeEoEXdVHF+1sQj+q7Ntg46gZx+pUA2edU3SGC2jJ0OpaB
uAukz+ye.oL8bE5Y7O+A32IbfSLGclUOMybDRUad5Kusey8UWAE+aWAok+tt
Bx97aQc4meipK9o0w+EdEz40sB9Suo6edU7Gbe6VEoegWQDzBeWWFoe9sM0y
KibLvm+dsL95z9Sg9l9Ez9Sy+Fo8+Y09Ru2J+esy1W1VGM6ayrkk+ayr8WAK
USbU6KM6XdabTg8iu2HXeFws3220RZf28klszuMqkLreWWKSy8BN48ycW2mM
CkeaVNYnD+rkSdtu9DD+771Gohtjvdj4feAz+OtTilLmP+IZjK.e7H++AsiX
cSkWRVyO5mT42l587Ij58.520ZzrLMD86O6+0OBJVQngnf++mOJ9keE7ZMh9
WwcB9+V59eO96y90o6O+J.g94N57K+Fw6Suxt9tGrD7xw+yK4s.2WTp6W2ta
cRD9ghj5uWuxDDYetiheNtSbOST+U5nXpu9qdnmeen8SW8s7ecizR+C8hh+K
P8X+1S8X+8C0i4aN0iW92OTO5u8TO9e+P8n91S8n+cC0iV5aN0i62OVMnE+1
S898iUC5u8HVX+8iUC9u8DueyYz3qkvivLezfV8q7p9T4En5huIA25q8d87m
1lYXEkdg2j2zeueSd9qDtruOtDEND34+RRH+8DRouvBhvy4bh+mx4zmx7zaH
GYRz+yKFDv2r3F8YI.h6UDHkOtn+Kli3yF6hd8ym0mlx3AD+FV8WLweNbAe7
FhiZBZ17zOOnAg0H+++oX59m94Pk8zuFw80NRRxeqFI5WybR5sXJ8JFGw2fw
Q9az7AdEx+jzWafndqFIwu1HQ+VMRBesQh4sZj3+ZiD6a0Hw80FIt2pQh8qM
R7uUiDyWajDdqFI5u1HI9VMReUA22DIWgWgjK7ZN+yNoe5sqMy+7Cs3qYnEe
WFZgWyPK7tLz7ulgl+cYn4dMCM26xPy9ZFZ12kgl40LzLuKCM8qYnoeWFZpW
yPS8VOz+UZKd4g9SHF9mejDeMij3awHI7ZFIg2hQh+0LR7uEiD2qYj3dKFI1
WyHw9VLRLulQh4sXjneMiD8awHQ8ZFo+YACH9ZDbEdCDbEeMxsBuAxshuFwV
g2.wVwWiTqvafTq3qQnU3MPnU70HyJ7FHyJ9ZDYEdCDYEeMRrBuARrhuFAVg
2Jz6esQh+kMxS+9Csgl6can+pPaDd4gl58GKIs361rl40LqYdWl0zulgl9cY
n+Zp6Xnd2H3eMEfzRuaCsvqgfK7tPv4eMCM+2k0ZNgW18TpuAtmJ7xtmR89G
EDF1uarYLLuaC8WiMig9cankdMq0ReWVq4Dd4HdQ89OqYdWrWy7Z7eg4sHro
buFjALuEgMkQ3aVNo3+lMRreyFI5uUiDy+PIZ64ji5UTzEVU+wSFODe3l2kb
rHAtWY9vsjrm+Ub5Z+PUXWxmNeb+17AuJ+3jlP+l1pmqif6BOWmL3BjnJqM4
ixWnIGZHqadj9WmP1etDDZCRx2030zV+WLBy9XqIflTm8ZSa9kDhSQmSRS8y
Se9w6ySX+mRL7Gd9u9G+3g+oy8O8DEIiLGMsDhrPxRyJxHf+D5C77eFFuOdM
ze5h334joXfSkSfQjiG+IIFVdV3ST+UWFyOOVTzxOOBTxRTbO+IzgnQi0meY
dPgniCOo3OUuKP+LkWjW8okTzkJ+SmeaSdTkWPR3ykf9urpD9iejOBds6fI6
XZxGoo2PDzjOcMeNe2OsXn7LU+IZ5w4oAOsNGR4dxWZI4yKyh+DtPK9DO2az
ihAm9Wa7+z07m9XAs7D7v+YuFi9jT0eEyvu9BDEoD+KVHIuWyvWKk9a5Lk58
Xl9Cz+8NG+4o2qQ7+mDMdYoYVQANQ77lUhikFSK39qjH+GTP9USy+GR7+iR4
uPUr8m9L+Se+4U8tK9ZXV+2KUuMJjub5z+Vd4sQd4mkKjeyDKtVmlf.7b.PC
8kVm9r4Jtx19E+yazyxy0s23z1vurNVOeez.7Kn9rzvxLPyE9IzNxebk+s9A
bZUXX1e2OgTviDOK7E7IZAIDXr2zGNbQLOEYN8u6mMfPQg4c4kYn4wzQ5Om2
8u+GvmgpiqIS3Irt3i55wkt4+w+m+i+u.4EWXl
-----------end_max5_patcher-----------

Hi T,

Thank you for the patch, though I seem to have worked it out.

My original intention was to try and match the ACN (Y, Z, X etc.) convention throughout my patches to avoid confusion. This proved impossible, as x, y, z coordinate order seems universal.

Spat~'s coordinate convention matches that of the ICST objects. Both seem to be internally consistent. However, Spat~'s encoded channels seem to be 90 degrees different to ICST’s. Encoding with xyz messages, where x= rear/front, y= left/right and z= down/up, in Spat~ makes the two results identical. This is equivalent to a 90 degree clockwise rotation.

In ACN the names of the encoded channels do not use the Furse/Malham alphabetical convention, but the literature and common usage consistently describe the application of the alphabetical names to the ACN component channels.

When decoding in Spat~ using the same coordinate order it works, but the Y coordinate (or signal) needs to be inverted

Hi T,

Apologies for taking so long to get back to you.

I’ve been trying to work out how to make Spat~ work to encode and decode 3rd order ambisonics in line with Pro~Tools plug-ins from Blue Ripple, Dear Reality and Noise Makers.

It seems that they use an ACN channel order in line with the Wikipedia “Ambisonic data exchange formats” page.

I can’t find any relevant papers to back this component order up, and find the mathematical Y terms hard to compare, as they are formatted differently in different places.

Here’s Max patch comparing Spat~ with ICST encoding. This seems to be the only current alternative other than deriving the components from maths and driving a matrix. There is a difference between the coordinate navigation system and the meaning of the X,Y,Z etc ambisonic channels, which are defined differently.

Ciao,

Dave


----------begin_max5_patcher----------
9371.3oc6cs+aaib7+mS9qfvneudWOEYtu3iBTfbO5UTzjzbI2cM4xUXPKQa
ydxjBhRNOJZ9a+6xcIknjFZRaM6pGVAA1xjTb2OyL6ryt673+93Gcx4YeHN+
Dm+ry6bdzi9uO9QORcohK7nx+9QmbczGFLJJW8XmjF+9ry+OmzSeqoweXp5x
Sb96e2q+opKe9kCxFkMQ+dc6GF545GvYDlOUvC60wKQ5657uKeiICUMiroeB
0mU0NoytNIcT7TUWys7hWjkNMO4SwEWKre0UWpC41q1Op2LxWX1roUuQRs2X
Zz0p23IeyjjnQUc.8CO8iii0u5SNY9qZbzzAWkjd4YShGLUeWJiVzfLpP8Kt
p0CKZ9hux+6wOt3G81LFQtMYDTPFAAcFgaqLB.pMwKTSm8Uucl2FQtGjc80w
oSWid+MiGGMQdCmeX1j73m77nQWEcsyMwSxmk67Me2KbFbUTZZ7HmrICim37
kQ4NyxiG5b9GULpdNuJQ9DSFp+98b993nINuJNZTxzO5DkNz4EYI4wNOO52k
uRmjTmWNI6mxxFk6vjeI8KM55ySxyRSF3LdzrKeRRZ9WU0OGkjFOHaVppyRq
HVShykc4noIYomA9D04xL+akKCyof3GthBo.GgmRvmKn84gK9mfKjLIFxrme
34m.Ao.bgjmKYwHZpKxXvEDBgHAAhKsujx6QYUiOL.DHBHLvcQBC7P.YIOpZ
bOkZFDwAQDAKDIGjXdLv.w.EKLvBTCNLKFnfXfgEFHtVfOP.w.GILvBX0w.w
LX.TKEWfEFDTyKKEBBAOrf.0uFDLjh1.PHf0L3L47bBSCAePHf0L1TeKvE7.
g.VyXSWZrfgf.3D1BrlvlJGKPMtjD3TzBrlhl5ZA1.3LzBrlgl3qMe0n19AN
As.qInIBgELeEDBXM+LQue.lEBxkhBBBAxqDRCBCsRn+EHD7PdkPtysPx.P3
WAgfOxiFzPvPhRuEDBAnMZHv7P3MfPHDY0pFEB+CHH34h75dLJD.2aFOBxK6
wnP3YfP.6UPaTH7OAg.C4EtYTH.N0lGG48hwnP3GAgf.40dZTH7RPH3Yz83y
n.5Uf.xG4kwYTH7SfPH.6kwYTL7ZPLDh7FBXTH7KPPv2E4UhZTH7yfPff7NK
gBDZ7LpSylbcznjb0IeYmyHk4sudX0AgKouMHvqmS0RUCLwQWuc3Oh8U9SHq
e3p7GeldXzAD+gumxeXZUYBB0biXx2JbD1trWev8BKFAPb0qbJzHN8wqkM7m
AOUdjV4W.c8w1TlRfh6Zl4Feya+UKI+P1zQz.sd0mcIp6AdI6M1mPH.7Oogl
9btv0a90K7ELyno1dbS2CetoKSqBuz681HN10w44QWFutS9z24Ij9RfBoVgB
uXG5sB+6n4DtJ8lUSWIpNl84emhdJ1BR3KZV9FoH9JubRzvjXs+wQl2LWjLZ
jpoNqhBWJUC7DpeRPEkq7xmiWZuZ+3V+JsNYb8uQzroY0oCtyGJuzSkd4HEo
f5C+.imjMNahxTE0KQfoJu29kO4Mekkz5QC1Tsd7F5BrE+YgptsfdNd.egcF
3awpUYS9apopHvltWlwxzZfKWuMmZFdg0rRf5soLBzsR3dwV7n03JLlQVbwu
3.52JTQmIgjf4zvNuhCp5vx7CDK7U9hyLXNwq38eQz.86GUzB5hKTtEPaomn
aUzB5MLTlEPKqz9Uah14K06tExATpEnGThqgnGMYiux99lLwmXdS70aqd0d3
dzD+il3uaZh+8Z7iqwG+P70pJBCON9433mc3wOMMe72FkmLvQs40NJ469Nu4
KdaOmm8EOumyK+hezYRlbF53gN8cdaueo2O26G687dun2y58RmjzahmTbqYo
EQb3MQSRxlk6LHKcXRQmMumyukNIdjbB9ahcll4L8pXmL4OjOqCsuCq2W3vc
FDkGmeOCMQNvfdBRNA.iHVe+ZIB8A33KGhW6eDBuJNEMr4SKcJC2MCnHH4gG
9JSFCX79BZPXHohFDtwmCQmkQcdexzqzQGqSYz0NHKaxvjTonZtTRctrY+1o
ULHZERNzSoOVI3dZyJqEiRFVPoAZlZzb1j9N+8gxuUxfnQ5qKGP57ENLmnyy
jiUe+UwokC7c9KNgtcPfi.QE8L3PQ+xPFlGXMZJT3rQvBjDcP34wE1NlaIXI
sGJYI04SdhvB.QscH2RvZNfPhmlmPscD2RnH4HXAB.WBwv.hBBHjbKL+Pcr.
XVHP.g.RmjuOmVGBVL3aITj7gau.OaKVEBhGjbnaOFoQ7XwvxkPQx6tEZWdw
rHvGDAHMenfDTS2qECJWBEooC4BeyyC.mPmhjo97ROv0nH.bFbJVqhiKLOB.
m.mgzD3f9bqYsRDb9aFRyeSYgVvNWPDfUHXEniCNih.3XykvPZ9ae+ZPvhQl
Kgwwc4R5XK1hAlKgIvcffQCw62Bh.rVxp1qPLKBdCHB7MoxUihm+AHdBvcwQ
FEAPgnKAqLYR0ZiLJBfhPWBVoeB3UbaT7.EttDrhxR3k5YT7.N0W.xapiQQ.
Tn6RBcM4hUMJddIHdHlbeCMJddEHdn3tvOihfeBDALbW3mQQvqAQ.G2sOvnH
3W.Qf.2ktZTD7yfHvC2MgBEDzjCqlb4mcH8shKqRB8sTXtcObiaIgHUd6tDO
GZ2aiI1LGHd10mGO4yMP3aDmKQNCtU+yYIW5iLmddc1v3lciGZqTNIgZYewn
IRYOmStXTVzzaklFxWNr778YRJbnRhWvp1eei5NP0OtS2sDmLb+mSF.Ym6CM
NI008.fSxbOxIotj8eNouO+Hmj5RO.3jR6wevOOI0ks+yI87nGGSRc4G.bR2
iV7H4jh8eNoPbzhGImza+mSxCOZwijS5e.vI0mu6COd2Avt5TjmfePx6N.1G
mpXtX+h2Au61imDONNcnyo4YylLH9Txoe3iexNomAh6t6dc2kTVRYVKJzeKu
K2TxAv9vTDYhGsJgb.rOLTh3A4LajCfcdgHdXZQI4.XuVplU5PvpjbI9D8uJ
Kpeb5.IUdxmcdZR53YSycHNOUW+YYNOcXx0wo4IYoNru2R1rbGxGRtalQK9s
KTra9oNIkpKOxg54JVJ1ZyitId3YRps76bVzzoSRNe1Tc4B+QykhJd2SjCpl
FO4r3znyGsPBTKBhk6qTTtjc9qZgPcfLqtxhfA2I+i4Siu14KiJqIyi9nJMD
jK6cNQ45.j9q567aouHS9zCSt3hXUoa9M8bd6oi5477SeYuez4lnQyhUkd4p
rbv3rQxOM8i5HMuPJ+9lDCHAqKIiUk7Ez+lYbcRC1iTkwxLdVN51xjoLlExx
QJA4xLgtv8XVZ4XVZ4Nj+U5VZbwjYoEnX4k4iV4NwackDTg0q82r.j7O5PIe
bsxBDUX8R+MK.KGjVZoH.Gx50AbV.V4xdwxyKo7F.CCHJHfvJnObAB5CCCHB
Hf3XEGN9MCHKlwBXAH4N0dqTqvrfHWHHdvJrbX9MhGKlwBXAHEJdBHW8xr3w
GDOHEJdBJqQc1VLaFvvJro3Pt8iYwCnQBXEDUbHmewr3AzFArBhJFjKfXV7.
Zh.VAQEcEGgnT+lsqJ4LrBoJJmacqrAwCVAfef.Rdy90qbFVAbEXAVRX6ZWN
Kr64E+Z618FtZOccjhDXjrW+uBBSeiBS3gaFEluEDlAlkaBsAelEluADlglk
aBNYfQgITdZf65ZTXBuJRiBymCBShQgI7ZKMJLeFHLolkaBtIGFEl+SPXxLJ
LgWXsQg4K.gI2nvDdO3LJL+QPXJLK2DbaELJLeIHLMqUPvaQrQg4q.goYsBB
dQ6FEl+DHLMqUPvqk2nv70fvzrVAAukRFElPY3BNwrVAAuSFFEl+LHLMqUPv
a3oQgI3FryQKAlqxWIbg0Sf4LNZIv7ksXSkHh3Bqm.yY7.rN3PWMOw5IvbFV
IDt.Qv5J8LLf.2HPgKdGUnqwg.3d+IH3c3f0ffMONPAEqiCjXawJviCDqrNn
GyqQ7XyiCTvw63.cMMB.O.PAVofcJsltWadjeBO7NxOiyC.mPW3i2g7YbD.N
CtH.ui0y3H.bBbAV9fZHvlZZVqDAm+1CqDxNmYA6bAQ.Auity0zHngCqyih1
g0s.B17347X3tbIlsSf4LONtCDX1NAly7DXMPHv7H.77xvJ4LCqbkY6DXNyy
G2EGwrcBLm4Ef6ZiX1NAly7L5JtY1NAly7cM4R8X1NAly7I3toNLam.yY9TS
tXUlsSf4LelI22PlsSf4LeNtK7iY6DXNyWf6B+X1NAly78vc6CX1NAly78wc
oqLam.yY9A3tITLCl.y+SEQFoUBOZFq64GMqmRW5RNYhpqkxJtfJSle+SqKM
jtch9cIzz+2RrDX8crc9rribMXpPDmuHcFfM2XV53nA+tC0w0VI3eZnsR5Qr
6N6HoP627e0krEhPMHg5p2lG5lku+aJztWl8TmXFDZ7.6tBiDe0htzYbukhr
6UjWXtjPOROvOcagZcW+dXGO0cu+hWPSibLbuCEd0MnnQNTZ34xtoczwDDr6
lX0TTgNMfSTlCIrlepPv5jEID0FuFH75Kj5nBIt5+QBsqWqPv5fFCE.q9rnJ
zsF7roOrPv5THkHPyurHf.qnuXcnjAbf8WypvCr.+JPqFTprFzp.Brd+h0AX
5y7aFPVz2WHXcBldAjsq.XHH5PZ6Q8fBvMPzYQ+hgf04dJ73MJLZQujgf0wf
VjlVE1EOdf3AqsNU6nF1DOfFWf0AxwB8rMd.sl.qimiwcsMd.MlvCsL7FvA.
aSaaAsk.qitixXV2VcP7fkm23KzRe1COv9gCAqixym1HfrnW4Pv5j7pVbnru
utwP1yGcHXcRdUCffviE8XGBVmqGwOv134Mf3wyjpusH59GfnyG2kBZQ77bP
7Df6JAsHddFHdBM4NQXQzA42Oj.itLWKhNvIdQKmPVtsXVDO+HHdnlbY6VDc
uDDcLStGsVDcuBDcHunWKhmeBDOBbWzqEwyqAwiGtaxhEwyu.hGebWDuEwyO
Chm.b2TOCfmlJgCIW9Ya4UEDAc28DOKKLBcI6wKTJEXBDJnTPBSKBhcvhmP2
EznM5JE85zI7prw0qzaqpkq7QzOqbdU1znowWGM8pb6HCxC1c88stTRN7UEr
D4JPVH8U+6DOY0JvwEIihKqLE05VO5jnwiqc4GU6qTv69OZ7VVRJJtTRp9Rj
4WZR7MIUee97qFMQ1ymJ61ylnw7Gluk5kEimIoyRlWXITRQkcIk7RAsJebYs
mPIVUc656NiqtBHo+ES6RSzBm+ohbTHGMJavuGOr1nFIMebbZRZ8hvwR2dX7
EQyFM8rkxoGz9f2edA0A5lfb7B2BJYXVZQmXIdQwkqZthQdJdqnNXTOQZzXf
urtFrzvMykfbV94QSJXUkpPnU2bZV1nku0brLJ9hok2dbRZ5JTwoYia9lSRt
7pa46ddl7lWeaua0cxOaVp9tmIkJldVQ8lY4mKZznR0JK+5+PTZhTgR7zDMK
f5N+lZ0nWkOXR1nQKQmz24Ff6LTJkOH98ICmd0RNkTwcjOdx3JgnSlykGlbY
b9zku1znKyW9J4S+nlnW6RyNubT7YRkhiGIQwxOfb7QR9z7qxded4CVInUm.
nKCOuSOnd9n555nW552lt5k0W++4rH5YMit50Clo5MGjJ6lUa2cU2Mq991Ug
2rCZtzaFRaNSYItzHBeNW35MeAgUaWdcU6vkll0AS0CqKsROpZBZjEB.bNZK
IKHZTVfsqJKztffuxM5BT1TRWDc+6l79OMpe7fjQ4NDqx4ogaIs.zMfy2qyb
eOu00BTZt2VVTPQmOoAlRPiLE2NMT59NXwuOcUpEktpCeWx10KhWYF57BlrF
HoCi+PMqPM8Hm3OLdhyW9k+gKn+o+vEru5IxOQjeh+UekcGI0rNT99qNzxoL
0kE0x0Fr6pDctn.QIJ70kBEVWTfeHJJnmNcOQRXgoTDqaMEkc3x9okoMSReg
as+QC15BCKusxKKMLMy4UQCShlWAQWkkE17LtjNwx.2H5NvHf1LTsopPltTZ
DquMsEgZeaQzqf69YLxD01d5LL9xbPiRn1Q+SdRpU043EtgBvaAcNKGfkMJM
DJ6EqpqQe5gT266jPqzoWpBdadgiAY4VU3vmbvJbnUUTJNv1OEGzVsJMZ8Tl
ma+u5O40mFvHABlc0f3u+IjzU4CvsAfrKrM.ZH0jUIchizroGMZFGU6sBcX5
z27Gcjubiu79ay3s27G+KNuwQpyzIx4qcdqibpUmnFnXDwticbkjZN3VP4ZD
C4tMx3akjw2VRFehjfdqjQucHxHSrSQG0mqdSDt6tRzZGBJxTNsKu.XFsXE2
reEp1hyFcTRZSm3kp8JtOL4LOa1jAUpoqVTryx5YFFmOMIc9QE+tE6i1JO30
ICGmkjNsrqP806IkRGFQmhLU+0ReorIC0GYe2lE+NiGQGwSwYq3P5n3o4np7
0dv4DHhY5Z76BAx0PDnBSe6FApfRRMTunX0YcuWvLUuvui8B.hlgEV5bWCfR
th1ABWYUibUiRidoBFu1zEggqusUq+f1TMRwov2Mf6avQIrtpLKzfchhihrP
QY2TXPuUY.htF+PI8CVUHf541v8LIt57feiQcC5Zuvn7XZWmTvqwdQ4Eqbts
SJ7eogmo8UqyhlNcRx4ylpMaot25cm7onKGkcdznUbDHHWN5wK5b3kojJRDX
NtVxqM81c8b3a0qM4kohL0HcAFtL7mafh2H.qWJy5dherVkLqvmMaNgsQakh
kmb4xoyqlb95NkN6B4z0KAvAD5h7OHsN5WaiRPPxbscey9LR+8eFYP.PwZ7g
FirghI19Eij4djQ1PIUauhQ5CUIJevwHEG.LRRvw4HEG.F63AU2lenwH8N.l
izy8nwNOw6.XNRg3nwNOogjX3dEijGdzXmmDFd.vH0awxCMVGgb.XnJKf8fj
2wN.F2wzmv8dFuqgDQvj3wwoCcNUeV.mRNcQ3BY5s11cOcqsqRHA5hhTn+Vd
usI7C.qKKJMFO3MJgvO.LurLYw7vi2w1+4ckgO1COdG+.f24xNXrJoHGeH5e
UVT+3zAEINmO67zjzwyll6PbdpxmebXNOcXx0woEIhGG12aIaVDc1lEh6lYz
he6BE6lepS1NEnBTwP8bEZWc8t4uHfoHLzc2Cqlk37D60YINhlmxzk+6MLKw
0XVhT1ve146xxjJAJbKo37eK82Reii9eO6zW8aous7O91S+geK8WK+iu+zet
3A+lOkb8roW43VDAhNWLQR.54LNKeZxMwNCJRaVuOIOt3I+qihuQ40SkO6UY
SR9j7wiFo9BIpuwrwuOZxv4IvsBOsZP1LcrYDBsyE7tq9Xw7LcO2f6xT0lrx
JDptBkQV398HwC96e2q+ImWDcSxkZ2BCBnr6idRXftjT5uDOYXTZjy2lMZ3I
2FknzMB80ABePvZYMt0lNjoFlppufbIQyS8Io0rdg0hqHjHgJIOmaRheuyW9
gS+zWAQCo3Iq.QBuMpGSK5PCIKVg6RJo2pDugYuGRnSv2hDr.ckdVmcBYA6V
DrhbZG.AqkZ5gYIX5PChEpllfQ1sHXpL4GDEKX6Qw35BMRIEi6saQwlMFhbE
tMGQpsFgvqBhxcIx0W+A.xUf6VT5hyqIcQ2wjtdBH4ZaNAodueqHWhcLx0mf
HWrs4fQkIDkYIe5Nl19uFjbw25jKFaqJcMNJMdDDkAqJYDiosAPOVhnSo8pe
MGnSjqlZnNO4JuwJ66V0eOu9ZWutYu7B0EdAdrdfep9xjWsDayBQTLaZ134V
7+QHK9C71dhbpUIVXwutNVDtiYOVbDTFiOXKZeAQGSKysJauvh+vsnE+td5p
GfNYvruXwe3VzHCpdcjkTrcMK9UagADEaKZmAgGVynel+dfQ+gaQ6Ln53vsT
.auvn+PwVT5pZOK71IM5+iPjqsoIE5yfrxn+csUfCRt725jKVoVKucKi9CCv
p7xVNHpLyEenazubVxqcdBouyzLmudwAIVee9ccM6YkbqFko2kLpNWDIsQam
6XRZk5Q19TO99K0iu8odzcSp2m9yfDLwVjf4IpMXkR2snWeDld4s8oW5gmT9
tE85CvzK+sO8htSRu9tnISiyShRK79iJm+v4Keya+UvSO2MX2vCDnk4.wskG
HLSRLmU0OuIZQ1xYXR9znzAwmorrBvhO26c0XLZznr2ObRzkqRDa03YVS9eT
Qokp2J0VFPxtmuWeZQBoTuG5R6CZ2QHaktWQclFecYJr5j+4EWTzY5U7i+5G
FmkJkYSzN.22GOH5iyu4eOsnZCFW7wWN2Ry5O37W+R1uRJcgqE+n1ycQxnQp
m8rJRToefA7DpeRlCUeOtOQAvBWRSAZdyud0OoUeYZnKITScbCCb0TrhKQZ4
MbmfzbK6KhI.WfG.EC1KRhSQWFutykTeXgyef.Lxvq6URyFUsP5fN56XToTI
4yJK9GXJ4e4jngIkIcXB7xsTeWAOzkp9PoXgTnQHkUVUFetHkWfn2J+pUQ84
clVk16ZepIA96PuaIZw8YfRqh8QyllUmOXvAGiRtIteSSbr1MqOzfcaSZP59
VHvtsR36cJ7X0tip1+rpWZQKcz34dX7s3qw2DMZVb1EqWtXW.xQYoWtLERxr
jLz24+uWTCXW73IoIEyVrNsYom5ZISo3dhleCy0rtHo8U6gxuRJJ.1snfcKI
S85R57qeQgO06bR4u9gYOOp32u9ET8k0+54Qe3Em.1zUrL5iqmf.uW9lcSpp
OMMax0Mnh9dEPGFNi34obNW0n6JWzcYkAKoCwW4s3EJMTdOduNdIf2HEwWI7
DA2e6QPAkMZuRuZ+nSJtCn97h4FbYgxYA8K9pAj59uu.7RVVmt.0iVOePznX
GU303jcgyf4qyZv70YA5f6bH+9NX6s7UgPM9pbmk0aRhPX60aImWpPIJv7le
3ie5LEs9j6n89KsrVZWVU1EREiQJ5h2FedFU5LuRN63p8251To9Sdw3FuET7
k9JxwwUlhs9GVNlx5tIwxIgNWNLqkvZTKZTtlPwZ0UC6HZzz7XyELfmKi3x1
IWuQ03M8xM7EGWswwUabuVswrFVLAY+bGnpT1v7apBAh+tQ8CyljG+jmGM5p
nqmuySklt2Sa2t7ONtSS6R6zTAAsAM9jcYE9TcRBnb6sOpv+nBerT3GDredj
CAMqvOTXFE90C+1RU7eibkY4SSFjO+JOOZ5UwxEBT+Z+ywwo+smcbpfcpoBT
qz9r7OlK4vvSID3uadlCA0mRH73Z.NNkv8ajQC4einwprSGnQRBh0xEKXm.4
jSFsVxNi4x5yYAD2pqxBVuT.haR+Clr5dXQV09oc49saHBosxYhr81TlHHqQ
ezbhfsdBT7.n3.IHqW3C35363gSdb6.Hw.GHMhZsQJO3XjdGBEGnviLRxAP4
5xOfcjQRBN.XjT+iyQRN.R.6d9jiiHoGBEGHxQicdB8fn3.czXGU0SdumQ5d
zXGUk9duu3.wUaqxCNV2Avd4vzIgoGbrtCgx5Dy6AIqy6PnBzbzDlmPO.1ul
x3W9AGq6.XGZHdOLMZ4.XOYHj8QiVZvqCt97Dcgm4yNrEmRtYq9GLqcr6d6k
UVl69wK6qTlDHBV+d2mJNSzfhZ9QYCNOlGOIR9c0g0yRrFIuINsvAFkuvyFd
tJVbV6dClM4lxjXEckaMmYW6Ko7RLkW6TOPodzRtO1R2X34mMKMQ6CU8EyuZ
RtBmq75WNgPT+0bYTR5JObRQmbb1nnJ+9oJ9UOQUclp4XkO5j4gBZ0EVDIT5
W5FT1d178C+v6r+8DgER3gOnlCkc3cz+pym5gFeje3cx+OH4ihCuC9+AIez6
v6b+ePN+n+g2w9+fb7Xvg2o9+fjOFd3cn+OH4i97CuC8+gIiTbHbn+9P600C
LFo2gfK.PNxH88ODbH.wdOib6WZz8Y60UFcJQmQV0UU4Mrxn2RnHdZd1rICh
OkbpsBJQe5daPIpSg95HDUWkqQmsD86RXo+uc3FvtENaegaDpS6755C28laz
T1N76O8mgxVn93TbanLdQ1Pnp3ouQQbbSH3aO8GfPfGRkmGc4LrDA9FAAO6z
WAg.rppn5pKKJHX4b4n7VIWqyOtjlp4PcZmwCQLENBaci7Aq5pOgzrgLcJ4I
VUNHzjU21Schah9rcGlj+dESpzwodfwj3r8KlDgtSyjZRg8v3KATXyHHMooq
ZRSu.c0Bj0dcuacQisyIbRO7b54GlGUM6PvomYG2vH9gfez5cbKbeB+PvW1I
jC0c9ShVQ+qxh5qcR5Ie14opxGPtCw4oJ++zg47zgIRqIxSxRcJxCwVXqOnV
yCp82K8f5d2mjzEIPu6Xj0K20czuoAsM+96xuKUghqWeEhlbYeZ+yu7cr+MX
xDO7dXu54QC98KU0i35O6sUt+BKswOXMxUsxZ7FTTimmzLW+SnWTiapXPSHt
lkVpSmnzP8l3PKSBhA0yikycybRyjW8C0sJPQch2cksbK4XV74Cfh7bPQdBw
nrIpduZqXSG3h7TCSK0lDD5dXKxqdJUcDpLSVWwVTDkhquLyQeZVkytpiPU4
p0bVzZCiymVTihJat2sHZpp8PWkLbXb8vT4jqSFNNKIcZYufxIpZYhOuuOIz
UZkQoqhVXsgzNM95AWzZOYCaCQWAlpLuzJvnEm1li6F1VEUvRK0TEItZK0TE
p6rTSQYdcosV5YVUjKL.xZK2B4PPQN08139snKid3haqmqxTwq16JbV9hpOZ
wlbJp9yMt2x6BUlb68VhhjJ7z0Wdc2S8Wa5fnN04XLTD25jncQJAaQnItHR7
bsPiqRG20dpESVsgMtamDXCvfJS6jZQhqQ.Z2Z7hPEGeVLqSpEnTeDnx9tcp
o7tswzE5GKUSVT5wV7GqSXn1nyRLASQzkYN8aXH+lILxYcsoweb.w8tnyeCa
qh2hns1xM.s1h2ZaEhVawZkFRPqsns1VTzZKRqsECs1pc4PNd3pMAQRHdBhD
dqMFdRhjVEEccwqwZUVzEO4dRqBitHJ32pznKdR9gs1V3I4GzZagm1d+VaKO
zZKuVaKLLnhD5u4qRpzEkEdjkVkDYiWkTXWlN2CCEaAcw.5.TLgkswK9mFnr
Y0m27x8Kt2l1QocuiZd6jWo2fjAidrNXSfGFJqDgc0pXJ1frSMsdUbzFk4XL
0Nyn7IVtaP0erUV2xpq3b0E3I6XxtWf5vzX5QIAT76qcZgNLVWVLJWWMrCm+
G3uHcuNSXIannd210ETr1HzsCieWYVjU4.dT8otxz6DfWfnuun7uQeApcpCu
xjQM0go98C7oTAiunjgR7BCa3lnu0dgtcXwaDW5sClxZ+dfZLaQobb9ehhvQ
qxgnr3gftnhcdGZCaqNsWeAnrBrNXeMVsSaqYH.o1os0t56iTC01Jx88PpgZ
akB9BjZn1V9iOGoFp0EqhEOp0kfiEOpM0jBFRMTa6VhfhEoqUHgUC0R6vwRC
TaBcbrTA05VZg13n1T1gkTW6a+HF6Ugm3t68FqZuQnu1WMzdoIr2Y3twabAQ
P27iJuH34TmFtassUQ8WabuqaGJKFlqL+sb6xgnzT7fNsFGSbdacqsIbibrW
DtemOmaxFSj6xBI8XnvO6x9fhxQMnap1ruwihVS0lU0dDzZp1Lr1yEslpU61
Dd30VsYWfPfWa0psN3wtZ03.Ah7q1rOf6iWa0lIBb7jMZWUHGOb0ZagmtvV2
rENdZnXs1V3Iy254IyvSIeqVpRvQug6cw.vMqs5zIJEhUK05oVGfUK05gw6i
UK0pOF3gUK0pS7flDQqtlDGqVp0iplgUK05AvSwpkZ0sBHX0Rs6rDnMxsU8Q
3ojn0oEQSKQqFmQPSMQq1lQPSOQ69XEZJJZeyaPQSgam1RDT7BoN4Fn.dvnN
.ihFO9l3I4kOspQN45n+iN5kB58XclcIaQzTcxj3aRpddt5JQSFbUxz3ASmM
QGscevSmqeUAK0jzYIkK6WBOYSlO8iiVMnlVDm4yFlj85oQSmke1yiSmoikL
IptHZ1noKSJN+xKRFMZdrVUOTZqhz3xnVdQ8+oV3dQKhMtfhv7REvzpvkiUD
4zhd0KaQpuCo5KwEUwFF2i5yEpOEPYBlJXnW4qQWzVtjPcK3FF3x0eRdIxRg
DVsvIi5WqBIsdjhM+4mMM6xIQCSJxGMqEuv8JkjlHuqhrqnIkzzqkDzjpuSc
IukYFWm7gMkILuCBSSY9dbehhjTD75JhCeE5x8jbtBCGYl.lz5uWSbkSl7sY
iF57xrh3kO41n70iS+2oRuCUiuQpq7b9ytqse8.2rP2Umo+t8CDKkNFp5Muq
L2S3TPVNAeDdOnzt6mHspBdcm4lPcxE4GgiJ.dLPVD4cK17Yr3fQevuKBqG4
G3nPVRuKL29UwWNaTToID2+21+47y69nuviC9rLy92yGkHMU8eUXG6swmZIv
9QounSlPe6nYw2tF6nAEU.yknwLRAyrfx5M2N0vR9K1cv+1j33z6bOTkyfDr
h+U7IhWfzLZT6bpbp0eSNE5ctuUPnbURnhPJQnnij5Rn28NndQVprlQQOLeb
4zCpjqwi+eO9+GHMPjQN
-----------end_max5_patcher-----------
[Ambisonic data exchange formats - Wikipedia.pdf|attachment](upload://voUUnhxxO0jETinQZ6GpKJvlpYZ.pdf) (649.7 KB)

Hi Dave,

Have you had a look at spat5.tuto-hoa-2.maxpat ?
This patcher compares Spat encoding with ICST and the AmbiX plugins (from matthiaskronlachner.com)
The patcher shows that the encoded HOA streams are similar with the 3 software tools. This holds true for ACN SN3D, ACN N3D, and FuMa.
The only pitfall is that Spat requires an extra 90° rotation around the z-axis, as I explained before.
I don’t have access to the Blue Ripple, Dear Reality and Noise Makers plugins, but I presume the results would be similar. (you could insert these plugins spat5.tuto-hoa-2.maxpat to make comparisons)

The 90° rotation (easily achieved with spat5.hoa.rotate~) is the only step required to ensure compatibility with other tools; no need to reverse engineer the mathematical formula.

If you still face issues/difficulties, please provide a more detailed description of your workflow (which tool encodes / which tool decodes / do they only exchange HOA streams, or do you transmit automation data – like xyz or aed data ? etc.). Feel free to send patcher / screenshots / video / audio files if necessary.

Hope this helps,
T.

Hi T,

Yes, the 90 deg rotation does work but I would need several instances of it due to my working with a modular approach.

This involves mono/stereo encoders, with early reflections from a cuboidal “room” feeding a global reverberation engine. Each has its own control panel. These are used as bpatchers to display a number of sources simultaneously, along with Midi or OSC external control. I am also trying to incorporate a convincing distance model for sounds inside and outside the nominally unity distance speaker array.

Similarly, the decoding is controlled by bpatchers, one for each speaker, though there is only one decoder object.

There is also a graphic display of the “room”, sources and loudspeakers built with Jitter. Another different coordinate system.

I’m using 16 inputs and outputs as something reasonable for 3rd order ambisonics in terms of user hardware, and for proof of concept. As it is modular it would then be expandable fairly simply.

This is all based on a long standing 1st order ambisonic version, which works well. The above mentioned distance model worked well there, especially as the XYZ components all go to zero as xyz coordinates go to zero. W was increased inside the unit sphere according to Gerzon’s equation. Outside the unit sphere the directional coding was maintained, and the amplitude diminished according to the inverse square law (1/r), the amount being scalable. The reverb send varies as 1/sqrt r, as suggested by Chowning.

With 3rd order I started from the basic encoding equations, though this led to rather large processing load when dealing with the number of inputs and outputs. This led to exploring the ICST and Spat~ objects. I had found the latter to be much more efficient when attempting an amplitude/delay panning project (Delta Stereophony, roughly equivalent to simplified WFS). Additionally appealing is being able to use simpler and shorter /sources lists, without having to specify source number and send as separate messages.

Neither of these really seem to deal adequately with distance, and the directional components do not go to zero at centre zero, meaning that the audible result was not central. My solution is to fade out first and higher order components as zero is approached, and increase W to compensate for the loss in volume level.

Additionally, when attempting to produce an early reflection send signal from a cuboidal room, signals cancel along the xyz axes as they are equal and opposite polarity. In the centre at zero they default to a direction along one axis or cancel completely. A solution seemed to lie in deriving A-format signals, as suggested in several papers (e.g.Wiggins), working with those and encoding to 2nd (or possibly even 3rd) order at the end before decoding.

A lot of ambisonic plug-ins only let one pan sound around at a fixed distance, whereas most sound sources travel in straight lines or ways that can be approximated by a succession of straight lines.

Of course, there is a problem in that ambisonics is essentially dimensionless. This arises in calculating delay compensation in loudspeaker arrays, and in simulating the Doppler effect. The delay is related to the ‘real’ distance in meters or some other defined dimension.

Many years gone I was able to make plug-ins with Max 4. Some will still work in Reaper, though the user interface has gone. I’m not a proper programmer, and cannot author my own plug-ins. Most of my audio work is done in ProTools, though I do use Logic to work with some clients. Logic is crippled for use with ambisonics. I occasionally use Reaper. Cubase and (better) Nuendo are good alternatives with a decent architecture, but how many DAWs does one need, can afford, and can be good at using. Many times, when forced to use Logic, I feel that I could have finished the job in ProTools by the time I’ve trawled through the Logic manual and gone online to work out how to do what I need to.

Hence my interest in ProTools plug-ins, as I would need to use those to ease production. Those available (apart from the Blue Ripple ones) do not provide any loudspeaker decoders, just binaural ones. Hence my desire to be able to build one that works simply. I can, of course, send audio from ProTools via Soundflower or Loopback to Max, encode there and record the B-Format or loudspeaker feed signals. However, if I need to record back into ProTools, or import this recording into it, I have to ensure that it is spatially compatible.

“Reverse engineering the mathematical formulae” seems the most efficient way of doing this.

Incidentally, I have been using the trial versions of the Noise Makers and Dear Reality plug-ins, and the free 03 Core Blue Ripple ones. The latter only allows rotation, but the other two will pan freely.

Ciao,

Dave

Thanks Dave for this detailed description of your workflow.
That seems quite interesting, and your insights are valuable.
I will rack my brains to see if I can simplify interoperability of Spat with other toolsets.
The main challenge, as discussed before, is that Spat is a large framework (HOA being only one option of the Panning module) and we need to ensure some sort of backward compatibility with the repertoire. Therefore it’s just not possible to brutally change the XY coordinate system throughout the library…

Best,
T.

Hi T,

I totally understand what you are saying.

I have no complaint with the Spat~ objects, as they are consistent with themselves, work well, are efficient, and easy to use.

I am probably not a typical user, using very few objects from the library and building things around them to fit with what I’m trying to achieve.

I was certainly not expecting that it was feasible to to change Spat~'s coordinate system, just trying to find a way round the problems I was encountering, and ensure that what I am doing works with what others are doing.

I have found it very confusing working through all the information I can find to resolve different coordinate systems, and descriptions to arrive at some sort of “standard” practice.

As someone said “Standards are great things. That’s why we have so many of them”.

Thanks for your help, and I hope that you’re not adversely affected by Covid-19.

Incidentally, I seem to get a stream of error messages when loading my patch that are like the following.

spat5.hoa.decoder~: error occurred when processing “/speakers/aed 149.971 0 1 30.0294 0 1 90 0 1 0 90 1 -149.971 0 1 -30.0294 0 1 -90 0 1 0 90 1 -52.394 -43.9356 0 -43.516 26.4781 0 14.0362 51.7078 0 53.1301 11.3099 0 41.0548 32.3115 0 -97.289 -30.4654 0 -2.07003 -45.3244 0 171.983 37.9907 0”. Reason: invalid loudspeaker setup: speaker #4 and #8 are almost coincident

This seems to happen as the patch is opening, before an xml file describing the loudspeaker positions and other data is read. Loading the xml file itself brings up no error messages and everything is fine.

This happened even before installing an automatic xml read system. I tried fixing it by installing a loadbang triggering a valid message, but that didn’t help. Then I tried a load bang with a set of random values for each loudspeaker bpatcher, which produces messages like the above.

It seems that as the patch is building, it is assumed that all speakers are at the same default position.

I had a similar problem with spat5.diagmatrix~, which seems to have been solved with a loadbang and appropriate message.

Any clues ??

Ciao,

Dave

Splitting the coordinate list for readability :

/speaker/1/aed 149.971 0 1
/speaker/2/aed 30.0294 0 1
/speaker/3/aed 90 0 1
/speaker/4/aed 0 90 1
/speaker/5/aed -149.971 0 1
/speaker/6/aed -30.0294 0 1
/speaker/7/aed -90 0 1
/speaker/8/aed 0 90 1
/speaker/9/aed -52.394 -43.9356 0
/speaker/10/aed -43.516 26.4781 0
/speaker/11/aed 14.0362 51.7078 0
/speaker/12/aed 53.1301 11.3099 0
/speaker/13/aed 41.0548 32.3115 0
/speaker/14/aed -97.289 -30.4654 0
/speaker/15/aed -2.07003 -45.3244 0
/speaker/16/aed 171.983 37.9907 0

(NB : you can do that with spat5.osc.split)

you’ll notice that, indeed, speaker #4 and #8 are both located at the zenith.
This will mess up the HOA decoding, and you should fix that.

That said, you can sometimes get spurious error messages when setting loudspeaker positions. Typically this happens when you set the positions one by one, as this could result in an intermediate state that is unstable. Therefore I recommend setting all positions at once, as list (using the /speakers/aed message), just as you did.

Otherwise, feel free the send the patch with the complaining object; I’ll try to have a look.

Cheers,
T.

Also, speakers #9 to #16 have a distance of 0, i.e. they all are coincident, and located at the origin (xyz=0,0,0).
HOA decoders (or any other panners) won’t work with such a layout.

T.

I had a similar problem with 3 order ambisonic files exported from Nuendo. I fixed it with 90 'yaw rotation in “spat5.hoa.rotate”