ギターチューナー

この投稿では、Android用の無料のGuitar Tunerアプリの作成について説明します



画像



アイデアの最初の段階で、ユニバーサルチューナーを作りたかったのです。電話は音を聞き、音を検出し、表示します。 理論的には、これは非常に簡単に実現されます。音は振動であり、振動には周波数があり、振動周波数は注意です。



数学には、フーリエ変換のような素晴らしいものがあります。 この変換により、アナログ信号の周波数スペクトルが得られます。 つまり、任意の信号は、異なる周波数と異なる振幅の正弦曲線の合計として表すことができます。



画像



したがって、信号自体が正弦波の場合、周波数の拡張では1つの項しかありません。つまり、信号には1つの周波数があります。 信号が複雑な場合、スペクトルは複雑です。

tumblrの統計



楽器は特定の音を演奏すると同時に、多くの倍音(倍音)を鳴らします。つまり、スペクトルは複雑な構造を持ちますが、スペクトルで演奏される音(周波数)は最大の振幅を持ちます。 原則として、信号には一定数の高調波、つまり基本波の倍数(2倍、3倍など)の周波数もあります。



画像



したがって、ギターで音がするノートを判別するには、電話のマイクからサウンドストリームを削除し、そこからフーリエ画像を取得し、最大振幅の周波数を見つけ、周波数とノートを一致させる必要があります。



問題



各段階で、トラブルが待っていました。 後者に加えて、もちろん、対応表が既知であり、最初のオクターブのノートの既知の周波数440 Hz、および隣接するオクターブの1つのノートの周波数間の既知の関係(2回)とオクターブの既知のノートの数から簡単に計算できます。



まず、 Android OSの最初のバージョンの初期の頃には、マイクからのオーディオストリームを操作するためのオープンなJava APIがありませんでした。 サウンドを再生するためのAPIがありましたが、マイクからストリームを読み取るためではありませんでした。 ただし、Speech Recongnitionシステムにはネイティブコードがあり、録音されたサウンドストリームで機能しました。 その結果、ラッパーはこれらのネイティブストリームを操作するためのハックとして作成されました。 後で判明したように、これは非常に悲しい結果で応答しました。 しかし、それについては後で。



次のステップは、信号のフーリエ画像を取得することでした。 当然、高速フーリエ変換(FFT)アルゴリズムが使用されました。 私たちはすぐに、これが最も計算が複雑なタスクとして、チューナーのパフォーマンスのボトルネックになると考えました。 自然な解決策は、この部分をJavaではなくCで書くことですが、両方の解決策を比較することにしました。 Cooley – TukeyバージョンのFFTアルゴリズムをJavaとCで実装した後、小さなベンチマークを実行し、時間差がほぼ2桁であることがわかりました。 誰が勝ったか、明らかに。 ただし、Javaバージョンの結果をほぼ1桁改善することができました。複雑な数値を複雑なオブジェクトとして扱う作業を単純な数値のペアに置き換えました。 その結果、Javaバージョンの結果は十分に高速になり、不必要なネイティブコードの使用を回避するために(一般的には移植性が低下するため)それを使用することにしました。



その後、最も興味深い問題が始まりました。 スペクトル画像を見ると、期待したものがわかりませんでした。 基本周波数の大きな振幅と複数の高調波のはるかに小さな振幅の代わりに、私たちが理解できない法則に従うほとんど目立たない基本周波数と高調波の振幅を見ました。 私たちに提示された依存関係を長く理解しようと試みた後、最終的にSpeech Recongnitionにすべてをダンプしました。 同様に、彼は人間のスピーチで一般的な周波数を強調しています。



解決策



そのとき、ストリームを読み込むための代替ソースがなかったため、どうにかして出なければなりませんでした。 私はユニバーサルチューナーを作るという当初の目標を放棄しなければならず、代わりに6弦と7弦のギター、4弦、5弦、6弦のベースギターなど、打たれた楽器セット用のチューナーを作りました。 言い換えると、チューナーのユーザーは、楽器で音を出す前に、チューニングしたい弦を選択してから、演奏するだけです。 したがって、基準周波数を取得することが理想的です。 そして、信号のスペクトル画像から目的の音の高調波の1つを知ることで、基準周波数からの実際の基本周波数の偏差を(分割することで)見つけることができます。 言い換えれば、「台無しにされた」音声認識信号の最大振幅をもつ周波数は、所望の周波数で除算された整数であり、高調波数が取得されます。 さらに、分割することにより、サウンディングノートの実際の基本周波数が計算され、求められた周波数とサウンディング周波数の差が計算され、表示されたスケールの長さに正規化され、ユーザーに表示されます。



その後、マイクからのオーディオストリームを操作するためのAPIが登場し、それを使用してチューナーがやり直されましたが、現時点ではサポートされていません

リソースのため、完全な状態ではありません。 それにもかかわらず、50,000人以上のAndroidユーザーが積極的に使用しています。



そのような有益な物語。 受け取った情報が将来あなたに役立つことを願っています。 すべての質問に喜んでお答えします。



All Articles