diff --git a/tests/sparse-pads.test.ts b/tests/sparse-pads.test.ts new file mode 100644 index 0000000..045249e --- /dev/null +++ b/tests/sparse-pads.test.ts @@ -0,0 +1,100 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; +import { collectPads } from '../src/lib/parsers'; +import abletonTransformer from '../src/lib/transformers/ableton'; +import dawProjectTransformer from '../src/lib/transformers/dawProject'; +import midiTransformer from '../src/lib/transformers/midi'; +import reaperTransformer from '../src/lib/transformers/reaper'; +import { TarFile } from '../src/lib/untar'; +import { + EffectType, + FaderParam, + Group, + GroupFaderParam, + ProjectRawData, +} from '../src/types/types'; +import { findPad } from '../src/lib/utils'; + +function faderParams(): GroupFaderParam { + return Object.fromEntries( + (['a', 'b', 'c', 'd'] as Group[]).map((group) => [ + group, + Object.fromEntries(Array.from({ length: 12 }, (_, parameter) => [parameter, -1])), + ]), + ) as GroupFaderParam; +} + +function sparseProject(): ProjectRawData { + const rawPad = new Uint8Array(27); + rawPad[1] = 202; + rawPad[16] = 100; + rawPad[20] = 255; + rawPad[24] = 60; + const pads = collectPads([new TarFile('pads/a/p02', rawPad.length, rawPad)], []); + const params = faderParams(); + + return { + pads, + groupPatterns: [], + scenes: [ + { + number: 1, + name: '01', + patternNumbers: { a: 0, b: 0, c: 0, d: 0 }, + timeSignature: { numerator: 4, denominator: 4 }, + patterns: [], + patternEvents: {}, + }, + ], + songPositions: [], + settings: { + bpm: 120, + scale: 0, + rootNote: 0, + groupFaderParams: params, + faderAssignment: { + a: FaderParam.LVL, + b: FaderParam.LVL, + c: FaderParam.LVL, + d: FaderParam.LVL, + }, + rawData: new Uint8Array(), + }, + effects: { + rawData: new Uint8Array(), + effectType: EffectType.Off, + param1: 0, + param2: 0, + }, + sounds: [], + projectFile: {} as File, + scenesSettings: { timeSignature: { numerator: 4, denominator: 4 } }, + }; +} + +test('keeps physical p02 on zero-based pattern source 1 when p01 is omitted', () => { + const data = sparseProject(); + const physicalPad = data.pads.a[0]; + + assert.equal(physicalPad.pad, 2); + assert.equal(findPad('a0', data.pads), undefined); + assert.equal(findPad('a1', data.pads), physicalPad); + + const params = { exportAllPadsWithSamples: true, keepUnusedPatterns: false }; + assert.deepEqual( + abletonTransformer(data, params).tracks.map((track) => track.padCode), + ['a1'], + ); + assert.deepEqual( + midiTransformer(data, params).tracks.map((track) => track.padCode), + ['a1'], + ); + assert.deepEqual( + reaperTransformer(data, params).tracks.map((track) => track.padCode), + ['a1'], + ); + assert.deepEqual( + dawProjectTransformer(data, params).tracks.map((track) => track.padCode), + ['a1'], + ); +});