過去の桐井戸端BBS (桐ver.8)
13115 イベントで「遅延」が使えないので代用案を考えたが、もっといい方法があるのでしょうか 悲しげ 2001/09/19-20:20
マシンの速い遅い関連で思い出しましたので、ついでにお智慧を
拝借させていただきたいことがあります。

イベントで「遅延」は使えませんから、「遅延もどき」で代用しています。
ひとつの例として、ある「チャラリン」と云う音wavを3回鳴らしたいとします。
これって間に遅延を挟まないで実行させると殆ど同時に発音されて1回にしか聞こえません。
そこで苦しく次のようにさせています。(^^;)

------------------------------------------------
 サウンド 再生,"音1.wav",非同期,終了状態=&終了
 &i=1
 繰り返し(&i<2500)
  &i=&i+1
 繰り返し終了
 サウンド 再生,"音1.wav",非同期,終了状態=&終了
 &i=1
 繰り返し(&i<2500)
  &i=&i+1
 繰り返し終了
 サウンド 再生,"音1.wav",非同期,終了状態=&終了
------------------------------------------------

何かもっとうまい方法がありますでしょうか? と云うのが1点目。

2点目としては、これはこれでもいいのですが、気になることは、
この時&iが2500くらいまでの遅延(もどき)でバランス的に丁度よいと云うのは、
これは単に私のマシンの速度に限ってはそうだと云うことに過ぎないのではないか、
と云う点です。
つまり、もっと遅いマシンや最新の遥かに速いマシンだとバランス的にはよくない可能性が強いことになります。
  ちゃらりん、ちゃらりん、ちゃらりん
ではなく
  ちゃらりん・・・・ちゃらりん・・・・ちゃらりん
かもしれないし、
  ちゃちゃちゃらりん
かもしれない。
この点をどうしたらいいかは・・・・やはり
1点目と同じことですね。(^^;)
13116 Re:イベントで遅延もどき 【多遊】 2001/09/19-20:40
記事番号13115へのコメント
悲しげさんは No.13115「イベントで遅延もどき」で書きました。

自分の掲示板からの切り張りで恐縮ですが・・・・・・・

>遅延コマンド/【多遊】 ■2001年08月15日 水曜日 18時07分05秒

過去ログ No.38
イベントで遅延コマンドが使用できないみたいですが、
代わりに「#itvl」で使用してみました。

・1回だけ使用の場合
 &STR=#時刻
 繰り返し(#itvl(&STR,#時刻,3)<5)
 繰り返し終了

・手続きとして利用の場合
 手続き実行 遅延もどき(5)
 (数字をいれて、手続きを呼び出す)

 手続き定義開始 遅延もどき(数値 &遅延秒)
   &STR=#時刻
   繰り返し(#itvl(&STR,#時刻,3)<&遅延秒)
   繰り返し終了
 手続き定義終了

※「サウンド 再生」は,試してもいませんが時間稼ぎにはなるようです。お試しください。

ps。時間の数値は、別途変数で設定できれば汎用できるかと思います。



13117 Re:イベントで遅延もどき いかすぱげてぃ 2001/09/19-21:35
記事番号13116へのコメント
もし、1秒以内の遅延が必要なら、例えば

------------------------------------------------
変数宣言 日時{&Etime}

サウンド 再生,"音1.wav",非同期,終了状態=&終了
&Etime = #時間加算(#日時値,0.5,3)
while (#日時値<=&Etime)
end

サウンド 再生,"音1.wav",非同期,終了状態=&終了
&Etime = #時間加算(#日時値,0.5,3)
while (#日時値<=&Etime)
end
サウンド 再生,"音1.wav",非同期,終了状態=&終了
------------------------------------------------

基本的には多遊さんの変形バージョンです。

上記は1回目が0.5秒設定
2回目が1.5秒設定になってます。

理屈的にはこれで大丈夫・・・のはず・・・かなぁ???
試してみてください。とほほほ・・・

いかすぱげてぃ

13119 Re:イベントで遅延もどき いかすぱげてぃ 2001/09/19-21:47
記事番号13117へのコメント

>上記は1回目が0.5秒設定
>2回目が1.5秒設定になってます。

げげげ、書き間違った。
2回目も0.5秒設定だ。(^^;

いかすぱげてぃ

13122 Re:イベントで遅延もどき(解決編) 悲しげ 2001/09/19-23:17
記事番号13119へのコメント
どもっ、【多遊】さま、いかさま、
繰り返しループの中味を空にしておいてもいいのだとは知りませんでした。
で、取り敢えず、いか様の方で試してみました。

--------------------------------
名札 メイン
 var 日時{&Etime}
 &秒=0.5



proc 実行1()
 キー入力 (1,1),プロンプト="次の値(秒)で実行します"\
        ,モード=確定,上書き=する,初期値=&秒\
        ,終了状態=&実行リターン,&秒
 cond(&実行リターン=0 .or &秒=<0) return
 サウンド 再生,"音1.wav",非同期,終了状態=&実行リターン
 &Etime=#時間加算(#日時値,&秒,3)
 while(#日時値=<&Etime)
 end
 サウンド 再生,"音1.wav",非同期,終了状態=&実行リターン
 &Etime=#時間加算(#日時値,&秒,3)
 while(#日時値=<&Etime)
 end
 サウンド 再生,"音1.wav",非同期,終了状態=&実行リターン
end
--------------------------------

ついでに云えば、このテストの結果、"音1.wav"なるサウンドについては
遅延秒数は「0.42」が最も好ましいことが判明いたしました。(^^)v

細かいですか? でも0.4でも0.5でも、果ては0.45でもイマイチだったと云う、
この辺りの微調整までできるのは大したもんです。
古典一括でしか使えない「遅延」コマンドはせいぜいが0.1秒単位が最低だから、
却って有利かもしれませんね、ちょいと面倒だけど。(^^;)

ん〜、待てよ。
つ〜ことは、私のv8初期公開作品(確か第2弾)の鍵盤楽器に付属させた
「自動演奏」って、イベントでもできるんですね。
長さの制御はcmd方式よりもきめ細かく。(^^)
ps:繰り返しループは負荷がかかりますかね?
13123 Re:イベントで遅延もどき hidetake 2001/09/19-23:19
記事番号13119へのコメント
単純ループを使うと、桐は CPU を 100% 使い果たし
その間、他の処理が極端に遅くなる可能性があるので、
1つ音を鳴らすだけのフォームを作り、
その中でタイマーでカウントアップしては、音を鳴らすようなものを作ってはどうでしょうか?
そして、カウントアップしたら、そのフォームは自分自身を終了させるようにして・・・

フォーム自身は見えても見えないように作っても良いでしょうし!

そしてフォームをモーダルかフォーム呼び出しで開くと言うのは?


13125 Re:イベントで遅延もどき hidetake 2001/09/19-23:40
記事番号13123へのコメント
0.何秒単位の処理だったら、別に CPU の使用率が
どうとか言う必要は無かったですかね? (^^;


13126 Re:イベントで遅延もどき 悲しげ 2001/09/20-00:28
記事番号13125へのコメント
#13123 hidetakeさん
>フォーム自身は見えても見えないように作っても良い
>でしょうし!

見えないフォームの作り方を教えて下さい。
ちなみに私が作ってみたのは極小のフォーム(幅・高さとも最小の6pt、
しかもオプションで表示倍率をこれも最低の10%)でした。
最小化指定するより遥かに小さいっす(^^;)。

で、ワークスペースに機能名が「閉じる」の牡丹を設置。
kevは次のとおり。
--------------------------------------------------
手続き定義開始 フォーム::フォーム開始(長整数 &表番号)
 オブジェクト操作 @フォーム.タイマー値1=&STR
 サウンド 再生,"音1.wav",非同期,終了状態=&実行リターン
手続き定義終了

手続き定義開始 フォーム::タイマー1()
 method @b閉じる.実行()
手続き定義終了
---------------------------------------------------

&STRの値は「フォーム呼出し」時に呼出し元で指定させる。
と云うことで、先の方法と挙動を比べてみました。
----------------------------------------------------
名札 メイン
 var 日時{&Etime}
 &秒=0.5



proc 実行2()
 キー入力 (1,1),プロンプト="次の値(秒)で実行します"\
        ,モード=確定,上書き=する,初期値=&秒\
        ,終了状態=&実行リターン,&秒
 cond(&実行リターン=0 .or &秒=<0) return
 &STR=#STR(&秒)
 フォーム呼出し "音1.wfm"
 フォーム呼出し "音1.wfm"
 フォーム呼出し "音1.wfm"
end

proc 実行1()
 キー入力 (1,1),プロンプト="次の値(秒)で実行します"\
         ,モード=確定,上書き=する,初期値=&秒\
         ,終了状態=&実行リターン,&秒
 cond(&実行リターン=0 .or &秒=<0) return
 サウンド 再生,"音1.wav",非同期,終了状態=&実行リターン
 &Etime=#時間加算(#日時値,&秒,3)
 while(#日時値=<&Etime)
 end
 サウンド 再生,"音1.wav",非同期,終了状態=&実行リターン
 &Etime=#時間加算(#日時値,&秒,3)
 while(#日時値=<&Etime)
 end
 サウンド 再生,"音1.wav",非同期,終了状態=&実行リターン
end
----------------------------------------------------

その結果は、同じ遅延秒数を指定しても、フォーム呼出しの方はかなり遅くなります。
これは恐らくはcpuの処理能力に規定されているのではないでしょうか?
とすれば、複数のマシンで使われるものなのでマシンによって遅延の長さが異なって来るのは好ましくないとの前提からすると、
今回のように微妙な短時間を争うようなケースでは繰り返しループ(つーか絶対時間を利用?)の方がベターなのかな、と思いました。
な〜に、0.*秒×3回だけの話ですから。(^^;)
13127 Re:イベントで遅延もどき hidetake 2001/09/20-01:04
記事番号13126へのコメント
>見えないフォームの作り方を教えて下さい。
>ちなみに私が作ってみたのは極小のフォーム(幅・高さとも最小の6pt、
>しかもオプションで表示倍率をこれも最低の10%)でした。最小化指定
>するより遥かに小さいっす(^^;)。

多分一緒だと思います。
随分前にアップしたのが、
http://pub.idisk-just.com/fview/VL5uq6YszmreeeDtINFqZbZ4PxUVp2La2c9ET4RUO9xE2FTkXEM5GS1EZ85WZ22IRWhd0JGjzQs/c3RhcnQ.lzh
にありますけど、これは起動遅延用に作った奴で言って時間を「メニュー.WFM」を起動するものだったです。


>な〜に、0.*秒×3回だけの話ですから。(^^;)

ですね!

それから、私は1回1回起動するのではなく、
1回のフォームで3回タイムアップさせて
そのカウントアップ毎に別の WAV を鳴らす等の処理を考えていました。
短い処理だと、フォームのロードや初期化等に時間か掛かりそうですね!


13128 Re:イベントで遅延もどき hidetake 2001/09/20-01:45
記事番号13127へのコメント
>>見えないフォームの作り方を教えて下さい。

それから、背景色を「ボタンの表面色」にして
フォームの位置を「右付け」「下付け」にすれば
まず気付く事はないと思います。


13135 Re:イベントで遅延もどき 悲しげ 2001/09/20-11:33
記事番号13127へのコメント
どもっ、hidetakeさん

別途「見えないフォーム」は見ました。確かに大体同じようなものでしたね。

>それから、私は1回1回起動するのではなく、
>1回のフォームで3回タイムアップさせて
>そのカウントアップ毎に別の WAV を鳴らす等
>の処理を考えていました。
>短い処理だと、フォームのロードや初期化等に
>時間か掛かりそうですね!

そうですね、呼び出した時のkevを次のようにしてみました。
---------------------------------------
名札 メイン
 var 整数{&回=1}



手続き定義開始 フォーム::フォーム開始(長整数 &表番号)
 オブジェクト操作 @フォーム.タイマー値1=&STR  /*この値は呼出元で指定している*/
手続き定義終了

手続き定義開始 フォーム::タイマー1()
 サウンド 再生,"音1.wav",非同期,終了状態=&実行リターン
 cond(&回=3) method @b閉じる.実行()
 &回=&回+1
手続き定義終了
---------------------------------------
こうすると、音の繋がりのバランスはよい(繰り返しループ方式と全く同じ)になりました。
が、最初の一音、つまり鳴り初めがどうしても一寸遅れるみたいでしたから、
今回のwav3連発はやはりループ方式で行きます。
もっと長い遅延の時には、cpuへの負荷の関係で、
ループよりはこちらの方式(遅延専用タイマーをセットした別フォームを呼び出す)を優先採用させようと思います。
でも記憶を保持できているかなぁ。(^^;)

戻る