Pitch

object Pitch extends ProductReader[Pitch]

An autocorrelation based pitch following UGen. It is more accurate than ZeroCrossing , but more also more CPU costly. For most purposes the default settings can be used and only in needs to be supplied.

The UGen has two outputs: The first output is the frequency estimate in Hertz, the second output is a toggle hasFreq , which tells whether a pitch was found (1) or not (0). If the clarify argument is used, hasFreq has more fine grained information.

The pitch follower executes periodically at the rate specified by execFreq in cps. First it detects whether the input peak to peak amplitude is above the ampThresh . If it is not then no pitch estimation is performed, the hasFreq output is set to zero and the freq output is held at its previous value. Otherwise, the autocorrelation is calculated, and the first peak after the peak around the lag of zero that is above peakThresh times the amplitude of the peak at lag zero is reported.

===Examples===

// pitch-follower resynthesizing with saw tooth
play {
 // be careful and use headphones!
 val in      = Mix(PhysicalIn.ar(0, 2))
 val amp     = Amplitude.kr(in, 0.05, 0.05)
 val p       = Pitch.kr(in, ampThresh = 0.02, median = 7)
 val saw     = Mix(VarSaw.ar(p.freq * Seq(0.5, 1, 2), 0, LFNoise1.kr(0.3,0.1,0.1)) * amp)
 Mix.fold(saw, 6) { res =>
   AllpassN.ar(res, 0.040, Rand(0, 0.040), Rand(0, 0.040), 2)
 }
}
Companion
class
trait Product
trait Mirror
trait ProductReader[Pitch]
class Object
trait Matchable
class Any

Type members

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 kr(in: GE, initFreq: GE, minFreq: GE, maxFreq: GE, execFreq: GE, binsPerOct: GE, median: GE, ampThresh: GE, peakThresh: GE, downSample: GE, clarity: GE): Pitch
Value Params
ampThresh

The minimum amplitude threshold above which the pitch follower operates. An input signal below this threshold is not analyzed. ''(init-time only)''

binsPerOct

A value which guides the search for the peak frequency in the first coarse step. Its setting does not affect the final pitch resolution; setting it larger will cause the coarse search to take longer, and setting it smaller will cause the fine search to take longer. ''(init-time only)''

clarity

If the clarity argument is greater than zero (it is zero by default) then the hasFreq output is given additional detail. Rather than simply being 1 when a pitch is detected, it is a "clarity" measure in the range between zero and one. (Technically, it's the height of the autocorrelation peak normalised by the height of the zero-lag peak.) It therefore gives a kind of measure of "purity" of the pitched signal. ''(init-time only)''

downSample

An integer factor by which the input signal is down sampled to reduce CPU overhead. This will also reduce the pitch resolution. The default value of 1 means that the input signal is not down sampled. ''(init-time only)''

execFreq

The frequency at which the pitch is estimated. This will be automatically clipped to be between minFreq and maxFreq . ''(init-time only)''

in

The signal to be analyzed.

initFreq

The initial value of the freq output, until the first valid pitch is found. ''(init-time only)''

maxFreq

The maximum frequency in Hertz to be considered for reporting. ''(init-time only)''

median

This specifies the length of a median filter applied to the frequency output estimation. With the default value of 1 the filter is defeated. Median filtering can help eliminating single spikes and jitter. This will however add latency to the output. ''(init-time only)''

minFreq

The minimum frequency in Hertz to be considered for reporting. ''(init-time only)''

peakThresh

This is a threshold used to find the first peak in the autocorrelation signal which gives the reported frequency. It is a factor of the energy of the signal (autocorrelation coefficient at zero). Set this value higher (e.g. to 1 ) to eliminate false frequencies corresponding to overtones. ''(init-time only)''

def read(in: RefMapIn, key: String, arity: Int): Pitch