Mix

object Mix extends ProductReader[Mix]

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 to Seq.tabulate and to Array.fill in sclang.
  • Mix.fill(n: Int)(thunk: => GE): corresponds to Seq.fill.
  • Mix.seq(elems: GE*): A shortcut for Mix(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
trait Product
trait Mirror
trait ProductReader[Mix]
class Object
trait Matchable
class Any

Type members

Classlikes

final case
class Mono(elem: GE) extends Lazy
Companion
object
object Mono extends ProductReader[Mono]
Companion
class

Inherited types

type MirroredElemLabels <: Tuple

The names of the product elements

The names of the product elements

Inherited from
Mirror
type MirroredLabel <: String

The name of the type

The name of the type

Inherited from
Mirror

Value members

Concrete methods

def fill(n: Int)(thunk: => GE): GE

A mixing idiom that corresponds to Seq.fill.

A mixing idiom that corresponds to Seq.fill.

def fold(elem: GE, n: Int)(fun: GE => GE): GE

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

def mono(elem: GE): GE

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.

override
def read(in: RefMapIn, key: String, arity: Int): Mix
Definition Classes
ProductReader
def seq(elems: GE*): GE

A shortcut for Mix(GESeq(elems: _*)).

A shortcut for Mix(GESeq(elems: _*)).

def tabulate(n: Int)(fun: Int => GE): GE

A mixing idiom that corresponds to Seq.tabulate and to Array.fill in sclang.

A mixing idiom that corresponds to Seq.tabulate and to Array.fill in sclang.