서커스 갤럽(Circus Galop)이라는 노래가 있다.
자동 피아노 연주용 노래이며 최후반부에는 보표가 12개로 나누어지는 그야말로 혼돈 그 자체인 곡이다.
그리고 그 악보를 지메 2.2의 피아노 효과음으로 옮긴 인간이 있었으니 그게 바로 나임
당연히 하나하나 손으로 만든건 아님
어느 세월에 16000개의 음표를 다 배치하고 음량 피치 다 조정하냐 난 그럴 끈기 없음
예상했겠지만 이것도 코딩으로 만든거임
1. Mido 라이브러리
짠 우리들의 친구 파이썬이야
파이썬에서 MIDI파일의 분석 및 처리를 도와주는 mido 라이브러리를 받아주자
그리고 서커스갤럽의 MIDI 파일을 분석해보자
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트리거의 내부 구조
우선 이 글을 먼저 읽고 오자
저 글에 있는 깃허브 링크를 자주 이용했는데 저 글은 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에 결과물이 나오는데그걸 지메에 집어넣으면
완성
ㅂㅂ
정성추 ㄷㄷ
이 이게 뭐노
이래도 지메가 게임이냐?
아믈랭도 이건 생각 못 했을 듯
이게 뭐노..
미친놈.. - dc App
이제 누가 피아노 보스 구현하면 플폼익데뚝딱
내 똥폰으로는 죽어도 못돌리겠네 - dc App
초당 10개만 넘어도 버벅거리던데 - dc App
뭐냐 이게 도대체 ㅋㅋㅋ
진짜 미치겠다 ㅆㅂ ㅋㅋㅋㅋㅋ
혹시 midi 어떤거 씀? 설마 내껀 아니지?