Locator
superclass: Object
A class for virtual spatialization in stereo, using delays and amplitude distances.
Class Methods
*new(right_speaker, measurement_distance)
Create a new Locator object where the left speaker is at (0,0) and the
right speaker is at (right_speaker, 0). right_speaker should be the
distance, in meters, between the two speakers. measurement_distance
is the minimum y-coordinate for the virtual location of spatialized sounds.
Instance Methods
compute_stereo_information(x_coordinate, y_coordinate, amp)
Computes the amplitude and delays for the left and right speaker for a sound
located at (x_coordinate, y_coordinate), behind the speakers. The
amplitude for the louder speaker is amp adjusted for the distance y_coordinate.
The amplitude for the quieter speaker is reduced based on the difference
in distance between the location and the speakers. Returns this.
left_amp()
Return the last computed amplitude for the left speaker, or nil if there has
been no computation so far
right_amp()
Return the last computed amplitude for the right speaker, or nil if there has
been no computation so far
left_delay_time()
Return the last computed delay time in seconds for the left speaker, or nil if there has
been no computation so far
right_delay_time()
Return the last computed delay time in seconds for the right speaker, or nil if there has
been no computation so far
make_a_line(number, distance_behind, amp)
Create an array of Locator objects corresponding to number virtual locations, equally
spaced distance_behind meters behind the speaker locations. The created Locators
hold delay and amplitude information for each virtual location.
get_stereo_information(x_coordinate, y_coordinate, amp)
Computes the distance, amplitude and delays for the left and right speaker for a sound
located at (x_coordinate, y_coordinate), behind the speakers. The
amplitude for the louder speaker is amp adjusted for the distance y_coordinate.
The amplitude for the quieter speaker is reduced based on the difference
in distance between the location and the speakers. Distances are in meters,
time is in seconds.
Returns an array: [left_distance, left_delay_time, left_amp, right_distance,
right_delay_time, right_amp]
(
// create a Locator with the speakers places 3 meters apart
l = Locator.new(3, 0.5);
SynthDef("help-locator", {arg out = 0, freq = 440, delay_time_left, left_amp,
delay_time_right, right_amp;
var ping, env, left, right;
env = EnvGen.kr(Env.perc(0.001, 1, 1, -8), doneAction: 2);
ping = Klang.ar(`[ [freq, freq * 3/2, freq * 7/5],[0.33, 0.33, 0.33]]) * env;
// put the left channel thru a delay line and adjust the amplitude
left = DelayC.ar(ping, 0.05, delay_time_left, left_amp);
// put the right channel through a delay line and adjust the amplitude
right = DelayC.ar(ping, 0.05, delay_time_right, right_amp);
Out.ar(out, [left, right]);
}).store;
// Move the virtual location around randomly in a 3.0 x 2.5 meter rectangle
// behind the speakers
Pbind (
\freq, Prand([220, 440, 330], inf),
\instrument, "help-locator",
[\left_distance,
\left_delay_time,
\left_amp,
\right_distance,
\right_delay_time,
\right_amp],
Pfunc({ l.get_stereo_information((0.5 + 2.5.rand),
(3.0.rand), 1.0)})
).play
)