Amebientの世界と結末

phi16です。Amebient Advent Calendar 12日目です。世界の話をします。
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

勝手にいくつかツイート引用したりしてますけど問題あったら報告ください。

## 事実

想定されている「初回の流れ」は、次の通りです。

- なんとなく遊びに来て、なんとなく楽器で遊ぶ
- 雷が鳴って驚くもまだ遊び続ける
- 謎の機械に気づいて**うっかり**起動してしまう
- よくわからず弄っていたら世界が水没してしまう
- わからないままに屋上へ行き、世界を眺める
- ロゴとポータルを見て終わりを理解する
- そして同時に「周回」を認識してもらう

つまり**「失敗」を意識することが前提**です。そして「これはVRChatのワールドである」ので周回のコストは限りなく低い。これによって気軽に**世界をやりなおす体験**をして欲しかった。これはVRChatの文脈という外枠があってこそ、ですね。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ここもだめだったか、次の世界で絶対沈ませないでやる！</p>&mdash; 猫屋敷やよい@VRC (@yayoi_vrc) <a href="https://twitter.com/yayoi_vrc/status/1284841170426683392?ref_src=twsrc%5Etfw">July 19, 2020</a></blockquote>

これすごい好きです。人生で言ってみたいセリフナンバーいくつとかだと思う。

&nbsp;
そして次回以降はいろんな細部に目が行くことかと思います。「終わらせない為に」。

- 初回の雷と同時にロッカーが開いてる、及び機械に電源が入っている
- 機械室のモニタには謎の割合が表示されている、200%になると危ない？
- コマンドが色々あって、`fan`だけ謎のパスワードが掛かってる

多分もっかい沈むと思う。そして屋上のロゴが**ロゴでない**ことを認識するのだと思います。

そしてキーボードの打ち方がわかるようになったら、謎のパーセンテージが上昇しなくなることがわかるはずです。

**これで、終わりです。**

設計された体験は、ここまでです。その先は無いのです。

## 目的

何故こうなったのか、何がしたかったのか、というのは… 比較的単純で。

「沈んで終わる」のは、**世界を終わらせて欲しかったから**。
「沈まないルートがある」のは、**自由に演奏をしていて欲しかったから**。

この2つはちょっと方向性が違うわけですが、[らくとさんの記事](https://raku-phys.hatenablog.com/entry/AmebientAdC4day)を考えると面白い言語化が出来ました。

まずAmebientは、**音楽体験の一種**、です。しかし、これは**二層の音楽体験を同時にやっている**んですね。片方が「**世界**としての音楽体験」、もう片方は「**楽器**としての音楽体験」です。

これらがそのまま2つのルートに対応しています。**楽曲は始まって終わる**ので、世界は終わらなければならなかった。音が無くなることが終わりではないし、始まりでもない。「始まりの音楽」から「終わりの音楽」へ至る、という一段階上の音楽、です。そうなるように設計された**受動的音楽体験**。

そして私達が自由に演奏しているあの領域は間違いなく**能動的音楽体験**です。だけどそれが外枠によって閉じてしまうことはその能動性を裏切ることになってしまう。だから**能動的操作によって体験を続ける**ことができるようになっている、ということです。これによって「外枠を破る」という行為にもなっていますね (それ自体が設計内ではありますけど)。

まぁつまり、ここまでは**在るべくして在るルート**だということです。

## 考察

対して、色んな方々の**追い求めているようなエンド**は「そうではない」のだとは思います。

これは結局「文脈の違い」です。Amebientは謎解き文脈ではないんです。

…とはいえ、そういうルートを考えていたことはありました。結構悩んでいました。

[初日の記事](https://qiita.com/phi16/items/20f3e861248ec44808ca)にも書いたように、「それなりの因果」が無いと世界は救えないんです。**救ってはいけない**んです。

まぁ最初に訪れた時にはきっといくらでも**因果が潜在しうる**と思えることでしょう。でも段々紐解いていくと… 多分するっと解けます。そうなってるつもりです。

例えばあのメインパネルが意味不明なのは、それでいいんです。意味不明であっても**高々モニタの色くらいしか変わらない**ことはわかるのではないでしょうか。それが因果の限界です。

**視えない因果が存在しない**ことを基準として作られているので、ないものは、ないんです。そういう文脈なんです。

> 視えない因果が実在する世界がこのVR空間だというのも然りです。でもそれでは作者が圧倒的優位な立場に成り得てしまう。それはフェアじゃないと思う。

あの機械類は何故あるかというと、「Visual側面の提示」と「技術レベルの提示」が目的です。Soundが出来る世界なので折角だからVisualもあってほしいよね、っていう話。概念的にはVJの文脈です。

そしてあのメインパネルの構造は実は[ニューラルネットワーク](https://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF)を模していて、そして[ライフゲーム](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0)をする為に設計されています。`monitor 2`で出てくるやつね…。これはあの機械単体で (理論的には) **任意の計算**が出来るっていう、わかる人にはわかるタイプの小ネタです。作ったのは私です。

まぁ、だから**世界に干渉する程の強度が無い**んですよ。

> [精霊の箱](https://www.amazon.co.jp/dp/B07BGRLHW9)みたいな解釈が出来ていたらまた違っていたのかもしれないね。あれは個人的に好きです。

とは言え最初はこうじゃなかった。配電経路の操作盤みたいなものを考えていた。パズルみたいになっててね、うまいことやると6つある遠景のビルに電力を供給出来るみたいな。電力供給に成功したらビルが崩壊するので残った**鐘**が現れて、最終的に空が晴れる、みたいな。

考えたけどやっぱり解釈が無かった。よくわかんなかった。それに悲しい話としてはVRAAの締め切りがあったので「どこまで行けるか」には結構制約があった。

因果が必要、という話で「大きなアンテナ」をどっかに置いておく話もあった。でもすぐバレてほしくはない。隠すには「隠す場所」が必要で解決にならない。水中に置いといたら壊れちゃいそうだし。
あと例えば「楽器の配置」とかは純粋な能動的体験を邪魔してしまいそうで良くないな、という気持ちがあった。音楽体験としての軸はあんまり揺らいでほしくなかった (とは言え接続できたほうが因果は綺麗でしょうけど)。

何よりも「謎解き」として成立させるには**快適に苦しませる**必要があって、VRChatの様々な層を**快適に苦しませるのは厳しい**、ということは[その頃感じていた](https://phi16.hatenablog.com/entry/2020/07/30/181740)ので、そういうことはしない方が良いと思った。
Amebientは全面にpositiveな作品でありたかったので、まぁあの謎キーボード配列くらいが限度でしょう…。

> あれは「最初は誰もわからない」かつ「わかると誰でもわかる」んです。前者が割と重要で、見た瞬間「またアレか…」みたいな気持ちになると悲しいと思うし。後者は後者で「知らないとわからない」のは嫌、ですよね。ですよね？
> まぁこれに頭使う要素は無いんで私は謎だとは認識してないですけど…。でも丁度良かったんじゃないかと思う。

代わりに**悪魔の証明**みたいな側面を持ってしまったのは申し訳ないやら残念やらですけど。「フェアでありたい」という気持ちをうまく伝えたかったですね…。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">amebient存在するかも分からない雲のない空を求め続けている</p>&mdash; rocksuch@(ロックサーチ) (@rocksuch) <a href="https://twitter.com/rocksuch/status/1287587959613435904?ref_src=twsrc%5Etfw">July 27, 2020</a></blockquote>

ちなみに海外の方から幾度かDMで「ヒントちょうだい！」って言われたこともあるんで根本的に伝わってない感はあります。うむ。難しいね。

> まぁ「ここは謎解きではなく音楽を楽しむところなんだと思った」みたいな発言もいくつか観測しているので全くの意図通りにならなかったわけでもない。

## 存在しない結末

まぁ「存在しないエンドを追い求める」感じになってしまったのはTwitterに流れていた**謎の情報**に起因するところもありそう…です…。

> まぁなんかもっと𝑰𝒏𝒕𝒆𝒓𝒏𝒆𝒕うまくなってほしいと思うことは多々ありましたが。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">雨の妖精をなかまにして結界を発動してもらうことで月光エンドに行けます <a href="https://twitter.com/hashtag/Amebient?src=hash&amp;ref_src=twsrc%5Etfw">#Amebient</a> <a href="https://t.co/TfPlIGZrQB">pic.twitter.com/TfPlIGZrQB</a></p>&mdash; Cap.🌘 (@CaptainAyakashi) <a href="https://twitter.com/CaptainAyakashi/status/1287673755041374209?ref_src=twsrc%5Etfw">July 27, 2020</a></blockquote>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">共存エンド <a href="https://twitter.com/hashtag/Amebient?src=hash&amp;ref_src=twsrc%5Etfw">#Amebient</a> <a href="https://t.co/GLuXJ5zny9">pic.twitter.com/GLuXJ5zny9</a></p>&mdash; amanek (@amanek_) <a href="https://twitter.com/amanek_/status/1288102816519659520?ref_src=twsrc%5Etfw">July 28, 2020</a></blockquote> 

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Amebientをパブリックで開いてたら縁があって皆さん来てくださって色んな終わりを見せて頂いた<br>もしかしたら二度と見れないかもしれない…<br>とても素晴らしかった…<br>これからもあの雨雲の先に月の幻影を見続けるんだろう… <a href="https://t.co/YiAXgiZ6la">pic.twitter.com/YiAXgiZ6la</a></p>&mdash; rocksuch@(ロックサーチ) (@rocksuch) <a href="https://twitter.com/rocksuch/status/1287746059339358208?ref_src=twsrc%5Etfw">July 27, 2020</a></blockquote>

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">VRC<br>Amebient の月光エンド見れました！<br>めちゃくちゃ良かった <a href="https://t.co/nYoTnAtDyI">pic.twitter.com/nYoTnAtDyI</a></p>&mdash; KL (@KLjp01) <a href="https://twitter.com/KLjp01/status/1287729019459313664?ref_src=twsrc%5Etfw">July 27, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/I9rgWGMsKe">pic.twitter.com/I9rgWGMsKe</a></p>&mdash; fotfla (@fotfla) <a href="https://twitter.com/fotfla/status/1288817898383798272?ref_src=twsrc%5Etfw">July 30, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

…これは**特殊な文脈**があってですね。2018年8月の某に起因するものだと思うんですけど…。

アバターに**ワールド座標固定でモノを仕込む**っていう… 文化が。一部にあってですね。

「既存のワールドを上書きする」行為は良くないイメージを持たれてそうな部分ありそうですけど、まぁ**作者の了解の上で**やる分には色々出来てすごい良いものが見られるんすよね。そうなんですよ。

で、それをAmebientで**展開**した結果なわけなんですが、まぁこう、**良い**ですよね。とりあえず。

VRChatのアバターが「アバター」に留まらないのはまぁ昔から御存知の通りかと思いますが、そういう点でこれもその延長線上だと… ちょっと厳しいか？ でもこういうところがVRChatの良いところだと思うんですよね。私は。

そしてまぁ、その**解釈**として「救いの無い世界を**自分の手で**新たなエンドへ導く」っていうのもめちゃくちゃ良いと思うんですよね。私の出来なかったことなので。

勿論それは私の望むような「完璧な終わり」ではないわけですけど、これには「人」という大きな成分が入っているわけで。VRChatのメインコンテンツは「人」ですから。

それこそTwitterでこの話が広まるように。この主観性で成り立っている媒体が。

&nbsp;
…まぁ、というわけで、「現実」を全て解説しました。これで以上です。

Amebientを今後どうにかする予定は無いのでゆっくりして頂いて大丈夫です。

似たようなモノ作る気もないし。作れる気もしないからね…。

> 私ももうちょっと自身へのハードルを下げておきたいんですよ…。

&nbsp;
さて、以降、どうでもいい話をします。

## 実装

えー、世界をあるタイミングでぐっと変化させる必要があるわけですが、それは任意のタイミングで行えるわけではありません。音楽と繋がっているので。

Amebientのリズムの周期である128拍の切り替わりタイミングで丁度世界遷移が起きるようになってます。が、これは**他人と同期しません**。完璧な同期は諦めるとしても、大まかには合わせたい気持ちがあります。

というわけでAmebientの遷移条件は次です。

- 32拍目から64拍目以内に、世界遷移条件を達成するとフラグが成立し、masterから全員に伝える
- フラグ成立を受け取ったら次の128拍目で遷移する

0拍目にしないのは「masterでは2拍目だが他の人は126拍目」みたいなケースがある為。64拍目にしてるのはその逆に対応する為と、「条件が成立してから64拍くらいは待ってあげてほしい」という気持ちからです。同期を安定化させたいとかもある。あとこれは条件を曖昧にする効果もあって、「うっかり」度を増す結果になっていると思います。

ちなみに初回の遷移条件は「32拍中に**雨粒によって**鳴った音の数が125を越える」です。要は「楽器で色々遊んでると雷が落ちてくる」ということがしたくて、この数は実際に遊んで調節していました。

> [VRAA02の審査配信](https://youtu.be/A0IZxID3p4w?t=3705)時に**発動してもらわないと困る**という点もあったので「めちゃくちゃ長く過ごすと見つかるギミック」ではない形態になってます。マジで完璧に作用してよかったね。

水没の条件は「**ファンが強い状態で**、32拍中に雨粒によって鳴った音の数が75を越えた状態で一定時間経つ」です。気持ちとしてはファンから出る空気が雨粒の代替として作用するので必要量が少なくなるというのと、2種類の気体 (？) が混ざっていろいろ大変なことになるんじゃないかなみたいなやつです。多分。

細かいことは色々違うんですけどまぁ十分条件としてね。うん。

> そういえば条件からわかるように、「楽器を鳴らさない」ことでも世界を終わらせないように出来ます。でもこれは演奏が出来ないことを意味するわけで、消化不良エンドって感じでしょうか。

そういえばログのところにある`DropCount`っていうのがさっき言った「32拍中に～」ってやつですね。そこまで知りたい人はちゃんと見ているんだろうか。

この辺諸々は`Scenario`っていう名前のUdonが制御しています。どんな名前にしようかちょっと悩んでた覚えがある。

そんなこんなで世界状態の切り替わりが出来ています。

あとアニメーション系は…まぁそんなに複雑でもないか。遷移が確定すると時間が測れるのでいい感じにやってあげてます。2つの遷移は絶対に連続して発生しないのでゆるゆるとやってます。

&nbsp;
あとはlate-joiner問題ね…。面倒なのはここかな…。

最初に初期化信号が来たタイミングで諸々情報が確定するならよかったんですが、まぁそうとは限らないので、**任意の状態から任意の状態に遷移できる**ようにする必要がありました (でも過去に戻ることは無いのは前提として組んでいます)。

とりあえず「同期された世界状態とローカルの世界状態に齟齬がある場合」に諸々の状態 (ロッカーとか) をどうにかするようになっているっぽいです。

あと「遷移が確定した後にlate-joinした場合」も一応動くようにしてるつもりみたいなんだけどこれは絶対に間に合わないケースがあるので… 微妙なタイミングで同期がずれるケースが存在するような気がする…。

色々複雑にすればするほど考えられるフローが増えていくのでほんとしんどいですね。Amebientはマシな部類です。

何よりも様々なフローに対して「この場合はどういう現象が**起きるべきか**」っていうのを考えなきゃいけないんです。全て同期させるだけでは出来ないことがあるので。

## まとめ

元々同期のしんどさの話を細かく書こうと思ってたんですけど、こう、世界自体の話を書く機会が必要っぽかったのでそうしてみました。

どこかで気が向いたらもうちょっと書くかもしれない… けど日が無い気もします。

…こういう意味でのセカイのあるワールドは… 色々と厳しいですね。でもぶいちゃだとやりやすい側面があるのは事実だと思うんですよね。**少なくとも現実よりはな**。

Amebientは舞台をめちゃくちゃ綺麗に閉じてるのでマシですけど、広げちゃうと綻びが起こりうる領域がどんどん出てきちゃってね…。

色んな媒体でのそういう表現、あると思いますけどこれは**自由度**との兼ね合いで。このVRChatのワールドとして (アトラクションではなく) **自然にセカイ的**である空間の設計、うーん、うーん…。

いつか「救われる世界」を見てみたいですね。それはそういう願いを持つ人がきっとやるんだと思います。

おわりです。次回は機械類の話をします。