我正在try 创建一个应用程序,它将帮助训练人的耳朵听到不同的音调.我目前正在研究一个按钮数组,它将具有从八度3到5的每个色调音符.当这些按钮中的一个被按下时,它将执行上面用Electron 游戏包编写的功能.
我遇到的问题是,一旦按钮被按下,整个应用程序似乎都在等待,直到播放完该音符(只有1秒).这些按钮将注册输入,然后播放它们,只是不是同时播放.我希望能够在任何时候点击任何音符并让它被播放.
import pygame
import time
import pygame.midi
# mixer config
# freq = 44100 # audio CD quality
# bitsize = -16 # unsigned 16 bit
# channels = 2 # 1 is mono, 2 is stereo
# buffer = 1024 # number of samples
# pygame.mixer.init(freq, bitsize, channels, buffer)
# pygame.mixer.music.set_volume(0.8)
pygame.midi.init()
fps = 60
timer = pygame.time.Clock()
player= pygame.midi.Output(0)
player.set_instrument(1,1) #127 is max
major=[0,4,7,12]
def go(note):
player.note_on(note, 127,1)
time.sleep(1)
player.note_off(note,127,1)
我正在使用pyqt5编写应用程序,相关的按钮代码如下.我不确定问题是与按钮如何执行功能有关,还是与pyGame MIDI功能有关.
import sys
import pygame
import time
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import chromatic_player
#small change for new branch
lowO= 3
highO = 5
Octaves = list(range(lowO,highO+1))
#Notes = ["A","A#/Bb","B","C","C#/Db","D","D#/Eb","E","F","F#/Gb","G"]
Notes = ["C","C#","D","D#","E","F","F#","G","A","A#","B"]
global glo
glo=0
class CustomButton(QPushButton):
def __init__(self, text='',octave='', parent=None):
self.octave = octave
self.text = text
super(QPushButton, self).__init__(text, parent=parent)
self.setGeometry(QRect(30, 40, 41, 41))
self.button_show()
self.setId = self.text
def button_show(self):
self.clicked.connect(self.on_click)
def on_click(self):
chromatic_player.go(int(Notes.index(self.text[:-1]))+12*self.octave)
print("User Clicked Me")
print(self.text)
print(glo + 1)
class Color(QWidget):
def __init__(self, color):
super(Color, self).__init__()
self.setAutoFillBackground(True)
palette = self.palette()
palette.setColor(QPalette.Window, QColor(color))
self.setPalette(palette)
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setWindowTitle("My App")
layout1 = QHBoxLayout()
layout3 = QGridLayout()
layout1.setContentsMargins(0,0,0,0)
layout1.setSpacing(5)
layout1.addWidget(Color('green'))
layout3.addWidget(Color('red'))
layout3.addWidget(Color('purple'))
for j in Octaves:
layoutTemp = QVBoxLayout()
for i in Notes:
buttontemp = CustomButton("{}{}".format(i,j),j)
#buttontemp.clicked.connect(buttontemp.on_click)
layoutTemp.addWidget(buttontemp)
layout1.addLayout(layoutTemp)
layout1.addLayout( layout3 )
widget = QWidget()
widget.setLayout(layout1)
self.setCentralWidget(widget)
app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec()