Files
ep-133-project-export/tests/sparse-pads.test.ts

119 lines
3.5 KiB
TypeScript

import assert from 'node:assert/strict';
import test from 'node:test';
import { createServer } from 'vite';
import { collectPads } from '../src/lib/parsers';
import { TarFile } from '../src/lib/untar';
import { findPad } from '../src/lib/utils';
import { EffectType, FaderParam, Group, GroupFaderParam, ProjectRawData } from '../src/types/types';
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', async () => {
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 };
const server = await createServer({
server: { middlewareMode: true },
appType: 'custom',
mode: 'production',
define: { 'import.meta.env.DEV': 'false' },
ssr: { noExternal: ['lodash'] },
});
try {
const [abletonModule, midiModule, reaperModule, dawProjectModule, webViewModule] =
await Promise.all([
server.ssrLoadModule('/src/lib/transformers/ableton.ts'),
server.ssrLoadModule('/src/lib/transformers/midi.ts'),
server.ssrLoadModule('/src/lib/transformers/reaper.ts'),
server.ssrLoadModule('/src/lib/transformers/dawProject.ts'),
server.ssrLoadModule('/src/lib/transformers/webView.ts'),
]);
assert.deepEqual(
abletonModule.default(data, params).tracks.map((track: { padCode: string }) => track.padCode),
['a1'],
);
assert.deepEqual(
midiModule.default(data, params).tracks.map((track: { padCode: string }) => track.padCode),
['a1'],
);
assert.deepEqual(
reaperModule.default(data, params).tracks.map((track: { padCode: string }) => track.padCode),
['a1'],
);
assert.deepEqual(
dawProjectModule
.default(data, params)
.tracks.map((track: { padCode: string }) => track.padCode),
['a1'],
);
assert.deepEqual(
webViewModule.default(data).scenes[0].patterns.map((pattern: { pad: string }) => pattern.pad),
['a1'],
);
} finally {
await server.close();
}
});