New Object Early Community Build #1: FluidVoiceAllocator (NOW WITH SC TOO)

Doesn’t it expect two lists, frequencies and magnitudes? If you use it with melbands do you have to spoof a list of gains you want to keep, or just dump the same list into both?

Even if something like that would be the case, it still seems like it would be a sines-specific voice allocator, that has uses in other things. Either that, or making the inlets and future documentation a bit more generic in terms of how it works and what it receives.

edit:
To make clearer what I mean, given that there is a native mc.voiceallocator~ object, finding out that there is a fluid.voiceallocator~ object would immediately make me think that it is for using fluid. objects with mc. objects and/or that it worked and operated the same way.

Whereas a name like fluid.sinevoiceallocator~ would make it’s functionality, and more specifically, scope more clear. And again, that it isn’t related to mc. objects at all.

1 Like

it is more a freq-amp-voice-tracking-and-allocator - I’ll think about confused mc users indeed (good call on that thanks)- at the moment I’m even doubting the split is right (i.e. track and voice in one object) so I’ll wait to port to Pd and SC and see how these other communities connect with it too.

p

2 Likes

Ok, took a stab and trying to make this today and not entirely sure why it’s not working. There’s probably a more direct/elegant way to handle the voice fading in/out, but I tried copying the same structure using mc.line~ and setvalue to address each individual instance, but getting no joy from it.


----------begin_max5_patcher----------
2084.3oc0ZkzbiiaE9r8uBV5XJ0rvC6XN4YRkJ4Pla4Vpo5hhB1FcSQpvEuz
SM92dd.TasIkDoEG6djWI.He3881eD+90WMaQwS1pYQ+Tz+M5pq98qu5pvP9
AtZy0WMaUxSoYIUgkMK29XwhuLad6T01mpCC+srnz6Sxuytcl0I0o26xu6yk
1z5VB.bHlLOhB5XgzXjDthyHZJiNORRBSQiIQ+1lmPdyJWdlsNPW5lAcKCjC
2BexLa+BKZpe8JaGp9401VpOa1b7mneyO6eb809eMef77Jass7kSvYh.iw.H
ly3DEfbmQ.DhXdjR3mBTxiwYPWNS1OmAGiytMqHo9sxZUUI6kZ6jmU15GRxZ
rQ5HRbDUbJlmQiY3GNmaLTEALp4QBoHVoMLplHYTN.D.QAgJVheDBAgnnFMg
MRYtXjHyzBJHR.jH3sfGblNVpLRNmJ0JEWRLnRuXzJ8B5GMBbRdmaHCj2YuA
dm8gx6mSty4sZ2JklQkDFWHlPdm+tv6Gw6dkMKBhXQ7wx9LCOVJTJhRPLZMf
ZFna.t7z7OuK+C8y97iw9KvXQdG9u9uuMX4Kt53TaV1hrhzutcmbaQdcdxp.
Em8y0e0kWUjG8uv8PYl8N2hrSEKj2pCHAdrRpXFfQvPGJEftIQ2i947QK2gO
oEYgshdy0kEO9cxe+l41jzvlgLPcJfxNMp5enUtuEdnfOD2Q.6LWUc.bm+ND
kUPMSSTV.f2u3rI00kMtSvbTfESEGI6HpRcZKl9XOhZO4JSBn6ms4Id8xCTR
7arv8rtzUT5pcU1kOT3RwrBeOb3TkVr1dJgNyX55VQpH8jcA5qwG6gRAuEkT
vwUBRXDdYAxQR8hLc9R+RgKer7KWSiwfoBMPnJbNsN.BiNJBd6ejgQvhDpxP
UqHXr..SPhkr8ARHB8aD.f2spFNBH3cVdaSdtOj5ngAhLVBLMCmkRLbbNDFj
uAeCjQpGDbwOkvv5R6Za9xnsEZLVnPPkwJJS.3nRgD.IZrSfQCEF8GoEwpz3
LWt8kna7UOWEoGMLzacV.LZKC0QJshcLbXUSVsyuqQM4J2c4IYWV3+iiP+sW
NYSEHwF+GkBcRPYXcGGweIe7sXPNVyjd.k2DXX+1xjzWNeuT5M+Qda5ihwTd
g9O83dnfrIecR5We4j981vXBeDdtX2WbFZeq4i17VnFoD7RjZqyRd16n7k8k
HjkU73cYEKRxpsqVWbXlW0NrRy5RKBAszdOWcbbgGh4I3lP9tDZL5GjnkFzO
.ETL8tGAlK2ct7CHKPI6xf++0jj4peNroWjT4R2IPbHgSKJ8z0UjezpI1W1Q
4pj759uiCDCZXH4h98hHwlQWUrz1cmFtntIGQoPIK7sOjzL256st6tO.b9PB
uBhNijed++m+mkt.OlThH2qw4La9c0aEjdgCJeS+Z09EtLoNYityFkm185tt
udvD97xWTUj0TaQUgvSc1+oztZApf8o+9+3e+o+YlWP87u1ffvuT7zuZyJhe
L4gMfSPx3vcz1pSeC2KVNaq3KoYoqvOxAKXijsQgtcHLkldvbU1r8pBdrPSw
xzvB03fhPvx+I6Me8qOqnX8ApTsE6lWayq+bUcRscKlcH5bvcscnfoZ6+zZ6
tYjOxnP806Gfqa6PFhEZLxsQoGaNrvGTPoyjIWx50YOGxkq5T04pZ6PHymFi
F7wrNRds.XFs6dp4CNaNDeGTxb8CC8UkCPziFFX+fohf.yJ2SKKdLGC9GcSR
ScwcIt7yjHPOlT8l0ujO5D6X5+JaC0KzLY1Pr+pXC0OLLU1PbxOb1PoOmlYG
cXnd6AujNZaF9OXNUtMqwsLNzqRL8qhzj5hxnav6D2dscvLhJjQ2r+xQqLQQ
XRX.sA84vnXAkD+qyhf4fievq4RlzX7343PR1HeaFWdy0OIFV4xs2ZSpaJsn
+YpNfh2dan2+QTLOkna7WgaIDypZG4Sf+6aJJWZKGRAcfhGK3ZDYUffiHIv7
P43aXCWMxFUzOvEn2LeyWd0weHvB9w+dzrpnoLc6ibaCSNnjskXsbXc.6S7c
eCkOXUA3ZWdqcjgSJs8Mu.i1tcQqbKWW3xq2vtbhIF5zMIipa2jvo6lpxvWI
WAc6ECfCx6jub2U1E3nWDv4612YAtWgtumxrvqj6fUMDgljPh8CHLRMSYvJg
wjh3bzbq245xWjKhuB8Rd.FBP6ptHZ4cbFQOKoHS.oLCfo3rofmTCfRlIfP.
LDmFmR8C8Z2mUKompbY71Up0Rk.Pm+iZkLTssy63URhE8N0TaoJFhDw2wzC7
tNQFSCmzSt+oA4ZTL9PJBrhMgjSoFJ2P.fgAJj5frrm4lbuSCvgg+LUc4VWe
GxbDBwlHBcVwDeJHDYH7DLYT57gPlB4zVg8.H0QUzw7Wi0cNkaX1KfgHApjq
oT+Kjw+RXTcMI5YkWJSwtblBYkevXJ9XXpKhTzgDsmMEp5rAkWAYpxU5bVuT
yTQoyhdloJWIXHYkcT0bFZ65OlUDYL40GyJASGKvJ6AkuMIXc8LVuq7R0AFj
2NXBzq0CgRaS.8xjLClmtXJMjxM3v6VByj9SF6xRagMnjwTSRrW0HpzoeaJJ
kh4wglJ9SnolXnXk6LkfqUy6ulgtK7B4B4fpA8UBzgTci.jwBoRSkLIC2wb9
tJQ5YpoNm7AwVL8eFZf6x15z0kp6nB11Xsj0qevVVsY0ApLaUxWJJ2cHlQ3O
u8xvK5eVo8A2102NRRY58tZapuujg1+8jr8.nGNR.k4MtMHLxeW6eY5IUU9W
4c05MGD5POQu9Ot9+CXfvSvF
-----------end_max5_patcher-----------

Ok, improved it some. It still isn’t sounding 100% the same (lots of clicks and stuff when using low/chunky sounds), but it’s at least doing something in the ballpark of what it should.

Turns out I needed to account for every output, including 0 and 2 which are just left alone in the poly~ version. I’ve tried experimenting with voice state 0 being a 0 and a 1 and neither seems to work right.


----------begin_max5_patcher----------
4729.3oc2cstibiic92seJ3VHH1s21x7pnzlLAdSPPvBrSv.rA4O1CLTWEqt
0XURk0k9hGL9cZeExSVNjRpJotntTUI0q8XOt6pHoD44iGdtwC47qu3hEWm7
fJaA5OgdO5hK90WbwElhzEbQ02uXwlfGVFEjYZ1hq2Fju7VU5hqJq7tP082E
lEdcXTX9i5lPppIY85LUd469MbG7Un2vbvnetp5njkeRsZUZvMYKSShhzMDW
U2xnvkeJ+1zjhatsY4p3fqiT2d3CTVwcGVQYujE9EUyRu9lMIqZWRR5JfnZT
Rbwlv3HUdVyBCRuoBsV7t0gQpEWAHRZQ1spLmfv05u9tnjjsvGH5OeWRD7w8
DcbvFS2tXkZSRVRQ7JG.cAHcw9dMoHutaqgxvUlGJ45e4Mx5VV1r7G2ppFPY
g2DG.DeceYlnBiu4iopkUSCDrqddPX9Ik3q+kmudRQ+H+1Kdg9GWMRNgnv6T
NYKS1p95BaXFspvzf3apFiuA6.vBwgrGPFhd8EcRvWCu39IWFy2wuweDbwUH
N22gwjLAQJ8bEBeN6JjOyfEteaiEtmAVP4jeWgEry.KHbVKrPJYeWiE7y.Kv
bwuqvBxoiE9b4uqfB5oCEdb+eWAE3SGJjBplB+9k387Och2UvmKhOVcOL5pG
Z4pGLc4hMKcJh2Fr7SeE4YETHVoaOKzs2P1Jc0j7owfeXpiqPJwRA12yCLLg
eERh4GpQlROQ3biJKK.3RdJdR5kyZXlmtM3rWBm6WIKEjbHvTF22WyF453J8
c4bpqmTxcwPgTemygty1B8YZwFvSh62sJZcRb95fkpNMnmOZ6s8Z9NqcjfnE
ILHrnehcV7+mSC0bMcqHV54PAfPBbLdLFESDdDLUJXdZ9GrlMh3hm1EaEw+R
RX7QrLiYAg515C8hDy+5iSg5YnMtO1QVSzttROO.LbMhdOYdCi70UMv86BR2
MgbPkif7oGR9D28Spov6NWk9wR2Qa4LrMnYcTB342HvFF3j1AhO.61zvlWCe
pyBtSs5iA44ogWWjq1+orJPpBkz.QTgJYccw0k2jHhRhu4Pv58jethda03M.
tanWCi5g0mcaR590BWmFdys4wfDKauqZTx16oHNLOK+wRvUTVugon9WSy5hs
nCFhig8vl7C1oI+rdUgMIlR99UEMeCkAvn4zrNFE2oRyBShaL9tXQv1sMJtM
GvlfeIIsgJUcQgwkEI1UTpRG0mxmeeoAo.cjCDQQZ4L8Ct78Sw5ftjFWDZFJ
0yc0CIybhlCIaakfayTWc0MTo5ZhaAiZjMHnlkABt6dzPGfmx.+zjMZAXlUb
X71TUlJNOHuZvuq5Up0AEQ4eztb910+DcKsqzpH+KVbSZ3pjX8fn0Tgt35tC
zBXnF8O2SLlVDGr0xCCbX.tzQkY.QVjccPpI9bkKYn0UlmjD0tpcOWjZcdU0
aCiieBJlmrs6JMKZ5t5qSfJ2z261TSFrLur1OBLE4eTKVqc6BhhpV4190+PP
b3lfbUdX4T.EuqxChcHocM2YolU.S9R08gqxKCCYSlAn4gaqYhVraVdU3Mpr
71kkGTF0v8krSDVihJpCs5GyUa1FATQ6F.KOByxAAo2mU0vZFsl.v9n41bQc
SwfsJuOwgsEI9ZvoilUXybxtEIdfVylupCjL1VwXmVLAZ.EZkitNRhmGWvJ+
CEV.Q8ZaTYC8D0pGNE7YYxlMfvCq.z+SvmTn7aUnvXnYvPsgNDzNMXnf3UHP
7XLJLGZYdh4QRUetHLUsBYzKmgVmjZJeU1VzxjhX3Ag2PNRyUjhRhaMSDEFq
LMpggscpwxxTD19Tj6h9ge.nMxgaGVQeoF9kRcU6sV8Y.9ifEGnj0.rkpTMw
wFyB.b1IvQmLfiO.vUp+hKYNLeOgvs5O.+JgXzryXSLt06xZXRhLgKrwzIXo
Myv+3AHTSHhI0dB01ifmANKKVqd17HzQwivbObskaowe3mOVjbzZz5Sfzo1I
cg6HXPt533TnBvLYeepzqVGfnTIvbvqzCToiaUun0QudRz+xoQhObFvuH7jX
bEmjmAejO6JIg5.yTy.0Xn6RhJ1nPEYZUkpG.KXgGBLXFoBxTHfRQqKhWZrv
Z9kYSGRnMCaV2Q.fjyDTxNfTGMV47H1tOfbi1ZCriCEi9mahdSmHJ9PF.3Wh
HBr1CUIgTszCqM.f+8tTJp2zKkhPcODpnURvdFkRArKof07n2fdU4e+mVSP+
vOfHWhdMR+4KQ+w5h+CUE+JS62lb+qnNe3CWg.E8Nks9xKQ5+pMjfhEtRJ5x
obAaGxEoxlcRG9rOBQlc6vdWAlQT5htTa2jOXZRkf.Wv3DZo0ILwy2b4e3sS
peYL7j3XlIASXbv9MomumesEthCi1+7iPA4AwKlL9NlXBAHcvRY95zTo5O5v
Z8bKMv3AvT5B.a57.fR.VHgOmRqcAfp8b5eHBLekQdXoHO3WbGtDb1wUKqre
.734wXSgMe1kPgIO69OEFuELl6lfvXzqdYvFstfWd4yge3jADk6UlGbXOGA0
mwo0lzw.urjO6VzsyzXvh2RzJHUmgfnmJ.atfqgLAlHMxtY.6k2SEqSvO+.V
bR5lfnvL0JsgvDzK26n9KQKA85oISo4vhg3lLRt8DGFyBRYlRL4VCanlNoP7
QK1weJD6XKdfrRyhvM1UCyV9TM41cPVBiWodnw1EMIvVIkMgbF3EixGbKA7a
D.yIDWydQs86qjVNRG6VfgHz0aGNyRJRWVyWTGSGTaZXkJKOLd21r898gy.M
1UAmznfLhQg1Ht4aTPGIVn4alsQgdw7nFEl.1NeCCwHGFrYELXicTb3b2tCF
.4afgFw9PCOOCswxHWu5edFE3wxHOiCBczfF2rDatGEiQ9lN3Hy2nPdDSHjY
ZPrSp0vXg2LhEjiQsmcrnpv5DgoJGtJSridRfqiJADtIJ45fnmj0.1xOgIOQ
p1rz40e03eLduKxmXpn51cdLuoHJOb4sAwwpnwbNnpOyCMSNUAi6Ho0o3rKg
3Vmhymb9G1KnPLXB9LSOW7rhIt.oKck5XTg4LtTRH.nfmIP4FU7WOyrsiNur
HROGIWr6ubFviTFO3VYi2Jvk8mtf8IYn297sqibzyZR50PT0gooms7zqiD0a
fL0yZp5sOW8rlrdfOH5IvEMxPv8gLWiPRCaimGeWZ6sWvo0D1anL1avT1q+b
1aLIs2SyZOZqx6Ms85Ku85Ow85Oy8rk5d6IIq4tWyGcaO0ZO681WeGou2Air
txeOx9DE0dF7YKE91WWmYvWOovWO4vW25PspD0RZ7YKO95NQ99IUt5uUbMYe
zwGQJ8YIm9ZZPR6.dznlghscqvyhHspoqnH0SXj5L29FJNRcb1QLqlL+zVNb
r27oFFwcJvxRPJWijLtqiNR+AIZrvB6ftw9NVNLj0Rd0+5OBRPLhgW8usXT.
qv.odkGoDluW6fOcgAULu5Oj9g329VDnpHOHFApiRSdPu1DVu7g3pJyuMLqc
UHnf3jbS9KtIIKGAviJMbIrh+QTvxkEovJhqpdbv1Vc6yRhqZP3JcdL.eF8J
fwLWktISG8qaCR2naS1kn7DT.5kopfnWhfd7VTT30oAoOh9w+1OgduNX4e8m
0u8pdPGGczsfjMzcIfffxzoDsMI5wuZRAy5QOh33JPOfVCRrT5ruDHY8arrk
MdusdmZCJxpdmUVvz9sxr+VeOz3xWI50WZFsw5u9me0CW9gbnGHnrOmleEhi
d8agIIz+2e+Cw+JzJf3+AjG50nG9Wze6yv2dUB5OhRzaI0e4+9+8m9Klxyfx
oB8t3+Yn7OeoovBnPFTl9M+prxxRUlbQMA8VTATvu8gpYVfEj.MubLEFSfVu
GRe8knLXFMoHK5QGjVYEHEClaPaTAYE5zX85GAJNWKwyA3EfYHUVYhul.B9Q
YKC0SxqCWpy.VEnmL+QzMEAoAv2TqpA4JNCzlhkZfVErEPvGSJPf.yhnUnDs
0QAfDVkts5W+sfhFXlA.dcSiSh0txEne8524hIW9QehU0IvTOxU6Q.BtCAH7
ws7VGm4pjPnWAmMrT4fHA2DLr4SbKHYXuh6LZIscMev4kienvF6Pg2yPoARU
YgSvpUg5WP8kARNv5lsMI0jRPAEqBSxRhR18kMEZa.N3sn.VohrFuFSi2lbu
Bj3lFUd4h.1FntF382+s6B+xWBMW8HQpLPxYYooKZYN8Rn+SKesXGetuNUiN
7CjVFrpzDEvQcTO8SNCVUd.ceJH+q77Z84B0mTOVdbCITeLlf43ESmiiYpHX
lifnfvMtU2Gcs59nqkHLLvkGvUC+69OTrThkCEqsyFLE6eVNY20oA9LC2fv+
DOMvVI7Y3z.2AOxWhLZp2CHif7sbVO86+jtNhqdGJ00Q3566h4RNC6Q0IzhK
ddlqcfdUmmeTwYNqSOsYcgjMxYcWwbg.mMsehmeSASLRZmMOz9TLuyOwU6B+
mGZWGd7hvdCYntIkolOXvJXInNcQLNBjM5qbKBV12Q7FeRXT8w82p.ApTNGg
Xsyy5Oc7PwIJJfYUTf0i7+rP5fBfrHs6ejySC.ASNcc.VAAF3NtKau9ervat
.AcpjrtPG.7NfAx34C5deGz8xI.CDtiKg4oyEVv3GtzjEdtyALrMUsUAdKlo
xMoSy4AE9dS3JBa6AE4oor4jseKZOo9J5ckwvv6HVXX6V.QbL67xUm5pEq6.
CgPlsso6L2xxoa64vhQJ.kHNuMsT8kUAKOF5FawxAuEGIoX+Zuo7JNQLa2vT
moXPwYdabZCGHXGOBg5x8nTBCLVBrGvieVynaiBdTKUd2j51PXvrLIUOVZuo
Z1Ah0IQQI2WlEA58zHo4STeUpBt.mEtbGZGBFlpCu3xaqhiPGWXYBKapMY+c
tT5lf3b6C09LFyLVxKhC02uY+Iv3yFWsrauUo2nKydm50883T+28W5+sJzLl
BReb+7LXi4MgPahTw2jWS55YO.QV9or8M7yEA02XtsQt52vNflP2soU1OG9V
7st7JdUW0tq30d1aZMnzQlfFbcVRTQtB53aKulCRUatFXndy+w+4e8M+WQZN
oG+wBX7+um7vOphRbtO3tFajrd2s2sWEmvy9ov3RFCSrwJuycewSBNZgjvvX
lzqwAOQGVn8rL54.OpuuvWP3DIFy0gwpYfAWXt1daEX1E5bHWEm+QcDt6Hif
18T8kYOeSoRhPlWUR1by6bUIMfgbAa2F8XYlQedxyomX3snL+QZQKg3OSlp.
SXCXK2ngA1jwhXGXr4wCA6MS.ylvGVkbeLnrG8tfh7DyQq4LSEMl2rtHxEb7
Q54yndXWFkCfj9Tj3x+tXQD6DWDYEI99cQDedM8+YdQzxGWFoNSMO7YVyis8
Q4Lu.I6.PVGUDtxwDFQvRujkA4Ion2AOIfAkAWTeijfd29u5gd2AAf7nDBws
fmrgu3Mu5TVzQkXGgOwyWRK8HCqu3cnj4CJyBiUqUA5jQ7q56sECXtdsICYP
TLGJP+MfFggeVYIugn+u2YNDDGkibVhdAWdd2goU6tCwi5H3d.NJIBNfaD8s
lcGwuw79Zu06k33S2k6Jz7f811u0gRni80V13nNcvL1n6oQzQb1DzQ5qrYj6
.8ju6T0Sxg5IwT0S7g5I9T0Shg5oIadhNTOQmpdhMTOQlpdhLTOgmpdZn0Sd
9SQOIGQOUdVZ1S4aBWsMILNuRrDH82gefxVouCwG6tKPUZOp4LxnZ44RTjwH
NRNAvmTLlIp1ylOA8.SWODSbIXKQwVeI6aZpmmqTPHR9w0TlOwhAPtLyg1+v
5ZDxplGiv4ErzADuaVswCVLA0haSitkZlxCBbNsFTGnkGBbjyC33iPviW+.W
4Nf3B1+CiatmKw0EikdhpcX9PP8vVdtqU3iY52uOpf5YR9GAk4PITA2mikDf
W20USEVlbrzxykJXiwlpoPYsjNFYKSg5F4yk3R2wXmnbJrJPmndCZ+gmbp5o
gnIg+T0SCIFPvmpdZHapDropmFx1WwjvQfGq3G7Tq3aTcMyydWedpND9Gi8c
mWWMFwHRu4.fGUWK5nqoOScMYxma4mus6bW+usrcWvl.GR3huwHJ5DPT1L88
ejDEeLb9SgdOSGQFSzkNWQX7wv7wlDZhMBZhNY8DcPduovNR9XLEhLEghgOF
Mp7onmXiJzlSA5wFSPeDSgIqrQOOctKnniA8XSw7DwcLVeLElrRHiMLFmcOg
kGQb0sq1f3IcjZm7E9NXOrO0ySvjBtYCiIVzSdXCOapXLZ+78lD.aLtH4Rlr
tZb5zO+9BOp95P5pbKjdx8DhtadxsCxStXPN7NAo6qCjmdSfXNgec8+rtdwu
8h+e.XclSsC
-----------end_max5_patcher-----------

edit:
A waveshaper inline there, but not connected as I’m trying to figure out what’s the problem still.

Aaaand a further improvement. I had forgotten to smooth the amplitude for all the changes from the magnitudes.

I still think I’m getting more clicks than I should be, but it’s getting there.


----------begin_max5_patcher----------
5051.3oc6c0ujaiib+u87TfSUpXO9FSiOI.ujMkujJUpqpro1ptT4er2xEGI
pY3ZJRY9w7g2Z86TdExSVZ.RJQJAJQIAoXeYGuq8H.Pht+gFM5tQCne8pWL4
1rmhJlf9Sn2idwK90qdwKLEoK3EMe9ESVD9zzjvBSyljF8X1s+xjapqpL5oR
SwKQIwoQ+T3zO0VUZ0h3zjnRyiQVWXVU4lktLrb58wo28w7nok0DCkE3En+Q
JYBLkwCBtAwHbOeBSwXAATb.WpX2f74d3aPTpGF8yMuu5tn74kQ0urIKpRJi
mdeXZZTRQ7cogISV033YFF.Xp2PIS5RQQ4M3PCP7hIyiShdHJuHNKsC8+hIg
KW1o3Wz4Qzn2ujYdQpaVUTbZcQhUEkG8Pb6yutzvb.WJAPoJ2vJSdxmOY8qI
aVTdZUrgTpK72tpkjLiXogKhJVFNs9g0CrsUuFoEAZ7if8MvHAq+GNCuFNAI
h6Rxl9oHCPgaKLaYTZb5x7nhnzxvxFZeU0yhlGBn9GmmkVVD+ECEPfAIa0Ou
gBsVolGLj+eNOFF2Zaxc4wyxR0DQuQBcwsc26QDgg2DcYFSKRCWZ4gAY..VF
nxBfIqJtMLWOPcahoGnsUVlkkzupUOWRz7xlpWFCBf8QwxrkCWYd7c2uim81
LnxE65capo3iUo009QPln7iEgOzGsKCSRZlV2+0+TXZ7hvxnx35g.JdUkQog
.idewz7rjjd7acMOXolYfL9znGimUduoi5JL.MOdYqPzjUixyhuKpnreYkg2
UzujhxmqA8NEUcayb3OVFsXYBvE8a.L6Htnr39rGKZZXqfVW.Xstwtyo6pir
W46RW4F5KAMkn4vztt01SkIseEaq1bHUmJkQnWx7vblBTeRjRkuPPtAIjapq
zt9xI8ptiFRhZRa4+1UW09K23d74WxhScOzvw0J4.XvWnHXpz2WFnnRXYjSF
ZXWHn4KInhDXhDhbD.DcL.DgBqIPIALeoPoBX.Lc..zM6Bj3WHPJAlbOuRud
+NfIxoIGoLqt36ONbQSQCiKhKDt.qWCKrMCUDU9PXRUz4Ban9DOrRJ4RLSHj
LXtl1HCxoNISdgvoES8zFz9Uz6zlMVfTGwbM1X.JFV3QvA9JlLfy88YRE.Tj
QBTVLr8l8MEj5RHzfCChM3SQHpyOTsFZJ23QfBVYiPoBlTnQuZL73EnB5R7S
yVr.rlsmkBlGHcVzScLy1IPWMQdDS.wiRtxGajq7oMvkwAJ6vUWWfvmLdr1T
a8LnALfxP255sCTEYU4SaG7ZVc8FTepFLZrLNckmGuekFBSCG0.0ASE7wREr
yIUHFKUvO2XAYLTg5bREpCYDgbtnB4XoB54DKBFKUHNmTAcjTgVUy.TQSgsQ
yXh1k0Yer187OFVVlGeaUYspktgm4fbi7tjraCS1v2OadYd0Zhy720fzXhUV
qKnsQU5g3nGMgHHNIt74tQ.Ka9bvhrZv4Ml.Z8FVm.ZUG9kY4.Msxs5lUAlL
E7E3Sk2mmUc28cKeKOz6WwCaWQcuzF8j1Ru8Ncbl5URV9r5XigsEqO7Ni0WX
9cMKIL4c5voosU417ph6iJ7Bimq+36RxxVpmsp+8GxR5JOYaAulXWIZhfkId
VpfcEOvMiA3pg+YQKx.I5zYdv.IzUS1NHg0VfdfRBIwOD4ULMaYzWaek4go2
0POuAVpFXWOxZBxhEliO3oDVazSa9QvAak37.OFac7.B3raPALCZ4uKz5VfR
sFuz.w2AXAkStHXg+2AXAgy5gERI6rfEruCvBLWbQvB929XQ.WdQfBx29Pgh
GbQfB529PgTPM6Ej6Yd729LuufedXdUvwv7CrqqKl5Ukp2JgutJ.UiYeWU6m
uwTOegThkBbfRAFTvuAIw7sWIc2a755XR4feyJbpNF3bQTQQ3cQagmjINQ3g
GH2dyq4beOeYfOmS80AF0GCERC71KFZmuOJyPKVBzXd0BvShGWMKx9Nz1GB3
6DBFbaZstvqT4QAlVBRZJFihI06Difozxc0a.gOdbHhkcOtms5JGNYqJsylR
MloYrcjdCp58YO.6IaA.eeoRA.iOc+IzvVQ4sGWe7lbLqyX2CgqcKdqJGA6S
2K6y.uz1RKC2rqJb09X+4IYgkV4eh+ZwubfCJix+XsSucI15XJrJXB6HrBlM
JIa91o1w5WeRV5caCVum7yqyVi0MdAf6FJAudKv6Vew8Y4qmOcqIK.RAMV1d
Wsfhs2SUZb4psFWbU2frbTgyXvT+YKR7TS9mlYG1zXJGQ59XeVA6+GlbO99l
ngvnFcJBpYtkf6+6Y2yumcO+d18b1xtmWCdh39rWg.KMp2ySvyCIQo3BV8O5
cVmp1zPR6pF6up4Vqb5xsFtcyCsAP+mgeJBUdeDJNEZFvlcVCAsZELTX5LDn
dLEEWBsrLy7H4QetJNOZFxrtbAZdVto7YEKQSypRgGDdCkHsTQNJKs2HgdiL
LMpiUsNbuWgACi919gbLPpGhjlDnweGa9p+kB904hBJaN.a4QQcwwNiB.bNH
vQcNvUuNEWx7XAJgvu4GgNWHLq3yXCiaWpjJ50ZsZD2OwlYjLT.u2k4YxaZS
llScZMldojrrXspikQX9aO2pIGv2UdMbgDQJQyQyOBVmNFIDp.LHNHfJUsZ9
E0p9O.Yja1mvhv+RkJZ0o.67y07ISRrKTRLtQRQYPK43VnbX74hMWBpCLSs.
VFC8PVR0hHTUgdoxnm.KXgGBLXFEEVDg.hGMuJcpwBqKmNaF1Lsi.3LmInjU
3rNRrx8p0lxuT.4Bs0FXOOJF822E8buJpfZDQf0NtJIjl4oljejuWkTb++VP
KEg5uM2SYRmpkhdoRDcPbIGrlG8Fzqp+ye2bB5G9AD4ZzqQ5e+Zzers3+PSw
uxz9kYO9Jp2G9vMHXAXu5Ve80H8ezFRPwBeIEc8nlvNfe1GYV6Nri2CEPFQs
q1Rs8OAfAJMyz8MokYcr7DGsFU5kJod+Cu8L4WlIySXbv.NoJPEzZ7pvV.9O
FC3X3KDBEVFl59TBuEfzw6jEnyNklezQlxEF3xDWRO.Net.PIfHjHfSos9.P
0NE4DHhdIUX9Ji9vZUdv+v83RvIDestxcCfjSC.sqg5jO1AL1kxTk3zkfwb2
EFmhd0KCWnWK3kWeAsoSUmDcXkmfFv3zVS5XsG.nc5GN4haZLXwaMZElqSaO
zlJvNyvEQZzuy.oO0lp9I38CXWLSfSyxWDlDWDMSaHLA8x0Np+RzTvdf7ryf
4vJZy4jZq.aPpShhcZMr36fCpRsZGaw66jOZJrAOZJ1Cxx2UGRkFWzsDuu8e
FU3CdFUNh3Zd4OJKB+Qlf7hy4gEvPEi43avNmGV.wXOr.b7YjJXi9fSfOmCI
rwdtdXmUvXrmzJ11icqNX.juAHMhcRCedHswJH2N6+7PE3wJHeFIB5XORVL1
4lJFi9M547.CRkGv.xY6zogG8Qx5rdT8Njk8H+s74Ba3r480eE0bxmcTpnR3
3sSEUAi6IosI0rOg32lTyN4ZTx2wo3L.Jj5yA9YDS7AVW5K0gmByYbojP.PA
6LPQgcKnbWT5WcS11YWDQp7jbwp+vYfLRcTfcBbHosD+Lvk8MmvtQF5sNe6F
HG8rljdcTUscZ5YKO8FHQ81Sl5YMU8VmqdVSVOvGD8.3jNYH35PsqwXY8ELh
huJs8Vq3zZB6suL1auor2tyYuwjzdal0dzdkuyz1aW4s2tSbucm4d1Rcu0rj
0b2q6itbG0ZO68VW+.ou2VT1P4uGYchhZOC9rkBeqqavL3aGov2NxgugWC05
hnVRiOa4w2vIx2OEUF8WqtkPW2z8mReVxoutFjzOfGcpYew1tW3Y6ccBMbTj
1QXjF3HiXlTX9a6Izw9Bcz.Ix2Zym5XD2w.KSAsbcRx38rsjCGmnchL8zt7O
9iv7ciRyY+SSFE9ILHmp9PjvBTGJBZU02lgkqGoLs4rwO4C4eH8suEAKUTFl
hfkixydRO2Dlu7gzlJKuOtneUHnfzrRS9KtHqnDAXSTd7TXF+ynvoSqxgYD2
z73fss51Wjk1zf3Y57X.9czq.Ayxn7EE5neceX9BcaJtFUlgBQuLOJL4kHnG
uGkDeadX9yne7u9Sn2qCV9W+Y8auoGzwQGcOnYC8Pl9FFyD4bzxrjm+pIELa
odDwyWfdBMGzXEoy9Rfk0uw5V14816cVeSJU+Narfo+akY+s9dnw0uRzqu1P
so5O9me0SW+gRnGHnhOmWdChid8aggcz+y+8GR+UnU.y+CHE50nm9Gze5yvm
dUF5OhxzaI0e4+3+5m9KlxKfxoB8t3+Yn7OesovJnPFTl9M+ph5xxiL4hZF5
snJnfe6CMirfTEAZdMMEmRfVuFRe80nBXDMqpH4YOjdwJPKFL1fVDEVToSi0
aeF33RsFOOPV.FghJpS70LPwOpXZrdPdd7TcFvFAqSV9L5tpv7P3SQyZA4FI
CzhpoZfNJbIffOmUg.ElUIyPYZqiBAMrQ51pe82CKz.iL.vqaZZVp1UtP8qW
+Ncu9icoVUm.S6Pu5NzdfGkdAcblaxQAaJVslJo8X7NVprUjf6BF17ItGjrc
Ha1zq3Ai.ZeWy263xgSJjwRJrcPJcPpFKbBmMKV+BZu1OJAQ2hkY4lr7IrZV
bVQVR1pOrnRaCvVukHPTppnyqwz3kYOFAZbySpuFQ.aChtEj8W+oGh+xWhMW
xHIQEfly5Rymzyb5oP+mW+ZAWg3A5DVZ6egzyf0HMSAhZGzSuwYvpwCnGyA8
e0mWqOWE8onmqOtgh.NFSDLgCcbrHJAF4HHJnbia08QeqtO5uiC6JkX4vtZ6
7CSwA62+QyAm9l8+u1i7.4awSCrU.xomFXgKi3xWRLqTuFPFA6S26syCk56I
7CB7wbImgUTcps3iG4Qc050HfKGqwd.gpyyOpvMi5BIaji59hi7DMJnNFAbF
uyDij2YGMuyb5Lc2w6bQvYm2Opy2sN73Uw6Ljg5lzbKwFmAVBpSWDii.cOWu
iLnhMmxeqS6oR4Qx5DrbWmsar6zBN3Y8+fkHXV0DX8j+e7vB0sK.z+Bl9DWA
vJ.v.e08YqMQ.KTiD.tYPPf3PPvxEH8IFmc6vf0uRK72OLz65jtOL3xcZXf6
K5yATXaWorbiQOxoDAJ2teKVuMnGyDC1gBC114EKWHzG0kAcusfQ35soyQaO
GVLR8kfyQtaSKOpYMQeYV3zCguwGHea+Vxo9JRoyNnzy7.044FlxQpAsylDr
mhPn9bEkRXfYRfYBpQbUeriQTwQcEIsLI7Yst0UCpfgP2EC8QRT5c0aKx6Ma
LBZBHV8ohI1uvwHa7z5c2HqNL4XO62PpMa3yjOWE1d8vBd6VDOcGWlRLlEeK
quHT0Us4Eg5zj3k2Go24JylgpVQIKigW8zrb8at+NGNYdVRR1i0YEwJt.ebW
3W5+eVroKByedMzo2+pBc7Um1Bvqpxf.kUow56Ss+DXI8Z5JeQXZocht6FuS
1oEiM00dG21Gwss2zZLbfLAM71hrjpxHXf595q4f7nE2BBTu4e4e8e+M+aIZ
P94erB5f+4rm9wnjLuGCenyFIq2c6U69wQ7reJNsluMwFq9108pMBxYkjvvX
lTQ6TWQTxZLTKdqnAAh.AgSjXLWGFqtAFbh4B5sWfYmnyg7nzxOpiv8.YDzp
mZWY1y2QKIYyoNWtjDg3VE4KheZV1ioeEQNinhOX7pT+cFiB6ynbvzd4Mn.p
y.El5LXca3xkIOWmt3mwE4rZqOgDbjV3xbbZVAf9dLv0QvfMO+HXkyDQ3NNU
ql97zjnyplDaQK22cyY3tTQx7jp3YdlvBAFEkMMrLKG8N3IALnNXQ56oBz6V
+wCwaI9ABcTI1SDPTAfmiFqjw5aMEJ4.tBEGx+HNy4nVA3D47nPcdj8U8E2g
A2lO2jCEHJlCEn+DPm.qWTWxaH5+6cl7W+frAms2XxSTTOAWAXojH3.1QzW1
wXxId+Sx6Y3soE820zZbbyMnrAM2ZaI86kT6Cskj8R57MNHBaMDN1tly5lD4
CkzzcRl9itmnjQvjjNYI9Q2SafTCjC1RGvSlf0t2th2aGvmrHd1xr3zxFgEh
R5o+hdhp+ZJUgCnfi+LvoXsUEDhviukBgsZ3IxEF5ituQFL1A.1FPw.R5Atn
mjiPvlybf3VvAHBbZczXjqkBGzSJcO4umdJv2U8jbe8jy3I995Itq5Iw95Il
q5o8MyMf5pdhsudh3pdZeSbCvtpm127IkKTFoFyxD0GhIxPqS.18s8ZAbYfG
I.6uJth5PYvYjQ0xSkoFyB5bWrLqTLlAJ0tVkE7IcaLwmfsrQD5uQDLMUo7k
BBQxOrlxBHV70wmYtFE1ttssnCe9AKiEmjSGrXBpk.jL5VpEJ2ZOOnsf5dZo
qMEVxGghG0tAt5MwxGb0Gnatxm36iwRk4dRhZYVokVdpyU3iY3OXWbAUYxRK
Ak4QITAOfikDh9qtUMWv2lKrzxSkKFichRWrXsjNFcKtX4F4kRco+XrHU5Bq
B7Iiv9CkzU8zd8oKvU8z9TCH3tpm1mMUBlq5o8Y6qvIRD3wp9A65E9DAGhQV
mVWMl4xR0YgKGSWKFnqoWntl350lE7S2.Ztev2VFPKXNvq.t3aLlh5.lxl8m
+eISwGijuShZ0nCR5I2SiQQM2E8DaTAHyEVXQ7GiZYWrfJgLVmrN8PLOlITA
JmzUiwzGehy5pwol3z6K7n5qs4q5M1YiKdAc2rw0svF2zBaeIKL78qvlWsBl
iL0Pe6Gc0uc0+K3MqlZJ
-----------end_max5_patcher-----------

Yeah I had no luck using the voice inputs. It also didn’t really make sense to me to have to use them if you had the amplitude anyway, but my understanding of why you would need the voice information for just making some sines match the freq and magnitude is in tatters :slight_smile:

I guess the amplitude outputs are limited by the hop rate, so they couldn’t do the fast fade in/out/dip thing the state bit does, otherwise that would be an ideal solution since it cuts out “the middle man”.

Trying to think of a better way of doing the fades as well, like an mc.slide~ or something. This is easy enough for the ‘fade to in 25ms’ states, but not sure how to do ‘instant zero then fade to 1 in 25’ with a similarly set up mc.slide~.

So trying to understand the states better.

The voice states are:
0 - free
1 - attack
2 - sustain
3 - release
4 - steal

With 1/3/4 being “trigger” ones:

Voice states 1, 3 & 4 are only ever sent once per event, immediately falling to 0 or 2, and can be used as a trigger.

From the looks of the poly~ that basically means states 0/2 are “ignored”, with the version I’ve built in mc. sending a 0 for state 0 and a 1 for state 2. That seems to work right, but I’m still getting some clicks happening.

The reason for adding the 0 and 1 for states 0 and 2 respectively is because otherwise join kept spamming the last received message, so I can try and restructure that part so it actually “ignores” states 0 and 2 altogether as well.

Just trying to wrap my head around what should be happening.

  1. a track is free with 0
  2. a track just started at 1 - that will never be longer than one frame and should be followed by one of the other greater numbered state
  3. this means that the previous frame was on (either 1, 3 or 4)
  4. this means that the voice is now off and should be dealt with as dying - it’ll be followed by 0 if there are spare voices, or by 1 if it is reallocated
  5. this means that we ran out of voices so a voice went straight from 1 or 2 to a new state which is not respecting the track conditions of min jumps in mag or in freq (so a special behaviour can be done for a large jump which is flagged here)

I hope this helps

1 Like

That’s useful as a clearer version from the patch. But that’s more a description of what the states are.

As in, in state 0 what should happen? It should be at zero gain I assume?

So:

  1. be at a gain of 0
  2. fade up from zero (in 25ms in the example case)
  3. be at a gain of 1
  4. fade out to zero (25ms)
  5. fade down to zero (10ms) and fade back up to 1 (25ms)

A follow up question for state 4. Does the fade down take into account when it sends the new freq/gain numbers?

As in on any give frame, when state4 is sent out, did the freq/gain being sent out with it correspond to new values already? (meaning that the 10ms fade out will happen after the voice has already changed)

Or does it send state4 a frame ahead of time (or something like that) so that the next freq/gain pair will be the new voice, therefore allowing you time to fade out the current voice?

it really depends, as usual. hence that interface…

  1. that voice is dead, so the data in the same position in the other output is the last valid but not updated. that can be useful or not.
  2. trigger an attack sound? random playback? put the lights on? you just know that this is fresh. chose what you want.
  3. this is a continuation within the constraints of track allocations. so smooth the new data or something. pitch gliss. mag slide. the other outputs (freq/mag) follow the previous frame’s values within the constraint and you decide how you want to deal with that. slides is the conservative choice.
  4. fade out in the length is the conservative choice again. but a trigger of a new synth and lights and fumes on the 73rd finished note is also an option. you just know that this voice might be reassigned and you must deal with it.
  5. this is the crazy one. indeed your proposal is the conservative sampler option of a deck voice (quick dip to avoid freq jumps usually) but again that can trigger many things. you just know that, by oppostion to 2, this is a new stuff/big jump/unrelated to the material in the same track in
    the previous frame.

I hope this helps even more.

2 Likes

Gotcha.

That’s quite useful in a more general purpose sense too.

I don’t see how that would be applied if you always have to give it a list of frequencies and gains, but I guess what you’re describing is that there would always be freq/gain inputs, and you can then choose to do whatever based on how the voice allocation works.

///////////////////////////////////////////////////// thinking out loud /////////////////////////////////////////////////////

For a second I was trying to think of a more generic interface where it only takes a single list as input (laced or delaced but always an even number of two lists) then it does all the voice allocation based on the input (either on one or more lists) then spits out the data in the same format it got.

So if you send it only a list of freqs, it will do voice allocation magic on it to keep them close/similar/whatever it’s doing and spit out the freqs in the order you specify.

If you send it only a list of gains, it would do the same.

If you send it a list of normalized floats between 0. and 1. it would do the same within the range etc…

So it could be more input-agnostic, while still doing whatever secret sauce it’s doing, and if you send it the output of fluid.sines~ (laced or delaced/whatever) it would operate as it presently does.

///////////////////////////////////////////////////// thinking out loud /////////////////////////////////////////////////////

Does does this currently send the “duck” ON the frame that is to be ducked or BEFORE the frame that is to be ducked.

As in, when state 4 is received, should the current example fade out at all, or should it immediately drop to zero and then fade in. (speaking in terms of the current example in the documentation)

From what you’re describing I would think it’s the later, with the fade out in the 0. 10 1. 25 happening “too late” since the voice would already have been reallocated.

Exciting object! If I understand correctly it is for reducing the output of fluid.sinefeature~ to a lower dimensionality with the additional reporting on how the content changes over time – right?.. So the difference between a fluid.sinefeature~ 8 and a fluid.sinefeature~ 128 --> fluid.voiceallocator @numvoices 8 is that with the latter we not only get the frequencies and magnitudes streams, but also the report on how the tracking has been changing?

In that case, could it also be a good idea to include the same tracking algo + the 3rd output stream inside fluid.sinefeature~ as well? (Could be especially nice for fluid.bufsinefeature~ for offline stuff?)

As I understand a 4 is like a 1 when it is not preceeded by a 0. So, if you interpret this as the frame to “duck” on, then you duck on the first frame of the new track. If you want to duck the last frame of the previous track, you have to set up a 1-frame delay, I guess.

Do I understand correctly that a 3 is the first frame of being 0? (And not the last frame of being 2, right?)

What does @trackprob mean? Like, when it detects an event to start a new track, it will have the probability of @trackprob to actually start tracking and 1 - @trackprob to just ignore it?

I made a quick’n’dirty visualization by stacking multisliders, but I am thinking of a more elegant solution… I think a visual aid could help people form an intuition about the parameter values.
fluid.voiceallocator_visualization

<pre><code>
----------begin_max5_patcher----------
2884.3oc6bs0iaiaE94Y9UP3GJ1B3XvKh5RPeXAJPA5C8oMnuroHPVh1lIxR
t5xbIK17auGRJYKMVxVdLkGramfDOCon4gmuycRp7a2e2rkYOIJlg9H5WQ2c
2uc+c2o6R0wc0sua11vmhRBKzCa11pjRYQhLVjOat44EhxsxTXTl4Au.OGQb
fef9O0iHqpLQTV97NgYHylMG929GubcTVRVdyWmNuyGGllnvzXI7gvsYndrN
+QObFmF3PHdtNdXdfpKOeeZqdgUWqI0vKcV.XpmCGG3iYATB2SMEsZ656pID
GyaOucmUYrFsxV90OvYM.0tv7vshRQ9WDogKSzfAt9YoU.FBfjFkIGP1hxmM
Cz4v.Mvodjz8ScYzFY55ujKhJM7gO2WIInA.NxwveXXGlimOG5y0SKjn5krZ
F986uW8w720B1u.5Nbhdk3vHLOJ2I.SBb0cQL+N1yW+rg0BnuqE7GQs.KLqs
zBb7dWKvlZA8Hv3uTT.Vx83OusgL1eXA16NumZAlSSTUkTR6S0ss.D6pmg1R
P2fgkWu6lcpkWs78AlZNZqo8xOkLR2k2ggnDlCKvvuKvlZCrVYtR835bWaKu
XlPXcSwcPAFK3OeBrTwi.q0vWkhmzzbVU5WyjoH+YmTDcp+0K.te95Ej5BHA
mGPbAtl3wBH0.BEPDBloQj.6BHqJy1NLXzKyxu.lkbdlk4sPweL7UwdukFns
.G5eBMkhx1tUjVdjpye6Cn3LTZVIZUV9ZQIpLCsRl.rLpbi.kKhqRiCSgGqP
hBzOIdPj+Lp3gB0yyEHYAJLEAL3tpRTXAZG7MMi4ejT82y9WgnXQQTtbWYV9
esg7IxTQTVUZYaDokDfvt.0S7vHJ22.attKTZmdZqOpucs99dBJZSX5Zwrwo
Q11LrW1jdoJNbpwshGQ8Ct6UYDNjlxO8PlLRDljjEEBxRjtYwdQZaomqcjdD
vPP4zjFrPEdjP7MbosYrcYIO+iSwOb6vOtNsYGuoga9DX0RQlUIJaEZURkLd
wKjchm1AqJXbIxByvD+2pvDThHcc4lhEH0rjHVUZlHkQN3d.7A.CSjFIEEyA
q9XiKB45M6GQTVdtnXWVZLv5nsgqSkkUfCfEi0xm5YKr13KESVPYTnTR2.tK
mR7rfefgf9eA7PhByWWodZgxYnA7K.dt3GfmwvuANCKg0nLKEElrNKWVtY6n
cJRsCzvXDkdH3yPmRhq+T3TrDsDkLnCwkf6xAcJdZMfMx3XQ5vL9IbSxn5nA
NX+i0I.iR9D3z7SPbPXwghkqVAQKg3nOF9f.ofhBUn1Bg.sI6w5XsQYoEk4U
QkhXTAnIDWGXY.yG1wXmk77pSdUoTvW38Rjhv0VOLKmC6tbwNAvw5UiHOErk
trTZ8nWkdC4r5MLOui0aHrqKZqxWQ0fLpToRcT9Ckhs0mMzLUnqun8ur.lVX
sqF5b0G5mTlK6+AEgONvCf3.4GlsdAZxqN83tPN6rJfLFqGHmSljDbTw7fEn
IO.TXI.dKqJEPLszx7rDcBunB42Ep3kpeuNoWcLz4HYIJJLUkI8RHq3znbQX
gPoOWTBABeZ+Lahb1tG02Ckkl7r5aBUP.zFA.sJBsZVTQK52AfSO6aiikx8B
qSVg4nyUgRzV.brcs4SxBighJJNUo78l1LdxL080gFc0gF8vShd1+rujxxUt
+ExGD5xojoMJVn0JM.c0XP+JstnpbcfjdTUmCC.RDSZTU2kKUIX7LLanG2Hi
1n6s46.ktAyXbhHdA5WjakIg4p.RZ85bn.7VF.5T+1mIyJX8TkK9wX0HoVJl
T8VLPbwKHtNtLGJ0yiS06IF7aWk94Php+sBrPEkfDn.VwHF5ufbzXm1bUUmK
XvBBirTXb0k9lVBNCf4KVBeMXTq.QrJaX.cw.1BYnn8.nL5A68JkSBHUwPD.
2qWKxGsoN0REI65qy.jAV783q0eR.1O0nI1.t.l9wOmhQePUjg3yoD32.Mvv
nu84TJ76EUv.koeNkAMxEIJmqeN0Q8jRvFpWLysGLiXILCqC6S6Kk.pi1ugG
cBvLFpd80D7ArsMlqqxy1ZJYCzyz0j8wt0qcnXLi9Wa3e7kmgsK94PFD+d0U
jH9dbXzO5oNdW5I2tEke3jW21LY1+EGZObiiNYEmW691srNe3lU9CRwiOHKj
KkIfq81q1rUqfbGZsMos2cSf29lHNNObcQDjKSRaFJJQF8sxM4YUq2zteSNc
aN9KXdvCG+.CUToH0t2kq2lE2sGsJa6dNJtegbcpRZzv.55AT.RrXalt1n8o
udbgx8JlwWZt.M6pFWqMR0+Hf+JkiEpMbIOqHJa2gPmiKaGh+ErKgmfe73dG
3GF1jbCF+FvPd1gg3tACZ1c0724RYsLTuc43Kj0w14bWbn5sFs25iB7ttyXp
Z6xC9a5cur0aeSerWfkpLjdtLz4N5jA43o33zL6G7gRqmMVmTsKQo+jyXuRm
P8t2CASB226FF+ycpWkxcOYBCm9.Y68H2t.OBNmEs5cWeIfG75inz9vU6Bi.
J4qArUqJ0aW.E6.cnZAfBrfKL87Ah5u+rI8MxqDP6ELujyqfc9.fzfdRRqVu
70hlppKqjiv4oZfM9kLpe8Ew2wRNdNgkHALA0GgefoNTGmqx56xAfA4d9zy7
liL3si2q2KCITr7vvPvM.GLaBgJavg1DhaHpTlC0GqJxKu8wO2d2.uEpFLMa
G3u.plq4tt.NKT211qL97qDQfJcGDPbuY.RutMeiPjc4YK6CM7ucngKdADy3
vsgJf7VfF.mnAjDQZe3QvMCObq2MyaNBrTlWtII6QnfeQwlrj397jhuc5EAP
pZDk0QstwaGnrQsoYmBUH2LTgRoKnX2VvhE7ltKLUreiRMaAS2Wup4s9XfaY
J02RGvrIAByoKwvLc1ELdKhdXOhZRB9k6hD3h2.8T8A0bYW2Ovi3trb0Qqom
xE72H.0R3Iq99KX.Th41Bp1cU9+uAnTGqpgxIcTQUmJ5ejPzK2UnYWv6I13z
67yk3ZtYI0UuGfM+wFAJ6nZ0lsrzAB8Zt6tZvWWv+KdUe0yup+tLTQVUdTin
q4Jqi71KCiEEkxzvFMle8v64JZHP6hnj64nD0VTheFJode8rCkbNGkrF5wNG
krF5QOGkv1hRjyPI0KkhcnD9LThZEJwGAkZVNWEknigPcWMGNyrqhxNifxt1
PULXDDpKGtUFuKCJPq1an4F7V+JyXNFUciiQDxjuPINidkRpemC5eodcBOuw
n230YLstLTWGoIivd+EqOqQ6Qv0ACQ49EYLl9UBwgWK5z5XcZ328Saq04MF2
mrKjobLWvYNum6gP8gkdhmwb64Pl3Lp9XSN9YWo+gwHTI3WoTsuqkCmZ.fge
F0m1C3vvm6YLF8XvwtV97w3khdYnkiq4xcx0k53XN23tsHA5aKPsR.4DW+gQ
yHD6yHLGsXmx4lkdfgQZ2ZBXD7zwHlBgZXjNsl.FYL4hbgdhpCWynGbn1oA0
7VmTyE5VWIW3DLYhCy4rWaQzoAw2ssvP05ZYC+IiMH9rNKV10uXcmtEq4sLw
IvDRtaK6i57oiQpuaf0JLcaYcF4E1omN89WFghdiHMw14RMJRS7lhxoX3qI2
zqiziWm85pUcTAHrEgHifiH2hpuY8qtPtZJOpr9sAKRGCgnWIgHN120YSIzl
WzK0YabTq8Y24dbK6mhDAe4ZLuLin5REto0XMpbs4Sgh9XnLw+xTKZDnDy+M
GTmVYmV5nqd0+28v41+Ey9uGta2Ch7h5kllglsM7qlCnwettoL0zjqalKT2.
ey3M8DlGsQpdwtqxM2R8mbMmWh9DgxSqj0HJ.k2qtw8gEEpazdwtPCpoO8h6
+86+eZdSg0A
-----------end_max5_patcher-----------
</code></pre>

1 Like

That would be cool.

I imagine there’s some “extra stuff” going on here in the voice allocation so it fluid.sinefeature~ 8 would be different from fluid.sinefeature~ 128 --> fluid.voiceallocator @numvoices 8, otherwise why have it be a separate object at all.

This is what I think, but in the example poly there is a fade down that happens after a new voice has been assigned. Rather than instantly jumping to 0 and then fading the new voice up.

To simply I’ll use some MIDI range values for a single voice, presuming three columns of data (freq, velocity, state):

64 127 1
62 100 4

So there’s a note, then a new pitch comes in “steal”-ing that voice and becomes a new quieter pitch.

With the poly the way it is it’s doing this:

(already at 100% gain)
64 127
62 100
(start fading out NOW after the new note has started)

I would think that sonically it would be better to do something like this:

(already at 100% gain)
64 127
(start fading out NOW before the new note has started)
62 100

But that would require manually adding a (multiple) frame delay, or having the object report the changes in that order.

This is super useful, if for nothing else than trying to hunt down extra blips/boops.

1 Like

Here’s an updated playback one with mc.curve~ instead of line~ and doing the thing where it instantly jumps down to 0 before fading up for state 4.

This seems to remove a bunch of errand clicks and such.

Can’t tell much a diff in terms of sound from curve~ vs line~ but my gut tells me non-linear would be better for amplitude changes.


----------begin_max5_patcher----------
5038.3oc6c01iaiqc9yS9UvqQQSlbmnkuJRca2hbuEEEWftEKvsneIYw.M1x
ynMxRNRxyKYwl+S8uP+k0CojrkrorjsoMxd6NYylwjThjO7vCOmCeH8u7pql
bW1yQESP+IzGPWc0u7pqtxjjNgqp+7USVD97zjvBSwljF8T1c+7japxpL54R
SxeIAUjDOMBQZxJc0h3zjnRyiQ2jX1pxsScYX4zGhSu+17nokUMFlj4En+QJ
YBLkwCBtAwDJOelPJwRANPovB0MHeoG9FDk5gQ+T86qpJJeYYT0Kaxjaf+tN
63YllLzMdGAGLQm3u9pWo+e2LRPXQTQQ38Q6fBGRmmzemmGH2syy49d9x.eN
m5qjRtOFRjF3IFryasieLc6dF6KhRPXDAQQLD2JB3aEA72CBPIVP.L0yeynO
gw3PeGGL73+cgo2qkAF5esBUTWJgfcjDhU7woRHLm1suAQ7PTA5cXOonI6k4
QEQokgkwYo2lDmFMMaUZ4V.xIfRBaJQ3xfcQI4HDhrhRbmhRGBDwbCDwDiTP
x2+HgHgS0vd4gHtHXjRQGMD46PswKQZL3GCm9IqpZHGZ2mxrz8YDtmOgoXrf
.PCLWpXP2mOb2ewpjx3oODllFkTDeeZXhcctqWI0zhhxqwgZf3pIyiShdLJu
.Fya09uZR3xksR9pVOhF894LyKRcy5jhSqRRrNo7nGiad9MoFlC3RI.JqxMc
kIO62rTm90jMKJOcUrooTkHLNV2jLiXogfD8xvoUOrdfsI6VyEMJgH3JoHBV
+ObFdCbBRD2mjM8SQFfB2jX1xnz3z1SC5j8rn4g.pe67rzxh3uXZADXPxV9y
qagVyT2GLM++bdLLt0Tj6yimkkpaDcFIzI2Tce.QDl9lncmwThzvkVdXPF.f
kdxr.5jqJtKLWOPcWRTqY0v7frrjtYs94RhlWVm8xXP.rKJVlsr+Lyiu+g87
r2kAYtXeuaSNE2tJsJ2aAYhxaKBerKZWFljTOst6q+4vz3EgkQkwUCAT75Li
RCgN5CESyyRR5zeqx4QK4LCjwmF8T7rxGLUTagAn3wKaDhlrdTdV78QEkcSq
L79htoTT9REn2JoU2UOG91xnEKSfdQ2B.yNhKJKdH6oh5B1Hn0F.13kR64zs
0Q1I88oqbK8kflRzbXZW6bsshQ+pM6S0oRYD5AqPvblBTeRjRkuPPtALMYac
kCrbwNFvqlzjtYciZcNtGe94r3T2CMbbkRN.F7EJBlJ8gkSUToMG5NTngcgf
lcb58P.H5X.HBX9NlRBX9RgREv.X5..na1GHwuPfTBL4d9J8586AlHmlbjxr
5xtleYGWzsn9wEwEBWf0qgE1lgJhJeLLYUz4Ban9DOr1DUIlI.Ohf4ZZiLHm
5jL4EBmVL0SaP6WQuWa1XARcDy0XiAnXXgGAG3qXx.vCHelTA.EYj.kECauY
nofTWBgFbnWrAeJBQs9gp0PS4FOBTvJaDJUvjBM5UggGu.UP6F+zrEKhR6Zu
g4ARmE8bKyrcBzU0HOhIf3QIW4iMxU9zZ3x3.kc3psKP3SFO1XpsdFTOFPYZ
257sCTEYqxm1L30LNg51pAiFKiSW64wGVqI0TvQMPcvsB0XaELnfjyUqPN1V
A8bhEhw1J3myVAuBnGtUnN2shQKWb1ZErw1JjmyVAcjsBspldZE0I1DMiIZW
Vmcak642FVVlGe2pxJUKsCOyA4F48IY2Elrkue17x7UaZbGXrxZbAsIpROFG
8jIDAwIwkuzNBXYymCVjUANuyDPq2wZEPqpvuLKGZSqcqtdUfISAeA9T4C4Y
qt+g1ouiG5cy3wcynpVZhdRSp2cuNNScRIKeVUrwv1h0Gduw5KL+95kDl7dc
3zLaDR9phGhJ7Bimq+36SxxVpmVq+8GyRZKOYaAu5XWIpifkIdVpf8EOvsiA
35g+YQKx.I5zYdv.ITUS1MHgxiIpoIwOF4ULMaYzWadk4go2W2ddGrTsdqJH
aZPmTriI3sBdLlyuAIILOtuJPRYLJlHDAfWcALCZ4O39XYKdoAhu8wh.exEA
J7+1GJT9c2XJpjbVfB129PgzWbQfB929Pguu7h.Eju8gBgevEAJne6CEboks
5+L.E3u8gBqjBx8PgJvgaG6hodqR06wvWWG4pwrgrpCDE7888j5.Dqv9LJGG
nj.zfqBTSyOB9fTAYSnqbvuYEbUGC3VrD594qV.Fd+zZIM6anYWzkuWYrd2U
S6pmYdTQOa8OGLyUx2x3FBr11VgdcLDCvxFw1wrWkCEOWk1Z+cFifIaOLEPU
sk0AXOILQrYWcTJ.z7oijkd8wBK4wu.9rViqOFtwCycxbDce5fceFHIrCK03
lMnfqFp6OOIKrzNg872HZlC8fxn7aq7ercisx8709kuGOzM64P17cYIwlWeR
V586BVef7SaH9vlBu.vcSKAuY2jamewCY4alqcmYC0SifgIKksATr8dVkFWt
dWlEupc7JNpHCzKKZ1oIdp7nod1gMtUI4GIwgjr+eHOY78MAVfQM5TDTybKA
2+2IJyuSTlemnLmMhx7VvRd2SDDBrznd6CAa0kDkhKXU+n2jZpZatKaW0X2U
MsS0cGsUgM6CmM.5+J7SQnxGhPwoPwftYq0PPqWACElNCApGSQwkPIKyLORd
zmWEmGMCYVWt.MOK2j9rhkHCeVixg2PIRKUjixR6LRzgzqbmuMlvfgQeKoiy
DfCWZtMY3hh+d1GS+KE7qo0AJaN.a4QQswwViB.b1KvQcNvUsNEG7WiEnDB+
5eDZZEXVwmw5G2tT7y4sZsZD2OwlYjLTPeucmmIuogWJm5zZL8RIYYwZUGKi
v72ctUMcp2GEAtPhHkn4n4GQWmNFIDp.LHNHfJUMZ9EUp9O.YjaFRXQ3eoX0
UEaRmetlOY3CtPIw3ZIEkAsjiagx9wmK1bIHOvL0BXYLziYIqVDgVUnWpL5Y
vBV3g.ClQQgEQHnwiluJcpwBqKmNaF1Lsi.3LmInj03rNRlxA0ZS4WJfbg1Z
CrmGEi9GaidtWEUPEhHvZGWkDR87TCOB4Cpjh6+2CZoHT+c68TlzoZonWJNc
ChK45Cj26Puo5O+CyInu+6QjqQuEo+8qQ+wlj+C0I+FS4Wl8zande7i2ffEf
8pJ80Wiz+QaHAEK7kTz0iZBaO9YejDfseGu6KfLhJWskZ6eB.CTpmo6aX3XU
r7DGsFU5kher+gu6L4WlgDGLNX.mTEnBZLdUX6LkdLFvwvWHDJrLL08rqtAf
zw6jEPzmDtpezQlxEF3xDWRO.Net.PIfHjHfSoM9.P0NE4DHhdIUX9Fi9vJU
dv+v83RvIDestx8CfjSC.sqg5jYvOicoLUINcIXL28gwon275vE50Bd80WPa
5TU7QCq7Dz.Fm1XRGq4rzrW+vIWbSiAKdqPqvbMC3Paq.6LCWDoQ+NCj9Taq
5mfGFvtXl.mlkuHLItHZl1PXB50abT+0nof8.4YmAygUz5ibzNA1fTQ6f8ZM
r32.m4iJ0N1h22IeJOX8dJOrGjkeScdOpcQ2R79F93dv683dbDw07xepPD9i
jq4hy4IgvzJFyYPfcNOaJhwx6dN9L1JXi9b5fOmCIrwd3TXmUvXrGHC1ticq
4XO4aflFwdSCedZZiUPtY1+4oUfGqf7YrQPG64MiwN2shwneidNOWQT4ALfb
1N5c3Qe5lNqm2rCYYOxeOeDq5m+qu8qn5CQrite7HXKWZUBF2SRatiM7Ij0z
.1I2HQ9NlTv.nPpNR0mQLwG55ReoN7TXNiKkDB.JXmAJJraAk6iR+paXamcQ
DoxSxEq+CmAxHUQA1Ivgj1z3mAtru8D1sXn2F910CG8rRRuVpp1kld13oWOD
0a.l5Ykpda3pmUx5A9fnG.mzhgfaB0tFikU2UGJ9ZZ6sQwoUB6MDi8Fjxd6m
ydigzdayZOZmz2Ks81Gu81Ow81Oy8rQcuMcIqb2q8itbO4Zm8daxuG56sSKq
O96Q1PTT6L3yFE91jWuL3aOT3aOb3q+0PstHpEZ7YiGe8SjueLpL5us5NBcS
QGlReV3zWaCR5FviV4LTrs6Dd1N2LO8GEo8DFodtGaMSJptaMsRnigBcTOD4
ai4SsLh6XfkofVtVjLdfskr+3DsWjoi1k+4e.luaTZN6eYxnvOgA4T3pPHEn
NTDzppuctrWamwz5iY9jOl+wzu66PvREkgoHX4n7rm0yMg4KeLsNyxGhK5lE
BRHMqzvewEYEkH.ahximBy3eAENc5pbXFwM0ONXaqt7EYo0EHdllGCvuidCH
XVFkunPG8qGByWnKSw0nxLTH504QgIuFA03Cnj36xCyeA8C+seD8Acvx+5Oo
e600fNN5nG.ManGyzWVWlHmiVlk7xWMTvro0iHd9Bzyn4fFqHM6Kgtr9MVUx
Vu2NuypKknp2YsELceqL6u0O.Et5Uhd60lVap9i+42770erDpABp3y4k2f3n
29cvvN5+8+4io+BTJny+8HE5snm+mze5yvmdSF5OhxzaI0e8+7+9G+qlzKfz
oB8t3+YH8OesIwUPhLHM8a9MEUokGY3hZF56PqfD90OVOxBRUDn3Uso3TBT5
MP5auFU.inYqJRdwCoWrBzhAiMnEQgEqzzX8tWfdboVimGHK.iPQEUDeMCT7
iJlFqGjmGOUy.1HXcxxWP2uJLOD9TzrFPtVx.sX0TMPGEtDPvWxVg.ElqRlg
xzVGEBZXizkU+5e.VnAFY.fWWzzrTsqbg5Wu9c5d8G6Sspl.S6Qu5dzdfGkd
Acblq4nfMEqVoRZmNdKKU1IRvsACa9D2ARF1q3diVRWWyGbb4vaJrw1T36oo
zBopsvIb1rX8Kn4FznDDcKVlkaX4S3pYwYEYIYq+vhUZa.14sDAhRqJZ8ZLE
dY1SQfF27jpajCv1fn6.Y+Me5w3u7kXy80QRTAn4rJ07IcLmdJT+4UuVrW.O
PSXoc+ERGCVizcJPT6fd5sNCV0d.8TNn+q57Z84UQeJ5kpiaHAdPh9j55PGG
+RhQK7laK5S6qdflKfWpumvOHvGykbFVQ0zVvGeBeYCbTQPPG.HvKr84TrtH
0WofwYftN8FhZVpq8IWajtMCdHSE8z4oR4QdL0HX49N8hX2IKz6oY0MG1baA
Yx+3QEWNKvx8r4IFCE6eGbX8l+dDW74ct0M6BCtLJR8bsZdNfBqgSxxMq4HE
GBTtMXZfc1Ot60lYWffcnmwa6W9.1ByHgROp.qs2CAtv0Ag8LF7UqmCdhvgg
j9nl2D8kYgSOj9M9.62RA2SUcWbX55BlZ8AfuU7w5b7CTmmabCxYLXxRB1SQ
HTethRILN0GVhTMhCx8dFQEG0UZ1xjvWzZWWOnBFAbOXfaRRT58UA85ClvdA
loFO8SESrecrP15o0wtJqJHHXO6Wkb0gyaxmWE1bO5M4tvh3o64Zzfwrbe1T
ciwoyZ6aLtoIwKeHRGWRSntUqaIKigW8zrb8atabgmLOKII6op87Zcu.ebW4
I5+NK1TEg4urA5zQmrP687zF.dcVFDnDL7Ue+x7mPb9l1U9BvCW6M51aqBYu
VKUmWykAXWD21NOnwvd34S3cfeJfyIv.0CUGh07nE2ABTu6e8e6+3c+6IZP9
ke.7QY5eI64eHJIy6ovGasMA58tXcrsNhm8SwoU8aimOUWCguZKWXWIg0UvL
oh1JuhnjMXnV7FlEx8YReXNolrwZuTZ622DyUYXG+tmnoHXTZ4s5.XzyF9t9
o12F29an0jrc6S3x0jHD2pIeQ7yyxdJ8qny4VGa8xSJf5LPgoNCF3BtWm7RE
a.OiqxY0beB4X+5xh43cQG.8Arv0Qvfsu4AIXkyDQ3Ndmzm9xzjnyplDaeY7
46t4LbWpHYdxp3YdlXh.VEkMMrLKG8d3IALnJRI5igL58a9n5.fN9ABcTI1S
DP1bk0g0GJdJ4.tgr5yAINy4nVQbZz7nPMMA9p9bYavs4yMaQFhh4PB5OAsS
nqWTkx6H5+68F5IdPFgyFLrbDE0SvU.VJIBNfcDlVXjbhWuX7NVdaJQ2fhWg
iaG+4ZzbmnNq5vYw9B9cKhosyH1XqIczSFtpzeOmd50k+npoVLc6nqI9EqlD
WrZhbwpI1EqljiA97wsYs5jEwyVlEmVVO0BrsviuiEYBwtgViInVrcazkjCU
zNwigxC1s1sTxMpU5vF7yKvo5P53sX68QW0ApQT0RgSzMELZIQ2TWjApKWTS
b8zK5fcJrqppA6SDWUSCtfUfc4wSap.eLKfwcRmbTpfcQMoky3C0kbT8vFnd
DNpdFRNz2Q0yfRgNpdFbJrCpmwn+i6hNjYoB+Apo.eWUSxgpIgqpoglEEvcU
MIFplb13zPRdATWUSCoaHf3pZZHsCAXWUSCZ0jKb0QMlkJ3RGTSR9HPO09Mg
t5KoPerxCrfkq7I99XrTYNv9JeKlWuaIcQuXPGAB1WufpLW6.BJyiRnBd.GK
ID82Di5dgEyzsTxSsWLFqfjtPiibLqzobwbF4kRP1eLK1IcgpMe7XE1N0ZRL
FzS1UqzVh0DhXWQWImZYyiUdDvez.kxWJHDI+PJHWx2cmc7kTOovZlt1J9Qg
ThdbnkcgpZxtUM8z7nXLUsKDDMUDYLVRdxAOZT1r5BMSrwrZtvEplni1wuSN
HeiIFoRWXIIgL1Puc5gVQd.twziVPkznIhJB7vJb.UozeuAy06zpUMj6VvSt
WLlkbC1Ml7UaFvVmEScsr0IvbqCe4tm6x9OxkaeZKMrntuuPDd0u9p+O.qGP
c5.
-----------end_max5_patcher-----------

yes but you can trick it - you can just give steady amps for instance so you only track by pitch.

there are many other uses one can think of. If I was not crazy busy on my workday job, and then all my other time doing intern supervision as hobby on the other many things, I would make more examples. this will be for the autumn…

so now, 2 things:

  • continue playing or not, but please do not expect support more than this level of terse explanations.

or

  • we can stop the experiment and I go back to trying objects by myself for 6 months before giving it to alpha testers - until I’ve done many patches like in the good old days.

I’m saying that because the other bundle of objects that is cooking has a lot more stuff so I am now afraid :sweat_smile:

1 Like

that is a possibility. or if you ask for 10 sines, or 10 random pitches, or 10 formants, or whatever 10 combinations of freq and/or mag, you can get them to track. if you have 5 voices, it will prioritise the way you ask. if you have 50 voices, it will pile up and do voice management in an elegant manner. and everything in between!

[quote=“balintlaczko, post:33, topic:2085”]
In that case, could it also be a good idea to include the same tracking algo + the 3rd output stream inside fluid.sinefeature~ as well?[/quote]

nah. it is made to deconstruct the algo, not to bloat stuff with redundancies… but…

there will be in the next months a buf version of voice allocator which can take the buffer of bufsinefeatures or any other source. in the meantime, js can iterate lists faster than realtime those buffers for you to use the in-line one if you want to see.

yes, it is a special 1 that was not preceeded by 0.

that is a fantastic avenue indeed. maybe with 4 voices so we can follow but yes. @fearne you’ll like that I think

1 Like

I’m soon hoping to release an SC version of it for people to try - again, poking, alphaversion style. Pd is already ready if anyone wants it.

1 Like

If comments aren’t useful I can definitely hold off.

I would, personally, prefer pointing at potential interface things to highlight things that may come up later on to avoid fully baking in an interface that will prove to be problematic later out in other (non-PA) use cases (cough managing/creating your own buffers…).

For example:

Doesn’t seem like a great interface decision. Having to spoof or fake data/inputs in order to use something.

I guess I would rather flip the question around.

Do you want feedback on objects in progress?

as long as the feedback provider remembers n=1 then yes… divergent uses, attempt to own the current interface instead of imposing another one (since work has been done there so previous n is > than just me) general shared enthusiasm for the hundred of hours behind the early release… discussions, questions, pokings.

but again, if the object is useless, it might just be shelved so yes, feedback, but maybe not phrased as demands?

creating you own buffer is not just me - try teaching this, and you’ll see that they are needed. after more than 50 of those, I can tell you, and so can tell. the automagic stuff is advanced and abstract…

so voice your ideas and patches and roadblocks and we’ll see. and I will most probably park the next series of object until I have made more examples so the (as usual very carefully thought of) interface decisions are not dismissed as 'p.a.‘s taste’ :smiley: