서커스 갤럽(Circus Galop)이라는 노래가 있다.

자동 피아노 연주용 노래이며 최후반부에는 보표가 12개로 나누어지는 그야말로 혼돈 그 자체인 곡이다.


그리고 그 악보를 지메 2.2의 피아노 효과음으로 옮긴 인간이 있었으니 그게 바로 나임




당연히 하나하나 손으로 만든건 아님


어느 세월에 16000개의 음표를 다 배치하고 음량 피치 다 조정하냐 난 그럴 끈기 없음


예상했겠지만 이것도 코딩으로 만든거임





1. Mido 라이브러리



짠 우리들의 친구 파이썬이야


파이썬에서 MIDI파일의 분석 및 처리를 도와주는 mido 라이브러리를 받아주자


그리고 서커스갤럽의 MIDI 파일을 분석해보자


from mido import MidiFile
mid = MidiFile('35468_Circus-Galop.mid', clip=True)

for msg in mid:
print(msg)


대충 이런 코드로 분석해보면 MIDI를 뜯을 수 있는데

이런 메시지가 많이 뜰거임


note_on channel=0 note=63 velocity=123 time=0.00897788125


이건 63번 음표를 123의 강도로 이전 메시지의 0.8978초 후에 연주하라는 소리임


63번 음표가 대체 뭐냐하면

MIDI에서는 60번 음표가 가온 도(C4)음이고 1 증가하면 반음씩 음이 증가함 다시말해 63번은 가온 레#임


강도는 말그대로 음의 세기인데 127이 최대



이제 이걸 다 떼와서 지메로 옮기면 끝인데


문제가 하나 있지


SFX트리거의 구조를 아직 모르잖아?


그럼 알아봐야지




2. SFX 트리거




짠 SFX트리거야


지메에서 음향효과를 만드는 트리거지


내가 사용한 효과음은




이 Piano Pop 01이라는 효과음이야


이 효과음은 비누방울 터지는 소리 뒤에 피아노 C음이 들리는 효과음인데 우리는 피아노 소리만 필요하잖아?




그냥 시작지점을 0.1초로 지정하면 됨 ㅇㅇ.


그리고 저걸 통째로 다 재생하면 다른 음표랑 겹쳐서 렉을 엄청나게 유발하기 때문에 적당히 끊어줘야 하는데


최대한 짧으면서도 피아노 음을 해치지 않는 0.45초로 지정했음




그리고 음을 변화시키기 위해 이 Pitch와 Speed를 이용할건데


이 둘의 값을 1 올릴 때마다 음이 반음씩 올라가고 12를 올리면 한 옥타브가 올라가지


단 Speed값은 SFX의 속도가 변해서 음색이 변할 수 있기 때문에 더 이상 다른 방법으로 음을 올릴 수 없을 때 쓸 거야


어쨌든 원래 음인 C4에서 이 두 설정을 이용해서 위아래로 2옥타브를 커버할 수 있어


그럼 C2~C6인데 이전 글에서 나는 C2~C7까지의 음을 사용했다 했지?


그건 어떻게 했을까?




그냥 높은 도 음을 내는 저 효과음으로 바꿔주면 됨 ㅇㅅㅇ


그러면 이제 서커스갤럽을 만들 준비가 된 걸까?


아직 아니야




3. SFX트리거의 내부 구조


지메 레벨의 세이브파일 구조를 알아보자여느 게임이 다 그렇듯 지메는 유저의 데이터를 파일로 저장해서 보관하는데그게 바로 CCGameManager.dat와 CCLocalLevels.dat임gall.dcinside.com


우선 이 글을 먼저 읽고 오자



저 글에 있는 깃허브 링크를 자주 이용했는데 저 글은 2.1 이후로 업데이트가 없음


그래서 2.2 요소들은 하나씩 부딪쳐가면서 알아내야 해



이렇게 SFX트리거를 비교해가면서 힘들게 분석했다


결과적으로 SFX 아이디는 392번, 속도 피치 볼륨은 각각 404 405 406번임


저 위에 피치가 14로 지정되어있는데 저렇게 넣으니까 지메가 0으로 바꿔버리더라


다시 말해 피치에 12 초과하는 값은 절대 못 넣는다는 얘기임


가능했으면 C7까지가 아니라 모든 음을 다 넣었을텐데 좀 아쉬움




근데 다시 생각해보니 그게 가능하면 파이어인더홀 9단고음 귀갱맵 나올게 뻔함




어쨌든


C3~C5: 피치 조정으로 해결

C2~C3: 피치&속도 조정

C5~C6: 효과음 변경+피치 조정

C6~C7: 효과음 변경+피치&속도 조정


이렇게 하면 될거임



4. 코드 작성


여기까지 생각이 따라오면 코드 작성은 생각보다 어렵지 않음



코드를 실행시키면 Galop.txt에 결과물이 나오는데그걸 지메에 집어넣으면



완성


ㅂㅂ