Site search

Google
WWW を検索 backup-beta.blogspot.com を検索

2009年5月18日月曜日

サウンドを順に再生するスクリプト

音ってあまり使ったことないんですが、ちょっと分割したサウンドの再生テストをしてみました。アップロードできるサウンドの長さは10秒までなんですね。なので、音楽とかの長いサウンドファイルは9秒ずつくらいで分割したものをアップロードして順番に再生するようにしますよね。

サウンドキューを有効にすると2つのサウンドファイルは llSetSoundQueueingに載ってる例題のように簡単なんですが、サウンドが3つ以上になるとキューに後のサウンドが入ってしまうみたいで同じようには使えませんでした。。。サウンドキューは1ファイルしか扱えないってことなんでしょうかね。

そこでサウンドより少し短めの間隔を置いて次々再生するようにしたら、キューのサウンドが順次再生始まってから入れ替わるので上手く再生できました^^


各サウンドはコンテンツ内で順になるような名前にしてくださいね。たくさんのパートに分けたサウンドは一気に読み込むと重くなるので、再生中に次のを読み込ませるようにしてます。間隔はllSleepで8秒にしました。
// サウンドを順に再生
integer play=FALSE;  // 再生中チェック用

play_sound()
{
    play=TRUE;
    string str;
    integer i;
    integer j=llGetInventoryNumber(INVENTORY_SOUND);  // コンテンツ内のサウンドの数
    for (i=0; i < j; i++) {
        // サウンドを順に再生
        str=llGetInventoryName(INVENTORY_SOUND,i);
        llPlaySound(str,1.0);
        // 次のサウンドを読み込む
        if (i+1 < j) str=llGetInventoryName(INVENTORY_SOUND,i+1);
        else str=llGetInventoryName(INVENTORY_SOUND,0);
        llPreloadSound(str);
        llSleep(8);  // 8秒間スクリプト停止
    }
    play=FALSE;
}

default
{
    state_entry()
    {
        llSetSoundQueueing(TRUE);  // サウンドキューを有効にする
        llPreloadSound(llGetInventoryName(INVENTORY_SOUND,0));  // 最初のサウンドを読み込み
    }

    on_rez(integer start_param)
    {  // 持ち物から出したときリセット
        llResetScript();
    }

    changed(integer change)
    {  // コンテンツ内が変わったときリセット
        if (change & CHANGED_INVENTORY) llResetScript();
    }

    touch_start(integer total_number)
    {  // タッチ
        if (!play) {  // 再生中でなかったら再生開始
            llWhisper(0,"Playing...");
            play_sound();  // play_soundへ
        }
    }
}

回線が遅いとか関係あるかも知れないですけど、何度再生しても聞こえない(読み込まれてない)パートがあるんですよ。なので、フリービーのセットに入ってたサウンドで試したんですけど、あまりテストできてないです^^;

あと、音楽とかは一応ネット上にアップロードってことになると思うので著作権には注意してくださいね。

2010年4月29日追記: このスクリプトは再生中はタッチしてもスクリプトがほとんど停止してるので反応しません。タッチイベントで止めたりできるようするにはllSleepじゃなくタイマーで再生タイミングを調整するように書かないとダメですね^^;

0 件のコメント:

コメントを投稿