|
|
|
Tekkotsu は幾つかの音声ファイル(.wavファイル)を備えています。
これら音声ファイルは、次のフォルダに入っています。
マイドキュメント → usXX → project → ms → data → sound
音声ファイルは、パソコン上でWindows Media Playerなどを使用して再生できます。
Tekkotsu を使用すると、AIBO上で音声ファイルを再生できます。
音声ファイルの形式 サンプルサイズ 16ビット チャンネル 1(モノラル) サンプルレート 16KHz オーディオ形式 PCM
音声を再生するコマンドは、SoundManager::PlayID という値を返します。
練習: 音を鳴らそう ボタンを押したときに、AIBOが吠えるプログラムを作りましょう。
ボタンを押したときに高い声で吠え、離したときに低い声で吠えるようにします。
音声を管理するクラスはサウンドマネージャです。サウンドマネージャにアクセスするには、グローバル変数sndman
を使用します。また、サウンドマネージャを使用するためには、Sound/SoundManager.h をインクルードしてください。 プログラムで赤字の箇所が新しく追加・変更された部分です。上記プログラムを次のファイル名で保存して下さい。
#ifndef INCLUDED_MySound_h_ #define INCLUDED_MySound_h_ #include "Behaviors/BehaviorBase.h" #include "Events/EventRouter.h" #include "Sound/SoundManager.h" // サウンドマネージャのヘッダファイル class MySound : public BehaviorBase { public: MySound() : BehaviorBase("MySound") {} virtual void DoStart() { BehaviorBase::DoStart(); std::cout << getName() << " is starting up." << endl; erouter->addListener(this,EventBase::buttonEGID); // 音声ファイルをロード sndman->LoadFile("barkhigh.wav"); sndman->LoadFile("barklow.wav"); } virtual void DoStop() { // 音声ファイルを解放 sndman->ReleaseFile("barkhigh.wav"); sndman->ReleaseFile("barklow.wav"); std::cout << getName() << " is shutting down." << endl; BehaviorBase::DoStop(); } // イベントに応じた処理を実行する関数 virtual void processEvent(const EventBase &event) { // イベントのGeneratorIDに応じて処理を切り替える switch ( event.getGeneratorID() ) { // GeneratorIDがbuttonEGIDの場合(イベントがボタンに関係する場合) case EventBase::buttonEGID: std::cout << getName() << " got event: " << event.getDescription() << std::endl; // ボタンを離したとき(getMagnitude()==0のとき)barklow.wav を再生 // ボタンを押したとき(getMagnitude()==0でないとき)barkhigh.wav を再生 sndman->PlayFile((event.getMagnitude()==0) ? "barklow.wav" : "barkhigh.wav"); break; default: std::cout << "Unexpected event:" << event.getDescription() << std::endl; }; } }; #endif保 存 先 : マイドキュメント → usXX → project
ファイル名 : MySound.h
ファイル種類: C言語ヘッダーファイル(*.h)ボタンを押したときと、離したときで吠える声が異なることを確認してください。
発展
練習: 音声を止める、音声をミックスする 先ほどの MySound.h を改造し、新たに MySoundMix.h を作成します。
改造点は、AIBOの背中の真ん中ボタン MiddleBackButOffset を押したときに、前とは別の吠え方(長めの遠吠え)の音声を再生するように変更します。
また、単に再生するだけではなく、再生中に背中の真ん中ボタンを押すと、再生を止めて最初から再生しなおすようにします。
このためには、音声の PlayIDを使用します。下記プログラムでは、PlayIDは、protectedデータメンバーhowl_id
になります。上記プログラムを次のファイル名で保存して下さい。
#ifndef INCLUDED_MySoundMix_h_ #define INCLUDED_MySoundMix_h_ #include "Behaviors/BehaviorBase.h" #include "Events/EventRouter.h" #include "Sound/SoundManager.h" class MySoundMix : public BehaviorBase { protected: SoundManager::Play_ID howl_id; public: MySoundMix() : BehaviorBase("MySoundMix"), howl_id(SoundManager::invalid_Play_ID) {} virtual void DoStart() { BehaviorBase::DoStart(); std::cout << getName() << " is starting up." << endl; erouter->addListener(this,EventBase::buttonEGID); sndman->LoadFile("barkhigh.wav"); sndman->LoadFile("barklow.wav"); sndman->LoadFile("howl.wav"); } virtual void DoStop() { sndman->ReleaseFile("barkhigh.wav"); sndman->ReleaseFile("barklow.wav"); sndman->ReleaseFile("howl.wav"); std::cout << getName() << " is shutting down." << endl; BehaviorBase::DoStop(); } virtual void processEvent(const EventBase &event) { switch ( event.getGeneratorID() ) { case EventBase::buttonEGID: std::cout << getName() << " got event: " << event.getDescription() << std::endl; // 背中の真ん中ボタンの場合 if (event.getSourceID()==RobotInfo::MiddleBackButOffset) { // 背中の真ん中ボタンが押された場合 if (event.getTypeID()==EventBase::activateETID) { // 音声howl_idを停止する sndman->StopPlay(howl_id); // 音声howl_idを再生する howl_id = sndman->PlayFile("howl.wav"); }; } // 背中の真ん中ボタン以外の場合 else sndman->PlayFile((event.getMagnitude()==0) ? "barklow.wav" : "barkhigh.wav"); break; default: std::cout << "Unexpected event:" << event.getDescription() << std::endl; }; } }; #endif保 存 先 : マイドキュメント → usXX → project
ファイル名 : MySoundMix.h
ファイル種類: C言語ヘッダーファイル(*.h)一度に複数の音声を再生するとき、これら音声をサウンドマネージャが自動的にミックスしてくれます。
背中の真ん中ボタンを押してAIBOが吠えているときに、足の肉球ボタンを押してみてください。
|
|
|