134 lines
2.9 KiB
Racket
134 lines
2.9 KiB
Racket
#lang scribble/manual
|
|
@(require (for-label racket))
|
|
|
|
@title{Phasor}
|
|
A resettable linear ramp between two levels.@section{categories}
|
|
UGens>Triggers, UGens>Buffer
|
|
|
|
|
|
@section{description}
|
|
|
|
|
|
Phasor is a linear ramp between start and end values. When its trigger
|
|
input crosses from non-positive to positive, Phasor's output will jump to
|
|
its reset position. Upon reaching the end of its ramp Phasor will wrap
|
|
back to its start.
|
|
|
|
|
|
@section{note}
|
|
|
|
N.B. Since end is defined as the wrap point, its value is never
|
|
actually output.
|
|
::
|
|
|
|
@section{note}
|
|
|
|
If one wants Phasor to output a signal with frequency teletype::freq:: oscillating between teletype::start:: and teletype::end::, then the rate should be teletype::(end - start) * freq / sr:: where teletype::sr:: is the sampling rate.
|
|
::
|
|
|
|
Phasor is commonly used as an index control with link::Classes/BufRd::
|
|
and link::Classes/BufWr:: .
|
|
|
|
|
|
@section{classmethods}
|
|
|
|
|
|
@section{method}
|
|
ar, kr
|
|
|
|
@section{argument}
|
|
trig
|
|
|
|
When triggered, jump to resetPos (default: 0, equivalent to
|
|
start).
|
|
|
|
|
|
@section{argument}
|
|
rate
|
|
|
|
The amount of change per sample, i.e at a rate of 1 the value of
|
|
each sample will be 1 greater than the preceding sample.
|
|
|
|
|
|
@section{argument}
|
|
start
|
|
|
|
Start point of the ramp.
|
|
|
|
|
|
@section{argument}
|
|
end
|
|
|
|
End point of the ramp.
|
|
|
|
|
|
@section{argument}
|
|
resetPos
|
|
|
|
The value to jump to upon receiving a trigger.
|
|
|
|
|
|
@section{Examples}
|
|
|
|
|
|
|
|
@racketblock[
|
|
|
|
// phasor controls sine frequency: end frequency matches a second sine wave.
|
|
|
|
(
|
|
{ var trig, rate, x, sr;
|
|
rate = MouseX.kr(0.2, 2, 1);
|
|
trig = Impulse.ar(rate);
|
|
sr = SampleRate.ir;
|
|
x = Phasor.ar(trig, rate / sr);
|
|
SinOsc.ar(
|
|
[
|
|
LinLin.kr(x, 0, 1, 600, 1000), // convert range from 0..1 to 600..1000
|
|
1000 // constant second frequency
|
|
], 0, 0.2)
|
|
|
|
}.play;
|
|
)
|
|
|
|
|
|
// two phasors control two sine frequencies: mouse y controls resetPos of the second
|
|
(
|
|
{ var trig, rate, x, sr;
|
|
rate = MouseX.kr(1, 200, 1);
|
|
trig = Impulse.ar(rate);
|
|
sr = SampleRate.ir;
|
|
x = Phasor.ar(trig, rate / sr, 0, 1, [0, MouseY.kr(0, 1)]);
|
|
SinOsc.ar(x * 500 + 500, 0, 0.2)
|
|
}.play;
|
|
)
|
|
|
|
|
|
// use phasor to index into a sound file
|
|
|
|
// allocate a buffer with a sound file
|
|
b = Buffer.read(s, Platform.resourceDir +/+ "sounds/a11wlk01.wav");
|
|
|
|
// simple playback (more examples: see BufRd)
|
|
// Start and end here are defined as 0 and the number of frames in the buffer.
|
|
// This means that the Phasor will output values from 0 to numFrames - 1 before looping,
|
|
// which is perfect for driving BufRd. (See note above)
|
|
{ BufRd.ar(1, b.bufnum, Phasor.ar(0, BufRateScale.kr(b.bufnum), 0, BufFrames.kr(b.bufnum))) }.play;
|
|
|
|
|
|
// two phasors control two sound file positions: mouse y controls resetPos of the second
|
|
(
|
|
{ var trig, rate, framesInBuffer;
|
|
rate = MouseX.kr(0.1, 100, 1);
|
|
trig = Impulse.ar(rate);
|
|
framesInBuffer = BufFrames.kr(b.bufnum);
|
|
x = Phasor.ar(trig, BufRateScale.kr(b.bufnum), 0, framesInBuffer,
|
|
[0, MouseY.kr(0, framesInBuffer)]);
|
|
BufRd.ar(1, b.bufnum, x);
|
|
}.play;
|
|
)
|
|
|
|
::
|
|
]
|
|
|
|
|