U.F.O. SA/A10サイクロンSAコントロールアプリDual版Ver.1.00

U.F.O. SAやA10サイクロンSAをAndroidのBLE(Bluetooth Low Energy)から独自のランダムパターンもしくは任意の固定パターンで制御できる野良アプリUfoSaCtrlが2台同時制御に対応して
UfoSaCtrlDual
に進化しました。
BLEの使用できるAndroid端末が必要です。(バージョンとしては4.3以上ですが、4.3はOSにバグ有りらしく、4.4もOS側がイマイチですので、できるだけ5.0以上の方が望ましいです。ただし、筆者は4.4と7.0でしか実機確認できておりません。また、このアプリはエミュレーターによる検証も不可能なため、全てのBLE付きAndroid端末での動作を保証することはできません。ご了承ください。)

このアプリの対象となる製品はこちらです。

使用方法

良かったら、デモ動画でも見てみないか? (ボロン)ω
ここをクリックorタップするとYoutubeへ遷移します。

今までのUfoSaCtrlシリーズはAndroidの画面をリモコンに見立てて、各ボタンを極力大きく配置していました。
今回、制御対象を2台に拡大したため、リモコンというコンセプトではUIが破綻してしまうのと、音楽再生関連ボタンでリモコン制御できる機能を充実させたため、画面をリモコンと捉える必要が無くなり、シンプルな設定画面へと変化しました。

Screenshot_20180603-191257.png

画面上から、
左上に通知(Uの中に乳首が付いているやつ)が出ています。(Android5.0未満ではアプリアイコンと同じアイコンが出ます)

アプリアイコンとアプリ名が表示されます。(ここをタップするとアプリを終了できます)右側にはメニューボタンがあります。

1台目の接続状況が表示されます。接続されていないときは「(none)」でそのとき押せるボタンは「Connect」となっていて、ボタンを押すとU.F.O. SAもしくはA10サイクロンSAとの接続を試みます。

1台目の制御に適用されるパターンが表示されます。上の画面の例では「Step」になっています。ランダム制御するパターンは従来のUfoSaCtrlシリーズと同様に「Step」「Composite」「Gradual」の3パターンですが、設定画面にて任意のパターンを無制限に追記できるようになりました。

2台目の接続状況が表示されます。内容は1台目と同じです。

2台目の制御に適用されるパターンが表示されます。内容は1台目と同じです。

2台目の動きを1台目とどう関連させるかの設定が表示されます。「Random(適宜後記の3つを切り替える)」「Unrelated(1台目と全く無関係に動く」「Mirror(1台目と反転動作する)」「Sync(1台目と同じ動作をする)」の4種類から選択できます。

最下段は従来と同じ、左側が回転強さ(ボリューム)の設定、右側がオン/オフ(画面オフ時に動作開始)を切り替えるボタンです。

従来のUfoSaCtrlシリーズでは、アプリ起動と同時にすぐに接続しにいこうとしていたため、Bluetoothがオンになっていない場合はすぐに以下のような表示が出て、Bluetoothをオンにするように促しました。

Screenshot_20180603-191312.png

しかし、今回は接続したい対象が1台なのか2台なのか不明ですし、いつ接続したいか、いつ片一方だけ接続・切断したいか等、要求が複雑になりますので、接続(Connect)ボタンを押されるまではBluetoothの判定はしないようにしています。
これは例えば、接続するつもりはなくて、設定を弄りたいだけ、なんてときにも煩わしさが減少するかと思います。
一方、このBluetooth起動要求ダイアログが出た場合は、Bluetoothをオンにしようがキャンセルしようが、接続(Connect)ボタンが押されたことは一旦破棄します。ので、このダイアログが出てBluetoothをオンにした場合は改めて接続(Connect)ボタンをタップしてやってください。

接続(Connect)ボタンを押すと、

Screenshot_20180603-191340.png

接続機器名称を表示するところには「Scanning…」と接続試行中である旨が表示され、このとき右側のボタンは「Cancel」接続試行中断のボタンとなっていますので、接続する必要が無かった場合や、動作がおかしくなったのでやり直したいなんて場合にも押してみると良いでしょう。

※タイムラグのある無線通信であるため、どうしても通信のこぼれやタイミングの悪さによる動作不具合が起こりえます。
例えば、上の画像では1台目と2台目を同時にスキャン(接続試行)していますが、ときどき、1台繋がっただけで2台とも繋がったような表示になってしまったり等、画面上の表示と実際の接続状況に食い違いが発生することがあります。
これは、アプリ側のプログラムによる対処だけではどうしても発生を防げないことで、もしそれでも対処しようとするならば、2台同時の接続試行はさせないという対処になってしまいます。
それはそれで待ち時間が長くなったりして面倒になったりもしますので、今回は同時接続試行を許し、しかし、タイミングによっては正常に接続できないこともあるのでその場合はやり直してね、という仕様にしています。
(筆者はAndroid7.0と4.4しか持っていないのですが、4.4では失敗が多いですね。1台の接続で2台とも接続できたかのような表示になってしまう確率が高いです。確実に接続するなら1台ずつやった方が良いです。はい)

接続ができると、

Screenshot_20180603-191531.png

接続できた機器の名称が表示されます。(U.F.O. SAの場合は「UFOSA」)
接続ができているときは右側のボタンは「DisConn」となっていて、これは接続切断をしたいときに押してください。

次にお好みのパターンを選択しましょう。

Screenshot_20180603-191358.png

デフォルトでは6つのパターンを登録してあります。最初の3つ「Step」「Composite」「Gradual」はUfoSaCtrlシリーズ特有のランダム制御のためのパターンです。簡単にいうと、階段状に変化、ゴチャ混ぜ、なめらか変化、といった具合です。
ランダムに選出した回転速度をすぐに指示するのが「Step」。徐々にその回転速度に近づけていくのが「Gradual」。「Composite」はその都度「Step」変化でいくか「Gradual」変化でいくかもランダムで決定します。

昔のですが、説明動画もあります。27秒辺りからです。
ここをクリックorタップするとYoutubeへ遷移します。

残りの3つ「Telephon」「Seesaw」「Elevator」は固定パターン制御で、設定画面にて任意の名称およびパターンを記述することができます。この3つは例として記述したものですので、消すことも可能です。
このパターンの記述についてはちょっと複雑なので後述。

2台目も接続している場合は、1台目との動きの関連性も設定しましょう。
あ、ちなみに1台しか接続しないよ、という場合は、1)の方を使ってくださいね。2)の方だけを接続しても上手く動かないです。

Screenshot_20180603-191407.png

上記でも説明したとおり1台目との関連設定は「Random(適宜後記の3つを切り替える)」「Unrelated(1台目と全く無関係に動く」「Mirror(1台目と反転動作する)」「Sync(1台目と同じ動作をする)」の4種類です。
ちなみに「Random」選択した場合、無関係か反転か同期の選ばれる確率は一律ではなく、無関係を50%、反転25%、同期25%としています。
これは無関係に動作させても偶然に反転や同期と同じ動作になることがあるため、一律33%としてしまうと、いやに反転や同期が多いなぁ、という印象になってしまうためです。(これを設定で可変にする案もあったのですが、とりあえず現時点ではこの確率で固定としています。)

Screenshot_20180603-191425.png

最下段の左側はボリュームで「0」は停止、数字が上がるごとに強く速くなっていきます。規定では最大で5となっていますが設定で変更できます。ただし、そのルールがちょいと複雑なので変更については後述。

右側はいわゆるオン・オフを切り替えるトグルボタンで、「Immediately」となっているときは左側のボリューム設定が即座に反映されますが、「Start when LCD turn Off」となっているときは画面のバックライトが点いているときはオフ、画面を消灯させるとボリューム設定が反映される(オンになる)という仕組みになっています。

基本的には放ったらかしにしてチクニーに集中したいと思いますので、放っているときまで画面を点灯させ続けたくないやい!
という思想です。

なお、これら画面上で設定する項目の多くは、音楽再生関連ボタン(以下「メディアボタン」と呼びます)でリモートコントロールすることが可能です。ただし、このリモコン機能はAndroid5.0(Lolipop)以上のみ対応しています。
(Android5.0未満はBluetooth周りのOSの実装もイマイチなのでできるだけ5.0以上の機体を使用すること推奨です。)

標準では、
ボリュームボタンがそのままボリュームの上下。
曲の送り・戻しがパターン変更(1台目2台目ともにずらします。これは画面上で1台目と2台目で異なるパターンを指定した場合でも、そのズレを担保したまま1つずつパターンを変えていきます)
再生や停止・一時停止のボタンはオン・オフを切り替えるような動きをします。具体的にはボリュームが1以上だった場合は0にして、0だった場合にはそれ以前に指定していたボリュームに戻すという動きですので、元のボリュームが2だった場合は、2回再生ボタンを押すと2→0(停止)→2というようにボリュームが変化します。

が、メディアボタンって、使いたいボタンが付いている製品が簡単には入手できないというケースも多々あります。
例えば、100均で手軽に入手できるカメラのリモコンシャッターは実はボリュームを上げるメディアボタンだったりするのですが、ボリュームを上げる一方では使いづらいので、オン・オフ切り替えとして動いてくれた方がありがたいですよね。
というわけで、メディアボタンが押されたときにどういうアクションをするか、選択できるようにしています。

Screenshot_20180604-191032.png

画面右上のメニューボタンを押すと、3つのメニューが出ます。それの真ん中「Switches」を選択すると、

Screenshot_20180603-191455.png

ボリュームボタンと曲の送り・戻しボタンをそれぞれ他の動きにできる設定画面が出てきますので、これで設定変更してアプリのメイン画面に戻ると設定が反映されます。

ちなみに「Rel変更」というのは2台目接続時に1台目との関連の設定で「Random」「Unrelated」……が選べるところで、これを1つずつずらしていくものです。

ボリュームボタンと曲の送り・戻しボタンは2つボタンがあるので上下とか順送り逆戻りとか出来る他、どちらを押してもオン・オフ制御というのもアリだと思うのですが、再生や停止・一時停止のボタンは通常1つしかないため上下できるような機能への割り当てなんてあっても使わないと判断して設定を用意しておりません。(というか、そもそもあまり入手できないですよね。)

さて、これでとりあえずは使えるようになりました。
筆者はだいたい「Composite」で「Random」でボリューム1で使いますから、リモコンシャッターをAndroidに接続して、あとは画面消してリモコンシャッターを押すだけでオン・オフでウマー(^^)です。

充分堪能したら、終わらせましょう。
「DisConn」のボタンを押して接続を解除し、アプリ画面左上の戻るボタン(「<」みたいな図形とアプリアイコンが表示されているところ)を押すか、Android標準のバックボタンを押しても終了できます。
終了したら、通知アイコンが消えますので、それで終了を確認してください。

なぜこんなに終了についてうるさく言うのかというと、このアプリは画面を消しても動くように、他のアプリを前面に出しても動くように工夫しています。
その結果、逆に使用していないのにこのアプリが起動したままですと、スリープに入る時間が減ったりしてバッテリーの消費に悪影響が出るのです。
ですから、使い終わったらちゃんと終了させてくださいね。

なお、「DisConn」ボタンを押さずに接続したままアプリを終了させても、接続を切断するようにプログラムを組んではいますが、例によって無線通信ですから、まれに通信を取りこぼして接続が残ったままになってしまう場合がありますのでご留意ください。
BluetoothそのものをOFFにしてしまえば良い、ってのもあるんですけどね。

より快適に使用するために

筆者はAndroid7.0と4.4の機体しか持っていませんが、4.4は明らかにOSのBluetooth周りの実装がヘボいので、できれば新しいバージョンのAndroidを使用することをオススメします。リモコンも使えますしね。

4.4を使用する場合はOS側でどんどんゴミが溜まってしまっているような現象が見受けられますので、適宜Bluetoothをオフにするなり、(アプリじゃなくて)OSの再起動をするなりしてゴミ掃除をしてあげた方が動きが良くなります。
また、4.4で同時2台接続は失敗する可能性が非常に高いので、1台ずつ接続しましょう。(4.4じゃなくても失敗確率は結構高いのですが)

U.F.O. SAやA10サイクロンSAのコントローラーはなるべく人体から離した方が良いです。
また、UfoSaCtrlアプリを実行しているAndroid機とコントローラーの間はなるべく遮蔽物を置かないように(人体含め)しましょう。
特に人体が絡むとBluetooth通信の質がガタ落ちします。

また、少なくともU.F.O. SAのコントローラーには指向性がはっきりと存在しますので、繋がりやすい方向を確かめて使用された方がより確実になります。

それと、もしかしたら筆者の持っているスマホが安物しかないから(SnapDragon系を持っていない!)かもしれませんが、なんと、スマホのバッテリーが減るとBluetooth通信の安定性も落ちます。
これはもう筆者の経験上、特に、最初の接続に掛かる時間が全然違うんですよ。あと、動作中にも実はこっそり通信切断してしまってこっそり再接続していたりなんてことも発生したりします(切断ボタンを押してないのに切れてしまった場合は再接続を試みるようにプログラムしてあるのです)。

そして、いくら気を付けても、それでも無線通信ですので通信の取りこぼしは発生します。
通信はできても、コントローラー側がデータを受けきれずに破棄する、ということもあります。
特に連続して送信を続けるとコントローラー側のデータ受け取り拒否が発生しやすくなりますので、通信の取りこぼしによる動きの不確実さが気になる方は、頻繁にデータ送信することになる「Gradual」パターンや「Composite」パターンを使用せずに、「Step」パターンを使用することをオススメします。

2台同時通信ということで、通信の取りこぼしは若干増えたような印象はあります。
(まぁ、この辺はアルゴリズムをもっと最適化すれば多少改善できる余地もあるかもしれない、が大変なので今は許して。(^^ゞ)

パワーユーザーの方向け

ここから、もっと根本から設定を弄ってバリバリ使用する方向けの複雑な説明になります。
慣れてきた、物足りない、という方はこちらも習得して使いこなしてみてください。

UfoSaCtrlProのときからそうでしたが、このUfoSaCtrlDualでも、設定でかなりのパラメータを柔軟に変更できます。

メニューボタンで「Settings」を選択すると、設定画面へ入れます。

Screenshot_20180603-191443.png

基本的にはUfoSaCtrlProのときと同様なのですが、Dualならではの変更点があるのと、Pro時代にかなり説明記事が分散してしまったので、改めて一からここにまとめておきたいと思います。

まず、この最初に出た設定データはデフォルトでアプリに仕込んでいるものです。

この設定画面にもメニューがありまして、

Screenshot_20180603-191448.png

メニュー一番上の「RecoveryBasicData」を押すことで、いつでも初期データに戻すことができます。
そして、Save#1~#3で3つのデータをセーブしておくことができ、Load#1~#3でセーブしたデータを呼び戻すことができます。
ただし、このセーブはアプリ内セーブですので、アンインストールしたりデータ消去をすると消えてしまいます。
この設定データはただのテキストデータですので、長期的に保存したいデータは全選択してコピーし、テキストエディタ等でペーストして別個にファイル保存すると良いでしょう。
(このアプリにそこまでの機能を持たせるのは大変&あまり意味が無いので実装していません。)

画像にデータの全てが映っていませんので、改めてここにそのデータを記載しまして、それを元にデータの作り方を説明したいと思います。

-----

[SpeedOffset: int(0~100): 2要素必須 通常,減速時]
10,5
[MaxVolume: int(1~100): Speed * Volume + Offset が100を超えないように注意]
5
[SpeedPattern: int(0~100): 要素数は自由(ランダムに選ばれる)]
0,3,6,9,12,15,18
[SpeedDisplacementThreshold: int(0~100): 似たようなSpeedを続けないため最低限変化すべき量を指定]
5
[TimePattern: int(1~): 要素数は自由(ランダムに選ばれる) 単位100msec]
8,16,24,32,40,48,56,64
[TimeIndexLimit(Step): int(1~): 要素数はSpeedPatternと合わせる 各数値はTimePattern要素数以内とする]
6,8,6,5,4,3,2
[TimeIndexLimit(Gradual): int(1~): 要素数はSpeedPatternと合わせる 各数値はTimePattern要素数以内とする]
5,6,5,4,3,2,1
[RelationChangePhases: int(1~): 2要素必須 min,max: 2機目のRel設定でRandomを選択している際に、Sync,Mirror,Unrelatedを切り替えるまでにいくつのパターンを消化するか、の最小値最大値を指定]
2,8
[SwitchHeightWeight:int or float(0~) 最下段のVolumeとSwitchの画面高さを指定します]
2.5
[Custom0:Name,Data 先頭行にこのパターンに付ける名称を、2行目以降にパターンを記述してください]
Telephon
14,10,s
0,20,s
-14,10,s
0,20,s
[Custom1Data]
Seesaw
14,11,g
-14,11,g
[Custom2Data]
Elevator
11,11,s
0,16,g
-11,11,g
0,16,s
-11,11,s
0,16,g
11,11,g
0,16,s
[End]

-----

-----で囲った中(-----を含まない)が設定データです。
行の先頭に「[」(半角大カッコ)を書くとその行は全てコメントとみなされます。別に「]」で閉じる必要はありません。

基本知識として、U.F.O. SAやA10サイクロンSAの制御は単純にモーターの速さ(恐らく電流を流す時間比率)を与えるだけの単純なものです。
その速さは停止状態の0~最大で100。逆回転はマイナス符号を付けて表します。
つまり、-100~0~+100の値で制御します。

ですが、UfoSaCtrlシリーズアプリでは製品の特性を考慮し、また特徴であるランダム制御を実現するために、ちょっとわざと構成を複雑にしています。

基本公式は
制御値 = Speed × Volume + SpeedOffset
です。

設定データ最初に現れる[SpeedOffset]値は、U.F.O. SA実際の製品が、新品で無負荷状態であれば±1という最小の値を与えてもモーターは回転するのですが、劣化したり乳首を当てた抵抗が加わると小さな値ではモーターが動かない、という事象が発生するために設けた設定です。

例のデータでは「10」としていますが、この値が常に制御値に上乗せされることになります。

じゃあ、その後ろに書かれている「5」はなんなのさ、って話なのですが、
これはGradual変化のときにのみ使用される値です。(「Gradual」パターンでは常に、その他「Composite」パターンや任意パターンでも使用されることがあります。)
Gradual変化とは、制御値をいきなり与えるのではなく、徐々にその値に近づけていくように緩やかに変化させるという、UfoSaCtrlシリーズ独自の制御方法です。

例えば、今-10で動いている状態で、これを+12に切り替えたいというときに、100msecごとに-10→-9→-8→-7→-6→-5→-4→-3→-2→-1→0→1→2→3→4→5→6→7→8→9→10→11→12と制御値を変えていくわけですが、先程話に出ました「あまり小さい値だとモーターが動かない」事象があるので小さい値はスキップ(飛ば)します。
このオフセットが10のままだと-10→0→10→11→12となり、緩やかに変化した感じがせず、いきなり反転した印象しか与えませんね。
また、止まっている状態から動き出すには大きな力が必要ですが、動いている状態から遅くしていく分には結構動きます。
なので、遅くしていく時専用のオフセット値を用意しました。それが、10の後ろに書かれた5なのです。
この遅くするときだけ5まで粘るという設定で、-10→-9→-8→-7→-6→-5→0→10→11→12、まぁ、あまり変わんねえじゃねえか、言われてしまうとそれまでなんですが、そういう設定項目です。

次にMaxVolumeですが、名前の通り最大ボリュームを記述してください。
上記の基本公式で±100を超えないように記述してください。
(超えても製品もしくはアプリが壊れるということは無いと思いますが、思った通りには動作しなくなります。)

SpeedPatternは「Step」「Composite」「Gradual」で速度を変更するときにここに書かれたリストからランダム抽出されます。
なぜわざわざ1つ1つ値を書かせるのか。SpeedOffsetとMaxVolumeから選択できる最大値は求められるんだからこんな設定必要無いじゃないか! と言われるそのとおりです、と言いそうになりますが……、
それだと均一の確率でしか選択されないんですよね。
まぁ、例のデータでも3つ飛びの値を1つずつ書いているだけなので確率は均一なんですが、これ、同じ値を何度記述しても良いんです。
数多く記述した値の選択される確率が上がります。
そのためにわざわざリスト列記という形を取っています。(小さい順に書く必要はありません)

SpeedDisplacementThresholdはこの値以上の変化が生じるような値しか次の値として選択しないよ、というしきい値です。
ランダム制御って簡単に言っても、本当にランダムだと、たまたま同じような速度ばかりが延々と続いてしまうなんてこともあります。それが真のランダムです。
しかし、本当に欲しいのはランダムであって、厳密なランダムではないのです。
なので、この設定値を使用して、同じような速度が続かないように制御しています。

TimePatternは速度保持時間を、これまた列記で記述します。単位は100msec。10で1秒です。
これも範囲指定じゃなくて列記方式としているのは、確率を不均一にもできるようにする理由の他に、次の設定項目へ。
(ここの記述も小さい順にする必要はありません)

TimeIndexLimit(Step)、ここに書く要素数(数値の数)はSpeedPatternの要素数と合わせてください。
また、その数値はTimePatternに記述した要素数を超えない数としてください。
ここに書いた数値の順はSpeedPatternに記述した数値の順と対応していて、例えばSpeedPattern3番目の値がランダム選択されたときに、ここに書かれた3番目の数値を見て、TimePatternがランダム選択される範囲を予め限定します。
何のための設定値かというと、「遅い速度なら長くても良いけど、速いのが長く続くとしんどいよね」という思いから編み出した設定値で、
例えばこのデータの2番目のSpeedPatternの値は3でゆっくりなのでTimeIndexLimitは8、つまり、TimePatternの左から8要素(全部ですね)の中から持続時間を決めるよということになります。
データの7番目のSpeedPatternの値は18で速いのでTimeIndexLimitを2として、TimePatternの左から2要素、つまり0.8秒か1.6秒という短い持続時間しか選択されないように制限します。
これはそのための値です。
もちろん、設定は自由ですから速いのを長くするように記述するのも自由ですよ。

そして、TimeIndexLimit(Gradual)。さきほど同じですが、速度を緩やかに変化させるGradual変化のときにはこちらの値の方が使われます。
なぜ、わざわざ値を分けているのかというと、緩やかに変化させている分の時間が余計に経過してしまっているので、Step状に変化するときと同じ持続時間にしてしまうと非常に間延びした、なかなか変わってくれないという印象の制御になってしまうためです。
そのため、デフォルトではStep変化のときよりも短い時間が選択されるように制限を厳しくしています。
もちろん、自由に変更可能です。

ここまではUfoSaCtrlシリーズで共通の概念でした。

次のRelationChangePhasesはUfoSaCtrlDualならではの設定項目です。
2台目の動きについて1台目との関連を指定する「Rel」と表示された選択項目の中に「Random」というものがあって、これが「Unrelated」「Mirror」「Sync」を適宜切り替えるようにしているのですが、毎回切り替わっていたら「Unrelated」との差が分かりません。
そこで何回か同じ選択をするようにして、それから切り替えるとしているのですが、その最小値と最大値を指定します。
この間の回数がランダムで決定され、その回数分は同じ関連を維持し、そしてまたランダムで回数を決定して次の関連を維持します。

さて、UfoSaCtrlProでは画面をリモコンと捉えていたため全てのパターンを画面上にボタンで表示するようにしていて、その表示色やボタンの大きさ指定などの設定項目があったのですが、UfoSaCtrlDualでは必要なくなったのでごっそり消えました。

残っているのは最下段のボリュームとオン・オフボタン。ここの高さの指定がSwitchHeightWeightでできます。
数値を大きくすると最下段の高さを増やせます。当然、代わりに上が狭くなります。
ここの数値だけは小数の記述OKです。
あまり突飛な値を指定すると表示が見切れたり消えたりするかもしれません。エラーチェックはしていませんのであしからず。

ここまでが固定で必須の設定項目です。

ここから以降は任意の設定項目。任意パターンの設定になります。
任意パターンが不要な方はここから以降はごっそり削除していただいてかまいません。

任意パターンの設定に入りますと、行頭に「[」を記述するコメント行が単なるコメントとしてだけでなく、任意パターンの区切りとしても使用されるようになります。
任意パターンを区切るところに必ずコメント行が必要になりますのでご注意ください。

そして、コメント行のすぐ下の行にはパターン名称を記述してください。
ここの名称がパターン選択スピンボタンに現れるようになります。
その次の行からはそのパターンの設定を1行当たり3要素で、任意の行数分記述します。
記述内容は、

Speed, 持続時間, 変化パターン

です。
Speedは-100~0~100ですが、こちらも基本公式 制御値 = Speed × Volume + SpeedOffset が適用されますので、それに応じた値にしてください。

持続時間も上記と同様、その速度に到達してからの時間で単位は100msec。

変化パターンは必ず「s」か「g」のいずれかの文字を記述し、
「s」は指定した速度を即時に指示するStep変化、
「g」は指定した速度に向かって緩やかに変化させてゆくGradual変化
です。

なお、あまり急な変化を連続して記述すると、U.F.O. SAやA10サイクロンSAのコントローラー側でデータ受け取りの処理が間に合わずに破棄されてしまうことがあります。
そのときの症状は、バッファがいっぱいで何もできない、みたいな感じで秒に近いくらい長い時間データ受け取り拒否が続いてしまいます。
これには、これ以上間隔を空けておけば大丈夫、という明確な時間は存在しなく、例えば200msごとに毎回データを送り続けていても、たまに受け取り拒否が発生する、といった頻度で発生します。

公式でも、このアプリでも時間の最小単位は100msecとしていますが、この単位で毎回データを送り続けると結構頻繁に受け取り拒否状態に陥ります。ので、ご注意を。

ん? そしたら、このアプリのGradual変化制御ってヤバいんじゃないの?
って、その通りです。実はProが付く前の途中のバージョンまでは100msec単位で毎回データを送りつけてました。
今はだいたい2回に1回はデータを送信せずに間引くという制御を入れましたのでほぼ200msec単位(停止させるとき等例外あり)で送信するようになっています。
(それでも偶に受け取り拒否が発生しますので、偶に動きがおかしいなってなることがあります。気になる方はGradual変化やGradualパターンやCompositeパターンを使用せずにStep変化やStepパターンだけを使用することをオススメします。)

最後に細かい話で恐縮ですが、このデータの最後尾に何か変なゴミが付いて取れない(文字として見えないデータ(同じ値の連続ですのでウイルスとかではありませんのでその辺はご安心を)が数百バイトレベルで付いてる)ので、[End]の行は本来不要なのですが、そのままにしてその内側を編集した方が良さそうです。
もちろん、他のテキストエディタ等で予め編集したものをここに全コピペしていただいてかまいません。
開発ソースには一切ゴミを入れてはいないんですけど、ビルドするとゴミがくっついちゃって、取り方が分からないんです。(なんなんだAndroidStudio)

ダウンロードファイル

勝手な再配布はしないでください。
特に、うちのサイトは弱小なので、検索で上位に表示されるサイトに勝手にコピーされると、盗まれたのとほぼ同じ状況に陥ります。
何かしらの問題が発覚して、こちらのサイトでファイルを差し替えても、それが皆さんの元には反映されなくなることにも繋がります。

諸事情によりアプリの無料配布を終了致しました。
今後は活動を支援してくださる方とのみ細細と共有していければと思います。

今後のUfoCtrlアプリ配布ページはこちらです。
UfoCtrl Ver1.00 (UfoCtrl開発活動支援プラン)

最後に

アダルドグッズや同人コンテンツなどをご購入の際にはこのサイトのリンクを踏んでから購入していただけると、いくばくかの紹介料をいただけるので筆者が大変助かります。
このアプリや筆者の作成コンテンツが役に立ったとか面白かったとか、ありましたら応援していただけると幸いです。

このアプリの対象となる製品はこちらです。

2018-06-05

この記事のタグ

U.F.O.

SA

アプリ

制御

自作