@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
135 lines (125 loc) • 4.48 kB
text/typescript
export function convertFrequencyBandsToOctaveBandsDivisions2(
values: Float32Array | number[],
target: Float32Array,
divisions: number
) {
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; ) {
// let currentOctaveValue = 0;
// const valuesCount0 = Math.max(1, Math.floor(currentOctaveSize / 3));
// const valuesCount1 = currentOctaveSize - valuesCount0;
// let j = 0;
// for (; j < valuesCount0; j++) {
// const currentIndex = i + j;
// currentOctaveValue += values[currentIndex];
// }
// target[octaveIndex] = currentOctaveValue * divisionsMult;
// octaveIndex++;
// currentOctaveValue = 0;
// for (; j < valuesCount1; j++) {
// const currentIndex = i + j;
// currentOctaveValue += values[currentIndex];
// }
// target[octaveIndex] = currentOctaveValue * divisionsMult;
// octaveIndex++;
const {octaveIndexTmp} = divideMethod({values, target, currentOctaveSize, i, octaveIndex, divisionsMult});
octaveIndex = octaveIndexTmp;
i += currentOctaveSize;
currentOctaveSize *= 2;
}
}
interface DivideParams {
values: Float32Array | number[];
target: Float32Array;
currentOctaveSize: number;
i: number;
octaveIndex: number;
divisionsMult: number;
}
// function divideOctave2(params: DivideParams) {
// const {values, target, currentOctaveSize, i, octaveIndex, divisionsMult} = params;
// let octaveIndexTmp = octaveIndex;
// let currentOctaveValue = 0;
// const valuesCount0 = Math.max(1, Math.floor(currentOctaveSize / 3));
// const valuesCount1 = currentOctaveSize - valuesCount0;
// let j = 0;
// for (; j < valuesCount0; j++) {
// const currentIndex = i + j;
// currentOctaveValue += values[currentIndex];
// }
// target[octaveIndexTmp] = currentOctaveValue * divisionsMult;
// octaveIndexTmp++;
// currentOctaveValue = 0;
// j = 0;
// for (; j < valuesCount1; j++) {
// const currentIndex = i + j;
// currentOctaveValue += values[currentIndex];
// }
// target[octaveIndexTmp] = currentOctaveValue * divisionsMult;
// octaveIndexTmp++;
// return {octaveIndexTmp};
// }
function divideOctave2(params: DivideParams) {
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: number) {
const valuesCount0 = Math.max(1, Math.floor(currentOctaveSize / 3));
const valuesCount1 = currentOctaveSize - valuesCount0;
return [valuesCount0, valuesCount1];
}
function divideOctave4(params: DivideParams) {
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: Float32Array | number[], target: Float32Array) {
let octaveIndex = 0;
let currentOctaveSize = 1;
const valuesCount = values.length;
for (let i = 0; i < valuesCount; ) {
let currentOctaveValue = 0;
// let frequenciesCount = 0;
for (let j = 0; j < currentOctaveSize; j++) {
currentOctaveValue += values[i + j];
// frequenciesCount++;
}
target[octaveIndex] = currentOctaveValue; // / frequenciesCount;
i += currentOctaveSize;
currentOctaveSize *= 2;
octaveIndex++;
}
}