Remove deprecated and unused Ableton automation parameters and simplify playback state logic
This commit is contained in:
@@ -1,13 +1,9 @@
|
|||||||
import { FaderParam } from '../../../types/types';
|
import { FaderParam } from '../../../types/types';
|
||||||
import { AblGroupPatternOccurrence, AblTrack } from '../../transformers/ableton';
|
import { AblGroupPatternOccurrence, AblTrack } from '../../transformers/ableton';
|
||||||
import { koEnvRangeToSeconds } from './utils';
|
|
||||||
|
|
||||||
export type AbletonAutomationTarget = {
|
export type AbletonAutomationTarget = {
|
||||||
arrangement?: number;
|
arrangement?: number;
|
||||||
session?: number;
|
session?: number;
|
||||||
maxValue?: number;
|
|
||||||
soundLength?: number;
|
|
||||||
invertValue?: boolean;
|
|
||||||
staticValue?: number;
|
staticValue?: number;
|
||||||
valueOffset?: number;
|
valueOffset?: number;
|
||||||
};
|
};
|
||||||
@@ -65,20 +61,6 @@ export function convertFaderValue(
|
|||||||
case FaderParam.FX:
|
case FaderParam.FX:
|
||||||
convertedValue = value;
|
convertedValue = value;
|
||||||
break;
|
break;
|
||||||
case FaderParam.ATK:
|
|
||||||
convertedValue =
|
|
||||||
koEnvRangeToSeconds(
|
|
||||||
(target?.invertValue ? 1 - value : value) * 255,
|
|
||||||
target?.soundLength ?? track.soundLength,
|
|
||||||
) * 1000;
|
|
||||||
break;
|
|
||||||
case FaderParam.REL:
|
|
||||||
convertedValue =
|
|
||||||
koEnvRangeToSeconds(
|
|
||||||
(target?.invertValue ? 1 - value : value) * 255,
|
|
||||||
target?.soundLength ?? track.soundLength,
|
|
||||||
) * 1000;
|
|
||||||
break;
|
|
||||||
case FaderParam.PAN:
|
case FaderParam.PAN:
|
||||||
convertedValue = (value - 0.5) * 2;
|
convertedValue = (value - 0.5) * 2;
|
||||||
break;
|
break;
|
||||||
@@ -93,9 +75,7 @@ export function convertFaderValue(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return target?.maxValue === undefined
|
return convertedValue;
|
||||||
? convertedValue
|
|
||||||
: Math.min(target.maxValue, convertedValue);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getFaderValueAt(
|
export function getFaderValueAt(
|
||||||
|
|||||||
@@ -6,6 +6,5 @@ export function getSimplerPlaybackState(projectMode: AbletonPlaybackMode) {
|
|||||||
voices: projectMode === 'key' ? 5 : 0,
|
voices: projectMode === 'key' ? 5 : 0,
|
||||||
retrigger: projectMode === 'oneshot',
|
retrigger: projectMode === 'oneshot',
|
||||||
portamentoMode: projectMode === 'legato' ? 2 : 0,
|
portamentoMode: projectMode === 'legato' ? 2 : 0,
|
||||||
useOneShotEnvelope: projectMode === 'oneshot',
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,64 +86,3 @@ test('uses absolute automation targets for Session clip envelopes', () => {
|
|||||||
assert.equal(envelopes[0].Automation.Events.FloatEvent[2]['@Time'], 1);
|
assert.equal(envelopes[0].Automation.Events.FloatEvent[2]['@Time'], 1);
|
||||||
assert.deepEqual(envelopes[0].LoopSlot, { Value: {} });
|
assert.deepEqual(envelopes[0].LoopSlot, { Value: {} });
|
||||||
});
|
});
|
||||||
|
|
||||||
test('uses each Simpler target duration and One-Shot release direction', () => {
|
|
||||||
assert.equal(
|
|
||||||
convertFaderValue(FaderParam.REL, 1, track, false, {
|
|
||||||
soundLength: 10,
|
|
||||||
maxValue: 2000,
|
|
||||||
invertValue: true,
|
|
||||||
}),
|
|
||||||
0,
|
|
||||||
);
|
|
||||||
assert.equal(
|
|
||||||
convertFaderValue(FaderParam.REL, 0, track, false, {
|
|
||||||
soundLength: 10,
|
|
||||||
maxValue: 2000,
|
|
||||||
invertValue: true,
|
|
||||||
}),
|
|
||||||
2000,
|
|
||||||
);
|
|
||||||
|
|
||||||
const envelopes = buildClipEnvelopes(
|
|
||||||
occurrence,
|
|
||||||
{
|
|
||||||
[FaderParam.REL]: [
|
|
||||||
{ session: 23000, soundLength: 2 },
|
|
||||||
{ session: 23001, soundLength: 4, maxValue: 2000, invertValue: true },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
track,
|
|
||||||
false,
|
|
||||||
);
|
|
||||||
|
|
||||||
assert.equal(envelopes[0].Automation.Events.FloatEvent[2]['@Value'], 1500);
|
|
||||||
assert.equal(envelopes[1].Automation.Events.FloatEvent[2]['@Value'], 1000);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('preserves the pad envelope before group automation when the static group value is absent', () => {
|
|
||||||
const pattern = {
|
|
||||||
...occurrence,
|
|
||||||
faderParams: { ...faderParams, [FaderParam.REL]: -1 },
|
|
||||||
};
|
|
||||||
const envelopes = buildClipEnvelopes(
|
|
||||||
pattern,
|
|
||||||
{
|
|
||||||
[FaderParam.REL]: [
|
|
||||||
{
|
|
||||||
session: 23000,
|
|
||||||
soundLength: 4,
|
|
||||||
maxValue: 2000,
|
|
||||||
invertValue: true,
|
|
||||||
staticValue: 321,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
track,
|
|
||||||
false,
|
|
||||||
);
|
|
||||||
|
|
||||||
assert.equal(envelopes[0].Automation.Events.FloatEvent[0]['@Value'], 321);
|
|
||||||
assert.equal(envelopes[0].Automation.Events.FloatEvent[1]['@Value'], 321);
|
|
||||||
assert.equal(envelopes[0].Automation.Events.FloatEvent[2]['@Value'], 1000);
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -8,23 +8,20 @@ test('exports every EP playback mode as automatic One-Shot Trigger playback', ()
|
|||||||
voices: 5,
|
voices: 5,
|
||||||
retrigger: false,
|
retrigger: false,
|
||||||
portamentoMode: 0,
|
portamentoMode: 0,
|
||||||
useOneShotEnvelope: false,
|
|
||||||
});
|
});
|
||||||
assert.deepEqual(getSimplerPlaybackState('legato'), {
|
assert.deepEqual(getSimplerPlaybackState('legato'), {
|
||||||
playbackMode: 1,
|
playbackMode: 1,
|
||||||
voices: 0,
|
voices: 0,
|
||||||
retrigger: false,
|
retrigger: false,
|
||||||
portamentoMode: 2,
|
portamentoMode: 2,
|
||||||
useOneShotEnvelope: false,
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test('preserves native EP ONE envelope translation', () => {
|
test('preserves native EP ONE trigger behavior', () => {
|
||||||
assert.deepEqual(getSimplerPlaybackState('oneshot'), {
|
assert.deepEqual(getSimplerPlaybackState('oneshot'), {
|
||||||
playbackMode: 1,
|
playbackMode: 1,
|
||||||
voices: 0,
|
voices: 0,
|
||||||
retrigger: true,
|
retrigger: true,
|
||||||
portamentoMode: 0,
|
portamentoMode: 0,
|
||||||
useOneShotEnvelope: true,
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user