이번에는 간단하게 진행할 것이다.
지난번에는 건반 클릭 이벤트만 처리했는데, 누르면 피아노 소리가 나도록 설정해야 한다.
일단 먼저 피아노 소리 파일이 있어야 하는데
구글링 해보니 쉽게 찾을 수 있었다.
여기 있다. 출처
각각 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 |