에이블톤 als 파일 파이썬으로 편집하다 곡을 날려먹음;; (Invalid Pointee Id)
지난 편에서 작곡 프로그램을 못 다뤄서 파이썬으로 우회한 얘기를 썻다
미디까지는 잘 됐다. 근데 미디는 소리가 없다

악기를 올리고, 프리셋을 고르고, 이펙트를 걸고, 파라미터를 맞춘다. 트랙이 일곱 개면 일곱 번이다. 그리고 다음 곡에서 또 처음부터
그래서 프로젝트 파일 자체를 만들기로 했다. 이게 사고의 시작임
에이블톤 als 파일을 열어봤더니
에이블톤 프로젝트 파일이 .als 인데, 이게 뭔가 싶어서 열어봤다
$ file 고마워.als
고마워.als: gzip compressed data, max compression, original size modulo 2^32 353686
gzip으로 압축된 XML이었다. 풀면 트랙이고 디바이스고 파라미터고 전부 태그로 들어있다
import gzip
with gzip.open('고마워.als', 'rt', encoding='utf-8') as f:
xml = f.read()
풀어서 앞부분만 보면 이렇다
<?xml version='1.0' encoding='utf-8'?>
<Ableton MajorVersion="5" MinorVersion="12.0_12300" Creator="Ableton Live 12.3d1">
<LiveSet>
<NextPointeeId Value="50996" />
<OverwriteProtectionNumber Value="3076" />
<Tracks>
<MidiTrack Id="1" ...>
이거 보고 진짜 신낫다;; 이러면 파이썬으로 다 되는 거 아님? 싶어서
근데 저 세 번째 줄이 나중에 나를 잡는다. NextPointeeId
신나서 디바이스를 통째로 갈아끼웠다
베이스 악기 프리셋을 바꾸고 싶었다. 그래서 제일 단순하게 생각했다
# 이렇게 하면 안 된다
old = xml[operator_start:operator_end] # <Operator>...</Operator> 통째로
xml = xml.replace(old, new_preset_xml) # 다른 프리셋 XML 로 교체
저장하고 에이블톤에서 열었더니 이게 떴다
Invalid Pointee Id.
그리고 곡이 안 열렸다
Invalid Pointee Id — 왜 깨졌냐면
에이블톤 XML 안에는 이런 게 곳곳에 박혀 있다
<AutomationTarget Id="12345">
그리고 XML 다른 위치에 이걸 가리키는 게 따로 있다
<PointeeId Value="12345" />
둘이 1:1로 묶여 있다. 디바이스를 통째로 갈아끼우면 그 안의 Id 들이 전부 새 번호로 바뀌는데, 다른 데 있는 PointeeId 는 옛 번호를 계속 가리킨다
그래서 참조가 끊기고 파일이 손상된다. 오토메이션을 안 걸어놨어도 이 구조는 이미 파일 안에 들어있음
곡 하나에 몇 개나 있는지 세어봤다
XML 길이 353,686자
AutomationTarget Id 337개
PointeeId 2개
깨진 참조 0개
337개다. 이게 전부 참조 대상이다
그래서 규칙이 하나 생겼다
값만 바꾼다. 구조는 안 건드린다
| 하지 마라 | 해라 |
|---|---|
| 디바이스 XML 통째로 교체 | Value 속성값만 변경 |
AutomationTarget Id 변경 |
Id 는 절대 안 건드림 |
| 문자열 위치로 앞에서부터 편집 | 뒤에서부터, 또는 범위 내 문자열 치환 |
WaveForm / FilterType 번호 추측 |
확인된 값만 사용 |
| 한 스크립트에서 열 가지 동시 변경 | 백업 → 소수 변경 → 검증 → 다음 |
| 검증 없이 저장 | 파싱 + 참조 + 값 반영 확인 |
| 백업 없이 시작 | 무조건 .before_xxx 백업 |
필터 주파수를 282에서 1800으로 바꾸고 싶으면, <Operator> 를 통째로 바꾸는 게 아니라 그 안의 숫자 하나만 바꾼다. 구조가 그대로면 Id 도 그대로고 참조도 안 끊긴다
시시해 보이는데 이게 유일하게 안전한 방법이었다
또 걸린 것 — 앞에서부터 고치면 안 된다
파라미터 여러 개를 한 번에 고치려고 위치를 찾아뒀다가 순서대로 바꿨는데, 두 번째부터 엉뚱한 데가 바뀌었다
당연한 건데 그때는 몰랏다. 문자열 길이가 달라지면 그 뒤 좌표가 전부 밀린다
# 뒤에서부터 처리하면 앞쪽 좌표가 안 밀린다
for start, end, new in sorted(edits, key=lambda e: -e[0]):
xml = xml[:start] + new + xml[end:]
808을 909로 바꾸다 또 막힘
드럼킷을 바꾸려는데 샘플 경로만 갈아끼우면 될 줄 알앗다
근데 벨로시티 변형 문자가 서로 달랐다
808 킥: (기본), -f, -k, -p, -t
909 킥: (기본), -d, -g, -k
그래서 하나씩 매핑해야 했다
kick_variant_map = {'-f': '-d', '-k': '-g', '-p': '-k', '-t': ''}
게다가 파일 이름도 달랏음
808: 808-Kick-Tone-f.aif
909: 909-Kick-Tune-d.aif
↑ Tone 이 아니라 Tune
이거 모르고 돌렸다가 존재하지 않는 경로가 잔뜩 박혔다. 그래서 교체하고 나면 파일이 실제로 있는지 확인하는 코드를 넣게 됨
결국 검증을 붙였다
편집 스크립트 끝에 세 가지를 넣는다
# 1. XML 이 파싱되는가
ET.fromstring(content)
# 2. PointeeId 가 가리키는 번호가 실제로 있는가
automation_ids = set(re.findall(r'AutomationTarget Id="(\d+)"', content))
pointee_ids = set(re.findall(r'<PointeeId Value="(\d+)" />', content))
broken = pointee_ids - automation_ids - {'0'}
assert not broken, f"깨진 참조: {broken}"
# 3. 바꾸려던 값이 진짜 바뀌었는가
안 하면 에이블톤에서 열어보기 전까지 모른다. 그게 제일 무섭다
그러다 문서가 401줄이 됐다
같은 실수를 두 번 하기 싫어서 규칙을 적기 시작했는데 계속 늘어났다
맨 앞에 이렇게 써놨더라
이 문서는 실제 시행착오를 통해 검증된 규칙과 코드 패턴을 담고 있다
그리고 2번 항목이 "편집 전 반드시 백업" 이다
폴더를 열어보면 이렇게 남아 있다
고마워.als
고마워.als.before_artic
고마워.als.before_clean
고마워.als.before_devices
고마워.als.before_inject
고마워.als.before_newriff
위험한 작업을 다섯 번 했다는 뜻이다. 이름만 봐도 뭘 하다 무서웠는지 보인다
참고로 미디도 같은 일이 있었다
als 만의 문제가 아니었다. 미디를 만들 때도 결과가 이상해서 캡처를 올려가며 따진 적이 있다

화음이 동시에 울려야 하는데 0.1~0.2박 간격으로 쪼개져 들어가 있었다. 아르페지오처럼 들리는 거
원인은 라이브러리가 코드를 넣을 때 음마다 미세한 시간차를 두고 배열하는 거였다. 눈으로 피아노롤을 열어보기 전까지는 몰랐다
이런 걸 매번 눈으로 잡는 게 싫어서 결국 자동으로 재는 걸 만들었는데, 그게 지금 하고 있는 서비스다. 라우드니스·클리핑·다이내믹 레인지를 재서 목표값이랑 같이 보여준다. 심사는 무료임

정리하면
에이블톤 als 파일은 gzip으로 압축된 XML이라 파이썬으로 열린다. 열리는 건 맞다
근데 열린다고 마음대로 고쳐도 되는 건 아니었다. 구조를 건드리면 참조가 끊기고, 파일은 열어보기 전까지 멀쩡해 보인다
- 값만 바꾼다. 구조는 안 건드린다
- 여러 군데를 고칠 땐 뒤에서부터
- 고치기 전에 백업, 고치고 나서 검증
- 한 번에 열 가지 바꾸지 않는다
마지막 게 제일 어려웠다;; 한 번 돌릴 때 다 바꾸고 싶어지거든
다음 편에는 이렇게 만든 게 결국 뭐가 됐는지 썼다. 곡 만들려다 검사기를 만든 얘기임
댓글
첫 댓글을 남겨 보세요.