From e7fdaea248116be72e7b0a5e449512d5019a4e30 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Tue, 14 Jul 2026 07:56:27 +0200 Subject: [PATCH] Improve Ableton builder by using dedicated note mapping function and refining device setup. --- src/lib/exporters/ableton/builders.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/lib/exporters/ableton/builders.ts b/src/lib/exporters/ableton/builders.ts index 0c0d24e..5ab1a52 100644 --- a/src/lib/exporters/ableton/builders.ts +++ b/src/lib/exporters/ableton/builders.ts @@ -12,6 +12,7 @@ import abletonTransformer, { AblGroupLane, AblScene, AblTrack, + getDrumRackMidiNote, } from '../../transformers/ableton'; import { getQuarterNotesPerBar } from '../utils'; import { @@ -218,7 +219,12 @@ function trackAutomationTargets(midiTrack: any, includeArrangementMixer: boolean sampleRate > 0 ? (trimmedFrames > 0 ? trimmedFrames : sampleDuration) / sampleRate : undefined; - addTarget(targets, FaderParam.PTC, targetFor(simpler.Pitch.TransposeKey)); + const pitchTarget = targetFor(simpler.Pitch.TransposeKey); + const staticPitchValue = koTrack.faderParams[FaderParam.PTC]; + const staticPitchOffset = + staticPitchValue === -1 ? 0 : Math.round((staticPitchValue - 0.5) * 10); + pitchTarget.valueOffset = Number(simpler.Pitch.TransposeKey.Manual['@Value']) - staticPitchOffset; + addTarget(targets, FaderParam.PTC, pitchTarget); addTarget(targets, FaderParam.TUNE, targetFor(simpler.Pitch.TransposeFine)); addTarget( targets, @@ -619,12 +625,7 @@ async function buildDrumRackDevice(koTrack: AblTrack, abletonVersion: AbletonVer continue; } - const padNumber = parseInt(subtrack.padCode.slice(1), 10); - // EP133 is 3x4 (top→bottom), Ableton Drum Rack is 4x4 (bottom→top) - // flip vertically: row 3 → row 0, row 0 → row 3 - const row = 3 - Math.floor(padNumber / 3); - const col = padNumber % 3; - const drumPad = row * 4 + col; + const drumPad = getDrumRackMidiNote(subtrack.padCode) - 36; const drumBranch = structuredClone(drumBranchTemplate.DrumBranch); const note = 92 - drumPad; // 92 is the number of slot for C1 in the drum rack and it goes down @@ -633,8 +634,10 @@ async function buildDrumRackDevice(koTrack: AblTrack, abletonVersion: AbletonVer drumBranch.Name.EffectiveName['@Value'] = subtrack.name; drumBranch.Name.UserName['@Value'] = subtrack.name; drumBranch.BranchInfo.ReceivingNote['@Value'] = note; - drumBranch.BranchInfo.SendingNote['@Value'] = 60; // not sure if this matters + drumBranch.BranchInfo.SendingNote['@Value'] = + subtrack.drumRackSendingNote ?? subtrack.rootNote; drumBranch.BranchInfo.ChokeGroup['@Value'] = subtrack.inChokeGroup ? 1 : 0; + drumBranch.MixerDevice.Volume.Manual['@Value'] = subtrack.volume; drumBranch.DeviceChain.MidiToAudioDeviceChain.Devices = await buildSimplerDevice( subtrack, abletonVersion,