質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

2回答

721閲覧

pythonでピアノロールのy軸からノート番号を求めたい

kemomimi_sabal

総合スコア12

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

0クリップ

投稿2019/11/22 06:16

編集2019/11/25 06:51

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])

ソースは上記です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stdio

2019/11/22 06:48 編集

もう少し文章を増やして下さい。 これでは丸投げの質問と判断せざるを得ないです。
stdio

2019/11/25 01:30

私の説明が悪かったのかしら。 「どうもうまくいきません。」と言っている部分のソースをアップして下さい。 それともう一点、y / ノートの高さで座標が求まることは数学上ありえません。
stdio

2019/11/25 07:02 編集

「self.pianoKeysCanvas.create_rectangle」とは何ですか? 教えて頂けると助かります。 私の予想ですが、取得しなくても最初からそこに書いている気がします...
kemomimi_sabal

2019/11/25 07:03

y / ノートの高さの単位(恐らく音階)でmidiノート番号は求められると教わりました
kemomimi_sabal

2019/11/25 13:06

self.pianoKeysCanvas.create_rectangleはピアノのキーを描画している部分です
guest

回答2

0

自己解決しました。一番高い最高音のキーのmidi番号からyの終点を引きそれを20でやって商を求めることで解決しました

投稿2019/12/05 02:18

kemomimi_sabal

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

貴方がself.pianoKeysCanvas.create_rectangleの正体を明かしてくれないから私は推測でお答えします。

Python

1self.pianoKeysCanvas.create_rectangle(0, measure_height * 10 + (t_measure_height * i), 60, 2 measure_height * 11 + (t_measure_height * i), fill=black, 3 outline=outline)

create_rectangleの第一から第四引数が座標と幅高さの値だと思います。
この値を配列に代入してやれば、取得せずとも貴方の実現したいことは可能だと思います。

Python

1rectangles = [] 2rectangles.append({'x':0,'y':measure_height * 10 + (t_measure_height * i),'w':60,'h':measure_height * 11 + (t_measure_height * i)}) 3 4for rect in rectangles: 5 self.pianoKeysCanvas.create_rectangle(rect['x'],rect['y'],rect['w'],rect['h'],fill=black,outline=outline)

投稿2019/11/26 00:41

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問