0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ギター指板の音名を覚えたい!!ハッカーが練習アプリを作った結果....

Last updated at Posted at 2024-02-10

ギター指板の音名、覚えていますか...?

こんにちは、jikao1919です。
突然ですが、皆さんはギターの指板上の音名を覚えていますか????

私は覚えていません()。
練習していて自然に覚えられる程練習するのが理想なのでしょうが、毎日マックばかり食べているためか、近年記憶力の逓減が著しく、全く覚えられません。

もっと効率的に練習したい...。

やはり、もっと効率的に練習したいものです。
そこで、練習用のアプリケーションを自作することにしました。

アプリの挙動は

  1. 弦の番号(1弦か、2弦か、...6弦か)と音名(CからBまで12音)をランダムに指定される。(例:1弦でCの音を出すフレットは?)
  2. 考慮時間のWait処理
  3. 考慮時間の間に考えて答えを出し、実際にピッキングして音を出す。(例:8フレットだな)
  4. 答えとなる周波数の音を発生させ、自分の出した音があっているか答え合わせする

となります。正解、不正解は自分の耳で判断してください()。

実際に作ってみる

Pythonを使って実装します。GUIウィンドウ生成にTkinter、正解となる音を出すためにwinsoundを使います。

全体コードがこちらになります。

flet_memorize.py
from random import random
import random
import tkinter
import winsound

counter = input("繰り返し回数: ")
interval = input("インターバル秒数: ")
interval = 1000*int(interval)

strings = ["6弦", "5弦", "4弦", "3弦", "2弦", "1弦"]
flet = list(range(0, 12))

# 全音名のリスト
pitch = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
# 1~6弦における0fのpitchインデックス
idx_0f_pitch = [-8, -3, -10, -5, -1, -8]
# 全フレットの音名リスト
pitch_all = [[pitch[i] for i in range(j, j + 12)] for j in idx_0f_pitch]

# 6弦ギター(0~11f)の音域をカバーする周波数(A1~A4 = 55Hz~880Hz)
freq = [55 * 2 ** ((1/12) * i) for i in range(4 * 12 + 1)]
# 1~6弦における0fのfreqインデックス
idx_0f_freq = [7, 12, 17, 22, 26, 31]
# 全フレットの周波数リスト
freq_all = [[freq[i] for i in range(j, j + 12)] for j in idx_0f_freq]

def strings_deter(idx_pre):
    idx = strings.index(random.choice(strings))
    while idx_pre == idx:
        idx = strings.index(random.choice(strings))
    return idx

def flet_deter(idx_pre):
    idx = flet.index(random.choice(flet))
    while idx_pre == idx:
        idx = flet.index(random.choice(flet))
    return idx

def ring(f):
    winsound.Beep(int(f), 1000)

# Window表示を関数として定義
def disp(mytxt, mytime):
    root = tkinter.Tk()
    # テキストを表示させる
    w = tkinter.Label(root, text=mytxt, font=("normal", 20))
    w.pack()
    # 決まった時間後に閉じる
    root.after(mytime,lambda: root.destroy())
    # 継続して表示
    root.mainloop()

strings_idx = -1
flet_idx = -1

for num in range(int(counter)) :
    strings_idx, flet_idx= strings_deter(strings_idx), flet_deter(flet_idx)
    disp(strings[strings_idx], int(interval*0.5))
    disp(pitch_all[strings_idx][flet_idx], interval)
    f = freq_all[strings_idx][flet_idx]
    ring(f)

うおおおおおおおおおお動いたあああああ

インターバル秒数に考慮時間を入れてください。おすすめは5秒ぐらいです。
繰り返し回数は問題の出題数です。やりたいだけ入力してください。おすすめは50回ぐらいですかね...。

アプリはexeファイルにまとめてgitで公開しています。

画面右側のDownload raw fileを選択していただくと、実行ファイルをダウンロードできます。

jikao1919でした^^

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?