@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
73 lines (72 loc) • 2.73 kB
JavaScript
;
export function convertFrequencyBandsToOctaveBandsDivisions2(values, target, divisions) {
const divisionsMult = divisions;
let octaveIndex = 0;
let currentOctaveSize = 1;
const valuesCount = values.length;
const divideMethod = divisions == 2 ? divideOctave2 : divideOctave4;
for (let i = 0; i < valuesCount; ) {
const { octaveIndexTmp } = divideMethod({ values, target, currentOctaveSize, i, octaveIndex, divisionsMult });
octaveIndex = octaveIndexTmp;
i += currentOctaveSize;
currentOctaveSize *= 2;
}
}
function divideOctave2(params) {
const { values, target, currentOctaveSize, i, octaveIndex, divisionsMult } = params;
let octaveIndexTmp = octaveIndex;
const [valuesCount0, valuesCount1] = octaveSubSizes(currentOctaveSize);
let currentOctaveStart = 0;
const sizes = [valuesCount0, valuesCount1];
for (const size of sizes) {
let currentOctaveValue = 0;
for (let j = 0; j < size; j++) {
const currentIndex = i + j + currentOctaveStart;
currentOctaveValue += values[currentIndex];
}
currentOctaveStart += size;
target[octaveIndexTmp] = currentOctaveValue * divisionsMult;
octaveIndexTmp++;
}
return { octaveIndexTmp };
}
function octaveSubSizes(currentOctaveSize) {
const valuesCount0 = Math.max(1, Math.floor(currentOctaveSize / 3));
const valuesCount1 = currentOctaveSize - valuesCount0;
return [valuesCount0, valuesCount1];
}
function divideOctave4(params) {
const { values, target, currentOctaveSize, i, octaveIndex, divisionsMult } = params;
let octaveIndexTmp = octaveIndex;
const [valuesCount0, valuesCount1] = octaveSubSizes(currentOctaveSize);
const [valuesCount00, valuesCount01] = octaveSubSizes(valuesCount0);
const [valuesCount10, valuesCount11] = octaveSubSizes(valuesCount1);
let currentOctaveStart = 0;
const sizes = [valuesCount00, valuesCount01, valuesCount10, valuesCount11];
for (const size of sizes) {
let currentOctaveValue = 0;
for (let j = 0; j < size; j++) {
const currentIndex = i + j + currentOctaveStart;
currentOctaveValue += values[currentIndex];
}
currentOctaveStart += size;
target[octaveIndexTmp] = currentOctaveValue * divisionsMult;
octaveIndexTmp++;
}
return { octaveIndexTmp };
}
export function convertFrequencyBandsToOctaveBands(values, target) {
let octaveIndex = 0;
let currentOctaveSize = 1;
const valuesCount = values.length;
for (let i = 0; i < valuesCount; ) {
let currentOctaveValue = 0;
for (let j = 0; j < currentOctaveSize; j++) {
currentOctaveValue += values[i + j];
}
target[octaveIndex] = currentOctaveValue;
i += currentOctaveSize;
currentOctaveSize *= 2;
octaveIndex++;
}
}