diff --git a/src/lib/midi/fsSysex.ts b/src/lib/midi/fsSysex.ts index f00b607..0dfae44 100644 --- a/src/lib/midi/fsSysex.ts +++ b/src/lib/midi/fsSysex.ts @@ -136,9 +136,11 @@ export function buildSysExGetFileDataRequest(page: number) { } export function parseSysExGetFileDataResponse(bytes: Uint8Array) { + const page = (bytes[0] << 8) | bytes[1]; + return { - page: (bytes[0] << 8) | bytes[1], - nextPage: ((bytes[0] << 8) | (bytes[1] + 1)) & 0xffff, + page, + nextPage: (page + 1) & 0xffff, data: bytes.subarray(2), }; } diff --git a/tests/midi-fs-sysex.test.ts b/tests/midi-fs-sysex.test.ts new file mode 100644 index 0000000..da1027d --- /dev/null +++ b/tests/midi-fs-sysex.test.ts @@ -0,0 +1,18 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; +import { parseSysExGetFileDataResponse } from '../src/lib/midi/fsSysex'; + +test('increments the complete uint16 file page across byte boundaries', () => { + const response = parseSysExGetFileDataResponse(new Uint8Array([0x01, 0xff, 0xaa, 0xbb])); + + assert.equal(response.page, 0x01ff); + assert.equal(response.nextPage, 0x0200); + assert.deepEqual(response.data, new Uint8Array([0xaa, 0xbb])); +}); + +test('wraps the file page only after uint16 max', () => { + const response = parseSysExGetFileDataResponse(new Uint8Array([0xff, 0xff])); + + assert.equal(response.page, 0xffff); + assert.equal(response.nextPage, 0); +});