< Back to IRCAM Forum

Spat5.oper : Source Presence & radius : questions & issues

I’m having hard time trying to understand how to properly use source radius in spat5.oper.

First of all :

I’d like to understand why Source Presence (which is a Perceptual factor) is changed when source position (distance) is updated.
Of course perceived source presence (or gain, volume, … or whatever we all it) is affected by distance to listener, and low-level messages sent to spat5.spat~ do it perfectly.
But I’m really wondering why there is this kind of feedback mechanism in the UI that modifies a Perceptual factor when source position is updated.
And why only this one (Source Presence), and why not other params such as Room Presence ?

It sounds very counterintuitive to me : a hi-level parameter shouldn’t be controlled by another hi-level parameter : They should all be combined to produce low-level parameters.

When source distance is < radius, distance dial becomes red, indicating that source presence is clipped.

Position  Orientation

When radius is < 0.4 : it becomes a problem : If source distance is < 0.4, Source Presence is clipped to 120. ; when source distance goes back to higher values, Source Presence decreases, but as it has been clipped to 120. It doesn’t returns to original value.

(Please open this patch to understand what I mean !)


----------begin_max5_patcher----------
3111.3oc4arrjihi7bUeEDD6gcinZaIw64TueC6wd5nCYP1VcgQL7npt5Il4
aeSIAX.KvXWz8LarNhxElLQJeqLSI98Gevdm3arRaqew5SVO7vu+3COntk7F
Oz76GrOQ+VbJsTglcF6UwtuZ+jFTE6aUpamJnI6nYGZAjUeRTWkxpTOEt4t5
aU8VNSOk1pGw5yMf4IpwBF+O3f5MR7rwCTNsJ9HO6vWJXwU5whDrA8jENLZi
GNB4fwt3P+P2P7SV9NRPDxFj0mkO+e73ixudZgr7IVYI8.6Bdd6q7rDwqaE4
rrajuMxyjHi7L4Z7LA6sAMlmide7br3zIVV0E7LceEqvJOk9FPIVUEzuBDin
3smr9mkh5hXlUAqptHqzpRXwy3UbZpUtnDtPj8ur9OZbxKXkrL3hizRq3ifQ
.KocpR4YrXQclZ9bZ4c0CTQkixWFfAFaTxitT7hitUSJWTiMk+kxWBxWByCK
EvMCwt5c6RUpX7JJxkB6dRZixIxUkSjEKlBuYOOWOknP8cDV9sSvObwBL+zz
TsoTk8R4Nh6sxcdAab8QQQnHjWfON.G8jkavYVk3tZrpTSmxKq9yVZ72poo7
p2T.2QK4ws.T+npNiKCe9KVttHiB.u13OE7C7LPbwxNTcTyWHIwaWwiet7bz
n3Td9QF+vQsMizDWCXuHMU75gTwNZZE6Ttnu78hvak7CvrY+j4qj+k.jOXiR
A6YSgBwD6NMRA8DCB57EVFsQ1hFwVcDDlf5n3ShD1kBtJNDMuBhQE2JF5l9b
NbyXQgT0CjV+IZun3DMqxLvkZHgCC13AtFQ5fJtJEfTD2QAIzJZi4Qi8gViz
s.cO..H5tRQZcEClqiZWkirBwyL1FJeeCCqndNn2Ag30v4YX4LcP95DtPdmd
HznbpI9HDJz02oGrTgHuGyqHaQVE309kRHVDqkm5S88dp1ao7VzWnWyp4N2n
WD66Iz3+bwQDvnacUWbfR046o7+0A+jeeWKzlxegs4.km0QwuPK5zVWB0rCN
LbUx0QyXocQ7uIuS4e6gj3pjWHiAYzsLXNuR7sJF8Uqf5p8GbCUdEN88GJou
vR9BsppfuCryOeU4XujWno0Lw9NCsVyrdDZpH6vzx0AndBzPRz5B+MBJW4++
g.jQ3kGEEUKblZ0JlFGH5dUY0aZgq6i8cQtK+hIxbuDTMdaje+mVejmkWWUZ
gkWAz.XbTZEZ8QvDRceh797pW4UGs9U6s4fAGnS2J4BqLFsXOmklrCBIWWPS
+U6YSoangryMYrZz1rMhDDsNqpj+csQIt2RXYmUK+6BtbrtwH3MVrNtx.4Xc
J1ZO+AVr.4.OyLlqFWT690rSkhz3rs0YZWZ0paSey50irLqlL2aSS2hWZUmC
KFwRdxBne4uyDUMY1yRr18l0QHGgOjxdgkZoUY2ft1TZY92ptvAqBB6P7zk.
oBe3FbmQggPevDaNFKYxh3dZlBXINKICFUhEJNx+VS51KrG+6gdWU6ManAQY
7lBf4YVa0FJawaklT2gzxrjBaee7NAb.k9gg+XJuGu4IHIYnPODBBHJ+2rkd
8dp7G6aeeKdpq4JPsBpi25p8kboEdyZ5TfMW8kyU4SrtZae76RSu9d43evd4
sruqyJ3kOkgNx5efsPqQGrv36zNFqMg+QGFCBakyxR5EH6au880JNVzclNAA
4sFgwfEpqDYqU+WCWhc8s0ZVcSSjsKosoI+HTw6KDmjMWXszp92Yen0omfwt
+HrnkLn0GYm1AIigMyotSwo857RSceSx6d2W+nCw5P18blmoAGs9hvbriUzu
MB1mcSegWxGVlYenrDdEcZvkrzFJz.vi7DlLI3S0UCpDydXLh1VlghhbCIXh
umiSTjLAgH3iGxiDhccCc7k2pig6OJwhrxpBnPvpsw7h35TZwDyWrPTj.EQA
ENbEFWTva6161t9ckv1SqSac.l.8d8.77WXyTd+YYd5IUHdlVMPfcd7MMz4E
hbnZ4FBRaxXPdjJJZGP2HDNxGE.+yKvgnH54Ie9I4hdRIiAQRJcGKUmt2TPu
FOqvY.MtDgp9w9ZcYEeOOtSmXGCh5htcCYfOPsJNbexAMMVpZyTsov2nPkly
Jfx4TCS3rXzm2vMbz4uLwaEzDdc4UHzi7R41YrPr5pmGMCRuSCk1go5HO94L
lNDLtunImQeFjsmCU0CFHzYByfp28pPrehGT1rMV1P8J9Rn8iwY3gOGiy.vq
5O1g4UCR0CyqDjpCykEjxD5Kvex3rXzjpCSiAovyHTlKHUO4wTA.lXTOxnI4
GEYrIbTNAhGtQKlS7XfhjOpQvL9AX4L9ylgdtVD6y49B2eGM94CPY9YICYk.
TTHxIxILz2y2m7zBu0Psz4AWELdqZuEFFQdLJFsoFijHmF2r+X88SGiVYLMk
cotaLZPtvMJgYPRreeISZ8LTWOCy1eS7NAtwcUfB3lvKka521uKDmtj.ag1M
mWwMt+nAl4wOOT0S+FeBeUEjYVrSAWuaayfvRWmPg7ffrjdL8gBdh4IQAoKB
RW7ogvKklD5cEEOdTkcznmSgyHvf9WNfIb4rCAB6gZ3UvbZ5MgVdjkLTQn.L
szBswSszUHFRwLBG32S1odzIWfRAUtuARgSJaFxpGRCb2GMyOs3aQbhHXO+P
e3FNHuwjbu4SmcvXROkAQslPw2.ao1WMnKmxFmNXs4xy1IrS4GokfMndk+gy
0YfpEzmBnNSfQAdagdN.8PDJpSmJ+MMnkxgZrmjAOJnFi8SyhOJLmExzKmPK
XlGM41NaNeGsv4XcZ5DY20CgEm3bumAV9Hc5QTBc1kiIp0pHjf.hKJnuoJDk
sBBdLUpqsPMWuID4EJ1V2NBtZoDS06n2LnHiYb+Js3jNvjIn6J3oSCEFYE+p
1G0KyHm8hZu1cbMAkk8hJJrQfpn0pt.UNU5Mm6emuWf4bqUixL0Xqfu6s7lF
eX.CwoL9kzAFR8P8wMvOzI.62PPevYSPj5iGwA6SBcW.QplhYHRE7YIxDQdd
JapB6o7o5uA.Y69B1u0jCf45fSJzGXB+o.ddwwTwAh8TEloSwgnkaHo2.wgX
.YYVDILn.0rtrwMP5yHuJAmvoDTbYWil6gYzhz2lCg3zZYL54PAL6YE6t9r7
JOQeDZL6aoQp7HU2DMOiHUBdfzjwoOd1+jlATyjfuLaMk32TSwT.Z4MVADTW
QU9daPiwApw3EdWRVFPPd5DZg6X.di.bepd.PSiwQciDPSixEV+W.dRWfgXx
y1KOEBLCxqNbj+psmADiCVi8k9rbPHaHXYzBGriimqaDYBz0GLDmHYEOvGTn
qa.Ap4wL5PB4U5fAa7FiQm4qlBbIabkgxvDBJ.4fIS+.ZZ.i7136nn4vHe2P
Wmvodh4HiVWDMUD4swQREj.WeuPBPGSfeBKqronFzlPeUjDrKj3GF6MiJQWI
yXufg3Y1SwDNao5Lq+zjYMz7TWF.n63sLL69W3rWmpULMvDYouMt0OMGRG68
T4Qzszt4nbbaGJDU67GLkyr2KCNPRz77U3TjrtafDYM2.ImfH8Nko1v+UcKj
5eZ6Z1EobVwmvedp8XBfN7TPMX+K.tvpoGKVP85vOZdIATGtN4YlGOw4hhba
aiy027Fz8tejtMmtBuympf+ROdSRMvPiSfvq52+Ha9gLAvHob8pn3YOiYpdy
nc0N2ab0wCC7eYyuq2MRb07+4wVHN8sYFTAhiaDR0nrwWz+0Gn+tN5tD2GnP
WZ7aClrVJe2gw0Rh1DDFRb7jWAqz3EFNb1W7KEg7LV26CFqRsFY5UjP6z1+7
w20ar68Lx++LFCjUyX.+2Vagl27CGmVE8++ptwql514uu56.85upyqxMotUn
nVuazKanZRj2enMv4Ny8oyuOf8dWMFUV5mN+BzYMURAKclZGjYmIOzJLSxSC
mE9Z7zJLQxiF8UYof0ZhvKXhvuWQGYIbjyJvRdneZyzBlH+UXdBWh88ZXLr.
aA4Key61XHXALDdMbX+oEYv+m0D4gVRHH7ZDVEuj.3qgeD4mV76knlTA4WkU
Jt5LsFBO7RVp.uFFD3kXPb4B55LIn44uvJJaPVMGPdieUbdyZsgLZz+T0OJ6
BlduZ6NE11zBH8lJH2llSAk82Zp5R8piVjUyaxhQ0HGaUNoxVEH2g4l2rTH0
0G+iG+u.5BZ8l
-----------end_max5_patcher-----------

So if you configure all parameters for a source in a specific position (A), moving the source around and going back to position A : Source Presence can be (very) different.
:-s
(If source comes too close to listener, source presence is lowered… forever !)

I’ve seen a couple of posts where @tcarpent recommends to keep 1m radius in spat5.oper :

When using speakers, it makes sense and it avoids the problem described above

BUT

In my scenario, I’m using a spat5.spat~ @initwith “/panning/type nearfieldbinaural”
(Listener position & orientation is driven by (real world) trackers.)
In binaural, it totally makes sense to have a very small source radius, as sources can come very close to listener’s head.

How can I deal with it ?
How can I avoid source presence to be changed if they come too close to listener ?

One more question :
When Source Presence is changed in spat.oper : hi-level output returns the updated value.
But when Source Presence is changed because of source position (+ radius & drop params) : its new value is not returned by hi-level outlet.
Is that expected ?
It makes things more difficult when trying to replicate spat.oper parameters in Max / M4L device…

Hi Mathieu,

Thanks for your detailed message, and legitimate questions.

  • Indeed, source presence is linked to source distance. This is a design choice.
    As any design choice, this is debatable. But that’s how it is, and it would break too many patches to change that now. (although I could think of a tricky option to disable it, but that’s not for the simpler).

  • Note that Spat Revolution, for instance, has adopted another design choice.
    Similarly, in Panoramix, user can enable/disable the link between distance and presence.

  • In your patch, as the source moves too close to the listener, its presence is clipped (saturated). That explains why it doesn’t return to its original value afterwards. This is indeed a problem.
    You should change your initialisation mechanism to fix that.

  1. set your minimum radius (say 0.4m) : /source/1/radius 0.4
  2. place the source at that minimum distance: /source/1/dist 0.4
  3. set the maximum reachable presence (say 110) : /source/1/pres 110
    Now you can freely move the source, and whenever its distance goes back to 0.4, it should retrieve its “reference” source presence (110)
  • This approach should be compatible with near field binaural (where indeed, small radius is intended)

  • Source presence not being properly output on the high-level outlet is definitely a bug. This will be fixed for the next release. (we often dont use that outlet, but I understand it might be needed when embedding into M4L)

Hope this helps,
T.

1 Like

Thanks Thibaut for your feedback

Indeed, source presence is linked to source distance. This is a design choice.
As any design choice, this is debatable. But that’s how it is, and it would break too many patches to change that now. (although I could think of a tricky option to disable it, but that’s not for the simpler).

Ok, got it…
Would be curious to see what would be the « tricky option to disable it » :slight_smile:
disable the link between distance and presence is not really the point, it sounds great.
The problem rises when I want to recall « presets » for a source :

  1. set your minimum radius (say 0.4m) : /source/1/radius 0.4
  2. place the source at that minimum distance: /source/1/dist 0.4
  3. set the maximum reachable presence (say 110) : /source/1/pres 110
    Now you can freely move the source, and whenever its distance goes back to 0.4, it should retrieve its “reference” source presence (110)

With static sources and listener this should work fine…, but my scenario is a bit more complex, and it gets more complicated :

My sources and the listener are constantly moving (position are controlled in real time by trackers), and I need to recall sources parameters on the go : when a new sound file is played and sent to a source, I want to recall specific spat.oper parameters (including radius, drop, filters & reverb settings, …).

When I recall a « preset », I do not recall source position (because position is driven by a tracker AND source position is translated to relative position to listener (using spat5.abs2rel)

(I’m using 2 layers of spat.oper :
The first one to configure all parameters, and visualize sources position in word space coordinates.
Then sources positions are translated to listener relative coordinates (spat5.abs2rel), feeding a second spat5.oper driving spat5.spat~.
The first spat5.oper sends hi-level parameters to the second spat5.oper)
In my case, the drop parameter is also an issue : it doesn’t changes source presence immediately : it is applied when the distance changes…

So when recalling a preset, I would need to :

  • Place the source @ minimum distance
  • Recall all source parameters (radius, drop, presence, …)
  • Move back the source to the position where it’s supposed to be (tracker /or/ position stored in preset)

I’ve tried this method : it’s a bit tricky, but seems to work :slight_smile: