8

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

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

4

6 に答える 6

18

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();  

Audiere を C# で使用するための最も簡単な方法は、Harald Fielker の C# バインディングを使用することです(彼は、これは MonoVS で動作すると主張しています。VS2005 のフル バージョンと別の Express 2008 バージョンの両方で動作することを確認できます)。 C# および VC++ の)。Win32 Audiere DLL、lib、およびヘッダー(これらはすべて同じ 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 ライセンスであり、バインディングにはライセンスが添付されていないことに注意してください。ハラルドの拘束力を商用製品に使用したい場合は、法務チームに相談するか、ハラルドに連絡を取る必要があります。または、独自のバインディングを作成して面倒を避けることもできます。


@トム:ハラルドのライブラリには特定のライセンスが添付されていないため、それをホストすることでどのような影響が生じるかわかりません。ただし、少なくとも、私の libaudieresharpglue プロジェクトがどのように設定されているかについて、詳細を説明できると思います。

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

別のフォルダーに、Sourceforge の Audiere パッケージが必要です。VC++ プロジェクトのプロパティで、[構成プロパティ] > [C/C++] > [全般] に移動し、[path/to/audiere-1.9.4-win32/include追加のインクルード ディレクトリ] に含まれていることを確認します。次に、同じウィンドウで [リンカー] > [全般] に移動し/path/to/audiere-1.9.4-win32/lib、「追加のライブラリ ディレクトリ」にあることを確認します。libaudieresharpglue.dll次に、プロジェクトを (できればリリース モードで) ビルドし、この出力をvc8.0/Releaseフォルダーに作成できるはずです。

次に、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_testsquare_test

それはそれをカバーするはずです。詳細を見逃した場合は、自分でやり遂げるのに十分小さいことを願っています:)

于 2009-11-03T18:11:45.617 に答える
4

いつでも DirectSound を試すことができます...

于 2009-10-29T11:46:24.900 に答える
3

バッキング トラックの再生中にフィードバックをエミュレートするプログラムを作成する目的で、NAudioを検討してきました。特定の周波数で正弦波を生成することに関するブログ投稿があります。これは、探していることを行うために適応できると思います。

于 2009-10-29T12:20:05.940 に答える
0

基本的に、独自のソフトウェアシンセサイザーを実装するか、サードパーティのライブラリを見つける必要があります。参照: http: //en.wikipedia.org/wiki/Demo_ (computer_programming)#Music

于 2009-10-29T12:27:17.953 に答える
0

Console.Beep が非同期かどうかは、MSDN のドキュメントでは明確にされていません。もしそうなら、あなたはおそらく必要な数の電話を立て続けに発することができ、誰も賢明ではありません. もちろん、頻度と期間を取るバージョンを使用することをお勧めします。

于 2009-10-29T11:47:33.160 に答える
0

はい、可能です。

これに関するチュートリアルへのリンクを次に示します。もちろん、これも使用しますConsole.Beep

于 2009-10-29T11:42:14.150 に答える