p0 = mode ("polar" or "xy" (or "cartesian")) p1, p2, ... pN-1, pN starting with p1, the next N pfields are pairs specifying the locations of the virtual speakers, using angle/distance coordinates (for "polar" mode) or x-location/y-location (for "xy" or "cartesian" mode). Distances are assumed to be in feet. Up to 16 speakers may be set.
p0 = output start time (seconds) p1 = input start time (seconds) p2 = duration (seconds) p3 = global amplitude multiplier (relative multiplier of input signal) p4 = mode: "polar" or "xy" (or "cartesian") If mode is "polar", p5 = angle (in degrees), relative to listener p6 = distance from listener (feet) If mode is "cartesian", p5 = x coordinate (feet) p6 = x coordinate (feet) p7 = input channel [optional, default is 0] p3 (amplitude), p5 (x-coordinate/angle) and p6 (y-coordinate/radius) can receive dynamic updates from a table or real-time control source. Author: John Gibson, 11/13/04 based on the description in F. R. Moore, "Elements of Computer Music," pp. 353-9
In NPANspeakers, If you choose "polar" mode for p0 ("mode"), the listener is situated in the center of the coordinate space, at [0,0]. Angles are measured in degrees, with 0 degrees directly in front of the listener, 90 degrees to their left and -90 degrees to their right.
"cartesian" or "xy" mode for p0 will set up a Cartesian coordinate plane with the listener again at [0,0]. Speaker locations are given in terms of their x-coordinates and y-coordinates. Distance in both "polar" mode and "xy" mode are in feet.
The order of speakers in the argument list for NPANspeakers is significant: the order corresponds to the order of output channels. So if you want the front left speaker in the first output channel, list it first.
Then using NPAN, parameters p5 ("ANGLE/XLOC,") and p6 ("DISTANCE/YLOC") give the position of the virtual sound source, relative to the listener, using the coordinate space described above. As with the speaker setup, the interpretation of p5 and p6 depends on the "mode" parameter (p4).
This is pair-wise panning, so no more than two adjacent speakers have signal at any time. It is not possible to place a virtual source between two speakers that are not adjacent.
Distance from the listener affects gain (the closer, the higher the gain). Very short distances can cause clipping. If in doubt, use the polar mode, set both speaker distances and virtual source distance to 1.
A multichannel interface card is needed for this command, note the
rtsetparams
commands in the sample scores all specify multiple channel outputs.
Sample Scores
very basic:
rtsetparams(44100, 4) load("WAVETABLE") load("NPAN") bus_config("WAVETABLE", "aux 0 out") bus_config("NPAN", "aux 0 in", "out 0-3") dur = 10 amp = 10000 freq = 440 env = maketable("line", 1000, 0,0, 1,1, 19,1, 20,0) WAVETABLE(0, dur, amp*env, freq, 0) NPANspeakers("polar", 45, 1, // left front -45, 1, // right front 135, 1, // left rear -135, 1) // right rear dist = 1 // 3 counter-clockwise trips around circle trips = 3 angle = maketable("linebrk", "nonorm", 1000, 45, 1000, 405 * trips) NPAN(0, 0, dur, 1, "polar", angle, dist)
rtsetparams(44100, 8) load("NPAN") rtinput("mysound.snd") // 8 speakers arranged in circle, with speakers directly in front of (0 deg) // and behind (180 deg) listener. NPANspeakers("polar", 45, 1, // front left -45, 1, // front right 90, 1, // side left -90, 1, // side right 135, 1, // rear left -135, 1, // rear right rear 0, 1, // front center 180, 1) // rear center inskip = 0 amp = 1.0 dur = DUR() start = 0 // move counter-clockwise around circle angle = maketable("line", "nonorm", 1000, 0,0, 1,360) dist = maketable("line", "nonorm", 1000, 0,.5, 1,4, 6,.4) NPAN(start, inskip, dur, amp, "polar", angle, dist)
rtsetparams(44100, 8, 512) load("WAVETABLE") load("NPAN") bus_config("WAVETABLE", "aux 0 out") bus_config("NPAN", "aux 0 in", "out 0-7") // 8 speakers arranged in a rectangle, as follows... // // 1 7 2 // 3 x 4 x = listener // 5 8 6 sin45 = 0.70710678 NPANspeakers("xy", -1, 1, // front left (1) 1, 1, // front right (2) -sin45, 0, // side left (3) sin45, 0, // side right (4) -1, -1, // rear left (5) 1, -1, // rear right rear (6) 0, sin45, // front center (7) 0, -sin45) // rear center (8) dur = 60 amp = 10000 freq = 440 env = maketable("line", 1000, 0,0, 1,1, 49,1, 50,0) WAVETABLE(0, dur, amp*env, freq, 0) // pan using the mouse lag = 70 x = makeconnection("mouse", "X", -1, 1, 0, lag, "X") y = makeconnection("mouse", "Y", -1, 1, 1, lag, "Y") NPAN(0, 0, dur, 1, "xy", x, y)