SEIREN 블로그

에이블톤 als 파일 파이썬으로 편집하다 곡을 날려먹음;; (Invalid Pointee Id)

als파일 에이블톤 에이블톤라이브 InvalidPointeeId 파이썬 XML편집 AI작곡 미디작곡 DAW 작곡프로그램

지난 편에서 작곡 프로그램을 못 다뤄서 파이썬으로 우회한 얘기를 썻다

미디까지는 잘 됐다. 근데 미디는 소리가 없다

파이썬으로 만든 미디를 에이블톤에 올린 상태

악기를 올리고, 프리셋을 고르고, 이펙트를 걸고, 파라미터를 맞춘다. 트랙이 일곱 개면 일곱 번이다. 그리고 다음 곡에서 또 처음부터

그래서 프로젝트 파일 자체를 만들기로 했다. 이게 사고의 시작임

에이블톤 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이라 파이썬으로 열린다. 열리는 건 맞다

근데 열린다고 마음대로 고쳐도 되는 건 아니었다. 구조를 건드리면 참조가 끊기고, 파일은 열어보기 전까지 멀쩡해 보인다

마지막 게 제일 어려웠다;; 한 번 돌릴 때 다 바꾸고 싶어지거든

다음 편에는 이렇게 만든 게 결국 뭐가 됐는지 썼다. 곡 만들려다 검사기를 만든 얘기임

X페이스북

댓글

    로그인 없이 쓸 수 있어요. 이메일도 받지 않습니다.