Я инженер с некоторым опытом программирования, но у меня были проблемы с реализацией GUI для моего последнего проекта. Проект должен симулировать счет в реальном времени, следующий за python. У меня есть функция с именем returnLocation ( много параметров здесь ), которая использует запись mp3 для имитации живого исполнения, а при вызове предсказывает, где в музыке c оценка исполнения основана на значении i это передается ему (что в основном представляет время). Это значение сохраняется как л в моем коде. Моя оценка - это просто список заметок. Ex [A, G, D, C, E ...]. Я хочу создать код, который вызывает мой итеративный вызов моей функции returnLocation и использует вывод позиции счета для генерации визуализации заметок. В частности, я хочу, чтобы он показывал некоторые заметки по обе стороны от текущей заметки в партитуре. Это не должно быть очень красиво, но в идеале это может вызвать мою функцию returnLocation и обновить GUI таким образом, который имитирует живое исполнение. Моя текущая проблема заключается в том, что когда я использую функцию after, код запускается, но он ничего не отображает. Извините, этот вопрос настолько неясен, что было очень сложно обобщить этот проект.
Код:
hop = 1024
sr = 22050
winsize = 2048
window = 350
#calculate time per frame
timePerFrame = 1/sr * hop
#Set the update rate by the amount of frames of the STFT between updates. 22 frames is about 1 second
framesPerStep = 22
#use this to calculate the time step of the loop
timeStep = framesPerStep*timePerFrame
Cprev = None
Dprev = None
Bprev = None
query = 'Recordings/6.mp3'
Fquery = extractChromaFeatures(query)
Y, sr = lb.core.load(query, sr = sr)
Fref = six
score = sixI
l=0
i=0
class Note:
def __init__(self, canvas, x1, y1):
self.x1 = x1
self.y1 = y1
self.canvas = canvas
self.note = canvas.create_oval(self.x1-7, self.y1-1, self.x1+7, self.y1+7, fill="red")
def move_note(self, Ydif):
self.canvas.move(self.note, 0, Ydif)
def update_notes(Notes, Yold, Ynew, Xnew):
counter = 0
for note in Notes:
Ydif = (Ynew[counter]-Yold[counter])*24
if(Xnew[counter]>0 and Xnew[counter]<len(score)):
note.move_note(Ydif)
counter +=1
def update_sheet(Y,Cprev, Dprev, Bprev, framesPerStep, i, Fref, Yold):
startTime = time.time()
l,Cprev, Dprev, Bprev = returnLocation(Y,Cprev, Dprev, Bprev, framesPerStep, 22*i, Fref)
Notes = []
Ynew = []
Xnew = []
for x in range(-6 , 6, 1):
xVal = 600 + 97*x
if(x+l>0 and x+l<len(score)):
yVal = score[l+x]*24
else:
yVal = 0
varName = "Note" + str(x)
varName = Note(canvas, xVal, yVal)
Notes.append(varName)
Ynew.append(yVal)
Xnew.append(l+x)
update_notes(Notes, Yold, Ynew, Xnew)
Yold = Ynew
i=i+1
time.sleep(timeStep - ((time.time() - startTime) % timeStep))
root.after(0, update_sheet(Y,Cprev, Dprev, Bprev, framesPerStep, i, Fref, Yold))
# initialize root Window and canvas
root = Tk()
startTime = time.time()
root.title("Live Score Sheet")
root.resizable(False,False)
canvas = Canvas(root, width = 1200, height = 300)
canvas.pack()
l=0
Yold = [0]*12
canvas.create_line(600,0,600,300,fill="blue")
update_sheet(Y,Cprev, Dprev, Bprev, framesPerStep, i, Fref, Yold)
root.mainloop(
)