Improve float precision handling in fader parameter extraction and add corresponding test case
This commit is contained in:
@@ -560,13 +560,11 @@ export function collectSettings(files: TarFile[]): ProjectSettings {
|
|||||||
for (let paramNum = 0; paramNum <= 11; paramNum++) {
|
for (let paramNum = 0; paramNum <= 11; paramNum++) {
|
||||||
faderParamsData[groupId] = {
|
faderParamsData[groupId] = {
|
||||||
...faderParamsData[groupId],
|
...faderParamsData[groupId],
|
||||||
[paramNum]: Number(
|
[paramNum]: bytesToFloat32(
|
||||||
bytesToFloat32(
|
|
||||||
settings.data.slice(
|
settings.data.slice(
|
||||||
24 + groupNum * 48 + paramNum * 4,
|
24 + groupNum * 48 + paramNum * 4,
|
||||||
28 + groupNum * 48 + paramNum * 4,
|
28 + groupNum * 48 + paramNum * 4,
|
||||||
),
|
),
|
||||||
).toFixed(2),
|
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
35
tests/project-settings.test.ts
Normal file
35
tests/project-settings.test.ts
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import test from 'node:test';
|
||||||
|
import { collectSettings } from '../src/lib/parsers';
|
||||||
|
import { TarFile } from '../src/lib/untar';
|
||||||
|
import { FaderParam } from '../src/types/types';
|
||||||
|
|
||||||
|
test('preserves float32 precision for every group fader parameter', () => {
|
||||||
|
const data = new Uint8Array(224);
|
||||||
|
const view = new DataView(data.buffer);
|
||||||
|
const expectedValues = new Map<string, number>();
|
||||||
|
|
||||||
|
view.setFloat32(4, 123.456789, true);
|
||||||
|
|
||||||
|
for (let groupNum = 0; groupNum < 4; groupNum++) {
|
||||||
|
for (let paramNum = 0; paramNum <= 11; paramNum++) {
|
||||||
|
const value = 0.1234567 + groupNum * 0.1 + paramNum * 0.0032109;
|
||||||
|
const offset = 24 + groupNum * 48 + paramNum * 4;
|
||||||
|
view.setFloat32(offset, value, true);
|
||||||
|
expectedValues.set(`${groupNum}:${paramNum}`, view.getFloat32(offset, true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const settings = collectSettings([new TarFile('settings', data.length, data)]);
|
||||||
|
|
||||||
|
assert.equal(settings.bpm, 123.46);
|
||||||
|
|
||||||
|
for (const [groupNum, group] of ['a', 'b', 'c', 'd'].entries()) {
|
||||||
|
for (let paramNum = 0; paramNum <= 11; paramNum++) {
|
||||||
|
assert.equal(
|
||||||
|
settings.groupFaderParams[group][paramNum as FaderParam],
|
||||||
|
expectedValues.get(`${groupNum}:${paramNum}`),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user