A graph element that mixes the channels of a signal together. It works like the sclang counterpart.
The Mix
companion object contains various useful mixing idioms:
Mix.tabulate(n: Int)(fun: Int => GE)
: corresponds toSeq.tabulate
and toArray.fill
in sclang.Mix.fill(n: Int)(thunk: => GE)
: corresponds toSeq.fill
.Mix.seq(elems: GE*)
: A shortcut forMix(GESeq(elems: _*))
.
A separate graph element is Mix.mono
.
Mix.mono(elem: GE)
flattens all channels of
the input element before summing them, guaranteeing that the result is monophonic.
Finally, Mix.fold
is an idiom that not actually adds elements,
but recursively folds them. Thus,
Mix.fold(elem: GE, n: Int)(fun: GE => GE)
is equivalent to
(1 to n).foldLeft(elem) { (res, _) => fun(res) }
Mix.fold
is often used in the SuperCollider examples to apply a filtering
process such as reverberation several times. For cases where the iteration
index is needed, the full form as shown above can be used instead.
===Examples===
// non-nested multi-channel signal reduced to mono (1)
play {
Mix(SinOsc.ar(440 :: 660 :: Nil)) * 0.2 // --> SinOsc.ar(440) + SinOsc.ar(660)
}
// non-nested multi-channel signal reduced to mono (2)
play {
Mix(Pan2.ar(SinOsc.ar)) * 0.2 // --> left + right
}
// mix inner channels
play {
// --> [left(440) + left(660), right(440) + right(660)]
Mix(Pan2.ar(SinOsc.ar(440 :: 660 :: Nil))) * 0.2
}
// enforce monophonic mix
play {
// --> left(440) + left(660) + right(440) + right(660)
Mix.mono(Pan2.ar(SinOsc.ar(440 :: 660 :: Nil))) * 0.2
}
// combine Mix(), Mix.fill(), Mix.fold()
// from original SC examples: reverberated sine percussion
play {
val d = 6 // number of percolators
val c = 5 // number of comb delays
val a = 4 // number of allpass delays
// sine percolation sound :
val s = Mix.fill(d) { Resonz.ar(Dust.ar(2.0 / d) * 50, Rand(200, 3200), 0.003) }
// reverb pre-delay time :
val z = DelayN.ar(s, 0.048)
// 'c' length modulated comb delays in parallel :
val y = Mix(CombL.ar(z, 0.1, LFNoise1.kr(Seq.fill(c)(Rand(0, 0.1))).madd(0.04, 0.05), 15))
// chain of 'a' allpass delays on each of two channels (2 times 'a' total) :
val x = Mix.fold(y, a) { in =>
AllpassN.ar(in, 0.050, Seq(Rand(0, 0.050), Rand(0, 0.050)), 1)
}
// add original sound to reverb and play it :
s + 0.2 * x
}
// Mix.tabulate usage
// from original SC examples: harmonic swimming
play {
val f = 50 // fundamental frequency
val p = 20 // number of partials per channel
val offset = Line.kr(0, -0.02, 60, doneAction = freeSelf) // causes sound to separate and fade
Mix.tabulate(p) { i =>
FSinOsc.ar(f * (i+1)) * // freq of partial
LFNoise1.kr(Seq(Rand(2, 10), Rand(2, 10))) // amplitude rate
.madd(
0.02, // amplitude scale
offset // amplitude offset
).max(0) // clip negative amplitudes to zero
}
}
- See also
BinaryOpUGen
- Companion
- class
Type members
Classlikes
Value members
Concrete methods
A mixing idiom that is not actually adding elements, but recursively folding them.
A mixing idiom that is not actually adding elements, but recursively folding them.
Calling this method is equivalent to
(1 to n).foldLeft(elem) { (res, _) => fun(res) }
It is often used in the SuperCollider examples to apply a filtering process such as reverberation several times. For cases where the iteration index is needed, the full form as shown above can be used instead.
- Value Params
- elem
the input element
- fun
a function that is recursively applied to produce the output
- n
the number of iterations
A special mix that flattens all channels of the input element before summing them, guaranteeing that result is monophonic.
A special mix that flattens all channels of the input element before summing them, guaranteeing that result is monophonic.