プロが教えるわが家の防犯対策術!

楽器演奏を一人で複数の楽器パート(複数のPCのキーボード)を同時に演奏(キー入力)する必要があり、手がいくつもあれば良かったのですがそう言うわけにもいかないのでそれぞれのPCにUWSCを入れてそれぞれのPCのキー入力を自動かつ同時に行おうと考えました。
リズムを正確に刻むために遅延を指定し、以下の様なスクリプトを作成しました。

Sleep(3000/1000)
KBD(VK_9,DOWN,0/1000)
Sleep(3000/1000)
KBD(VK_9,UP,0/1000)
KBD(VK_OEM_MINUS,DOWN,0/1000)
Sleep(3000/1000)
KBD(VK_OEM_MINUS,UP,0/1000)

etc…

以下は同じようなスクリプトがキー入力毎にあるだけなので省きます。

このスクリプトは正常に動作すれば
再生開始。
3秒待機。
9キーを押す。
3秒待機。
9キーを離す。
MINUSキーを押す。
3秒待機。
MINUSキーを離す。

といった動作になると思います。
しかしこのようなスクリプトを試験的に複数のPCで全く同じ内容で複製したものをそれぞれのPCのUWSCに同時に実行させたところ開始直後は完璧に同時に入力しますが時間経過とともに入力タイミングのずれが生じ、ずれが顕著になっていくことが確認できました。
全く同じスクリプトを使用しているなら通常全く同じ動作、遅延の処理が行われるはずですが、このような入力の時間差が発生してしまう原因がわかりません。

具体的な実行環境をお伝えしますと
先程お伝えした複数のPCとはVMware仮想マシンを使って複数のWindows10を立ち上げ、複製のキーボード、UWSCがあるかのようにしています。
動作させている仮想マシンは3〜5台で、
稼働時のCPU使用率50%、メモリ使用率75%、GPU使用率70%、その他ディスク、ネットワーク等使用率0〜1%と、スクリプトの処理時間等に特別ボトルネックになっているものはないように思えます(ド素人の考察です

様々な原因が考えられ一概に断定することはできませんが、スクリプトの記述方法が間違っていたりそもそもUWSCでミリ秒の遅延を扱うのは不向きだったり、実行環境に不備がある可能性などの指摘がございましたら教えていただけませんか。


一応上記のスクリプトに対する補足を述べておきます
わざわざ1/1000で割っているのはスクリプト記述の元となったLogicoolゲーミングソフトウェアのスクリプトであるluaファイルから流用して、本来ミリ秒である数値をUWSCのSleep(秒)をミリ秒に変換して実行できる様に機械的に翻訳したためです。
またKBDコマンドの遅延指定を0にして代わりにSleepコマンドを打ち込んでいるのも同様にluaファイルにあったSleepの遅延の情報をそのままUWSCが流用できる様に翻訳したためです。

質問者からの補足コメント

  • なるほど、時間の誤差は常に発生してしまうものなのですね。コンピュータに対する理解が浅くて申し訳ないです。ごめんなさい。

    基準時間を設定してキー自動でを押すような動作を実現するにはどうすれば良いでしょうか。
    例えば音楽を複数の端末で、同じ曲を流すと同じリズム、音色を同時に鳴らしてくれるはずで、ずれがあることは(少なくとも体感できるレベルのずれは)無いと思います。
    そのような基準時間をキー入力で設定することはできませんか。

    No.2の回答に寄せられた補足コメントです。 補足日時:2021/07/19 01:18

A 回答 (3件)

何か勘違いされているのでは?あくまでもキーボード操作が大前提ですよ。


>基準時間をキー入力で設定することはできませんか。
できません。

仕方がないので調整はSleepで行いますが、残念ながら状況により大幅に書き方が異なりますので、提示は困難です。
もこさんのスクリプトでは、誤差を吸収する部分がないので、ズレ始めると止まりません。

調整は細かくしても逆効果で、ズレ始める直前に影響のない[少ない]部分でまとめて行うのが効果的。
提示は出来ないものの基本的な考え方には同じで、実際の経過時間 - 理想の経過時間[絶対時間] をどこかで調整する。
    • good
    • 0
この回答へのお礼

基準時間をキー入力〜というのはキー入力の基準となる時間を作れないかという意図でした。誤解を招くような文章でした。

プログラミング経験が全くなく経過時間を取得できることに気づかなかったのですが誤差の求め方を教えていただいてはっと気がづきました。GetTime() + G_TIME_ZZ で経過時間をミリ秒まで計測して理想時間との差を計算に組み込むことができました。
慣れないことだったので四苦八苦してずれをなくす工夫と、キー入力が膨大にあるため誤差の計測と調整をしてくれるようなスクリプトを自動で入力してくれるようなシステム作る方法をひたすら探っていました。プログラムの勉強をし続けてようやく、瞬間的なズレは完全には無くならないものの大きなズレは大きく軽減ことができ、無事管弦楽のハーモニーを美しく響かせることに成功しました。本当にありがとうございます。

お礼日時:2021/07/21 18:09

逆です。

必ずズレます。UWSC以外でも結果は同じです。通常は問題になるような事ないです。
ある一定の時間内に誤差を抑えたいなら基準時間[絶対時間]を設定し、それに対して誤差を調整するしかないでしょう。
この回答への補足あり
    • good
    • 0

逆です。

必ずズレます。UWSC以外でも結果は同じです。通常は問題になるような事ないです。
ある一定の時間内に誤差を抑えたいなら基準時間[絶対時間]を設定し、それに対して誤差を調整するしかないでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!