From d745ed92133637d17cbc75a61b40a56f950d1b2e Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Tue, 14 Jul 2026 11:21:44 +0200 Subject: [PATCH] Improve float precision handling in fader parameter extraction and add corresponding test case --- src/lib/parsers.ts | 12 +++++------- tests/project-settings.test.ts | 35 ++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 tests/project-settings.test.ts diff --git a/src/lib/parsers.ts b/src/lib/parsers.ts index 5f1eb81..2cb19f9 100644 --- a/src/lib/parsers.ts +++ b/src/lib/parsers.ts @@ -560,13 +560,11 @@ export function collectSettings(files: TarFile[]): ProjectSettings { for (let paramNum = 0; paramNum <= 11; paramNum++) { faderParamsData[groupId] = { ...faderParamsData[groupId], - [paramNum]: Number( - bytesToFloat32( - settings.data.slice( - 24 + groupNum * 48 + paramNum * 4, - 28 + groupNum * 48 + paramNum * 4, - ), - ).toFixed(2), + [paramNum]: bytesToFloat32( + settings.data.slice( + 24 + groupNum * 48 + paramNum * 4, + 28 + groupNum * 48 + paramNum * 4, + ), ), }; } diff --git a/tests/project-settings.test.ts b/tests/project-settings.test.ts new file mode 100644 index 0000000..906a9ba --- /dev/null +++ b/tests/project-settings.test.ts @@ -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(); + + 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}`), + ); + } + } +});