Refactor fader value conversion and default handling for Ableton export
This commit is contained in:
@@ -1,11 +1,17 @@
|
|||||||
import { FaderParam } from '../../../types/types';
|
import { FaderParam } from '../../../types/types';
|
||||||
import { AblGroupPatternOccurrence, AblTrack } from '../../transformers/ableton';
|
import { AblGroupPatternOccurrence, AblTrack } from '../../transformers/ableton';
|
||||||
|
import {
|
||||||
|
convertGroupFaderValue,
|
||||||
|
getFaderDefaultValue,
|
||||||
|
getFaderPolicy,
|
||||||
|
} from './faderPolicies';
|
||||||
|
|
||||||
export type AbletonAutomationTarget = {
|
export type AbletonAutomationTarget = {
|
||||||
arrangement?: number;
|
arrangement?: number;
|
||||||
session?: number;
|
session?: number;
|
||||||
staticValue?: number;
|
staticValue?: number;
|
||||||
valueOffset?: number;
|
valueOffset?: number;
|
||||||
|
padTrack?: AblTrack;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type AbletonAutomationTargets = Partial<Record<FaderParam, AbletonAutomationTarget[]>>;
|
export type AbletonAutomationTargets = Partial<Record<FaderParam, AbletonAutomationTarget[]>>;
|
||||||
@@ -18,21 +24,6 @@ type AutomationPoint = {
|
|||||||
const SENTINEL_TIME = -63072000;
|
const SENTINEL_TIME = -63072000;
|
||||||
const BOUNDARY_EPSILON = 0.000001;
|
const BOUNDARY_EPSILON = 0.000001;
|
||||||
|
|
||||||
function defaultValue(parameter: FaderParam) {
|
|
||||||
switch (parameter) {
|
|
||||||
case FaderParam.LVL:
|
|
||||||
case FaderParam.LPF:
|
|
||||||
return 1;
|
|
||||||
case FaderParam.PTC:
|
|
||||||
case FaderParam.TIM:
|
|
||||||
case FaderParam.PAN:
|
|
||||||
case FaderParam.TUNE:
|
|
||||||
return 0.5;
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function convertFaderValue(
|
export function convertFaderValue(
|
||||||
parameter: FaderParam,
|
parameter: FaderParam,
|
||||||
value: number,
|
value: number,
|
||||||
@@ -40,42 +31,11 @@ export function convertFaderValue(
|
|||||||
groupMixer: boolean,
|
groupMixer: boolean,
|
||||||
target?: AbletonAutomationTarget,
|
target?: AbletonAutomationTarget,
|
||||||
) {
|
) {
|
||||||
let convertedValue: number;
|
return convertGroupFaderValue(parameter, value, {
|
||||||
switch (parameter) {
|
track: target?.padTrack ?? track,
|
||||||
case FaderParam.LVL:
|
groupMixer,
|
||||||
if (groupMixer) {
|
valueOffset: target?.valueOffset,
|
||||||
convertedValue = value;
|
});
|
||||||
} else {
|
|
||||||
convertedValue = track.volume * value;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case FaderParam.PTC:
|
|
||||||
convertedValue = (target?.valueOffset ?? 0) + (value - 0.5) * 10;
|
|
||||||
break;
|
|
||||||
case FaderParam.LPF:
|
|
||||||
convertedValue = 20 + value * 0.9 * 115;
|
|
||||||
break;
|
|
||||||
case FaderParam.HPF:
|
|
||||||
convertedValue = 20 + value * 0.7 * 115;
|
|
||||||
break;
|
|
||||||
case FaderParam.FX:
|
|
||||||
convertedValue = value;
|
|
||||||
break;
|
|
||||||
case FaderParam.PAN:
|
|
||||||
convertedValue = (value - 0.5) * 2;
|
|
||||||
break;
|
|
||||||
case FaderParam.TUNE:
|
|
||||||
convertedValue = Math.max(-0.5, Math.min(0.5, value - 0.5)) * 100;
|
|
||||||
break;
|
|
||||||
case FaderParam.MOD:
|
|
||||||
convertedValue = value / 20;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
convertedValue = value;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return convertedValue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getFaderValueAt(
|
export function getFaderValueAt(
|
||||||
@@ -98,7 +58,7 @@ export function getFaderValueAt(
|
|||||||
|
|
||||||
function getStaticValue(pattern: AblGroupPatternOccurrence, parameter: FaderParam) {
|
function getStaticValue(pattern: AblGroupPatternOccurrence, parameter: FaderParam) {
|
||||||
const value = pattern.faderParams[parameter];
|
const value = pattern.faderParams[parameter];
|
||||||
return value === -1 ? defaultValue(parameter) : value;
|
return value === -1 ? getFaderDefaultValue(parameter) : value;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getConvertedStaticValue(
|
function getConvertedStaticValue(
|
||||||
@@ -141,7 +101,13 @@ function getArrangementPoints(
|
|||||||
const points: AutomationPoint[] = [];
|
const points: AutomationPoint[] = [];
|
||||||
let previousValue = orderedPatterns[0]
|
let previousValue = orderedPatterns[0]
|
||||||
? getConvertedStaticValue(orderedPatterns[0], parameter, track, groupMixer, target)
|
? getConvertedStaticValue(orderedPatterns[0], parameter, track, groupMixer, target)
|
||||||
: convertFaderValue(parameter, defaultValue(parameter), track, groupMixer, target);
|
: convertFaderValue(
|
||||||
|
parameter,
|
||||||
|
getFaderDefaultValue(parameter),
|
||||||
|
track,
|
||||||
|
groupMixer,
|
||||||
|
target,
|
||||||
|
);
|
||||||
|
|
||||||
orderedPatterns.forEach((pattern) => {
|
orderedPatterns.forEach((pattern) => {
|
||||||
const patternTicks = Math.max(1, pattern.loopDuration * 96);
|
const patternTicks = Math.max(1, pattern.loopDuration * 96);
|
||||||
@@ -193,6 +159,10 @@ function getClipPoints(
|
|||||||
.filter((point) => point.parameter === parameter)
|
.filter((point) => point.parameter === parameter)
|
||||||
.sort((a, b) => a.position - b.position);
|
.sort((a, b) => a.position - b.position);
|
||||||
|
|
||||||
|
if (sourcePoints.length === 0) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
const staticValue = getConvertedStaticValue(pattern, parameter, track, groupMixer, target);
|
const staticValue = getConvertedStaticValue(pattern, parameter, track, groupMixer, target);
|
||||||
return [
|
return [
|
||||||
{ time: SENTINEL_TIME, value: staticValue },
|
{ time: SENTINEL_TIME, value: staticValue },
|
||||||
@@ -231,7 +201,7 @@ export function buildArrangementEnvelopes(
|
|||||||
const envelopes: any[] = [];
|
const envelopes: any[] = [];
|
||||||
Object.entries(targets).forEach(([parameterString, targetList]) => {
|
Object.entries(targets).forEach(([parameterString, targetList]) => {
|
||||||
const parameter = Number(parameterString) as FaderParam;
|
const parameter = Number(parameterString) as FaderParam;
|
||||||
if (parameter === FaderParam.TIM || parameter === FaderParam.VEL) {
|
if (getFaderPolicy(parameter).renderStrategy !== 'target') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
targetList?.forEach((target) => {
|
targetList?.forEach((target) => {
|
||||||
@@ -265,7 +235,7 @@ export function buildClipEnvelopes(
|
|||||||
const envelopes: any[] = [];
|
const envelopes: any[] = [];
|
||||||
Object.entries(targets).forEach(([parameterString, targetList]) => {
|
Object.entries(targets).forEach(([parameterString, targetList]) => {
|
||||||
const parameter = Number(parameterString) as FaderParam;
|
const parameter = Number(parameterString) as FaderParam;
|
||||||
if (parameter === FaderParam.TIM || parameter === FaderParam.VEL) {
|
if (getFaderPolicy(parameter).renderStrategy !== 'target') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
targetList?.forEach((target) => {
|
targetList?.forEach((target) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user