SpeakerAdjust
adjusts levels, arrival times, and optional eqalisation bands for multichannel signals.
Typical use is for multichannel speaker setups.
See also Spectralyzer.help for a related tool.
*ar(ins, specs, vol) // static settings
ins an array of audio channels to be processed/adjusted
specs the adjustment specifications:
one list for each channel consisting of
[ amp, a multiply factor for this channel,
delaytime, (optional) delay time for this channel (in secs)
eqspec1: (optional) spec for one eq band to use, with values for:
[freq, frequency,
db, gain in db,
rq], reciprocal of Q: bandwidth / cutoffFreq.
(1 is wide, 0.1 is narrow).
eqspec2,
...
eqspecN
],
vol master volume for all chans, can be used for muting
// Caution: not working yet, because default values with Control.names are not correct yet.
// for the time being, use ar (fix).
*arDyn ( ins, specs, vol)
same as above, but with adjustable delay times, level and EQ; to be used for tweaking
the setup is final.
This is slightly more efficient than creating control inputs on all parameters.
Recommended use: put a function for speaker adjustment in a MasterFX chain,
where it is guaranteed to run post all other sounds, and wake up after Cmd-period.
s.boot;
// ... full short example here, e.g. 6 chans, amp, delay, 2 bands eq each.
// step by step examples
(
ProxyChain.add(
\testSnd, \mix -> { Dust.ar(20) + PinkNoise.ar([0.1, 0.1]) },
\spkAdj, \filter -> { |in, spkVol=1| SpeakerAdjust.ar(in, [ [0.25], [0.5] ], spkVol) }
);
Spec.add(\spkVol, \amp);
// can be used in a proxy chain
c = ProxyChain(2, [\testSnd, \spkAdj]);
c.gui;
c.play;
)
c.add(\spkAdj, 1); // kick in compensation
c.end;
// make some sound that just plays
{ Dust.ar(20) + PinkNoise.ar([0.1, 0.1]) }.play;
// make a MasterFX - this filters everything on its buses,
// and wakes up after cmd-period.
z = MasterFX(s, 2, [\spkAdj]);
z.gui;
z.pxChain.add(\spkAdj);
(
ProxyChain.add(
\spkAdj, \filter -> { |in, spkVol=1|
SpeakerAdjust.ar(in, [
[1, 0],
[1, 0.02] // right channel slightly late
], spkVol) }
);
z.pxChain.add(\spkAdj, 1);
)
// one eq band on each channel, add gain at different freqs
(
ProxyChain.add(
\spkAdj, \filter -> { |in, spkVol=1|
SpeakerAdjust.arDyn(in, [
// amp, dt, [freq1, gain1, bw1]
[1, 0, [300, 8, 2]],
[1, 0.02,/* [2800, 8, 2]*/]
], spkVol) }
);
z.pxChain.add(\spkAdj, 1);
)
// load test for 24 chans: a MasterFX
(
MasterFX.clear(s.name);
z = MasterFX(s, 24, [\spkAdj]);
z.gui;
)
(
// generate random data for 24 chans, 3 bands each, to test load:
var data = { [
rrand(0.5, 1.0), // amp
0.01.rand ] // dt, max 10msec => 3.4m
++
({ [
exprand(100, 10000), // freq
rrand(12.0, -12.0), // gain in db
rrand(0.2, 1.0) ] // rq
} ! 3);
} ! z.numChannels; // for 24 chans
ProxyChain.add(
\spkAdj, \filter -> { |in, spkVol=1|
SpeakerAdjust.arDyn(in, data, spkVol) }
);
z.pxChain.add(\spkAdj, 1);
)