pythonでピアノロールのy座標からノート番号を計算したいのですが、やり方がわかりません。どなたか教えてくださいませんか。
python3のTkinterを使っています。
Canvasのオブジェクトをすべて取得して、座標を取得しその座標を使って計算したいです
y / ノートの高さの単位で求まる(10単位なら10)と教わったのですが、どうもうまくいきません。
Python
1 def drawKeys(self): 2 measure_height = 20 3 t_measure_height = measure_height * 12 4 5 half = measure_height / 2 6 print(measure_height * 11 - half + (t_measure_height * 7)) 7 outline = "#000" 8 black = "#333" 9 white = "#fff" 10 11 for i in range(0, 7): 12 self.pianoKeysCanvas.create_rectangle(0, 0 + (t_measure_height * i), 120, 13 measure_height + half + (t_measure_height * i), fill=white, 14 outline=outline) 15 self.pianoKeysCanvas.create_rectangle(0, measure_height + half + (t_measure_height * i), 120, 16 measure_height * 4 - half + (t_measure_height * i), fill=white, 17 outline=outline) 18 self.pianoKeysCanvas.create_rectangle(0, measure_height * 4 - half + (t_measure_height * i), 120, 19 measure_height * 6 - half + (t_measure_height * i), fill=white, 20 outline=outline) 21 self.pianoKeysCanvas.create_rectangle(0, measure_height * 6 - half + (t_measure_height * i), 120, 22 measure_height * 7 + (t_measure_height * i), fill=white, 23 outline=outline) 24 self.pianoKeysCanvas.create_rectangle(0, measure_height * 7 + (t_measure_height * i), 120, 25 measure_height * 9 - half + (t_measure_height * i), fill=white, 26 outline=outline) 27 self.pianoKeysCanvas.create_rectangle(0, measure_height * 9 - half + (t_measure_height * i), 120, 28 measure_height * 11 - half + (t_measure_height * i), fill=white, 29 outline=outline) 30 self.pianoKeysCanvas.create_rectangle(0, measure_height * 11 - half + (t_measure_height * i), 120, 31 measure_height * 12 + (t_measure_height * i), fill=white, 32 outline=outline, tags="rectangle") 33 34 self.pianoKeysCanvas.create_rectangle(0, measure_height + (t_measure_height * i), 60, 35 measure_height * 2 + (t_measure_height * i), fill=black, 36 outline=outline) 37 self.pianoKeysCanvas.create_rectangle(0, measure_height * 3 + (t_measure_height * i), 60, 38 measure_height * 4 + (t_measure_height * i), fill=black, 39 outline=outline) 40 self.pianoKeysCanvas.create_rectangle(0, measure_height * 5 + (t_measure_height * i), 60, 41 measure_height * 6 + (t_measure_height * i), fill=black, 42 outline=outline) 43 self.pianoKeysCanvas.create_rectangle(0, measure_height * 8 + (t_measure_height * i), 60, 44 measure_height * 9 + (t_measure_height * i), fill=black, 45 outline=outline) 46 self.pianoKeysCanvas.create_rectangle(0, measure_height * 10 + (t_measure_height * i), 60, 47 measure_height * 11 + (t_measure_height * i), fill=black, 48 outline=outline) 49 50 self.pianoKeysCanvas.create_text(90, measure_height * 11 + half + (t_measure_height * i), 51 text="C" + str(7 - i)) 52 for id in self.pianoKeysCanvas.find_all(): # 全オブジェクトを列挙 53 tag = self.pianoKeysCanvas.itemcget(id, 'tags') # タグ名を取得 54 print(tag) 55 if tag.startswith('rectangle'): 56 self.List_white = (self.pianoKeysCanvas.coords(id)) # .coordsで座標を取得 57 print('White key y', self.List_white[1])
ソースは上記です。
もう少し文章を増やして下さい。
これでは丸投げの質問と判断せざるを得ないです。
私の説明が悪かったのかしら。
「どうもうまくいきません。」と言っている部分のソースをアップして下さい。
それともう一点、y / ノートの高さで座標が求まることは数学上ありえません。
「self.pianoKeysCanvas.create_rectangle」とは何ですか?
教えて頂けると助かります。
私の予想ですが、取得しなくても最初からそこに書いている気がします...
y / ノートの高さの単位(恐らく音階)でmidiノート番号は求められると教わりました
私はその「ノート番号」という単語については詳しくありません。
https://www.geidai.ac.jp/~marui/matlab/node4.html
言語は違いますが、↑を参考にしてみてはいかがですか?
self.pianoKeysCanvas.create_rectangleはピアノのキーを描画している部分です