0

我在 max/Msp 中使用 JS,并希望使用黄金比例将缓冲区分割成多个部分。我知道这将是一个使用公式 a+b/a = a/b 的递归函数,但我不确定如何在 javascript 中表达这一点,以及如何递归地将剩余部分划分为黄金矩形。

4

1 回答 1

0

1.6xx 的黄金比例谈论的是螺旋式上升、扩张。如果您从缓冲区开始并想向内标记,则可以将其按倒数扩展以缩小。

golden_ratio = ( 1 / 1.61803398875 ) // 0.6180339887498547 of 1.00
//where 1.00 is the 'whole' of your buffer
//the following values are percentage points the slices are at in the buffer
slice_1 =  1.00 * golden_ratio   // .618
slice_2 = slice_1 * golden_ratio // .618^2
slice_3 = slice_2 * golden ratio // .618^3

您可以在一次显式调用中从任意缓冲区计算给定深度切片:

slicepoint = Math.pow(golden_ratio, slice_depth) * buffer_size

否则手动递归执行可能是提供初始条件(缓冲区大小)并将您刚刚计算的最后一个切片再次乘以黄金比例。我们的“最后一个切片”将是提供的第一个条件,无论你有什么缓冲区。

一些伪代码:

A[0] = buffer_size
while n++
A[n] = A[n-1] * golden_ratio

对于实际的 javascript 代码:

切片 1 秒。音频到 10 个缓冲区(10 个缓冲区需要 9 个切片)

arbitrary_buffer = 44100 //buffer length 1 sec @ 44.1kHz
slices = 10;              //slice count

// get the reciprocal of golden ratio 
// we can just shrink the whole and mark those points as slices
golden_ratio = ( 1 / 1.61803398875 )

// creepily enough 
// the reciprocal of the golden ratio is 
// its same value without the integer in front of it: .6180339887498547 
// so its a 61.80339887498547% of the original size per-iteration

// This is a list of our slice point locations
slice_points = new Array();

// add an initial condition (arbitrary_buffer) for the recursion 
// like knowing the end of a loaf of bread before cutting
slice_points[0] = arbitrary_buffer;

// the following recursion is in the [i-1] back-tracking
// that's why this for-loop condition has i at 1 instead of 0 per usual
// we provided the initial 44100 and start with index 1 instead
// slice_point[1] should be about 27255.29890386859

for(i=1;i<slices;i++)
    slice_point[i] = slice_points[i-1] * golden_ratio;

该数组从其末尾开始按降序填充:44100

如果您只使用任意缓冲区 - slice_point[i];,您可以将这些值切换为前向。

或者,在 js 对象之外并返回 max use [- ] 并从 bufferinfo~ 最右边的出口减去缓冲区 ms 长度中的 js 输出值,转换为样本。

您也可以尝试将其用作响度的速度图

于 2017-04-09T11:18:20.780 回答