once more : surround/vbap for synthesis

Roman Thilenius's icon


imagine a circular speaker setup with N speakers (for example 10)

now we are using a form of vbap to pan our audiomaterial.

mono source(s) -> vpab-like weighting/panning -> 10 channel format

while this works well for "normal" mixing approaches (say like controlling the azimuth using a computer mouse) we start to have a terrible problem as soon as we try to modulate the panning at high speeds.

(one which is not at all releated to the technology used, but who knows, maybe the solution is releated?)

lets say your material is a 40Hz sinewave and you rotate the virtual sound source with 10 Hz around your head.

it is clear what happens: every of the 10 speakers does now not even perform half a sine wave, but only small fragments of them.

while on the digital layer this is not a problem at all (you can distribute 1 signal on any number of channels, as fast as up to a per-sample speed modulation, then sum them together and get exactly the original again), but with reinforcement there are at least two problems which distort the audio the higher the modulation speed is:

1. there is no perfect hotspot

2. the "fade out" of the amplitude modulation of speaker #7 is not exactly the opposite of the "fade in" of speaker #8 - you will hear a click, just as you do when you have a fast attack on a bass synth.

a very basic solution would be to do what they do in prologic formats: exclude the bass completely from panning and leave it mono.

but this only works well until a certain modulation speed ist reached - the plan is to modulate up to nyqist (speed of nyquist-per-360 degree, that is)

yes, one could modulate the crossover frequency according to the panner modulation speed. but then you quickly hit the border of how fast the filter can be modulated. :)

are there any other approaches to this?

mizu's icon

Hi Roman. Maybe a mechanical thing: the heavy paper of a bass loudspeaker needs time to return to a quiet state, before the next impulse. Thinking to micro-doppler, i.e. same level of 40Hz in every loudspeaker, modulating in some ms delay, this would create highest and lowest frequencies ? I dydn't test that, i shall try... Maybe it makes a real nice big drum ? I don't expect from a loudspeaker a big fidelity, it can make nice matieres.
curious
michel z

Roman Thilenius's icon


it´s even worse.

the AM distortion in the LF content equals normal HF content already on the digital layer, which will be accurately reproduced by the treble and HF speakers later.

even if you have 2 speakers with 10 centimeters distance to each other and 5 meters distance to the listener, the antiphase version of the squared LF content on the second speaker will not kill the sound from the first one.

the usual industry standards use a 120 hz 72 db filter and then recommend you to modulate the amplitude not faster than 16 Hz. but i am going much higher than that. (see patch. it is a bit less a problem when you have a broad vector like 7 out of 10 speakers - in this stereo example here it is on the extreme level.)

yes, or you leave it as is and be happy about the special effect it creates. :)

#P window setfont "Sans Serif" 9.;
#P window linecount 1;
#P comment 304 545 347 9109513 how to make it dynamic?;
#P comment 444 71 169 9109513 arbitrary panning modulation;
#P comment 231 97 64 9109513 music;
#P window linecount 2;
#P comment 304 489 347 9109513 traditional method: create LFE channel \, 72 db crossover \, 120Hz. then dont use panning / amplitude modulations over ~16 Hz;
#P window linecount 1;
#P comment 297 466 212 9109513 but speakers? the AM leads to distortion.;
#P newex 377 154 43 9109513 *~ 0.5;
#P newex 382 124 43 9109513 +~ 1.;
#P user scope~ 358 245 488 375 64 3 16 -1. 1. 0 0. 0 0. 255 255 255 85 85 85 0;
#P user scope~ 8 180 138 310 64 3 16 -1. 1. 0 0. 0 0. 255 255 255 85 85 85 0;
#P newex 373 183 43 9109513 !-~ 1.;
#P flonum 430 44 57 9 0.13 2.01 3 139 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 389 94 82 9109513 cycle~ 0.13;
#P user scope~ 155 486 285 616 64 3 16 -1. 1. 0 0. 0 0. 255 255 255 85 85 85 0;
#P user scope~ 155 357 285 487 64 3 16 -1. 1. 0 0. 0 0. 255 255 255 85 85 85 0;
#P toggle 110 36 15 0;
#P newex 310 208 43 9109513 *~ 1.;
#P newex 220 207 43 9109513 *~ 1.;
#P newex 77 65 82 9109513 dac~;
#P newex 235 125 82 9109513 cycle~ 1.;
#P comment 372 389 164 9109513 digital summing = no problem;
#P connect 9 0 8 0;
#P connect 8 0 13 0;
#P connect 13 0 14 0;
#P connect 14 0 3 1;
#P connect 14 0 10 0;
#P connect 3 0 6 0;
#P connect 3 0 12 0;
#P connect 4 0 7 0;
#P connect 4 0 12 0;
#P connect 10 0 4 1;
#P connect 1 0 11 0;
#P connect 1 0 3 0;
#P connect 1 0 4 0;
#P connect 5 0 2 0;
#P window clipboard copycount 20;

jamesway's icon

Older post, but did anyone make any headway with this? I've been using reverb, it works alright, but I'm more interested in more advanced solutions. Cheers

Roman Thilenius's icon

i am using MSP-biquads for the highpass and since you can not safely change their frequency immediately from 50 to 20 Hz or similar, i am introducing a latency buffer of 100ms which allows to slide to the new frequency aim interpolated (and which is normally only active when my app is in offine-rendering mode.)

each movement in such a system is performed in polar coordinates anyway, so you´d just take the azimuth signal from the panning DSP to calculate the "movement speed" (from the perspective of the physical speakers) to find out how to set the highpass.

what is a bit annoying is that with 10 speakers some material works fine with X Hz but then in the binaural version you still hear artefacts, while with another sound it can be the other way round. :)

furthermore, the panning speed vs highpass requirement is a bit depending on the width of the phantom source. which could itself also be dynamic... and in my case, modulated at signal rate...

jamesway's icon
  1. Shoot, thanks for such a thorough reply Roman. Very interesting. I had ended up just using impulse response based convolution reverb per channel, CPU heavy, but fun experimenting with.

Roman Thilenius's icon

as for xIR, note that [buffir~] nowadays is long enough for simple filters, too, it is just a bit more CPU hungry than using plug-ins.

however, fixed frequencies for the highpasses are often enough, i did that too in some situations. frequencies below 50Hz are almost impossible to track and the direction of such a real or phantom source does not at all have an impact on the sound, so you can exclude the subbass from the direction filter and/or even mix them to mono, like it is done for many media or in conventional surround setups, too.

using fixed frequency filters means to have a maximum modulation speed for both, panning between adjacent speakers and "granular" approaches, simply because if you exaggerate those modulations you run into the impulse fidelity limits of the speakers anyway (and to a certain extent this is also true if a binaural stereo mixdown is your only end format)