MapleStory Finger Point

미니 프로젝트/Python 피아노

[2] Pyiano - 클릭 시 소리 출력

吳鍾振 2021. 2. 24. 23:17

이번에는 간단하게 진행할 것이다.

지난번에는 건반 클릭 이벤트만 처리했는데, 누르면 피아노 소리가 나도록 설정해야 한다.

일단 먼저 피아노 소리 파일이 있어야 하는데

구글링 해보니 쉽게 찾을 수 있었다.

sound_files.zip
3.83MB

여기 있다. 출처

각각 mp3 파일과 wav 파일이 있는데, 파이썬에는 'wave'라는 모듈이 있어 wav 파일을 쉽게 읽고 쓸 수 있다.

wave 모듈을 사용했는데, 왜인지 모르겠지만 재생이 되지 않아 부득이하게 그냥 간편한 pygame 모듈을 사용한다.

아 그리고 일단 loop 문은 지운 상태로 코드를 작성했다. 왜냐면 loop문이 끝나야 음악 파일이 재생이 된다..

import os
import sys
from PyQt5 import QtWidgets, QtGui, QtCore
from pyiano import Ui_MainWindow
import pygame


class Pyiano(Ui_MainWindow):
    def __init__(self):
        super().__init__()

        self.freq = 16000  # sampling rate, 44100(CD), 16000(Naver TTS), 24000(google TTS)
        self.bitsize = -16  # signed 16 bit. support 8,-8,16,-16
        self.channels = 1  # 1 is mono, 2 is stereo
        self.buffer = 2048  # number of samples (experiment to get right sound)

    def setupUi(self, MainWindow: QtWidgets.QMainWindow):
        super().setupUi(MainWindow)
        self.C.mousePressEvent = self.click_C
        self.D.mousePressEvent = self.click_D
        self.E.mousePressEvent = self.click_E
        self.F.mousePressEvent = self.click_F
        self.G.mousePressEvent = self.click_G
        self.A.mousePressEvent = self.click_A
        self.B.mousePressEvent = self.click_B
        self.CC.mousePressEvent = self.click_CC
        self.DD.mousePressEvent = self.click_DD
        self.EE.mousePressEvent = self.click_EE

    def click_C(self, event):
        self.C.setStyleSheet("background-color: #d1d1d1;")

        file = "audio/25.MP3"
        pygame.mixer.init(self.freq, self.bitsize, self.channels, self.buffer)
        pygame.mixer.music.load(file)
        pygame.mixer.music.play()
        self.C.setStyleSheet("background-color: #ffffff")

    def click_D(self, event):
        self.D.setStyleSheet("background-color: #d1d1d1;")
        
        file = "audio/27.MP3"
        pygame.mixer.init(self.freq, self.bitsize, self.channels, self.buffer)
        pygame.mixer.music.load(file)
        pygame.mixer.music.play()
        self.D.setStyleSheet("background-color: #ffffff")


    def click_E(self, event):
        self.E.setStyleSheet("background-color: #d1d1d1;")

        file = "audio/29.MP3"
        pygame.mixer.init(self.freq, self.bitsize, self.channels, self.buffer)
        pygame.mixer.music.load(file)
        pygame.mixer.music.play()
        self.E.setStyleSheet("background-color: #ffffff")

    def click_F(self, event):
        self.F.setStyleSheet("background-color: #d1d1d1;")

        file = "audio/30.MP3"
        pygame.mixer.init(self.freq, self.bitsize, self.channels, self.buffer)
        pygame.mixer.music.load(file)
        pygame.mixer.music.play()
        self.F.setStyleSheet("background-color: #ffffff")

    def click_G(self, event):
        self.G.setStyleSheet("background-color: #d1d1d1;")

        file = "audio/32.MP3"
        pygame.mixer.init(self.freq, self.bitsize, self.channels, self.buffer)
        pygame.mixer.music.load(file)
        pygame.mixer.music.play()
        self.G.setStyleSheet("background-color: #ffffff")

    def click_A(self, event):
        self.A.setStyleSheet("background-color: #d1d1d1;")

        file = "audio/34.MP3"
        pygame.mixer.init(self.freq, self.bitsize, self.channels, self.buffer)
        pygame.mixer.music.load(file)
        pygame.mixer.music.play()
        self.A.setStyleSheet("background-color: #ffffff")

    def click_B(self, event):
        self.B.setStyleSheet("background-color: #d1d1d1;")

        file = "audio/36.MP3"
        pygame.mixer.init(self.freq, self.bitsize, self.channels, self.buffer)
        pygame.mixer.music.load(file)
        pygame.mixer.music.play()
        self.B.setStyleSheet("background-color: #ffffff")

    def click_CC(self, event):
        self.CC.setStyleSheet("background-color: #d1d1d1;")
        self.CC.setStyleSheet("background-color: #ffffff")

    def click_DD(self, event):
        self.DD.setStyleSheet("background-color: #d1d1d1;")
        self.DD.setStyleSheet("background-color: #ffffff")

    def click_EE(self, event):
        self.EE.setStyleSheet("background-color: #d1d1d1;")
        self.EE.setStyleSheet("background-color: #ffffff")


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Pyiano()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

pygame 모듈로 음악 파일을 재생하기 위해서는

frequence, bitsize, channels, buffer를 지정해주고 pygame.mixer.init에 넣는다.

그리고 파일을 로드 후 재생하면 끝.

나의 목표는 Pyiano로 가장 좋아하는 곡인 월광 소나타 1악장을 꼭 쳐보고 싶다.

반응형

'미니 프로젝트 > Python 피아노' 카테고리의 다른 글

[3] Pyiano - 소리 멀티 출력 [끝]  (0) 2021.03.01
[1] Pyiano - Ui 제작  (4) 2021.02.23