【HSP】音感を鍛えられるかもしれない【プログラム】

【HSP】音感を鍛えられるかもしれない【プログラム】

精密集計DX」によれば、カラオケ DAM ではプラスマイナス 1/8 半音の範囲をぴったりな音程としているそうです。
なので、その範囲の音を出すプログラムを作成してみました。
半音は、2^(1/12) 倍の周波数になるので、A4 (ラ) の音が 440Hz より
音階の周波数は f(x) = 440*2^(x/12) というような 指数関数 になります。
(A4 の音を 0 として、半音の数をプラスマイナスで指定)
※…この基準は主に電子的に出す音の基準のようです。オーケストラとかだと、少し違う周波数が基準になっているらしい。
DAM でぴったりの音程として判定されるのは -1/8 ~ +1/8 半音なので、出したい音が f(n) [Hz] (n は整数) の音だとすると、f(n-1/8) ~ f(n+1/8) の範囲にすればよい。
この周波数のずれを比率にすると、n の値に限らず
f(n-1/8) / f(n) = 2^(-1/96), f(n+1/8) / f(n) = 2^(+1/96) になります。
これを Google 電卓に計算させたところ、2^(1/96) = 約 1.00724641222 だそうです。これで周波数の範囲が求められる。
ちなみに、半音の比率は 2^(1/12) = 約 1.05946309436 だそうです。
いよいよプログラムです。音を出すのに、以下の自作のモジュールを使用しています。

#include "hspmath.as"

#define NOTE_DIFF 1.05946309436
#define NOTE_SAME 1.00724641222
#define ctype f(%1, %2) (440.0 * pow(NOTE_DIFF, (%1)) * pow(NOTE_SAME, (%2)))

// 
// メイン
// 
note_str = "ド", "ド#/レ♭", "レ", "レ#/ミ♭", "ミ", "ファ", "ファ#/ソ♭", "ソ", "ソ#/ラ♭", "ラ", "ラ#/シ♭", "シ"

repeat 16

pos 10 + 156 * (cnt / 4), 10 + 116 * (cnt \ 4)
mes "" + note_str(cnt \ 12)

pos 74 + 156 * (cnt / 4), 28 + 116 * (cnt \ 4)
mes "" + f(cnt + 3, -1)
pos 74 + 156 * (cnt / 4), 52 + 116 * (cnt \ 4)
mes "" + f(cnt + 3,  0)
pos 74 + 156 * (cnt / 4), 76 + 116 * (cnt \ 4)
mes "" + f(cnt + 3,  1)

pos 10 + 156 * (cnt / 4), 28 + 116 * (cnt \ 4)
button gosub "低", *play
button gosub "中", *play
button gosub "高", *play

loop

stop

*play
id = stat

waveOutSine f(id / 3 + 3, id \ 3 - 1), 0.25, 2.0

return

デザインはシンプルですが…。

最初、鍵盤のデザインにしようかと思ったけど、マウスとの当たり判定とかしなきゃいけないから面倒くさいんでやめました。

ボタン右の数値が周波数です。
う~ん、「低」と「高」の音程が違うのはなんとなくわかるけど、発音し分ける自身はないし、「中」と比べると違う周波数であるということすら識別できない…orz
世の中には ヘルツ 未満 の周波数を聞き分けられる人もいるんだよなぁ…。
なんか、最初は半音すら大して違わない音程に聞こえてたけど、このプログラムで数ヘルツしか違わない連続を連続で聞いていたら、半音がすごい大きく違っているように聞こえた。(気持ちだけかもしれないけど)
これ毎日繰り返してれば、脳が勝手に適応してくれるのでは?
ほんとに音感が上がるかわかりませんが、とりあえずこれで音程をより正確にできるように練習しようと思います。
ではまたいつか~。
↓ブログランキング投票  (クリック) お願いします~。