MML이 뭔지 아시죠?
Music Macro Language 인데요. 음악을 표현하는 언어(?) 정도로 생각하시면 되겠습니다.
BASIC의 PLAY 명령에서 사용되는 문법이 대표적인 MML이라고 보시면 되겠습니다.
더 궁금하시면 wiki 문서를 찾아보셔요~ ㅎ.ㅎ
https://en.wikipedia.org/wiki/Music_Macro_Language
아래는 MSX-MUSIC BASIC 매뉴얼에 나오는 샘플곡입니다.
채널 2개로 출력하는 프로그램이네요.
OPLL 악기 설정만 빼면, 일반 PSG용 MML과 같은 구조로 되어있습니다.
요걸 C 코드로 옮기면 아래처럼 됩니다.
BASIC 코드와 C 코드의 MML 문자열이 똑같은걸 볼수가 있지요?
"BASIC에서 PLAY 코딩하던 것처럼 배경음악을 만들 수 있다"를 기억하시면 되겠습니다~
xxx_enqueue()가 모두 끝나면, xxx_play()로 배경음악을 시작하고 xxx_stop()으로 멈출 수 있습니다.
음악이 재생완료되었는지는, xxx_get_stat() 함수로 상태확인이 가능합니다.
위의 코드에서는 음악 연주를 가만히 기다리고 있으면 심심하니까,
놀고있는 PSG 채널로 짧은 효과음을 출력해봅니다.
shot() 함수는 아래처럼 구현되어있습니다.
총알소리에 쓰인 MML에 Z 명령어가 보이시죠?
요건 BASIC MML에서는 없던건데, PSG 노이즈 주파수 설정하는 용도로 사용됩니다.
참고하셔요.
실행하면 아래처럼 현재 버퍼 상태를 확인할 수 있구요.
스페이스 키 누르면 총소리가 나게됩니다~ ㅎ.ㅎ
PSG 두개 채널은 배경음악 용, 나머지 한개 채널은 총소리 출력으로 사용됩니다.
그럼 이번엔 3채널 모두 사용하는 BGM을 연주해봅니다.
베토벤 할아버지께서 작곡하신 "환희의 송가"가 되겠습니다요~
3개 채널이 모두 사용되니까, 스페이스 눌러서 총소리를 출력하게 되면,
PSG 마지막 채널은 배경음악과 총소리로 번갈아서 출력됩니다.
일단 설명만 드리고 넘어갑니다.
이 글 마지막에 동영상이 있으니까 그걸로 확인하셔요! ㅎ.ㅎ
라이브러리가 어떻게 사용되는지 대충 아시겠죠?
마지막으로 MML 데이터를 연속으로 enqueue()해서, 배경음악을 무한으로 연주해봅시다~
코드는 아래처럼 만들었습니다.
템포 240으로 "학교종이 땡땡땡~"을 연주해보았어요 ㅋㅋ
처음 enqueue()를 한번 해주고 play() 시작합니다.
그 후, 버퍼에 여유가 있으면 계속 데이터를 enqueue()합니다.
ESC 누르면 종료하도록 해주고요. 간단하죠? ㅎ.ㅎㅋ
그럼, 실제 동작하는 모습을 영상으로 보시겠습니다.
보기전에 약간의 설명들어갑니다 ㅋ
영상에 보시면 아래처럼 나오는데요.
화면의 빨간색 띠는 배경음악 처리에 사용되는 CPU 점유율입니다.
터보알 고속모드랑 Z80 3.58MHz 모드 두번 구동하니까 한번 비교해보셔요~
마지막으로 영상 나갑니다~
그럼, 즐거운 하루 되세요!