pygame 에서의 사운드 출력
매우 간단하게 중요한 부분만 설명하겠습니다. 나머지 자잘한 함수들은 직접 문서를 보시면 함수명만 봐도 뭔지 알만한 것들이니까요.
>
일단 처음에 초기화를 해줘야 합니다.
pygame.mixer.init()
믹서모듈의 초기화 함수인데 보통 pygame 초기화 함수인 pygame.init() 을 쓰기 때문에 특별히 pygame 에서 mixer 관련 함수만 쓸때외에는 사용할 일이 없습니다.
>
pygame.mixer.pre_init(44100,-16,2,512)
pygame.mixer.init() 나 pygame.init() 앞에 사용하며 초기화 할때의 사운드 설정을 미리 해 주는 것 입니다. 위의 예 에선 버퍼를 제외하면 원래 기본값들입니다. 버퍼만 2048 에서 512 로 변경한것 입니다.
버퍼의 값을 변경한 이유는 효과음에서 지연현상이 발생했기 때문입니다.
>
sfx1 = pygame.mixer.Sound('sounds/sfx01.ogg')
sfx1.set_volume(0.5)
sfx1.play()
간단한 효과음은 위와 같이 사용하면 됩니다. 위에서는 sfx1 변수를 만들어 놓고 효과음이 필요할때 마다 sfx1.play() 를 실행해 주면 효과음이 나오게 됩니다.
볼륨은 0.0 ~ 1.0 사이의 값 입니다.
파이게임에선 mp3 파일보단 ogg 를 권하고 있습니다. mp3 의 저작권 문제로 리눅스 배포판에 따라 mp3 가 제대로 실행이 안될 수 있기 때문입니다.
제가 테스트 했을때는 위와 같은 효과음에선 mp3 가 소리가 안난 반면 music.load 를 이용해 음악을 로딩할때는 mp3 가 가능했습니다. 보편적 실행을 위해선 ogg 를 사용하는것이 좋을 것 같습니다.
>
pygame.mixer.music.load('sounds/music01.mp3')
pygame.mixer.music.play()
음악을 로딩하고 원하는 곳에서 재생하면 됩니다. play(3) 식으로 사용하면 3번 반복해서 재생합니다.
pygame.mixer.music.queue(music_file) 함수로 다음에 재생될 곡을 미리 지정해 놓을 수도 있습니다.
>
pygame.mixer.music.set_endevent(MUSIC_END_EVENT)
음악의 재생이 끝났을때 이벤트를 발생시킵니다.
이벤트는
MUSIC_END_EVENT = pygame.USEREVENT + 1
위와 같은 방식으로 미리 설정해 줘야 합니다.
while done:
ev = pygame.event.get()
for event in ev:
if event.type ==pygame.QUIT: #창의 종료버튼이 눌렸을때 게임종료
done = False
if event.type == MUSIC_END_EVENT : #음악의 재생이 끝났음
print("Music End")
pygame.mixer.music.play()
그리고 이벤트는 위와 같은 방식으로 처리합니다.
위의 이벤트 처리 예제를 보면 음악이 끝났을때 음악을 다시 재생시키고 있는데요.
제 경우에 pygame.mixer.music.play() 로 음악을 재생시켰을 경우 음악이 재생되지 않는 현상이 간간히 발생했습니다.
음악이 끝날때 이벤트가 발생하게 설정해서 확인 해보니 play() 를 실행했을때 음악이 재생되지 않고 바로 음악 종료 이벤트가 발생하더군요.
이런 일이 랜덤하게 발생되기에 무엇이 원인 인지 잘 모르겠습니다. 그래서 일단 음악 종료 이벤트가 발생하면 다시 음악을 재생하도록 해 놓았습니다. 일종의 꼼수인데 문제를 해결하면 다시 문서를 수정해 놓도록 하겠습니다.
>
pygame.mixer.music.set_volume(0.3)
음악의 볼륨을 지정합니다. 범위는 0.0 ~ 1.0 사이의 값입니다.
>
나머지는 fadein, fadeout 이라던가 pause 라던가, 함수 이름만 봐도 대충 용도를 알 수 있는 것들이라 특별한 설명은 필요 없을 것 같습니다.
사실 pygame.mixer.channel 이라는게 있는데 어떤것일지 대충 짐작은 가지만 아직 테스트 해 보지 않아서 이 포스팅에선 언급하지 않았습니다. 언제 테스트 해 보고 포스팅 하려고 했는데 계속 미루다 보니 언제 포스팅 하게 될지 몰라서 그냥 제가 테스트 한곳 까지만 포스팅 해 놓기로 했습니다.
그리고 일단 포스팅 해 놓긴 하지만 동작에서 뭔가 석연치 않은 점도 있어서 버그인지, 뭔가 설정의 오류인지에 대해선 차후에 알게 되면 문서를 수정하도록 하겠습니다.