Audiereライブラリを使用した最もシンプルなオーディオ出力

ご挨拶! このメモは、初心者プログラマーを対象としています。 彼女はシンプルなAudiereライブラリについてです。 かつて簡単かつ迅速にサウンドを引き出したいと思っていたなら、あなたはそれを好きになるでしょう。

まず、それが何であるかについて少しお話しします。

Audiereは、LGPLライセンスに基づくオープンソースの高レベルオーディオAPIです。 Java、C ++、Python、Delphiなどを含む多くの言語で使用できます。ソースコードが影響を受けない場合、無料で商用アプリケーションで使用できます(詳細については、ライブラリのドキュメントを参照してください)。

C ++で最も単純な例を実装する準備をします。


まったく新しい場合
「cout <<」の出力方法を学んだ3日目であれば、事前に言っておくよ、友よ、下に書かれていることを繰り返して、すべてを説明しよう。


#include <iostream> //    "cout<<" #include "conio.h" //   "getche()",   "cin>>" #include "windows.h" // audiere   #include "audiere.h" //  using namespace std; using namespace audiere; //       


 int main() { setlocale(0, "Russian"); //    - cout<<"  "<<endl; AudioDevicePtr device = OpenDevice(); //    AudioDevice OutputStreamPtr sound = OpenSound(device , "sound.wav" , false); //     sound->play(); //   getche(); //         } 

さて、コメントはもう少し詳細です。

 AudioDevicePtr device = OpenDevice(); 

ここでは、ライブラリの概念に従ってデバイスポインター (まったく明示的ではありませんが、ポインター)を作成します。 OpenDevice()を引数なしのままにしておくと、ライブラリ自体が適切なデバイスを選択します。

次に、ストリームでファイルを開きます。

 OutputStreamPtr sound = OpenSound(device , "sound.wav" , false); 

サウンドを開くには、OpenSoundに3つの引数を渡す必要があります。

1. device-出力が発生するデバイス
2. "sound.wav"-私たちの任意の音
3. falseまたはtrue-サウンドをメモリにロードして再生する(false)か、ストリーム(たとえば、大きなファイルの場合)を介して、メモリに完全にロードせずに再生する(true)が必要です。 サウンドトラックの場合、「true」にする必要があります。そうしないと、メモリ全体がサウンドを取得します。

 sound->play(); 

サウンドを再生してください! どうやら、すべてが非常に簡単です。 サウンドの場合、音量を設定できます。

 sound->setVolume(1.0f); //  (  "0.5f" ) 

サウンドを繰り返し(ループ)することができます:

 sound->setRepeat(true); 

このストリームの再生を停止します。

 sound->stop(); 

このストリームが現在再生中かどうかを確認します。

 sound->isPlaying(); 

特定のストリームの現在のボリュームを確認します。

 sound->getVolume(); 

サウンドパノラマを設定します(左、中央、右):

 sound->setPan(-1.0);//       , 0.0 -  ,  1.0  

サウンドの再生速度を設定します(トーンも変わります)。

 sound->setPitchShift(1.0);// .   0.5  1.0  ,   1.0  2.0 . 

 sound->getPitchShift();//   PitchShift   

ヘッダーファイル「audiere.h」には、「CreateTone();」、「CreatePinkNoise()」など、MIDI機能を含むその他の関数が定義されています。 「audiere」名前空間のメンバーのリストと、 こちらのオンラインドキュメントへのリンク。

もちろん、プログラムにエラー処理を追加する必要がある場合、ソースコードは次のようになります。

 AudioDevicePtr device = OpenDevice(); if(!device) { cout<<"  AudioDevice.     .."; getche(); return 0; //   } 

ファイルを開くエラーの処理と同様に:

 if(!sound){ cout<<"  !     .."; getche(); return 0; } 

完全なソースコード
 #include <iostream> //    "cout<<" #include "conio.h" //   "getche()" ,   "cin>>" #include "windows.h" // audiere   #include "audiere.h" //  using namespace std; using namespace audiere; //        int main() { setlocale(0, "Russian"); //    - cout<<"  "<<endl; AudioDevicePtr device = OpenDevice(); //    AudioDevice if(!device){ cout<<"  AudioDevice.     .."; getche(); return 0; //   } OutputStreamPtr sound = OpenSound(device , "sound.wav" , false); //   if(!sound){ cout<<"  !     .."; getche(); return 0; } sound->play(); //   getche(); //         } 


そして最後に、このプログラムはより興味深いものです。私たちは原始的な楽器を作ります!

今回はgetch()メソッドを使用します。 違いは、「getche()」と同じように機能しますが、入力した文字は表示されないことです。 しかし、突然、あなたは面白いメロディーを手に入れ、あなたが押したものを見る必要がありますか?:「getche()」を使用するか、「getch()」で配列に書き込むことができます。 コードのシンプルさを隠さないように、私は意図的に初心者向けのテキストを複雑にしません。そのため、エラーやその他すべてのチェックを自分で追加できます。

楽器のソースコード:

 #include <iostream> #include "conio.h" #include "windows.h" #include "audiere.h" using namespace std; using namespace audiere; int main() { setlocale(0, "Russian"); cout << "  QWERTYUIO . X -  " << endl; AudioDevicePtr device = OpenDevice(); OutputStreamPtr do1 = OpenSound(device , "do.wav" , false); //         OutputStreamPtr re = OpenSound(device , "re.wav" , false); OutputStreamPtr mi = OpenSound(device , "mi.wav" , false); OutputStreamPtr fa = OpenSound(device , "fa.wav" , false); OutputStreamPtr sol = OpenSound(device , "sol.wav" , false); OutputStreamPtr la = OpenSound(device , "la.wav" , false); OutputStreamPtr si = OpenSound(device , "si.wav" , false); OutputStreamPtr do2 = OpenSound(device , "do2.wav" , false); //  -   ,     char notePlay = '1'; //      while(notePlay!='x') // ,     "x" { notePlay=getch(); if(notePlay=='q') do1->play(); else if(notePlay=='w') re->play(); else if(notePlay=='e') mi->play(); else if(notePlay=='r') fa->play(); else if(notePlay=='t') sol->play(); else if(notePlay=='y') la->play(); else if(notePlay=='u') si->play(); else if(notePlay=='i') do2->play(); } return 0; } 

*このプロジェクトの.wavファイルはここからダウンロードできます 。 ソースフォルダーに解凍します。

そして、これは初心者向けです
cin >>にはconche.hの代わりにgetche()があります。 「Getche()」は、「Enter」コマンドの入力を待機しませんが、キーを押した直後に変数に値を割り当てます。

 char inputVar; inputVar=getche(); 

しかし、ご覧のとおり、キーを押すことができるのは1回だけなので、この方法はループ内の配列に最適です。

 char inputVar[30]; // - int i=0; //   while(!inputVar[i]=='\r' && i<30) { inputVar[i]=getche(); i++; } 

「!inputVar [i] == '\ r'」-これは「Enter」を押すとテストされ、押されるとサイクルが終了します。 '\ r'は復帰のサインです。

そして今、なぜコードでは「getche()」が単独で存在し、変数を割り当てないのか、それは必要ありません。 キーが押されるのを待つだけで、その後プログラムは終了します。

「setlocale(0、」Russian ");」の助けを借りて、コンソールにロシア語のテキストを出力するサポートがインストールされます(入力はサポートされません)。

次の2行は、C ++に詳しくなった後、たとえば本から明らかになります。
Herbert Shildt-「完全なC ++リファレンス」


私たちの国の「音」はポインタであるため、その方法はポイントではなく矢印演算子「->」を使用して実行されます。 「sound.play()」のように。 これは、前述の本では、「ポインター」の章に当てられています。

「if else」コンストラクトについてコメントします。

次のすべてのチェックでは、 「else if」を使用しましたこれは、各値と押されたキーとの対応をチェックした後、残りのifステートメントが実行されないため、プログラムの速度を上げます。 私たちが書いた場合:
  while(notePlay!='x') // ,     "x" { notePlay=getch(); if(notePlay=='q') do1->play(); if(notePlay=='w') re->play(); if(notePlay=='e') mi->play(); if(notePlay=='r') fa->play(); if(notePlay=='t') sol->play(); if(notePlay=='y') la->play(); if(notePlay=='u') si->play(); if(notePlay=='i') do2->play(); } 

次に、たとえば「q」キーを押しても、他のすべての条件がチェックされますが、この場合は意味がありません。

勉強に成功したい!

この短いレビューは、設計の新規参入者の出発点として役立ててください。 最高!

Source: https://habr.com/ru/post/J318584/


All Articles