-
Notifications
You must be signed in to change notification settings - Fork 6
Channels and panning
Here I concentrate some idioms for handling channels and panning. Even though the discussion deals mostly with Stereo, Gensound is built to handle any number of channels.
If we previously define signals for the various channels, they can be combined in more than one way:
s = Signal() # start with a fresh Signal
s[0] = l_signal
s[1] = r_signal
s += center_signal*Gain(-3) # add center signal, and compensate
sig = ... # start with mono Signal
sig[1] = ... # add a new R channel (previous content of sig now occupies L channel)
sig += ... # this mixes into both channels now
w = WAV(kushaura)
w_mono = w[0] + w[1] # mix into mono
w_mono *= 0.5 # attenuate to compensate
w = WAV(kushaura)
w[0], w[1] = w[1], w[0]
sig = ... # create Signal with 3 channels for example
sig *= Repan(1, 2, 2, 0, None, 1)
# now sig has 6 channels:
# channels 0,5 are copies from the previous channel 1;
# channels 1,2 are copies from the previous channel 2;
# channel 3 is a copy of previous channel 0;
# and channel 4 is empty.
TODO this Transform needs treatment both for bugs and for usability, also better example.
Using the Pan
Transform, it's easy to pan mono signals into a stereo soundscape.
ch1 *= Pan(-50) # this results in a stereo Signal
ch2 *= Pan(50) # panning ranges from -100 (hard L) to 100 (hard R)
master = ch1 + ch2 # stereo signal with both channels panned as desired
TODO debug this Transform
If using Pan
, the pan law can be changed as follows:
Pan.panLaw = -4.5 # default is -3; most setups required between -3 and -6
Override the scheme
argument of Pan
to customize the panning behaviour, or expand it to include more channels.
It can be given any function returning a tuple/list of dB values according to the desired number of output channels.
This function is then fed with the first argument of Pan
, which may also be parametric (Curve
).
It can also be designed to receive more than one argument, thus allowing the panning behaviour to be multidimensional (for example, instead of one-dimensional L-R panning, one could place the audience in a rectangular room surrounded by multiple speakers, in which case it would make more sense to represent Panning locations as 2-dimensional (x,y)
coordinates). More on this later.
TODO This is already possible but not well-documented