web-dev-qa-db-ja.com

C ++でオーディオを操作することを学ぶ

私はオーディオ工学の学位を取得しましたが、プログラミングは初めてです。プログラミング環境でオーディオを操作する方法を学びたいのですが、興味深いプロジェクトを通じてC++をよりよく学習できるようになりました。

まず、C++はこれに適した言語ですか?使用すべきでない理由はありますか? Soundfileや他のライブラリについて聞いたことがありますが、何をお勧めしますか?

最後に、このテーマの優れたチュートリアルを知っている人はいますか? DSPの基本を学びました-ただプログラムしたいだけです!

編集:私はWindowsを使用しています。 Max/MSPに少し似ていますが、より制御可能なリアルタイムのもので遊んでみたいです。

32
Skilldrick

それは本当にあなたがどんな種類のオーディオ作業をしたいかに依存します。ゲームにオーディオを実装したいなら、C++が正しい言語であると確信しています。周りには多くのライブラリがあり、OpenALは素晴らしい、無料のマルチプラットフォームです。また、DirectSoundとFmodを大成功で使用しました。それらをチェックしてください、それはすべてあなたのニーズに依存します。

14
MissT

C++を使用することに決めた場合、 The Synthesis Toolkit は注目に値します。私はそれを学校のプロジェクトに使用し、スタンフォード大学で開発されたクロスプラットフォーム(win、mac、linux)、無料、オープンソースで非常に使いやすくなっています。 wikipediaページ からの抜粋:

STKインストゥルメントクラスのバージョンは、ChucK、Csound、Real-Time Cmix、Max/MSP(PeRColateの一部として)、およびSuperColliderに統合されています。

彼らには多くのテストコードが含まれており、そのサイトにはライブラリを使い始めるためのいくつかのチュートリアルがあります。 (しかし、もちろんC++を知っている必要があります)

STKには、オーディオファイル(およびmatlabファイル)の読み取り/書き込み、リアルタイムオーディオ/ midi io、いくつかの基本的なアルゴリズム(matlabの同様の機能に基づく使用)などがあります。


別のobviousオプションであり、おそらくdspを学習/テストするのに最も使用される環境は Matlab (またはfree octave 、しかし私は以前にそれを使用していません)。 C++で実装する前に、Matlabでテストすることがあります。


編集:過去1年間、私は [〜#〜] juce [〜#〜] を使用しました。これはC++オーディオプログラミングを中心とした非常にクールなC++ライブラリですが、QTのようなものに傾いています。開発者の1人(Timur Doumler)がCppCon 2015でC++とJUCEを使用したリアルタイムオーディオに関する素晴らしい講演を行っています。JUCEを使用しなくても、ぜひチェックしてください。 https:// youtu。 be/boPEO2auJj4

12
Emile Vrijdags

C++は正しい言語ですか?それは完全にコンテキストに依存します。コードを別のアプリケーション、フレームワークなどにプラグインする必要がある場合、フレームワーク用に作成された言語を使用する必要があります。

独自の自立型アプリを作成している場合は?おそらくない。別の言語を使用することをお勧めする理由はいくつかあります。

  • C++は初心者にはあまり適していません。これらのプロジェクトを通じてプログラミングを学習することが目標であれば、「実行することで学習する」のにより適した言語を使用してください。 C++には、ある日までは機能しないと思われる落とし穴や「機能しているように見える」ものがたくさんあります。これに恐ろしく複雑な構文と、他のほとんどの言語では単に問題ではない言語の癖を回避するために習得しなければならないいくつかの非常に複雑なイディオムとテクニックを追加します。それ以上はありません。
  • C++には「オーディオ」の概念はありません。 C++には、オーディオの録音、処理、再生、オーディオファイルなどの読み込みまたは保存に対するサポートは一切ありません。最新の言語のほとんどには、標準言語に組み込まれた何らかのオーディオサポートがあります(少なくともmp3ファイルやその他の基本を読み込み、再生する機能)。 C++では、これらすべてをサードパーティのライブラリとOS固有のコードを介して行う必要があります。

言語に本当の選択肢がある場合は、PythonまたはC#。まだ経験のあるプログラマーでない人には、C++をお勧めしません。

10
jalf

Audacity をご覧ください。これは、C++で記述されたクロスプラットフォーム(Linux、OS X、およびWindows)オープンソースオーディオエディターです。あなたのGUIスキルのレベルはわかりませんが、オーディオ作業を扱うコードはwxWidgets(GUI)コードと区別するのがかなり簡単なはずです。

5
Chris Lutz

特にDSPを使用する場合は、オーディオの場合はC++がC++よりも適切な選択である可能性があります。

  • ほとんどの実用的なオーディオおよびDSPリファレンスブックでは、コード例にCを使用しています
  • ほとんどのオーディオ/ DSPライブラリはCで書かれています(または少なくともC APIを持っています)
  • C++はCに比べて学習曲線を大幅に向上させますが、オーディオ/ DSPの作業にはあまりメリットがありません(低レベル/リアルタイムコードには特に関係ありません)

もちろん、C++の学習に「間違った」ものはなく、Cコードの理解と使用を停止することはありません(C++はほとんどCのスーパーセットであるため)後で決めれば、いつでもC++に移行できます。

2
Paul R

C++は、オーディオ処理を行うのに最適な言語です。私は Marsyas フレームワークを使用します。また、非常に高速で、他の多くのパッケージとは異なり、多くの複雑なタスクをリアルタイムで実行できます。実行したテストでは、MarsyasはMatlabよりも数百倍高速です。

始めるために、ここにいくつかのコードがあります。オーディオファイルを再生したいとします。このため、次のようなネットワークをMarsyasに作成します。

  • シリーズ
    • SoundFileSource
    • 利得
    • AudioSink

Marsyasは暗黙的なパッチ適用モデルを使用します。これはMax/MSPで見られる明示的なパッチ適用に似ていますが、オブジェクト間にワイヤを描画する必要はなく、コンテナに入れるだけでワイヤが自動的に作成されます。上記のSeriesオブジェクトは、SoundFileSourceを保持します。SoundFileSourceは、オーディオファイルをフィードし、それをGainに渡します。これにより、オーディオの音量を変更し、それをAudioSinkにフィードします。

このネットワークを作成するC++は非常に簡単です。

 MarSystem * playbacknet = mng.create( "Series"、 "playbacknet"); 
 playbacknet-> addMarSystem(mng.create( "SoundFileSource"、 "src")); 
 playbacknet-> addMarSystem(mng.create( "Gain"、 "gt")); 
 playbacknet-> addMarSystem(mng.create( "AudioSink"、 "dest")); 
 
 // SoundFileName 
を設定しますplaybacknet-> updctrl( "SoundFileSource/src/mrs_string/filename"、inAudioFileName); 
 
 //オーディオ出力をオンにします
 playbacknet-> updctrl( "AudioSink/dest/mrs_bool/initAudio"、true); 
 
 while(playbacknet-> getctrl( "SoundFileSource/src/mrs_bool/notEmpty")- > isTrue()){
 playbacknet-> tick(); 
} 

最初の4行は、オーディオを処理するMarSystemを作成します。他のすべてを含むSeriesオブジェクトが最初に作成され、次にSoundFileSource、Gain、AudioSinkが追加されます。

次の行では、SoundFileSourceのファイル名を設定します。ここで処理したい.wav、.au、.aiff、または.mp3ファイルの名前を指定します。

次に、AudioSourceをオンにします。これにより、AudioSourceの「initAudio」コントロールを更新して、サウンドカードにサウンドの再生を開始するように指示します。 whileループは、SoundFileSourceにオーディオデータがある限りループします。

この単純な例は本当に簡単に実行できることがわかりますが、Marsyasの真の力は、より複雑なタスクを実行したいときです。たとえば、FFTを実行するには、次のようにします。

 MarSystem * net = mng.create( "Series"、 "net"); 
 net-> addMarSystem(mng.create( "SoundFileSource"、 "src")); 
 net-> addMarSystem(mng.create( "Spectrum"、 "spectrum")); 
 net-> addMarSystem(mng.create( "PowerSpectrum"、 "powerspectrum")); 
 
 while(playbacknet-> getctrl( "SoundFileSource/src/mrs_bool/notEmpty")-> isTrue()){
 cout << net-> getctrl( "mrs_realvec/processedData")-> to <mrs_realvec>()<< endl; 
} 

オーディオソースの基本周波数を推定するには、次のようにします。

 MarSystem * net = mng.create( "Series"、 "series"); 
 net-> addMarSystem(mng.create( "AudioSource"、 "src")); 
 net-> addMarSystem(mng.create( "AubioYin"、 "yin")); 
 
 while(playbacknet-> getctrl( "SoundFileSource/src/mrs_bool/notEmpty")-> isTrue ()){
 cout << net-> getctrl( "mrs_realvec/processedData")-> to <mrs_realvec>()<< endl; 
} 

この最後のものは、サウンドカードからリアルタイムでオーディオを読み込み、強力なYINピッチ検出アルゴリズムを実行します。甘い?

さらに多くのコードについては、 MarsyasのWebサイト 、特に ドキュメント を確認してください。

2
sness

聞かないで!私は間違っているかもしれません!

私はC++をプログラミングしませんが、初心者にとって難しいという点でJalfに同意します。メモリ割り当て、ガベージコレクションなど、他の言語が自動的に行うことを手動で行わなければならないことがたくさんあります。 C++はオーディオを認識せず、他の言語にはオーディオ機能がゼロから組み込まれていると言っています。ただし、通常、これらのほとんどはかなり基本的な機能です。ファイルを開いて再生し、再生ヘッドをファイルのさまざまな部分に送信し、パンとボリュームを調整し、eqデータを抽出します。

しかし...合成またはエフェクトを介して、もう少し深くして実際にサウンドを形成したい、そしてそれらを追加するのではなくこれらのものを作りたいと思っていると思います。 VSTとVSTiをご覧になることをお勧めしますが、これはc ++領域(JUCEライブラリ、すごいすごいすごい)であり、一生懸命働きます。そうでなければ、他の人がCSound、Max、Cycling、そしてProcessingに興味があるかもしれないと示唆しているように。 Reaktorのようなソフトウェアを使用すると、モジュール化されたコンポーネントを、より少ない(もしあれば)コーディングでパッチすることができます。

kVRAudioのフォーラムをご覧ください。Hammerheadのような古いクラシックフリーウェアを開発したヒーローが何人かいます。その後、Fruity Loops、Rebirth、Tuareg、Audiomulchなどのインディーズソフトウェアを開発しました。

VSTとC++について学ぶのが最善だと思いますが、苦痛と苦痛を伴う長い道のりであり、スタンドアロンのソフトウェアまたは別のソフトウェアのプラグイン(Csoundなどを除く)を作成したくない場合は、がっかりするでしょう。

おもう。

2
Assembler

私は自分でオーディオアプリを作成した経験はあまりありませんが、もし私があなたの立場にいれば、VSTiの最初の(仮想スタジオテクノロジー機器)を作成することで遊んでいました。私の知る限り、SteinbergはこのためのC++ SDKをリリースしており、サウンドデザインアプリケーションに興味がある場合は、良い出発点になると思います。

1
Ciaran

2番目の質問に答えるには、この本をチェックしてください。C++でのオーディオエフェクトプラグインの設計:Will Pirkleによるデジタルオーディオ信号処理理論を使用。

本はいくつかの基本的なDSPを経て、オーディオプラグインを作成する方法を説明します。 C++でコーディングしますが、すべてのGUIイベントを処理するフレームワークRACKAFXをダウンロードするように提案しているため、難しくはありません。あなたがしなければならないのは、数式を書き、正しいチャネルにデータを保存することに集中することです。

幸運を!

1
ThePhantom05

既にDSPの知識がある場合は、 これらのチュートリアル は、GUIコードを含むDSPコードを完成したプログラムに変換する方法を示しています。単純な歪みから始まり、次に合成などに進みます。
基本的に、スタンドアロンの.exeとして、またはCubaseやAbleton Liveなどのホスト用のVSTプラグインとしてビルドできるコードを記述します。

1
basteln

ここにたくさんの良い提案があります。さらに、Jack Audio Toolkit、JUCEフレームワークを見て、Csoundのような合成ライブラリからCコードを移植する方法を学ぶことをお勧めします。 「オーディオプログラミングブック」もそのために役立ちます。

C対C++に関しては、オーディオ作業では、C++の部分はコード管理のためにchromeであることが多いと思います。DSPビットはすべて信号の低レベルの手続き数学です。 C呼び出しである可能性が高いため、Cを使用するか、C++を使用するかは、その面では重要ではありません。

えっ!

1
Iain Duncan

DSPの基本を既に学習している場合は、 Analog Devices Blackfin Processors をお勧めします。 CとC++の両方を使用できます。また、開始するためのオーディオのサンプルが多数用意されています。ボードに音声を読み込み、処理し、再生するのに十分なコードを提供します。

これから、任意のタイプのフィルターまたは他の希望する処理を適用できます。 BF533 Ez-Kit LiteをシリアルLCD=パネルと組み合わせて使用​​して、プロジェクトのオーディオイコライザーを1回作成しました。素晴らしい学習体験であり、とても楽しかったです!

1
Sean

実際のサウンド処理に焦点を合わせたい場合(GUIアプリケーションに付随するすべてのクラッディングとは対照的に)、 CSound を確認します。これにより、テキストファイルベースのラングゲーが得られ、オペコードと呼ばれるものからほぼすべてのオーディオデバイスを構築できますが、オペコードが表す実際のアルゴリズムを調べるために掘り下げることができるソースコードもあります。

1
U62

ニーズに応じて、Rの方が簡単な言語かもしれません。統計分析、グラフ、地図、音声分析も行っています。 png、tuneR、およびseewaveライブラリでは、.wavを読み取るために1行、データのマトリックスを取得するために1行、それをpngイメージに入れるか、画面で表示するために1行が必要です。データを分析するように設計されていて、使いやすいという点は、私にとって2つの利点です。たとえば、Rは、ほとんどのプログラミング言語のような0ではなく、1から始まるテーブルと配列に番号を付けます。すでに複雑なスクリプトを使用することで、人間の脳がはるかに快適になります。あなたはそれを見てみるべきだと思います: http://www.r-project.org/

幸運を!

0
Rodrigo

Windowsでは、DirectSoundのチュートリアルを検索します。

Linuxには、サウンドカードにアクセスするためのさまざまなライブラリと方法があります。最も簡単な方法は、単にデバイスにファイルを開き、ioctrlを使用して速度などを設定することです。

環境に関する詳細な情報を提供する場合、より良い推奨事項がある場合があります。

-アダム

0
Adam Davis