音を鳴らす

前のページ
目次
次のページ


 Tekkotsu は幾つかの音声ファイル(.wavファイル)を備えています。
 これら音声ファイルは、次のフォルダに入っています。

    マイドキュメント → usXX → project → ms → data → sound

 音声ファイルは、パソコン上でWindows Media Playerなどを使用して再生できます。

 Tekkotsu を使用すると、AIBO上で音声ファイルを再生できます
 この機能を利用するには、再生したい音声ファイルをあらかじめプログラムに記述しておく必要があります。
 例えば、DoStart()関数の中で、LoadFile("howl.wav") のように書きます。このように書くことで音声ファイル howl.wav がメモリ上にロードされます。
 また、再生する場合には、PlayFile("howl.wav") のように書きます。
 最後に、メモリ上にある音声を解放します。例えば、DoStop()関数の中で、ReleaseFile("howl.wav")のように書きます。
 自分で音声ファイルを用意することもできますが、その場合は音声ファイルの形式を次の通りにしてください。

音声ファイルの形式
サンプルサイズ16ビット
チャンネル1(モノラル)
サンプルレート16KHz
オーディオ形式PCM

練習: 音を鳴らそう

 ボタンを押したときに、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)

 ボタンを押したときと、離したときで吠える声が異なることを確認してください。

 音声を再生するコマンドは、SoundManager::PlayID という値を返します。
 音声再生が終了すると、音声再生プロセスは終了イベントを投げます。この終了イベントのGeneratorIDが audioEGID、SourceIDが PlayID です。
 PlayIDは、再生中の音声を止めるためにも使用します。

練習: 音声を止める、音声をミックスする

 先ほどの 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が吠えているときに、足の肉球ボタンを押してみてください。

発展

  1. ボタンを押したときに、遠吠えしながら、なおかつ、顔のLEDを光らせ頭を上げるプログラムを作成してください。


前のページ
目次
次のページ