pygame은 게임을 만들기 위한 모듈답게 게임에 필요한 여러 가지 요소를 지원합니다.

게임에 필요한 도형 그리기와 각종 사용자가 발생시키는 이벤트에 대한 구분, 그리고 음악 및 효과음을 재생할 수 있도록 합니다.

여기서는 pygame 모듈을 이용하여 사용자가 원하는 음악을 플레이할 수 있는 소스와 소스에 대한 설명을 작성하려 합니다.

참고한 예제는 Github에서 가져왔습니다.


예제 소스 링크 : juehan



00.pygame 음악재생 모듈

pygame에서는 pygame.mixer.music을 통한 음악재생 기능을 제공합니다.

하지만 해당 모듈가지로 음악을 재생시켜보기에는 어려움이 있으실 것입니다.

때문에 간단한 예제를 통해 설명하도록 하겠습니다.




01. pygame 음악재생 예제

예제 소스코드는 python 3.x의 형태로 작성되었으며, print문 외에는 큰 차이가 없습니다.

때문에 python 2.x 버전에서 실행하고자 하시는 분은 print문을 수정하여 실행하시면 됩니다.

또한 음악 파일의 위치가 Music이라는 디렉토리 내에 있는 것을 재생시키도록 되어 있습니다.

저와 같이 실행하고자 하지 않으시면, 음악 파일이 있는 위치를 적절히 수정해주시면 될 것입니다.

예제는 다음과 같습니다.

'''
Created on 2012. 2. 19.
This module is for playing mp3 (limited) and wav formatted audio file
@author: John
'''
import pygame

def playsound(soundfile):
    """Play sound through default mixer channel in blocking manner.
       This will load the whole sound into memory before playback
    """    
    pygame.init()
    pygame.mixer.init()
    sound = pygame.mixer.Sound(soundfile)
    clock = pygame.time.Clock()
    sound.play()
    while pygame.mixer.get_busy():
        print("Playing... - func => playsound")
        clock.tick(1000)

def playmusic(soundfile):
    """Stream music with mixer.music module in blocking manner.
       This will stream the sound from disk while playing.
    """
    pygame.init()
    pygame.mixer.init()
    clock = pygame.time.Clock()
    pygame.mixer.music.load(soundfile)
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy():
        print("Playing... - func => playingmusic")
        clock.tick(1000)
        

def stopmusic():
    """stop currently playing music"""
    pygame.mixer.music.stop()

def getmixerargs():
    pygame.mixer.init()
    freq, size, chan = pygame.mixer.get_init()
    return freq, size, chan


def initMixer():
    BUFFER = 3072  # audio buffer size, number of samples since pygame 1.8.
    FREQ, SIZE, CHAN = getmixerargs()
    pygame.mixer.init(FREQ, SIZE, CHAN, BUFFER)


'''You definitely need test mp3 file (a.mp3 in example) in a directory, say under 'C:\\Temp'
   * To play wav format file instead of mp3, 
      1) replace a.mp3 file with it, say 'a.wav'
      2) In try except clause below replace "playmusic()" with "playsound()"
    
'''
                    
try:
    initMixer()
    filename = 'Musics\\01.mp3'
    playmusic(filename)
except KeyboardInterrupt:   # to stop playing, press "ctrl-c"
    stopmusic()
    print("\nPlay Stopped by user")
except Exception:
    print("unknown error")
    
print("Done")


위의 예제의 결과를 보기 위해서는 커맨드에서 실행을 하셔야 합니다.



음악이 재생 중일 때는 playmusic 함수가 실행되는 것을 확인할 수 있습니다.

또한 음악 재생을 멈출 때 Ctrl + C를 사용하면 음악 재생이 멈추는 것을 확인할 수 있습니다.



02. pygame 음악재생 예제 설명

pygame에서 예제를 부분부분 나눠 설명해보도록 하겠습니다.


먼저 58번째 라인에서 66번째 라인을 보도록 하겠습니다.

try:
    initMixer()
    filename = 'Musics\\01.mp3'
    playmusic(filename)
except KeyboardInterrupt:   # to stop playing, press "ctrl-c"
    stopmusic()
    print("\nPlay Stopped by user")
except Exception:
    print("unknown error")
    
print("Done")

58번째 라인은 예외상황이 발생했을 때를 대비하여 try문으로 시작합니다.

예외처리 구문은 Ctrl + C를 눌렀을 때(Keyboard Interrupt)와 그 외의 상황으로 구분하였습니다.

59번째 라인은 음악을 재생하기 위해 필요한 요소를 초기화 해주는 함수입니다.

그리고 61번째 라인에서의 playmusic() 함수에서는 재생할 파일의 디렉토리(혹은 이름만) 가져와 음악을 재생합니다.

만약 음악이 재생되는 도중에 Ctrl + C를 하게 되면, 예외문이 발생하여 stopmusic() 함수를 통해 음악 재생을 멈추고 꺼지게 됩니다.


다음으로 21번째 라인에서 32번째 라인을 보도록 하겠습니다.

def playmusic(soundfile):
    """Stream music with mixer.music module in blocking manner.
       This will stream the sound from disk while playing.
    """
    pygame.init()
    pygame.mixer.init()
    clock = pygame.time.Clock()
    pygame.mixer.music.load(soundfile)
    pygame.mixer.music.play()
    while pygame.mixer.music.get_busy():
        print("Playing... - func => playingmusic")
        clock.tick(1000)

21번째 함수의 인자값(parameter)인 soundfile은 음악파일 및 디렉토리의 경로를 받는 변수입니다.

우리가 실행할 음악파일 및 디렉토리를 받아 pygame.mixer.music.load() 함수를 통해 파일을 메모리에 올립니다.

그 후, pygame.mixer.music.play() 함수를 통해 메모리에 올린 음악 파일을 재생시킵니다.

여기서 중요한 것이 30번째 라인부터 32번째 라인입니다.

만약 음악이 아직 재생중이라면 pygame.mixer.music.get_busy() 함수에서 True를 반환할 것입니다.

그러면 음악 재생 시간을 clock.tick() 함수를 통해 재생 시간을 연장시킵니다.

이 과정을 계속 반복하다가, 이후 재생이 끝나고 pygame.mixer.music.get_busy() 함수에서 False가 반환되면, 반복문을 빠져나오게 되어, 프로그램이 종료됩니다.

위의 설명의 구조는 다음과 같습니다.




음악 재생 프로그램은 상당히 까다로운 녀석이었습니다.

하지만, 위의 큰 흐름을 유지한 채로 프로그램을 커스터마이징 하여 자신만의 음악재생 프로그램을 만들어보도록 합시다~


+ Recent posts