KOSAKA LABORATORY->Tips

 このBlogの一部が書籍になりました。
書籍:「WiiRemoteプログラミング」
著者:白井暁彦・小坂崇之・木村秀敬・くるくる研究室
表紙:タナカユカリ
発売:2009年7月25日 好評発売中
詳細:こちらから

内容:WiiRemoteを利用したインタラクティブ技術のプログラミング学習書

 話題の家庭用ゲーム機「Wii」の特徴的なコントローラーである「WiiRemote」をPCで使うプログラミングが注目されている。高性能な加速度センサーや赤外線センサーを持ち、Bluetooth接続が可能で、プログラミング可能なデバイスを、個人レベルで自作したり入手したりすることはできなかった。WiiRemoteの登場とともにそれが安価で手軽に入手可能になり、多くの人々が興味を持っている。

 本書は、WiiRemoteの応用に興味があるプログラミング初学者向けに、WiiRemoteをPCから扱うためのプログラミングを解説する。ハードウェア寄りのゲームプログラミング入門書として、ステップバイステップでソースコードを解説する。具体的なサンプルを開発しながら、インタラクション技術を独習できる。言語はC/C++、C#およびActionScript 3、Processingなどをサポート。

Wiiリモコン 加速度センサを使う その2 Wii楽器の作成

 今回は前回の加速度センサを用いてWii楽器を作成したいと思います。
ここでは、Wiiリモコンを振ると音が鳴る。簡単なWii楽器を作成します。

2.Wii太鼓プログラム
Form1.csに以下の部分を追加する。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using WiimoteLib;                                         //WimoteLibの宣言
using System.Media;                                       //System.Mediaの宣言

namespace WiimoteLib_Sample {
  public partial class Form1 : Form {

    Wiimote wm = new Wiimote();                           //Wiimoteの宣言

    string path =null;                                    //Wavファイル名
    SoundPlayer wavePlayer;                               //SoundPlayerを宣言
   
    public Form1() {

      InitializeComponent();

      wm.WiimoteChanged += wm_WiimoteChanged;               //イベント関数の登録
      wm.SetReportType(InputReport.IRExtensionAccel, true);//レポートタイプの設定
      wm.Connect();                                        //Wiimoteの接続

      path = @"C:\WINDOWS\Media\tada.wav";                 //再生するWavファイルを宣言
      wavePlayer = new SoundPlayer(path);                  //SoundPlayerにWavファイルを設定
   }

   void wm_WiimoteChanged(object sender, WiimoteChangedEventArgs args){
     WiimoteState ws = args.WiimoteState;                  //WiimoteStateの値を取得

     //Wavファイルが読み込まれていないときは実行しない
     if (this.path != null) {
        float AX = Math.Abs(ws.AccelState.Values.X);       //X軸の絶対値
       float AY = Math.Abs(ws.AccelState.Values.Y);       //Y軸の絶対値
       float AZ = Math.Abs(ws.AccelState.Values.Z);       //Z軸の絶対値

       //X,Y,Z軸の加速度センサの絶対値の合計が5を超える時に、振ったと判定
       if ((AX+AY+AZ) >= 5) {
          wavePlayer.PlaySync();                           //音を鳴らす
       }
     }
   }
  }
}

実行

1.WiiRemoteを接続してください。

2.F5キーを押して実行してください。
  ※もしエラーが発生する場合はWiiRemoteが正しく接続されているか確認してください。

3.Wiiリモコンを振ってください。
 ※飛んでいくと危険なので必ずストラップをしてください。

解説

Wiiリモコンの三軸の加速度センサの値を取得して、指定した加速度を検出すると指定したWavファイルを鳴らします。

      path = @"C:\WINDOWS\Media\tada.wav";                 //再生するWavファイルを宣言
再生するファイルを指定します。鳴らしたいWavファイルを指定してください。
        float AX = Math.Abs(ws.AccelState.Values.X);       //X軸の絶対値
WiiリモコンのX軸の値を取得し、その絶対値をとります。

        float AY = Math.Abs(ws.AccelState.Values.Y);       //Y軸の絶対値
WiiリモコンのY軸の値を取得し、その絶対値をとります。

        float AZ = Math.Abs(ws.AccelState.Values.Z);       //Z軸の絶対値
WiiリモコンのZ軸の値を取得し、その絶対値をとります。

       //X,Y,Z軸の加速度センサの絶対値の合計が5を超える時に、振ったと判定
       if ((AX+AY+AZ) >= 5) {
          wavePlayer.PlaySync();                           //音を鳴らす
       }
X,Y,Z軸の合計の値が[5]を超えると音を鳴らします。
この[5]という値を、小さくすれば少ない動作で反応します。反対に増やせば、大きい動作で反応します。自分の好みの数字に置き換えてください。
今回は、音が再生中にWiiリモコンを振っても反応しません。再生中にも音を再生したい場合はスレッド処理などを用いる必要があります。