2009-10-29 2 views
8

さまざまな周波数のトーンを含むサウンドを作成する必要があります。 C#でこれを行う方法はありますか?C#で複雑なトーンを生成することはできますか?

これまでに私が見た唯一のトーン生成方法は、純粋なトーン(単一周波数)に対してのみ機能するconsole.beepです。

+0

お使いのコンピュータのスピーカー(ビープ音)を使用することは、通常はお勧めできません。デフォルトのオーディオ出力を使用する必要があります。 – decasteljau

+0

私は実際にデフォルトのオーディオ出力を使用することを好みます。最終的にはヘッドフォンを通す必要があります。 –

+4

それは重要なポイントです。ビープ音は忘れて。 DirectSoundまたはWaveOutを使用します。両方とも管理されていないAPIなので、あなたの言語としてPInvokeを使うか、C++/CLIに切り替える必要があります。 – CannibalSmith

答えて

19

Audiereライブラリはこれを非常に簡単にします。ここでは「1」ボタンのDTMFトーンを生成するために、ほぼ完全なC#のプログラムがあります:

AudioDevice device = new AudioDevice(); 
OutputStream tone1a = device.CreateTone(697); // part A of DTMF for "1" button 
OutputStream tone1b = device.CreateTone(1209); // part B 
tone1a.Volume = 0.25f; 
tone1b.Volume = 0.25f; 
tone1a.Play(); 
tone1b.Play(); 
Thread.Sleep(2000); 
// when tone1a stops, you can easily tell that the tone was indeed DTMF 
tone1a.Stop(); 

C#でAudiereを使用するには、立ち上がって実行する最も簡単な方法は、Harald Fielker's C# bindingを使用することです(彼はモノラルの作品を主張しています VS; VS2005のフルバージョンと、C#とVC++の別々のExpress 2008バージョンを使用していることを確認できます。 Win32 Audiere DLL, lib, and header(すべて同じzipにあります)をダウンロードする必要があり、VC++とC#の両方を使用してソースからC#バインディングをビルドする必要があります。

Audiereを使用することのメリットの1つは、コールが非ブロッキングであることです。 tone1aが再生を停止するのを待ってからtone1bを開始する必要はありませんが、これは明らかに複雑な音色を再生するために必要です。私はあなたが使用できる同時出力ストリームの数に厳しい上限がないことを認識しているので、おそらくあなたのハードウェア/ OSがサポートしているものであろう。ちなみに、Audiereは純粋に生成されたトーンだけでなく、特定のオーディオファイル(MP3、WAV、AIFF、MOD、S3M、XM、IT、Ogg Vorbis、Flac、Speexなど)を再生することもできます。

1つの可能性のある欠点は、個々のトーンを開始または停止するときにわずかに聞こえる「クリック」があることです。すでに再生しているトーンに1つのトーンを追加しても目立つことはありません。私が見つけた最も簡単な回避策は、トーンをオンまたはオフにするときに、トーンの音量を上下にゆっくりと上げることです。 「ちょうどいい」と鳴るためには、ランプスピードで遊ぶ必要があるかもしれません。

AudiereはLGPLライセンスを取得しており、バインディングにはライセンスが付いていないことに注意してください。市販の製品に拘束力を持たせたい場合は、弁護士チームに相談したり、Haraldを拘束しようとする必要があります。またはあなたは自分の拘束力を作り、面倒を避けることができます。


@Tom:Haraldのライブラリには特定のライセンスが付いていないので、私はそれをホストすることによってどのような影響が生じるのかよく分かりません。しかし、私は、少なくとも私のlibaudieresharpglueプロジェクトがどのように設定されているかについて細かい詳細を与えることができると信じています。

Visual C++ Express 2008を使用すると、bindings/csharp/libaudieresharpglue/vc8.0/libaudieresharpglue.sln.が開きます。VC++は自動的にソリューションをVS9ソリューションに変換します。

別のフォルダでは、AudiereパッケージをSourceforgeから取得する必要があります。あなたのVC++プロジェクトのプロパティの下で、設定プロパティ> C/C++>一般に行き、 "追加のインクルードディレクトリ"にpath/to/audiere-1.9.4-win32/includeがあることを確認してください。次に同じウィンドウで、リンカー>全般に行き、 "追加のライブラリディレクトリ"に/path/to/audiere-1.9.4-win32/libがあることを確認します。次に、vc8.0/Releaseフォルダーにlibaudieresharpglue.dllという出力(できればリリースモード)とこの出力をビルドできるはずです。

次に、Visual C#Express 2008を開きます。bindings\csharp\test\vc8.0\AudiereCSharpTest.slnを開き、ソリューションを変換します。プロジェクトはうまく構築する必要がありますが、実行するとエラーが発生します。それはいいです; csharp/test/vc8.0/bin/Releaseフォルダーに、VC++ソリューションのlibaudieresharpglue.dllと、Sourceforgeのパッケージのaudiere.dllの両方を追加する必要があります。

これで、AudiereCSharpTestを構築して実行できるはずです。既定では、#define stream_testはAudiereTest.csの先頭にコメントアウトされておらず、これはハードドライブに存在しないファイルを参照することに注意してください。単に#defineをコメントアウトしてnoise_testまたはsquare_testのコメントを外すことができます。

それはそれをカバーする必要があります。詳細を見逃してしまった場合は、うまくいけば十分です。

+0

これは見た目のいいライブラリーですが、NAudioが私にとってうまくいかないかどうかを詳しく調べるかもしれません。 –

+0

私はコンパイルするためにラッパーの "libaudieresharpglue.dll"部分をコンパイルするのに大きな問題があります。私はバイナリをつかむことができますか? –

+0

私はこれを受け入れました。それは明らかに私がする必要があるからです。しかし、あなたのばかな証拠の説明にもかかわらず、私はまだ "libaudieresharpglue.dll"をコンパイルすることはできません(100エラーで停止)。私がリンクすると、入力ファイル '。\ Release \ audiere.obj'を開くことができないことがわかります。 –

0

はい可能です。

Here is a linkこれに関するチュートリアル。もちろん、これはまたConsole.Beep

+0

私はそこから見たものから、これは一度に1つのトーンしか生成できません。 – Joey

4

を使用していますあなたはいつもConsole.Beepが非同期であるかどうMSDNのドキュメントは、それを明確にしない

+0

DirectSoundで複雑な音色を生成することを特に指しているリンクがありますか? –

+2

簡単に言えば、多くのsin()呼び出しの結果をウェーブバッファに書き込んだ後、そのバッファを再生させます。 – Kylotan

0

...のDirectSoundを試すことができます。そうであれば、必要なだけ多くのコールを素早く連続的に発射することができ、誰も賢明ではないでしょう。もちろん、頻度と期間を取るバージョンを使用したいと思うでしょう。

+0

同期しています。 – Joey

+0

C#の新機能 - スレッドを使って同期呼び出しを階層化できますか? –

+1

新しいスレッドを使用してConsole.Beepを呼び出すことはできますが、多くのサウンドを一度に再生することはできません。 – twk

3

私はNAudioを見て、バッキングトラックを再生しながらフィードバックをエミュレートするプログラムを作成しました。 sine waves at specific frequenciesのブログ投稿がありますが、これはあなたが探していることをするために適応できると思われます。

+0

これはこれまでのところ最も有望ですが、私は一緒に走っている複数の周波数を得ることができませんでした。 –

+0

複数のスレッドを使ってみましたか?ドキュメントには、Windowsのミキシングデバイスをサポートする記述があります。 –