林堂アキラと砂塚あきらの境界にて
出逢い
2019年のはじめ。シンデレラガールズに新たな一人のクールアイドルが登場した。
砂塚あきら。新潟県出身の15歳。
ギザギザした歯に涙ぼくろ、そしてツインテールという特徴的な外見をもち、ハッシュタグと動画配信を器用にこなす彼女は、自分とはほど遠い”現代”を象徴するキャラクターに思えた。
新しいアイドルとの出逢いは楽しい。
ただそれは記憶の中にかすかに残るもので、いつのことだと正確に思い出せないくらい昔の感情だ。
長い時の間に、うれしいことも、かなしいことも、数えきれないくらいあって。
正直に言ってしまえば、素直に喜ぶ感情を思い出すことはできないと思っていた。
でも、心の奥底に隠されていたその感情は、思いもよらず蘇ってきた。
マスク越しの、無邪気な笑顔によって。*1
言葉では表すことのできない、全身を揺さぶられる感覚。
シンデレラガールズというコンテンツに、もう一度『出逢う』ことができた気がした。
はじまりの出逢い
時は少し遡り、2018年の7月。「アルカ・ラスト」という名前も世に出ていなかった頃。
7人の声優によるヴォーカルユニット「Kleissis」の活動は、はじまりを告げた。
そのユニットの中に、『彼女』は居る。
林堂アキラ。そして富田美憂。
最年少ながら多方面での活躍が目まぐるしい彼女。
それでも、スケジュールを合間を縫いながら、紫色を身にまとう。
「無くてはいけないもの」。その想いから紡がれる女神の歌声は、時に力強く、時に優しい。*2
凛とした表情のうちに、時たまくしゃっと見せる笑顔にも、目が離せない。
アルカ・ラストという世界を正しく終わらせる物語。
そこに登場するのが、7人の女神Kleissisと、正しく終わらせるために召喚される破壊者。
アキラが呼び出されるのは、かつて黄金郷と呼ばれていた世界。
無数ある世界が交差する廃れた世界で、「Divergence」を歩み続ける"破壊者"を見届ける彼女は、何を思うのだろうか。*3
転機
それは突然だった。
同じくKleissisで活躍している、田中有紀がシャイニーカラーズの新アイドル「芹沢あさひ」を演じることが発表された。*4
シャイニーカラーズ1stライブの直後。
ライブ内容は想像以上のもので。
新しいユニットが追加されること。そこに追いかけている彼女が声を宛てること。
何もかも希望に溢れていた。
7人のうち、2人がアイマスに関わるようになった。
これからももっと増えて、ステージを変えて共演する機会があるといいな。
このときは、純粋な気持ちでそう思っていた。
邂逅
そして今年。8月21日。
その日は来た。
第9回シンデレラガール総選挙。
今年はCVの決まっていないアイドル限定のボイスアイドルオーディションが並行して開催された。
3位までにはボイスとCDデビューが確約され、そこで砂塚あきらは見事2位となった。
期間中は担当のことで精一杯だったが、結果が発表された際は純粋にボイスがつくことを喜んでいた。
新しいガチャが開催されましたよ!
— アイドルマスター シンデレラガールズ公式 (@imascg_chihiro) 2020年8月21日
今回の新登場アイドルはこちらです!
砂塚あきら(CV:富田美憂)#imascg_chihiro #デレマス pic.twitter.com/y0vxNKwi0q
CDデビュー前の、CV発表を兼ねたSR追加。
CV欄には、見覚えのある名前。
2人が、出逢ってしまった。
登場を祝うべく、ガチャを回していた。
ほどなくして、お迎えすることができた。
でも、演出を見た自分は、得体の知れない怖さに襲われていた。
「ボイスを聴く」ボタンを押せなかったのだ。
新規SRは嬉しい。
ボイス実装はもっと嬉しい。
でも、聴けない。
何故か、わからない。
今もまだ、あのエピソードをボイス付きで聴くことはできていない。
葛藤
Brand new!イベントを越え、9周年イベントを越え。
それでも、心に違和感は残っていた。
客観的な尺度で見てみれば、これ以上ない配役だと言える。
少なくとも、Kleissisで見ている彼女と、新潟エリアで出逢った彼女の姿は強く重なっていた。
だけれど、違う。受け入れることができていない。
「芹沢あさひ」の時には微塵もなかった感情。
「アイドルマスター」というコンテンツに、応援している声優が出演する。
それだけの視点では何も違いは無いのだけれど。
自分が出逢った「砂塚あきら」。生まれた「砂塚あきら役富田美憂」。
この2つの間の、大きな隔たり。
これほどまでに自分を苦しめるとは思ってもみなかった。
昔に誰かが言っていた。
同じようにCVがついて、祝福のムードに包まれる中で、「自分の中のアイドルと別れるのが怖い」と。
傍から見ていた自分は、正直に言ってしまえば、そんなの大げさだろうと思っていた。
だけれど、そういうことなのだろう。
自分の中に、自分だけのアイドル像があればあるほど、CVが付き全ユーザに共通化された像とは食い違っていく。
大層なことが言えるほど「砂塚あきら」を理解していた訳ではないけれど。
少なからず自分の中にも『彼女』が居た。
その『彼女』との、別れ。
他人に引き裂かれることを、本能的に避けているのだろう。
悲しくないわけがない。
でも、必要な別れだと、自分に言い聞かせて。
これから歩んでいく彼女を、笑顔で応援できるように。
"Brand new!"
SRが実装されて、ボイスが聴けなくて。
今日という日までずっと悩んでいた。
これを書いてすべてが解決するとは限らないけれど。
この感情を持っていた自分がいた印を残して。
全く新しい、次のステージを見届けていきたい。
このブログはD@NPEN Advent Calendar 2020 - Adventarの21日目の記事でした。
昨日はid:kny_uec君のミリオンのソロコレの話2 - kny_uecのブログでした。
武道館CD見て声出ました。懐かしい……。
ということで得体の知れない「何か」が生まれました。
見返すことすら恐ろしい状態ですが、長く続くコンテンツでもこういった経験ができるうちは安泰なのかなとも思ったり。
とにかく笑顔で新年ライブが迎えられるといいですね。現地取ったの2日目ですけど。
明日は7本目の腹いーたー君です。今回の毎記事の前後どちらかには居る形になりましたね。
みんなでつくろう!ナチュラルハーモニー
このブログはD@NPEN Advent Calendar 2020 - Adventarの18日目の記事です。
前日は id:hara_eater 君の nil でした。どんな記事になるんでしょうか。
今日はタイトル通りです。タイトル通りとは。
前回の内容の発展なので是非こちらも。
みんなで!
さて、前回の文末に書いた通り、実装した内容にはこれらの課題がありました。
- 色の変換を考えるときに最大値しか考えておらず青紫が最小ではない(記事を書いてる途中で気がついた)
- 気軽に使えない
- そもそもナチュラルハーモニー(配色)と言えるのか
元々の目的もあり、たくさんの人に使ってもらうためにも気軽さは大事です。
そこで!つくりました!
create-natural-harmony.web.app
みんなで!!!つくろう!!!ナチュラルハーモニー!!!!!
使いかた
- 画像を選ぶ
- スライダーを使ってナチュラルハーモニー度を調整する
- ナチュラルハーモニー!
- 値を調整して自分の好きなナチュラルハーモニーにする
- ナチュラルハーモニー!!!!!
- 調整が終わったら画像を保存
- 広がるナチュラルハーモニー!!!!
かんたん!
このサイトのつくりかた
前回の記事でナチュラルハーモニー処理をGoによって実装しました。
GoのプログラムをJavaScriptに乗せることはできませんが、WebAssemblyという技術を使うことでそれが可能になるようです。
WebAssembly · golang/go Wiki · GitHub
Goは様々な環境に対応するバイナリにコンパイルを簡単に行うことができますが、WebAssemblyも例外ではありません。
単純なコンパイルであれば、次の一文で行うことができます。
GOOS=js GOARCH=wasm go build -o ./web/wasm/nh.wasm ./cmd/wasm/main.go
ここで出力されたwasmファイルと、Go本体に同梱されているjsファイルをhtmlで読み込んであげると実行できます。
さらに、上記のコマンドでコンパイルを行う際、"syscall/js"
ライブラリを読み込むことで、Goのプログラムでhtml要素が操作ができます!
今回はCanvasやContextの値をGoのプログラム上で取得しながら処理を行っています。
document := js.Global().Get("document") outputCanvas := document.Call("getElementById", "outputNaturalHarmony") // 第一引数に関数名, その後ろは関数に与える引数 ctx := outputCanvas.Call("getContext", "2d") cvWidth := outputCanvas.Get("width") //パラメータ取得も cvHeight := outputCanvas.Get("height") // canvasのbyte列をuint8の形で読み込む data := ctx.Call("getImageData", 0, 0, cvWidth, cvHeight).Get("data") uarr := js.Global().Get("Uint8ClampedArray").New(data) // JavaScriptのインスタンス生成 garr := make([]byte, data.Get("length").Int()
前回の内容を含めて、細かい実装などが気になる方はリポジトリを覗いてみてください。
Q.これ(JavaScriptだけorその他言語)でよくない?
A. Goで実装しちゃったんだもん・・・・・・
あとGo+wasmに興味あったので。趣味で書くプログラムは自由にやりたいよね。
おわりに
なんだかんだで自分だけの要素でWebページ作るのが初めてでした(多分)。見切り発車でここまでできてよかったなって。
書き終わってみましたが、これアイマスのアの字もなくない? まぁそういう時もあるということで何とか。
明日はとびっぴい君です。