83 lines
2.2 KiB
Text
83 lines
2.2 KiB
Text
|
#lang scribble/manual
|
||
|
@(require (for-label racket))
|
||
|
|
||
|
@title{IndexInBetween}
|
||
|
Finds the (lowest) point in the Buffer at which the input signal lies in-between the two values@section{categories}
|
||
|
UGens>Buffer
|
||
|
@section{related}
|
||
|
Classes/Index, Classes/IndexL, Classes/SequenceableCollection#indexInBetween
|
||
|
|
||
|
@section{description}
|
||
|
|
||
|
Finds the (lowest) point in the link::Classes/Buffer:: at which the input signal lies in-between the two values, and returns the index. The fractional part of the index is suitable for linearly interpolating between the buffer slot values.
|
||
|
|
||
|
For example, if the Buffer contains [3, 21, 25, 26] and the input has the value 22, then the output will be 1.25, because the value 22 is in-between the values stored in indices 1 and 2 and in fact is one-quarter of the way along the interval between them.
|
||
|
|
||
|
IndexInBetween is the complement of link::Classes/IndexL::.
|
||
|
|
||
|
@section{classmethods}
|
||
|
|
||
|
|
||
|
@section{method}
|
||
|
ar, kr
|
||
|
@section{argument}
|
||
|
bufnum
|
||
|
index of the buffer.
|
||
|
@section{argument}
|
||
|
in
|
||
|
the input signal.
|
||
|
|
||
|
@section{examples}
|
||
|
|
||
|
|
||
|
@racketblock[
|
||
|
(
|
||
|
// autotune.
|
||
|
{
|
||
|
var index, in, autotuned, f0, fdiff;
|
||
|
var scale = ([0, 1, 3, 4, 7, 11, 12] + 70).midicps;
|
||
|
var buffer = scale.as(LocalBuf);
|
||
|
in = Pulse.ar(MouseX.kr(scale.minItem, scale.maxItem)) * 0.1;
|
||
|
f0 = Pitch.kr(in).at(0);
|
||
|
index = IndexInBetween.kr(buffer, f0);
|
||
|
fdiff = index.frac * (Index.kr(buffer, index + 1) - Index.kr(buffer, index));
|
||
|
autotuned = PitchShift.ar(in, 0.1, 1 - (fdiff / f0), 0.01, 0.01);
|
||
|
RLPF.ar(autotuned, [2000, 5000], 0.3)
|
||
|
}.play;
|
||
|
)
|
||
|
|
||
|
b.free;
|
||
|
|
||
|
|
||
|
// basic test.
|
||
|
(
|
||
|
{
|
||
|
var index, f0, f1, f3;
|
||
|
var buffer = [ 200, 210, 400, 430, 600, 800 ].as(LocalBuf);
|
||
|
f0 = MouseX.kr(200, 900);
|
||
|
index = IndexInBetween.kr(buffer, f0);
|
||
|
f1 = IndexL.kr(buffer, index);
|
||
|
SinOsc.ar([f0, f1]) * 0.1
|
||
|
|
||
|
}.play;
|
||
|
)
|
||
|
|
||
|
|
||
|
|
||
|
// One way to map across from an arbitrary piecewise curve, onto another:
|
||
|
// We use IndexInBetween to "unmap" your input into integer slots,
|
||
|
// and then use IndexL to do the reverse, to "map" onto your other distribution.
|
||
|
// This example maps a sort-of-exponential curve onto a sort-of-sinusoidal curve:
|
||
|
|
||
|
~from = [1, 2, 4, 8, 16];
|
||
|
~to = [0, 1, 0, -1, 0];
|
||
|
(
|
||
|
x = {
|
||
|
IndexL.kr(~to.as(LocalBuf), IndexInBetween.kr(~from.as(LocalBuf),MouseX.kr(~from.first, ~from.last).poll).poll).poll
|
||
|
}.play
|
||
|
)
|
||
|
::
|
||
|
]
|
||
|
|
||
|
|