2011/02/25

Javaでギター用チューナーでも作ろうか

昨年末からプログラムをやっていないので、忘れないために2ヶ月ぶりに再開してみる。今回はギター用チューナーでも作ろうかと思うが、毎回のように予備知識なしなので、適当に考えて、それを実現させようかと思う。

まずはギターの音を録音して波形を見てみた。サンプリング周波数は44100Hzで録音してみた。赤字の周波数が各弦のジャストチューニング。その横はジャストのときのサンプリング数。その下はジャスト前後のサンプル数と周波数。

1弦 329.62756Hz (133.7874sample)
134sample(329.1045Hz) - 133sample(331.5789Hz)

2弦 246.94165Hz (178.5847sample)
179sample(246.3687Hz) - 178sample(247.7528Hz)

3弦 195.99772Hz (225.0026sample)
226sample(195.133Hz) - 225sample(196.000Hz)

4弦 146.83238Hz (300.3425sample)
301sample(146.512Hz) - 300sample(147Hz)

5弦 110.00000Hz (400.9091sample)
401sample(109.975Hz) - 400sample(110.250Hz)

6弦 82.40689Hz (535.1494sample)
536sample(82.2761Hz) - 535sample(82.430Hz)

波形のかたち
思ったよりも素直だ。倍音が結構含まれているから、もっとギザギザかと思ったけど、そうでもなかった。6弦だけがちょっと倍音が多いけど。

周波数とサンプリング数の関係
上記のように何サンプルでジャストチューニングになるのかを計算したら結構中途半端になった。精度を上げるためにはちょっと細工が必要かもしれない。主流のサンプリング周波数はいくつかあって、44100Hz、48000Hz、96000Hzなどが一般的で高音質な部類になると思う。そこで思ったのだがCDのサンプリング周波数である44100Hzって昔から中途半端な印象があって不思議に思っていたけど、今回いろいろな数で割っていたら、1,2,3,4,5,6,7,9,10で整数に割れるのね。7で割れるというのが、おおっと思った。でも8で整数に割れないのが残念。5512.5となってしまうのが惜しい。ちなみに48000Hz、96000Hzだと7,9で割れない。

さて、どんな仕組みにするか
方法はいくつか思いつくが、そこそこの精度が出て、簡単なプログラムがよい。FFTや自己相関関数などを使ってもよいとは思うが、もっと簡単な方法として、サンプルを数えて行く方法にしようかと思う。波形のパターンを読み取って、繰り返している部分のサンプル数を数えるというもの。この方法のメリットとしては、低い周波数ほど精度が出るということ。FFTだと逆で低いほど精度が怪しくなると思う。ギターの開放弦もしくは12フレットの音が測定できればいいので、割と低い音を中心に測定することになる。高域は波形を複雑にして邪魔になる場合もあるかもしれないので、ローパスフィルターをはじめに通すといいかもしれない。

波形を数える方法
ギターの波形を見る限り、ひとつに周期に対してプラス側(もしくはマイナス側)にはピークがひとつしかない。そこで思いついた方法としては、まずプラス側のピークに着目し、その後レベル0を通過する仮想ポイントをチェック。0通過前後の2つのサンプルポイントから0を通過した仮想ポイントを計算すれば、そこそこの精度が出るはずだ。下図を見ると分かると思うが0をまたぐ2サンプルポイントが必ず存在する。

このチェックを繰り返して、チェックした仮想ポイント間の距離の平均を取ることで周波数を割り出してみようかと思う。実際やってみないとわからないけど、10回ぐらいの平均をとれば信頼できる精度が出そうな気がする。また10回ぐらい似たような値が出ていないと音程として認めない仕組みも兼ねる。PCの負荷も少ないと思うのでサクサク動くと思う。こんな単純な方法でいいのか分からんが、世の中のチューナーってどういう仕組みになっているのかな?

インターフェイス
一番重要な部分が表示部分かもしれない。使い勝手に大きく関わってくるからだ。多くのソフトチューナーは針をイメージしているものが多い。針式のチューニングメーターって、KORGがはじめに作ったようだ。それ以前はストロボチューナーなどデカイ機械しかなかったようだ。確かに針は個人的にも好きなのだが、いろいろ改善したい部分もあったりする。ソフトウェアなのでアイデア次第で問題解決できると思うのだが、まだ白紙。

仕様
オート・クロマチック・チューナー
平均律固定
キャリブレーションは430~440~450Hz(こんな広い必要もないけど・・)
目盛はセント表示
周波数表示 (個人的にはこれ重要)

のんびり下準備から
中身の構想は固まってきたので、細かな実験をして行こうと思う。暇を見てちょろちょろ作る予定なので、時間がかかるかもしれない。問題はやっぱりインターフェイスだな・・・