Update sample inclusion details for Ableton export and add test case for pad classification

This commit is contained in:
2026-07-14 08:04:12 +02:00
parent fb6ee93090
commit b70208f83c
2 changed files with 15 additions and 1 deletions

View File

@@ -23,7 +23,7 @@ function sanitizeFileName(value: string): string {
} }
const NOTES: Record<ExportFormatId, string> = { const NOTES: Record<ExportFormatId, string> = {
ableton: `Pads used at one consistent pitch are automatically organized into Drum Racks, while chromatic pads remain on separate MIDI tracks. Recorded fader automation is exported for LVL, PTC, LPF, HPF, FX, ATK, REL, PAN, TUNE, VEL and MOD. Choke groups work between pads in the same Drum Rack. TIM automation, the EP effects and stretching algorithms remain approximations.`, ableton: `When samples are included, pads used at one consistent pitch are automatically organized into Drum Racks, while chromatic pads remain on separate MIDI tracks. Recorded fader automation is exported for LVL, PTC, LPF, HPF, FX, ATK, REL, PAN, TUNE, VEL and MOD. Choke groups work between pads in the same Drum Rack. TIM automation, the EP effects and stretching algorithms remain approximations.`,
dawproject: `Unfortunately, the DAWproject format does not currently support the "Sampler" instrument, so you will need to manually assign the samples in your DAW.`, dawproject: `Unfortunately, the DAWproject format does not currently support the "Sampler" instrument, so you will need to manually assign the samples in your DAW.`,
midi: `The simplest format supported by any DAW. But you have to assign the samples manually.`, midi: `The simplest format supported by any DAW. But you have to assign the samples manually.`,
reaper: `Only basic sampler features are supported`, reaper: `Only basic sampler features are supported`,

View File

@@ -208,6 +208,20 @@ test('uses one hybrid classification for Arrangement and Session exports', () =>
assert.deepEqual(trackShape(arrangement.tracks), trackShape(session.tracks)); assert.deepEqual(trackShape(arrangement.tracks), trackShape(session.tracks));
}); });
test('classifies a pad from its distinct pitches across every exported scene', () => {
const data = project();
data.scenes[0].patterns[1].notes = [note(60, 0)];
data.scenes[1].patterns[1].notes = [note(61, 0)];
const result = abletonTransformer(data, { includeArchivedSamples: true });
const rack = result.tracks.find((track) => track.drumRack);
assert.deepEqual(
rack?.tracks.map((track) => track.padCode),
['a0'],
);
assert.ok(result.tracks.some((track) => track.padCode === 'a1' && !track.drumRack));
});
test('does not create selector-note racks when samples are excluded', () => { test('does not create selector-note racks when samples are excluded', () => {
const result = abletonTransformer(project(), { const result = abletonTransformer(project(), {
includeArchivedSamples: false, includeArchivedSamples: false,