さまざまな周波数のトーンを含むサウンドを作成する必要があります。 C#でこれを行う方法はありますか?C#で複雑なトーンを生成することはできますか?
これまでに私が見た唯一のトーン生成方法は、純粋なトーン(単一周波数)に対してのみ機能するconsole.beepです。
さまざまな周波数のトーンを含むサウンドを作成する必要があります。 C#でこれを行う方法はありますか?C#で複雑なトーンを生成することはできますか?
これまでに私が見た唯一のトーン生成方法は、純粋なトーン(単一周波数)に対してのみ機能するconsole.beepです。
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を拘束しようとする必要があります。またはあなたは自分の拘束力を作り、面倒を避けることができます。
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
のコメントを外すことができます。
それはそれをカバーする必要があります。詳細を見逃してしまった場合は、うまくいけば十分です。
これは見た目のいいライブラリーですが、NAudioが私にとってうまくいかないかどうかを詳しく調べるかもしれません。 –
私はコンパイルするためにラッパーの "libaudieresharpglue.dll"部分をコンパイルするのに大きな問題があります。私はバイナリをつかむことができますか? –
私はこれを受け入れました。それは明らかに私がする必要があるからです。しかし、あなたのばかな証拠の説明にもかかわらず、私はまだ "libaudieresharpglue.dll"をコンパイルすることはできません(100エラーで停止)。私がリンクすると、入力ファイル '。\ Release \ audiere.obj'を開くことができないことがわかります。 –
はい可能です。
Here is a linkこれに関するチュートリアル。もちろん、これはまたConsole.Beep
私はそこから見たものから、これは一度に1つのトーンしか生成できません。 – Joey
を使用していますあなたはいつもConsole.Beepが非同期であるかどうMSDNのドキュメントは、それを明確にしない
DirectSoundで複雑な音色を生成することを特に指しているリンクがありますか? –
簡単に言えば、多くのsin()呼び出しの結果をウェーブバッファに書き込んだ後、そのバッファを再生させます。 – Kylotan
私はNAudioを見て、バッキングトラックを再生しながらフィードバックをエミュレートするプログラムを作成しました。 sine waves at specific frequenciesのブログ投稿がありますが、これはあなたが探していることをするために適応できると思われます。
これはこれまでのところ最も有望ですが、私は一緒に走っている複数の周波数を得ることができませんでした。 –
複数のスレッドを使ってみましたか?ドキュメントには、Windowsのミキシングデバイスをサポートする記述があります。 –
本質的には、独自のソフトウェアシンセサイザを実装するか、サードパーティのライブラリを見つける必要があります。参照:http://en.wikipedia.org/wiki/Demo_(computer_programming)#Music
お使いのコンピュータのスピーカー(ビープ音)を使用することは、通常はお勧めできません。デフォルトのオーディオ出力を使用する必要があります。 – decasteljau
私は実際にデフォルトのオーディオ出力を使用することを好みます。最終的にはヘッドフォンを通す必要があります。 –
それは重要なポイントです。ビープ音は忘れて。 DirectSoundまたはWaveOutを使用します。両方とも管理されていないAPIなので、あなたの言語としてPInvokeを使うか、C++/CLIに切り替える必要があります。 – CannibalSmith