ソラマメブログ
< 2024年05月 >
S M T W T F S
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Mail

2007年10月24日

マイク&スピーカセット

micSpeaker links
マイク&スピーカセット

ずいぶん間があいたので自分でも忘れてきちゃってますが…。
マイク&スピーカセットの続きです。

マイク&スピーカセット
マイクはスタンドを延ばして配置しました。スピーカと並べるとコンサート会場のようです?

そもそもスピーカを作ったのは…
SLでのサウンド再生って結構音量が小さく、
音が鳴っている場所から離れるとすぐ小さくなってしまう、
広範囲に普通の音量の音を鳴らすことはできないか?
というところからでした。

範囲指定して音を鳴らすllTriggerSoundLimitedなんて命令もありますが
これの場合も音源から離れるとすぐに音量が小さくなってしまいます。
(と、思いました。実験はしたはず。)

それで、前回のようにsayなりshoutなりで複数のスピーカに命令を出して、
同時に音声を再生する仕組みを作ったわけです。

しかしそれだと遠くのスピーカには命令が届かないので…ここでscriptの力を借りる必要があります。
使うのはllRegionSayです。
チャンネル0以外でSIMすべてのエリアにチャットメッセージを送信する命令です。

マイク&スピーカセット
そのllRegionSayの仕組みを入れ込んだアイテムがこのマイクです。
マイクに向かってチャット命令を出すことで、SIM中のスピーカが鳴り出します。

まず動画で確認どうぞ。


チャットでは
/55 speak a842ec8d-aafe-7528-9f42-a91592a24dc7
と打っています。
55チャンネルを用い、スピーカにキーがa842ec8d-aafe-7528-9f42-a91592a24dc7の音を鳴らす、という意味です。

マイク、スピーカとも55チャンネルを送受信する設定にしてあります。

マイク&スピーカセット
パラメータはdescriptionに設定します(前回参照)

マイク&スピーカセット
マイクも同様です。チャンネル番号以外の指定はありません。

このサンプルでは、スピーカはすぐ近くにありますが、
SIMの端っこと端っこにスピーカを置いても、同時に音声を再生してくれました。
(scriptの動作やrezが許可されてるSIMで実験しました)

まあ形がマイクである必要もないですし、
HUDとかに用意した制御オブジェクトから
スピーカに対してllRegionSayで命令を送ったほうが
使いかってがいいかもしれませんけど。
(実はマイクをプリムで作りたかった!という…。)


この仕組み、何かのイベント会場とかにどうでしょうか?
面倒なので配布してませんが、フルパーミッションで差し上げますよー。
広い場所で実験してみたいので。
興味ある方はIMで連絡じゃなくてメールください。

マイク側のソース
integer debug = FALSE;
Trace(string s){
debug = TRUE;
if(debug) llOwnerSay(s);
}
integer initialized = FALSE;
key owner;
integer ch = 86492;
Init(){
if(initialized) return;
Trace("Init");
initialized = TRUE;
owner = llGetOwner();
string desc = llGetObjectDesc();
if(desc!=""){
ch = (integer)desc;
}
llListen(ch,"",owner,"");
Trace("channel : "+(string)ch);
InitSoundList();
}
list soundList;
InitSoundList(){
Trace("InitSoundList");
soundList = [];
integer len = llGetInventoryNumber(INVENTORY_SOUND);
integer i;
for(i=0;i<len;i++){
soundList += [llGetInventoryName(INVENTORY_SOUND,i)];
}
}
string LISTEN_COMMAND = "speak";
string BROADCAST_COMMAND = "harayoki.speakreq";
Speak(list l){
Trace("Speak "+llList2CSV(l));
string soundName = llList2String(l,1);
string soundKeyString = "";
if(llSubStringIndex(soundName,"#")==0){
//soundName is index number
integer i = (integer)llGetSubString(soundName,1,-1);
soundName = llList2String(soundList,i);
}
soundKeyString = (string)llGetInventoryKey(soundName);
if(soundKeyString==(string)NULL_KEY){
//soundName is key string
soundKeyString = soundName;
}
string vol = llList2String(l,2);
if(vol=="") vol= "1.0";
string s = BROADCAST_COMMAND+" "+soundKeyString+" "+vol;
Trace("Speak -> "+s);
llRegionSay(ch,s);
}
default{
state_entry(){
Init();
}
on_rez(integer num){
llResetScript();
}
touch_start(integer total_number){
if(llDetectedKey(0)==owner){
llResetScript();
}
}
listen(integer cha,string name,key id,string mes){
integer index = llSubStringIndex(mes,LISTEN_COMMAND+" ");
if(index==0){
list l = llParseString2List(mes,[" "],[]);
Speak(l);
}
}
changed(integer cha){
if(cha & CHANGED_INVENTORY){
InitSoundList();
}
}
}


詳しく説明しませんが、マイクInventory内にサウンドをいれ、
/55 say #0のように番号で音の指定をすることもできます。
番号はサウンドの並び順です。


おまけ。
マイク&スピーカセット
↑キャプチャ画像があまってたので張っただけ。

うーん、そろそろアバタをちゃんと自分でも作ろう。
このアバタはminaさんに作ってもらったやつで、ある意味本人に似ていて(笑)
(実は自分、体育会系なのです。)
気に入ってるんだけど。



同じカテゴリー(マイク&スピーカセット)の記事画像
改:マイク&スピーカセット
複数のスピーカをならす
スピーカで好きな音をならす
スピーカも作りました
マイクスタンドも作りました
マイク作りました
同じカテゴリー(マイク&スピーカセット)の記事
 改:マイク&スピーカセット (2007-10-24 11:39)
 複数のスピーカをならす (2007-09-09 04:38)
 スピーカで好きな音をならす (2007-09-09 02:00)
 スピーカも作りました (2007-09-08 03:57)
 マイクスタンドも作りました (2007-09-08 03:46)
 マイク作りました (2007-09-08 03:00)
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。