らくとあいすの備忘録

twitter : lactoice251

VRChatではじめるVR楽器演奏

こんにちは。memexさんの企画されている、VR音楽活動のススメ Advent Calendar 2020 23日目の記事です*1

なぜVR楽器か?

まずはVR楽器についての思想の話をします。

今回のAdvent Calendar企画でも数多く紹介されているように、VRChatでは様々な音楽の発信手段があります。そしてそれらの多くは、現実の楽器の演奏の音やそれに伴う動作を、何らかの方法でVR上に共有するものです。

しかし今回はそうではなく、楽器そのものがVR空間内にあるようなものを考えます。ぱっと見ると難しそうですが、簡単なものでも例えば、横に並んだキューブを叩いていくとそれぞれ違う音がなる、としたらそれは一応楽器と呼ぶことが出来ますよね。

とはいえ、構造はシンプルであるとしてその演奏はあまり容易ではありません。触覚的なフィードバックが薄いために正確なリズムを刻むことは困難で、精度よく同期を取るためにはあまり細かい構造も使えません。ほとんどの環境ではソフト的ハード的な問題で楽器演奏において重要な指の動きを用いることも極めて困難です。そもそもして、現実で得意な楽器がある人からしたらそのスキルをほぼほぼ活かせないVR楽器を触る意味はあるのか?と思われるかもしれません。

では、何故そんなVR楽器に焦点を当てたいかというと、それがVR空間内において、最も直接的に演奏を聴かせかつ見せることが出来る手段の一つであると考えているからです。例えば鍵盤を棒で叩くと音がするVR楽器があったとします。この時、もちろん鍵盤を叩けば音が鳴りますし、鍵盤を叩かなければ音が鳴りません。当たり前のことです。しかし、そこが重要で叩く動作を観測したとしたら必ず音が鳴るし観測していなければ音が鳴ることはないという、納得感があります。因果をくみ取れると言っても良いでしょう。

一方、現実の楽器を演奏する場合でもその演奏動作をキャプチャーして、聴き手と共有することももちろん可能です。 キャプチャーの精度をどこまでも高めていけば、聴き手にとってそれがVR内で演奏されているかそうでないかを区別することは本質的に困難になっていくのかもしれません。しかし少なくとも今現状において、今聴こえている音が、今居る空間に起こっている現象であると強く訴えた表現をしたい時にはVR楽器は良い手段になりうると思っています。

VR楽器を作って演奏する

次に、実際どうやってVR楽器を作って演奏するのかという話をします。そして実際に作って演奏します。

目的の設定

VR楽器の設計の上で大切だと思っていることは、目的を絞ることだと思っています。 現実の楽器は基本的に「色々な曲が演奏できる」、「誰でも演奏しやすい」、「幅の広い表現が出来る」等々、基本的には汎用性のある多いと思います。 少なくともそういう楽器が生き残っています。しかし、VR楽器でそれをやるのはあまりにも大変です。*2

一方VR楽器であれば、「使い捨て」出来ます。現実の楽器で、一曲のためにだけ楽器を作って使い捨てるなんてことはそうそう出来ませんが、VR楽器では思い切り使い捨てが可能です。逆に言えば、極論その演奏会なり、動画作品なりを作る上で必要十分な機能さえ備わっていれば別の曲はまったく演奏出来なくても構わないわけです。

というわけで、まず今回の目的を定めましょう。 目的を定めるときは、その音が演奏される背景に目を向けることが多いです。何のために演奏して、どんな人が聴くのかを想像します。

ひとまず書いてみました。正しいですがちょっと弱いですね。演奏動機に意思が欠如しています。 もうちょっと欲張って目的を立て直してみます。

  • 何のために? → VR楽器の制作・演奏の例を見せる。そして楽しそうと思ってもらう。
  • どんな人が聴く? → 本アドベントカレンダーの読者。きっとmemexのファンの方が多そう。

はい。少し動機を欲張って修正しました。その代わり対象を少し限定しました。 というわけで、今回のVR楽器制作・演奏は、「非常にシンプルな構造でその仕組みの理解がしやすいようにしつつ、さらにその先を見せることで読者 (とりわけmemexのファンの人達) に楽しいと思ってもらう」ことが目的となります。

作戦を立てる

上記の目的を実現するための作戦をたてていきます。 今回は、先に演奏楽曲から決めてしまおうかなと思っています。 というのも、memexのファンの方々が見ていることを想定するのであれば、memexの曲のカバーが最も導入として訴求力が高そうと思ったからです。

memexの曲を今再び聴き返します*3VR楽器で演奏するという視点で聴いたときの第一感は、「難しすぎる、無理」です。 細かな変拍子の多用、劇的なコードチェンジ・転調、めちゃくちゃ格好良いですがこれを演奏するための楽器を設計するのは相当に骨が折れる作業になりそうです。 そもそもして、第一の目的「非常にシンプルな構造でその仕組みの理解がしやすいようにしつつ」との両立は難しいでしょう...。 なにより現在12/25、12/23のアドベントカレンダーを書いています。一刻も早く仕上げなければなりません。

しかしここで、唯一出来そうな曲が発見されます。「Secret Protocol」です。

もちろんこの曲も完璧に演奏しようと思うととても出来るものではありません。 ただ、特筆すべきは「memex」をモールス信号で置き換えることで出来た、1曲を通じて流れるリズムです。 これさえあれば、この曲のアレンジとして認識されうる楽曲に出来るのではないでしょうか。そのぐらい強力なものです。(乗っている情報からして、memexですからね。)

また、元ツイートの構成も良いですよね。今回の趣旨にぴったりなのでここも引用しましょう。 はじめのモールス信号の提示の代わりに、単純なサイン波の音が入ったキューブを叩くところを作って"最もシンプルな"VR楽器を提示します。 そこからモールス信号にうつって曲に入る流れ、ありそうです。

さて、ここまでで目的の「前半」は概ねクリアでしょう。 次にその先ですが、ここはやはり曲として盛り上がりを見せたいところです。 とはいえ、ずっと私がはじめのテーマを演奏したのでは、やっぱり「その先」とはいえないですよね。 第一、同じ音を繰り返し演奏し続ける様をみてやってみたいと思う人はそう居ないはずです。

ということで、この「同じ音を繰り返し演奏し続ける様」というのを逆手に考えてみます。 つまり、はじめにその演奏を示したら、後は別の存在にまかせても良いわけです。 単純にシーケンサーでも良いですが、視覚的にはやっぱり意味のある存在...例えば...

と行きつきました。途中からオルタナティブぴぼさんに演奏してもらうことにしましょう。

後は、自分が空いているのでもう少し自由に演奏出来そうな楽器、例えば鍵盤のようなものを置いてその上で少し遊んでみることにします。 ここは、Secret Protocolに調を合わせた鍵盤を置いておけばある程度何をやっても映えそうなので、作ってから詰めれば良いでしょう。

検証

実現可能な範囲に絞りこんだ「目的」を設定した後、勢いに任せて作戦を立てました。 次は、作戦を自分のスキルセットや工数と照らしあわせて、実装不可能な部分が発生していないかを確認します。 今回一番不安要素が大きかったのは、「動くオルタナティブぴぼアバター」です。 これは単純に私が、3DHumanoidモデルを動かした経験がないからです。なので、本実装に入る前にここだけ現実的かを確認しておくことにしました。

今回は、ありふれた技術ということもあり参考になる情報*4もすぐ集まって、なんとか使えるレベルにはすぐ動いたので良しとしました。 ここで上手くいかない場合は、また一つ段階に戻って目的を満たす別の実装案を探すことになります。 ともあれ、これでひとまず今日は寝れます。

実装

さて、ここまででほとんどVR楽器制作の核となる部分は終了したと言って良いと思います。 後は作るだけです。もし、とにかくどんなものが出来るのか気になるから早くしてくれ!という場合この章は読み飛ばしてもらっても大丈夫です。

音作り

VR楽器を作るためには、当然鳴らすための音を用意する必要があります。 ここで大きく二つの選択肢があります:

  • 使用可能な音源の中で適切なものを探す
  • 自作する

残念ながら前者の方法について私はあまり多くの知見がないのですが、例えばfreesoundを見たりすることはあります。 そして、後者についてですがつい先日Amebient Advent Calendarに音作りの記事を書いたので読んで頂けると、少なくとも"私の"音作り方法についてはある程度書かれているかと思います。 というわけで、今回も楽器に使用する音は自作していくことにします。

まずメインとなる歌声パートの部分ですが、今回は(も?)GLSLSoundを使って作ってみました。 GLSL Soundでの音作りについては過去の記事があるのでここでは深入りしませんが、今回もそうですが前に作った音を手軽に改変して勝手良く使えるのはやっぱり便利ですね...。GLSL Sound音にValhalla reverb (https://valhalladsp.com/shop/reverb/valhalla-vintage-verb/)をほんのりかけてひとまず完成です。

後半私が演奏する鍵盤の音も同様に作っていきます。意識したのは、比較的バックが激しくなっても埋もれないように倍音の多い音にすることです。

VRCSDK2上での音ギミック作り

次は作った音を、実際にVRChatのギミックとして鳴らせるようにしていきます。 ここでは、導入に用いるもっともシンプルな楽器についてのみ作り方を書いていきます。

楽器のモデルとコライダーを配置する

今回は、ただのキューブをモデルとします。 自作のモデルを使いたい場合は、FBXをインポートして配置します。 キューブの場合ははじめからコライダーが入っていますが、FBXをインポートした場合は、音を鳴らす判定を付けたい場所にコライダーを設定しましょう。 この際、下記のようにIsTriggerにチェックを入れておくのが無難です。 現実の楽器はもちろんコライダー抜けなどはしませんが、VR楽器はコライダー抜けするようにしておいた方が演奏上都合が良いことが多いです。 f:id:Raku_Phys:20201225211759p:plain

AudioSourceを配置する

次に音源を鳴らすためのAudioSourceを配置します。 AudioClipに鳴らしたい音源をセットしましょう。 AudioSourceの設定ではいくつか気を付けるべきポイントがあります。

  • Play On Awake: オブジェクトの有効化で音を鳴らしたい場合には有効にしますが、後述のAudioTriggerなどで鳴らしたい場合にはオフにします。
  • Loop: 単発の楽器音であればオフです。
  • Spatial Blend: デフォルトでは2Dになっていますが、ある地点から鳴るような音にしたい場合は3Dに変更します。
  • Doppler Level: デフォルトでは1になっていますが、めちゃくちゃ気持ち悪いです。歩いたりするとドップラー効果がかかって、特に立体音響の時音にうなりが起きて大変なことになります。意図が無い限り原則0にします。
  • Spread: デフォルトでは0になっていますが、ややくどいです。音が非常に鋭く一つの地点から聴こえてしまいます。値をあげることでふんわりします。逆に鋭く定位させたい時は、値を下げて下さい。

f:id:Raku_Phys:20201225212504p:plain

演奏のためのスティックを作る

体を使った判定を使わない限り、音を鳴らすためにはtriggerを発火するための道具が必要です。 例えばここでは、スティックを使います。 スティックは持てないといけないので、持ち手の部分にPickupを設定します。 ここで、自動的に負荷されたRigidbodyのIsKinematicsを有効化、Use Gravityを無効化しておきます。 これで、スティックは物理に従って勝手に動くことは無くなります。 また、同期のためにObjectSyncを忘れずにつけておきます。

f:id:Raku_Phys:20201225213625p:plain

次にスティックの先端に接触判定用のコライダーを付けます。 ここでは、球のコライダーをそのまま使いました。 楽器に触れたときに、それがスティックであるのかどうかを区別するため、この球のレイヤーを分けました。(ここではInteractive Layerに設定。)

f:id:Raku_Phys:20201225213407p:plain

Triggerを設定して楽器が鳴るようにする

最後に、スティックの先端がキューブに触れた時に、音が鳴るようにVRC_Triggerを設定します。 ここは、ハマりそうなところがいくつかあるので、ポイントを列挙します。

  • スティックとキューブのコライダーのいずれかがIsTrigger (=接触しない) なら、OnEnterTriggerで接触判定を取ります。どうしても接触させなければいけないのであれば、OnEnterColliderで判定を取ります。
  • スティックにObjectSyncがついているのであれば、Triggerの同期は必要ないのでLocalにします。この時、他の人から見てスティックがキューブに触れたとき、各自のローカルで音が発火します。(どうしても音の方を同期させたいのであれば、スティックのコライダーローカルでのみ有効にした上で、TriggerをAlways Unbufferedにする手もあるにはありますが...。)
  • TriggerIndividualsはチェックを外してしまうと、音を連続で鳴らすことが出来なくなります。
  • Layersには、スティックの先端のコライダーのレイヤーをセットします。
  • Actionsは、AudioTriggerがおすすめです。長い音源をずっと鳴らしたいというような場合には、SetGemeObjectActive + PlayOnAwakeという手もありますが...。
  • AudioSourceの設定と同時にClipを忘れずに指定しましょう。

f:id:Raku_Phys:20201225220640p:plain

VRでの試奏

ここまで出来たら、一度VRChatにアップロードしてテストしてみましょう。

無事動いていそうですね。今回は非常にシンプルな楽器だったので特に問題なかったですが、複雑な楽器になってくると大きさが不適切で演奏しづらい、細かすぎて制御出来ないなどVRで演奏する時特有の様々な問題が生じることがあります。何度もVRで試奏を重ねて自分がもっとも演奏しやすい配置や形状にチューニングしていきましょう。

実演

では、上記の作戦に基づいて実装したVRライブを実際にやってみましょう...。

youtu.be

いかがだったでしょうか。 果たして、本番上手くいったんですかね...。

演奏後追記: 音声を全部モノラルにするというやらかしをしました...。 というわけで、動画版も併せて貼っておきます。[Cover] Secret Protocol (memex) 動画版 - YouTube

おわりに

本記事では、VRChatではじめるVR楽器演奏と題して、VR楽器を作る動機、構想の立て方、ごく簡単なVR楽器の実装を説明し、最後に実演をさせて頂きました。 ライブに仕立てる作業や、VR楽器を使いこんでいくための練習はなかなかコストが大きいものですが、その分うまく演奏出来た時は現実の楽器を弾くのと同様にすごく楽しいものです。しかも、VRChat上でならその感覚を、その場の人と共有出来ます。

是非、色々なVR楽器を作って楽しいVRChat音楽活動に役立ててみて下さい。

*1:現在12/26です。遅れてすみませんでした...。

*2:もちろん出来たなら素晴らしいことです。

*3:memexはいいぞ

*4:FinalIK(VRIK)+Animationでアバター制御: https://qiita.com/yuto_onizakura/items/fe77706e14adf981b7d9

Amebientの自作音源制作

こんにちは。Amebient Advent Calendar 23日目の記事です。

もし、Amebientが何であるかがわからないという方は、先にVRChatで公開されているワールド と、phiさんの1日目の記事 を見て頂ければと思います。

今回は、Amebientのための自作音源制作について書いていこうと思います。

何故作ったか

Amebientでは、環境音を除く全ての音源 (楽器用音源・Sound Effect) を全て自作しています。 VRChatのワールドとしてはなかなか珍しいのではないでしょうか...。

自作音源を用いることにした主な理由は、

  1. かなり微妙な要求を満たす欲しい音を探すコストが比較的大きそうだった
  2. ビジュアルや体験上の要求が発生した時に、自前の音であれば微修正をかけやすい
  3. 世界観の統一のために、使用する音サンプルの質感を揃えたい
  4. 共同プロジェクトなのでCC0等の音源などでない限り、全員音サンプルやソフトシンセを購入する必要がありそう *1

あたりかなと思います。実際には気づいたら作りはじめていました。

とはいえ自作音源作りは、GLSL Soundを通じて少し齧ってはいましたが、実際にはほとんどはじめてと言って良い作業でした。 なので、本記事の内容は一般に効率が良いとか、長年の知見があるといった類のものではありません。 そもそも、VRで気軽に楽器が作れるようにならなければ、少なくとも自分にとって楽器は買うものであって基本的に作るものではなかったので、自作音源をフルセットで揃えたりする機会はなかったんですよね...。そういう訳で本記事は、体験のために目的の欲しい音があって、それにどう寄せていくかという試行錯誤の一例と思って読んで頂ければ幸いです。

音色のバリエーション

Amebientに存在する様々な食器等に合わせた音のバリエーションを作っていくにあたって、同じような音を作り続けているとどれも同じく聴こえてくるというか...何を目指しているのか迷子になることがありました。そこで制作中期頃、音サンプルを一新するにあたって一度音の特性の分類マップを作ってみようと思いました。それが下の画像です。 f:id:Raku_Phys:20201222015106p:plain 音の特性の分類マップは、縦軸が音の高低、横軸が音が調和的かどうかというものになっています。(Amebientに合わせて作った分類指標です。)

縦軸の音の高低は、直観的にわかりやすいと思います。 一方横軸にとっている、右側:調和的 (Harmonic)と左側:打楽器的 (Percussive) の軸はパっとはわかりづらいかもしれません。 これらの二つの軸はどちらも音の周波数分布の特性を表すものです。 音の周波数分布が高低どちらに寄っているかを示すのが縦軸、音の周波数分布が離散的か (Harmonic)、連続的か (Percussive)を示すのが横軸です。

実際にGLSLで作った (https://twigl.app/?ch=-MP9wIbxrvIl7oDBu1qK&dm=both) 音のサンプルを聴きながら、違いを見ていきたいと思います。 まずは、調和的な高い音と調和的な低い音を聴き比べて見ましょう。

  • High & Harmonic

  • Low & Harmonic

これらの違いは直観的に良くわかりやすいと思います。 調和的というのは、いわゆるドとかレとか音程がつけやすい音のことです。 具体的には、ある特定の周波数のみが強調されているような音をさします。

では、次に打楽器的な音 (Percussive)を聴いてみます。

  • High & Percussive

  • Low & Percussive

Harmonicな音と比べると、"音程感"が無いのが分かるでしょうか...? これらの音は、一般に物を叩いた時などに出る音なので、打楽器的 (Percussive) な音と呼ばれます。

そして、上記の4つの音の周波数スペクトルを実際に見てみると次のようになっています。

f:id:Raku_Phys:20201223230827j:plain

Harmonicの方は離散的な山が出来ているのに対して、Percussiveの方はなだらかで、HighとLowを比較すると分布がより上に偏っているか下に偏っているかの違いが現れています。このような特性の異なる音をバランス良く散らせるように音作りをしていくことで、各楽器の個性が際立ち、ワールド内で表現出来る音楽の幅も広くなっていきます。

ちなみに、上の分類では周波数的な特性のみを考えて音を分けています。 本来は時間的な特性も音色を決める重要な要素ですが、Amebientでは発音手段が雨粒によるものと鉄パイプによるものしか無く、どれも非常に短い音になるため時間的な特性については考慮には入っていません。ただし、電子楽器3(水をすくって音を出す楽器) だけは、長い音を持っているためこの楽器は、時間的な方向の個性を補完する役割を持っていると言えます。

音作り

ここからは、実際の音作りの作業についてです。 音作りには大きくわけて収録音と、GLSL Soundによって描画した音の2つを用いています。

音の落書きとしてのGLSL Sound

制作初期において、Amebientの世界観などの議論が進む中、素早く作れてかつやりたい表現をしっかり探れる自由度を持った音制作環境が必要となりました。 そのツールがGLSL Soundでした。 GLSLでの音作りについては、過去に記事を書いているので、詳細はそちらに譲りますが、簡単に言えば波形を数式で直書きして音を作るものです。

GLSL Soundの便利な点は次のようなところかなと思います:

  • 作っている音やそのパラメータが全てソースコードとして残る
  • 一度作った音の再利用や改変が容易
  • 音作りから曲作りまでトータルにカバー出来る
  • Algorithmicに作曲するため、Unity上での実装と相性が良い
  • twigl を使えばリアルタイムにコードと音を共有しながら、方向性の議論が出来る

実際に、6日目の記事でも書いたようにAmebientのテーマの第一版は、GLSL Sound LivecodingしつつDiscordで通話しながら作っていました。

一方、そうして作った音を実際にワールドに置いて楽器として使ってみると、これのみで完成とするにはやはり弱く感じられました。 これは、GLSL Sound力が足りないと言われればそれまでですが...数式を使って波形を描いている以上どうしても自然音のようなほどよくランダムな揺らぎや豊かな倍音を含めることが難しく、どこか作り物感のある音にはなってしまいます。 そこで次のステップとして検討したのが、収録音です。

収録音とGLSLSoundの組み合わせ

Amebientの音の実在感を上げ、より環境に馴染むようにするために収録音を利用することにしました。

収録方法

収録の基本方針は、実際にAmebient内で起こる発音の仕組みを再現して、それを録音機で収録するというシンプルなものです。 しかし、全てが準備出来るわけではなく、またご時世的にあまり遠征なども出来なかったので、家の中で揃うもので色々と組み合わせて収録を行っていきました。 例えば、このツイートの動画は缶に水の落ちる音の収録の様子です:

写っている縦長の缶はホールトマトの缶です。前日に家で使ったようでたまたま発見されました。 その下の小さな缶はツナ缶です。こうして土台を作って浮かせることで、音の響きを取り出しています。 そして、このホールトマト缶の上から濡らしたキッチンペーパーから垂れる水滴を落として、隙間から出てきた音を下から狙って録音しています。 こうして録音された音をiZotope RX7等を使ってDenoising処理したものが次のサンプルです:

かなり、生々しいというか日常感のある音が得られていますね。 この音は確かに良いのですが、缶は前述の分類で言うところのHigh & Harmonicな役割を持たせたかったために、これよりももう少し音程感のある音にする必要がありました。また、缶以外の音についても同様で、Amebient全体としての統一感を取りつつ、個性を分散させるための微調整が要求されます。

そこで、すでに作りつつあったGLSL Soundによる音と収録音を組み合わせ、微調整の方をGLSLで担保するという方式を取ることにしました。実際には、GLSL Soundの方も全面的に見直し、収録音に"似せる"ように作っていきました。とはいえ、似せようと思っても完全には同じになってくれません。ただそれが逆に良く、自然音にはない統制感・楽器感をうまく保持してくれる音素材となりました。例えば、缶については次のようなGLSL Soundサンプルを作りました:

次に、これと組み合わせるため缶の収録音の音程を揃えます:

そして、これらを組み合わせて、水を垂らす音などの隠し音を少々加えつつ、最後にEQやReverbなどを調整したものが実際に使われている次のサンプルです:

缶の場合、Harmonicな音・旋律を作る音ということもあり、GLSL Soundの音を主軸として収録音で回りを包んだような楽器感の強い音になっていますね。

この収録音+GLSL Soundの枠組みは、今回の制作においてはかなり順調に進み、

  • コップに張った水に水を垂らす音 (張った水に水を垂らした時の音用)
  • シンクを鉄塊で叩く音 (一斗缶用)
  • 鍋に水を垂らした音 (鍋用)
  • ゴミ箱をスティックで叩く音 (3F廊下の太い配管を叩く音用)

など家にあるあらゆるものを駆使して収録を行っては、それをGLSL Soundで再現する作業を繰り返しました。

しかし、ある時、問題が発生しました。

どうしても、ドラム缶に相当する音を家の中から作りだすことが出来なかったのです...。

ドラム缶

困った私は、ほとんど冗談ででこんなツイートをしてみました。

そんなちょうどよくドラム缶に高所から水を垂らしてその音を収録できる人なんて...

居ました...

この界隈どうなっているんだ...と本当に思いました。零⑧さんには本当に頭があがりません...。 実現性の低さからツイートは半ば冗談でしたが、ドラム缶の音は本当にすごく欲しい音であったので、すぐさまDMで収録条件の相談に入りました。

f:id:Raku_Phys:20201223014625p:plain

ドラム缶を用意するのみならず、水滴を高所から垂らしてそれを収録するという無茶な要望にも関わらず零⑧さんは快く引き受けて下さいました。 そして、数日といっていたものの...なんと2時間後 には収録が終わっていました。

加えてDMでは詳細な収録条件を教えて頂き、かつ収録内容も水を垂らす音だけでなく色々な方法でドラム缶を叩く音など多岐にわたっていました。

f:id:Raku_Phys:20201223015134p:plain

こうして収録された音を切り出したサンプルを聴いてみましょう:

  • 6mからドラム缶に水滴を垂らす音

  • ドラム缶の上面を叩く音

こうして聴いてみると、Low & Harmonicな役割を持たせたかったドラム缶としては、水滴を垂らす音よりもむしろ、機転を利かせて録って頂いたドラム缶の上面を叩く音の方が適していることがわかりました。実際には、これらの両方の音とGLSLの音を混ぜ込み次のようなAmebientのドラム缶の音が完成しました:

ドラム缶特有の素材の"重み"を感じる良い音で、個人的には最も気に入っている音の一つとなりました。 この件で零⑧さんには、大変お世話になったのでAmebientのSpecial thanksにはMetal barrel sound担当として名前を入れさせて頂きました。 本当にありがとうございました! f:id:Raku_Phys:20201223020202p:plain

SonicPiを用いた効果音作り

ここまでで、大枠の音作りについては以上なのですが「ロッカーの開く音」、「貯水槽の落ちる音」といった効果音は単発の音だけではなく複数の音をうまく組み合わせて作っていく必要があります。この部分に活用したのがSonicPiです。

SonicPiは、Rubyベースのサウンドライブコーディング環境で、シンプルなコーディングによって、サンプルを加工しながら鳴らしたりSuperColliderを叩いてシンセを鳴らしたりすることが出来ます。このSonicPiに自作のサンプル音源をロードし、音程や鳴らすタイミングなどを微調整しながら組み合わせて鳴らすことで効果音を作っていきます。

例えば、貯水槽が落ちる効果音:

は、次のようなSonicPiコードで作られています。

use_bpm 120
kacha1 = "C:/SPS/amebient/kacha1.wav"
kacha2 = "C:/SPS/amebient/kacha2.wav"
gasya = "C:/SPS/amebient/gasya.wav"
gacha = "C:/SPS/amebient/gacha.wav"
bound = "C:/SPS/amebient/boundboard_gl.wav"
gin = "C:/SPS/amebient/gin.wav"
gon = "C:/SPS/amebient/gon.wav"
yure = "C:/SPS/amebient/yure_cut4.wav"
pipe = "C:/SPS/amebient/pipe_hit.wav"
splash = "C:/SPS/amebient/splash_rec.wav"
drumhit1 = "C:/SPS/amebient/drumhit_1.wav"
drumhit2 = "C:/SPS/amebient/drumhit_2.wav"
thunder = "C:/SPS/amebient/thunder.wav"


##############yure1##################
sample yure,amp:2.0
sleep sample_duration(yure)*1.0/6.0
sample drumhit2,rate:0.5,amp:0.3
sleep sample_duration(yure)*3.0/6.0
sample drumhit2,rate:0.5,amp:0.4
sleep sample_duration(yure)*2.0/6.0
##############break1##################
sample gin,amp:1.2,rate:0.4
sleep 0.1
sample gin,amp:1.2,rate:0.8
sample drumhit1
sample thunder,rate:1.1,amp:0.9
sleep 2
sample drumhit2,amp:0.4,rate:0.5
sample pipe,rate:0.2,amp:0.3
sleep 1.3
sample drumhit1,amp:0.3,rate:0.4
sleep 0.4
##############break2##################
4.times do
  tick
  sleep (0.05+look/12.0)*0.9
  sample pipe,rate:0.1+look/20.0,amp:0.6
end
sample bound,rate:0.4,amp:2.0
sample pipe,rate:0.3
sample gin,amp:1.5,rate:0.5
sleep 0.09
sample gin,amp:1.5,rate:0.8
sleep 0.04
sample gin,amp:1.5,rate:0.9
sample drumhit1
sleep 2.0
############collision1################
sample thunder,rate:1.2,amp:0.5
sample gon,rate:1.0
sample pipe,rate:1.0,amp:1.0
sample drumhit1,amp:1.0,rate:0.8
sleep 0.06
sample gon,rate:1.0
sleep 0.04
sample gon,rate:0.5,amp:0.5
sleep 0.03
sample pipe,rate:0.7,amp:0.25
sleep 1.6
############collision2##################
#bound(collision2)
with_fx :distortion do
  sample drumhit2,amp:1.0,rate:0.6
  sample pipe,rate:0.65,amp:0.3
  sample pipe,rate:0.65/2.0,amp:0.15
  sample bound,rate:0.8,amp:1.4
  sample bound,rate:0.4,amp:0.4
  play :D1,release:1.0,amp:0.5
end
#hit(collision2)
sample gon,rate:1.5
sample pipe,rate:1.5,amp:0.5
sleep 0.06
sample gon,rate:1.0
sleep 2.7
###########splash#####################
sample thunder,rate:0.7,amp:1.7
sample splash,rate:2.0
sleep 0.05
sample splash,rate:1.0
sleep 0.02
sample splash,rate:0.5,amp:0.7

ここで、このコードについて詳細な説明は割愛しますが、特徴的な部分として"break2"を説明します。

##############break2##################
4.times do
  tick
  sleep (0.05+look/12.0)*0.9
  sample pipe,rate:0.1+look/20.0,amp:0.6
end
sample bound,rate:0.4,amp:2.0
sample pipe,rate:0.3
sample gin,amp:1.5,rate:0.5
sleep 0.09
sample gin,amp:1.5,rate:0.8
sleep 0.04
sample gin,amp:1.5,rate:0.9
sample drumhit1
sleep 2.0

ここは、風に揺られた貯水槽がついに耐えきれず落ちはじめてしまう場面です。 4.times doは4回ループするという意味ですが、少しずつ音程を上げ、音の間隔を広げながら、すばやく金属音を連続的に鳴らすことで風によって強度を失った貯水槽の土台が斜めに倒れ掛かってくる重量感やスピード感を表現しています。この部分だけを切り出してきいてみましょう。

この例のように、各サンプルの間隔や音高のパラメータを細かく調整し、何度も再検討出来るのがSonicPiの強みですね。(DAWでももちろん出来ると思いますが、文字になっていると見通しが立ちやすく調整が容易というのが個人的な感覚です。)

Amebient Sample Packと色々なAmebient

ここまででサンプル制作の話は以上となりますが、最後にAmebient公開後に販売したAmebient Sample Packについて少し話したいと思います。

Amebient Sample Packは文字通りAmebientに使われている楽器の自作サンプルを詰め合わせたワンショット・サンプルパックです。 つまり、これを使うとAmebientとは違う形でAmebientの音を使った表現が可能になります。 Amebient内での音制作を超えて、これらの音でもっと自由な表現をしたいという人のためのものとなっています。

販売当初は本当に使う人居るのか...と思っていましたが、すぐに多くの人に使って頂き、自分だけのAmebientが生まれていきました。 このモーメントに私が見つけた限りのAmebient Sample Packの使用例をまとめています。 twitter.com サンプルを楽しんで頂いた方々は本当にありがとうございました!

本記事で興味を持った方も、是非自分だけのAmebientを作ってみて下さい。(宣伝)

おわりに

Amebientの自作音作りは、私の制作作業の半分以上の割合を占めているものでした。 かなり時間はかかりましたが、音を聴くだけで「Amebientだ」と思ってもらえるようなものに出来ていたら嬉しいですね。

そして今回で、私のAmebient Advent Calendar 2020の担当分は最後となりました。 全7記事を通して、Amebientの音的な側面は一通り書かせて頂けたかと思っています。 拙い文章ではありましたが、最後までお付き合い頂きありがとうございました。

*1:専門家じゃないのでわからないですが...わからないからこそ気にしなたくない動機がありました。

Amebientの環境音

こんにちは。Amebient Advent Calendar 20日目の記事です。

もし、Amebientが何であるかがわからないという方は、先にVRChatで公開されているワールド と、phiさんの1日目の記事 を見て頂ければと思います。

今回は、Amebientの環境音ということで、環境音の音量制御について書いていこうと思います。

音量制御

雨や風の音といった環境音は、通常どこか特定の方向から鳴っていると感じられることはありません。 なので、楽器などに用いる3D-AudioSourceではなく、2D-AudioSourceで表現することが素直な実装と言えると思います。

しかし、方向性を持たない音だからといってどこででも一定の音量というわけではありません。 例えば、外では防風が吹き荒れていても、室内に入ればかなり音量は小さくなることは明らかです。 ドアなどで環境が隔てられている場合、このような音量の変化は単純な環境音の入れ替えで事が済む場合も多いかと思いますが、Amebientのマップは明確に区切られた領域というものが無く、全体が連続的に繋がっています。なので、環境音も連続的に変化させて周囲の環境と一致させていく必要があります。

Unityの2D設定のAudioSourceでは、位置に応じて音量を変化させるプロパティは備わっていません。 そこで、AmebientではUdonを介してプレイヤーの頭の位置を取得し、頭の位置の関数として各AudioSourceのVolumeを制御するという方式を取っています。 これによって、建物の形状による音量変化や、水中・水上による音の変化、水深による音量の変化などを一括で扱うことが出来ます。

各環境音について

各環境音について、音量を制御する関数の詳細について書いていきます。 以下では、次図のような座標変数を用いて説明をします。 f:id:Raku_Phys:20201220213951p:plain

雨音は、室内では小さく屋外に近づくほど大きくなると考えられます。 また、1Fから4Fにわたってフロアに占める屋根のある領域の面積が小さくなっていくため、より上のフロアでは室内から屋外に (z方向に) 進んでいったより急に雨音が大きくなると想定出来ます。 これらの条件を満たす、音量の関数として次のようなものを用いました。

private float RainVolume(float y, float z)
    {
        float volume = 0.0f;
        float u = -1.0f * (y - waterY);
        volume = (Sigmoid(z, 0.004f * Mathf.Pow((y - deathY), 2.0f), -2.0f - y * 0.5f) + 0.08f) / 1.08f;
        if (y < waterY)
        {
            volume *= 0.5f * Mathf.Exp(-1.5f * u) + 0.5f * Mathf.Exp(-5.0f * u);
        }
        return volume * rainAmp;
    }

音量のz方向依存性ですが、主に次のように表されるSigmoidと呼ばれる関数で決定されています。

private float Sigmoid(float x, float f, float o)
    {
        return 1.0f / (1.0f + Mathf.Exp(-f * (x - o)));
    }

Sigmoid関数は、次のような見た目をした0から1までの値を取る関数で、fは変化の「急さ」、oは「変化地点」を表す量です。

f:id:Raku_Phys:20201219020952p:plain
(f,o) = (5,2) の場合のSigmoid関数
これを踏まえて、音量のz方向依存性の式を見ると、yが大きくなるにつれてSigmoidの「急さ」が大きくなり「変化地点」が建物側に寄っていきます。これによって、1Fでは外側に向かってなだらかに雨音が大きくなるのに対して、4Fに行くと建物を出た途端に雨音が大きくなるようになっています。

if文内は水中内の処理です。水中では雨音が急速に指数減衰するようになっています。 ただし、急に減衰する成分と、比較的なだらかに減衰する成分の重ね合わせになっています。これは、水中に入る時の急激な変化と水中でもかすかに聴こえている雨音を共存させるためです。特に物理的な根拠のある式ではなく、そういう風に聴こえたかったという感覚的実装です。

風音は、基本的に雨音と同じ音量変化を持ちます。 雨音の方にはないstateによる分岐は、雷が落ちた後に風が強くなる演出のためのものです。

private float WindVolume(float y, float z)
    {
        float volume = 0.0f;
        float u = -1.0f * (y - waterY);
        volume = (Sigmoid(z, 0.004f * Mathf.Pow((y - deathY), 2.0f), -2.0f - y * 0.5f) + 0.1f) / 1.1f;
        if (y < waterY)
        {
            volume *= Mathf.Exp(-4.0f * u);
        }        
        if (state == 2)
        {
            volume *= windAmp2;
        }
        else
        {
            volume *= windAmp1;
        }
        return volume;
    }

室内

室内では、減衰によって高音成分が失われた雨風の音と、室内に反響する水が垂れる音などから出来た環境音が鳴っているということにしました。音量は、雨風の音量の逆として実装されていて、volume = 1.0 - [雨風の音量] となっています。

private float BuildingVolume(float y, float z)
    {
        float volume = 0.0f;
        float u = -1.0f * (y - waterY);
        volume = 1.0f - Sigmoid(z, 0.004f * Mathf.Pow((y - deathY), 2.0f), -2.0f - y * 0.5f);
        if (y < waterY)
        {
            volume *= Mathf.Exp(-0.5f * u);
        }
        return volume * buildingAmp;
    }

海中 (泡音)

海中は、泡のような低音で満たされていて、次のような関数で音量が制御されています。

private float BubbleVolume(float y)
    {
        float volume = 0.0f;
        float u = -1.0f * (y - waterY);
        float u2 = -1.0f * (y - deathY);

        if (y < waterY)
        {
            volume = 0.7f + 0.3f * Mathf.Exp(-2.0f * u);
            if (y < deathY)
            {
                volume *= Mathf.Exp(-1.0f * u2);
            }
        }
        else
        {
            volume *= Mathf.Exp(-5.0f * outWaterTime);
        }

        return volume * bubbleAmp;
    }

泡音は、水中に入った瞬間不連続に大きくなり、その後少し小さな音量まで指数減衰します: volume = 0.7f + 0.3f * Mathf.Exp(-2.0f * u)。 これによって、水中に潜った瞬間のみ少し音が大きくなることで、その瞬間が音的に強調されます。 if (y<deathY)の分岐は、水中に落ちていってリスポーンする直前に音量を急激に減衰させる処理です。 最後のelse 内の処理は、水を出た直後に音量を急激に減衰させる処理で、outWaterTimeは水を出てからの時刻を数えています。 ここで、volume = 0.0fとしても効果としてはおおよそ同じになるのですが、不連続に音を切ってしまうとノイズが乗ってしまうためこのように実装しています。

海中 (Ambient)

海中に深く潜っていくと段々とAmbient的な音楽が聴こえてきます。 この音量はSigmoidで主に制御されていて、穏やかに音量が大きくなっていきます。 これによって、海の底の方から音が聴こえてきているような効果を意図しています。

private float AmbientVolume(float y)
    {
        float volume = 0.0f;
        float u = -1.0f * (y - waterY);
        float u2 = -1.0f * (y - deathY);

        if (y < waterY)
        {
            volume = Sigmoid(0.3f * u, 1.0f, 2.0f) - 0.12f;
        }
        if (y < deathY)
        {
            volume *= Mathf.Exp(-1.0f * u2);
        }
        return volume * ambientAmp;
    }

リズム同期する環境音

Amebientでは、上記のような定常的な環境音の他に周期的に鳴るような環境音が合わせて用いられています。 一度目の雷が落ちた後、64拍に一度すきま風が吹き、その後小さ目の雷が落ちます。 いわゆる「一般的な楽曲」では、ドラムによるクラッシュシンバルなど展開の切れ目で仕切り直しとなるような音が演奏されます。 Amebientでは、プレイヤーが自由に音を作っているだけなので明確な切れ目となるようなものが存在しませんが、定期的にやってくる雷とその予兆となるすきま風によって、適度な切り替え地点が生まれるようになっています。

おわりに

めずらしくコードが多めの記事になりましたね...。 とはいえ、書きたいことはコードの内容というよりはどんな気持ちで音量の線を引いたかという部分かなと思います。 VRCSDK2だとちょっと難しかったですが、Udonによって2D音源でも領域ごとの詳細な音量等々のパラメータ操作が出来るようになったので、色々な世界づくりや演出に活用していけそうですね。 次回は、最後になりますが、Amebientに使用した自作サンプルについてそのレシピ的なものを書いていきたいと思います。

Amebientの音楽体験設計 (終末編)

こんにちは。Amebient Advent Calendar 17日目の記事です。

もし、Amebientが何であるかがわからないという方は、先にVRChatで公開されているワールド と、phiさんの1日目の記事 を見て頂ければと思います。

今回は、Amebientの音楽体験設計 (終末編)ということで、Amebientをどのように終えるかという部分について、Amebientを楽曲としてみた時の視点から書いていこうと思います。

水没への遷移

Amebientでは、楽器/ファンを停止せずに演奏を続けるといずれ世界は水没に向かいます。 水没が確定すると、吹き荒れる豪雨と共にまずは楽器の音が停止します。 ここで音を抜いたのは、Amebientを楽曲として見たときにその先の「静寂」を聴きたいがために音的に止めたいなと思ったのが一番の動機です。 とはいえ、いきなりピタっと止まるのもおかしいので、雨にかき消されるようにだんだんと音が抜けていきます。解釈としては、音の要請から逆算したところがあるので色々あり得るところだと思いますが、音楽的な世界としてのAmebientの停止と捉えて良いように思います*1。実際この後では、今まで主役だった楽器の音がいきなり聴こえなくなることで、影に隠れていた風の音や雨の音が強く聴こえてきます。さらに、機械を起動すると同時に鳴り始めていた鐘の音に多くの人はここで気づくことになると思います。この鐘についてはまた後述しますが、音楽的な世界として停止してしまったAmebientにおいて唯一残っている音楽的な部分かなと思います。これによってAmebientは楽曲的な連続性を保ったまま水没に向かっていきます。

鐘の音をしばらく聴いていると屋上から金属のあたるような音が鳴ってきます。これは、屋上に設置されている貯水槽を支える台のネジが強い風雨によって緩みはじめてしまっている音です。そしてとうとう、貯水槽を支えきれず壊れてしまうと、バランスを失った貯水槽は建物に2度バウンドして海に落ちていきます。このあたりの展開は、リズム的な規則に縛られないまったく不規則な音を伴って進んでいきます。これは、ここまでの強いリズムを伴ってきたこととの対比として、音楽的に止まってしまった世界を強く意識させるものになっています。

貯水槽が海中に沈んでいくと、ほどなくして一気に海面が上昇しはじめます。 海面上昇の際には、海面の上昇に伴って波の音を近づけることで迫ってくる水の臨場感を向上させています。 Amebientでは、あまり強く波が打ち付けるようにはなっていないので、視覚との整合性を取るために通常時波の音は入れていませんが、唯一この場面のみは水が大きく動いて迫ってくるため波の音を取り入れています。ちなみに、ON/OFFを試してみましたが、水の接近を視覚よりも鋭敏に感じとれるように思えました。

水中

Amebientの水中は、無音ではありません。実は一番はじめの想定では、水中ではくぐもった水の音のみを環境音として流す予定でした。 しかし、ある日の作戦会議でcapさんとphiさんの作った水中の風景を見せてもらうと...

想像以上に良くて、そして穏やかでした。水中は本来人の生存出来ない領域なので、そこに沈むとなるとまず初めにくる感情として、恐怖感や不安感のようなものが多くありうると思います。 特にAmebientの海は、南国のエメラルドグリーンの海などではなく暗い海なので、私も上から見ている限りでは穏やかというよりは若干の緊張に近い感情を覚えるものでした。 しかし、実際に入ってみると、まず自分自身を受け止めてくれる浮力感、そしてそこにいつまでも滞在することの出来ることが分かる安心感、何より差し込んでいる穏やかな光が相まって、いつまでもそこに居たいと思える空間になっていました。*2

そこで、水中ではストリングスをベースに編曲したAmebient冒頭のテーマが聴こえているということにしました。これは、基本的にBGMを用いていないAmebientにおいて唯一とも言えるBGM的な音ですが、世界から切り離された音とというよりは、この世界の海の底からはずっとあの音が鳴ってるみたいな気持ちで音を入れています。実際、水深が深くなるにつれて音量が大きくなるようになっています。

さて、水没後の世界ですが、水没後でも海の底から流れる音は止まっていません。 水没エンドというと、どちらかというとネガティブなエンディングに捉えられるかもしれません。 しかし、個人的には穏やかさを獲得するエンディングのように思えています。 これはあくまでもAmebientを楽曲としてみた時の話ですが、曲の最後にこの穏やかな地点に行きつきたかったという比較的前向きな理由で世界を沈めています*3

少し余談ですが、とはいえ水没というのが比較的ネガティブな事象ではあるわけで、それを回避したいというモチベーションを持つ人が沢山見られたのは公開後になるほどと思った部分でした。 水没を回避したいというモチベーションの先として、やはりまず思いつくのは「晴れ」という結末ですよね。 ただ、晴れてしまうとこの世界からは、大部分の音が失われるんですよね。雨が降っていることによって、音が鳴っているので。 Amebientという楽曲の結末として段々と雨が止まっていって最後には風の音だけになるのか、あるいは雨風が強まって音楽が勢いを増しそれを超えた先に水没を迎えるのか、楽曲としては後者が魅力的には思えてしまうんですよね...。世界がどう終わるべきか、みたいな話の気もするので答えのあるようなものじゃないと思いますが、楽曲担当の一意見でした。*4

基本的には、水没まででAmebientの世界は終わりです。実際この後海中以外では環境音以外は何も鳴っていない予定でした。 ただ、実際に水没してみると水没前には行けなかった屋上に行けるようになり、わずかに佇める空間が生まれていて、海中とは違う空気感を持ったその空間を完全に終わらせてしまいたくない気持ちになってしまったんですよね。それで、遠くのビルのほうから聴こえてくる鐘が聴こえてきてしまったので、ここでも鐘の音は止めずに続いていくことにしました。 各鐘に割り振られている音はこのようになっていて、左側の5つがAmebientのテーマに使われている音なので、これらの鐘が鳴ることで永遠にAmebientのテーマが流れ続けます。 f:id:Raku_Phys:20201217231135p:plain ちなみに、良く見ると各ビルには鐘がちゃんと備わっていて、かつギリギリ水没しないようになっています。*5

おわりに

今回で、Amebientの音楽体験設計シリーズは以上となります。 体験設計と大仰に言えるようなものではなかったかもしれませんが、体験上の制約を付け加えながらインタラクティブな楽曲を構成していく感じが少しでも伝わっていたら幸いです。 次回の記事では、Udonを用いた空間領域ごとの環境音制御について書こうと思います。

*1:このあたりはphisさんの週末編にも書いてありますね。

*2:実際、この水中で寝ている方々も一定数居るようですね。

*3:あくまでも楽曲を作っていた時の私の気持ちです。

*4:ちなみに音を止めない解は存在していて、それは均衡を保つことです。例のパスワードです。世界を終わらせない、しかし音を止めたくない、ということになるとあの世界においてはこれが唯一の解なのかな?というところですね。

*5:いろいろな方法で飛んで行って実際に見た人も多いみたいですね。2Fの写真群の中にも鐘の存在を見つけることが出来ます。

Bozeと始めるBGM制作

こんばんは。Boze Advent Calendar 2020 14日目の記事です。

今回は、三日坊主さんが制作したVRChatワールド「stair54」のために作ったBGMの話を中心に書きたいと思います。あとおまけの話をします。

stair54の楽曲はYouTubeでも公開しているのでよろしければ聴いてみて下さい。

経緯

ある日twitterのTLを眺めていたらこんなツイートが流れてきました。

買い取りプランなるものは以前も以後もおそらくやらないと思いますが、新規ワールドを見て、即興演奏、そしてワールドBGMにという企画はすごくやってみたい感じがあったので即断でOKしていました。*1 即興演奏なら、行って弾くだけなので時間的にもほとんどゼロコストですし、そこから音源化するとしてもコンセプトとして即興演奏を用いるというところを出発とするので比較的工程少なく出来るだろうという算段もありました。

そして数日して、ワールドをめぐっていたら当時無題だった、「階段のワールドが出来た」ということで遊びに行きつつ即興演奏してみることにしました。

即興

元々、私は曲を作る時に視覚的なイメージを頼りにすることが多い方でした。 小さいころは科学系の雑誌の挿絵を眺めて曲を作ったり、そこから少しだけ改変した世界を想像して絵に起こしてみて曲を作ったりしていました。 小さい紙にたくさん絵を描いていって、それを譜面台に並べてモチーフを考えたり、一日中そのことばかりを考えて世界観を広げていったりすることが作曲の工程のほとんどであったと言っても良いぐらいでした。 少し成長して知識がついてくると、どちらかというと曲の初動は何らかのイメージに頼りつつも概ね理詰めで曲を作ることも増えてきました。 色々なことを考えなければならなくなってくる日常の中で、曲を作れるほどにある世界観に没頭していくことが難しくなっていた側面もあったのかもしません。

さて、そんな折にVRChatです。 HMDを被りながらピアノを弾いていると、まさに小さいころにしていたように、作りたい曲の世界そのものに入りながら曲を作ることが出来ます。 VRはシングルタスクで他のことが出来ない...みたいなことが良く言われますが、まさにそれが好都合で世界の中に存分に浸りながら曲を作れる環境を手にできたわけです。しかもVRChatでは、自分の描いた世界だけではなく、人の描く世界にまで入りこむことが出来ます。Boze Advent Calendar 10日目の記事で書かれている環世界の話にも通じるかもしれませんが、他人の作った世界と自分の視えている世界のInteractionの中で曲を創り出す行為は、自分の描いた世界のみからでは生まれない何かを生みうるものだと思います。

今回の階段のワールドの中での即興演奏は、HMDを被りながら周囲を眺めて頭に浮かんでくる抽象的なイメージをなんとなく音にしていくところからはじめました。 はじめは、あまり作為を持って曲にしようとせず、音の響きが世界の視え方に与える影響を観察していきます。 いくつか音を弾いていくと、視覚的には全く同じ世界であってもほんの少しの音使いの違いでその見え方は、少なくとも主観的には、大きく変化していくことが分かりました。 そのような、音が視覚的印象に与える影響の変化を楽しみながら、少しずつ音を変えていき、最終的にははじめてワールドを視た時の印象に音を溶かすように寄せていきます。 音を溶かすべきか、それとも音によって新たな軸を生み出すべきかは場合によって違うかもしれません。 ただ、世界に存在しない仕組みで鳴る音=BGMである以上、はじめからその世界にあったかのように、溶け合うように存在して欲しい、(少なくともこのワールドではそうあって欲しい)という願いのもと今回はそういった方針を取りました。

そうして、5,6分音を動かした後の様子がこの動画です。

はじめの10秒あたりまでは、今のstair54とは全然違うことを弾いています。 とはいえ、コンセプトとしては通じるものがあって、階段の循環するような回るような感じを、繰り返す低音のラインで表現しようとしています。 ただ、やっぱりまだ"溶けて"いません。 そして、そのあとちょっとずつ循環フレーズの質を変えていって、だんだん視覚的イメージとの齟齬を消していって、"ハマった"という感じを得たのが0:27あたりです。 その後は、自然に曲が続いていってほとんど今のstair54が出来上がってきています。 最終的には、トータル9分ほどの即興演奏を経てstair54の原型が出来ました。

調整

ワールド内で演奏している時は、演奏会として淀みなく聴かせたり、音源としてミスなく弾くといったことを優先していなかったので、撮ってもらっていた動画を元に落ち着いて再構成していくことにしました。 とはいえ、雰囲気はほとんど出来上がっているので、そこの根幹を変えないように即興では弾ききれていない部分の精度を少し高めていくぐらいの作業です。

この工程での一番大きな変更は、拍子を6/8から9/8に変更したことでしょうか。 元の曲は、かなり高音の旋律に長い音符を使っているのですが、それがやや長すぎてピアノの音色で演奏する上ではもう少し音と音をちゃんと繋いであげたい気持ちになったので、6/8の2小節分を9/8に圧縮しました。 圧縮する拍子として9/8を採用したのは、ほとんどフィーリングですが...基本となっている循環する低音フレーズを弾いていたら、ある時勝手に5+4のフレーズにすり替わっていてそれが"良かった"のと、9/8を3つずつの音符で割ると3拍子的に捉えることが出来てもとの拍子とも親和性が高そうだった等々の理由です。そして、この低音フレーズの5+4のリズムは、そのままタイトルの数字"54"に繋がっています。*2

おわりに

今回は、「Bozeと始めるBGM制作」ということで、ワールドとの相互作用の中で即興的にワールドBGMを作っていくという話を書かせて頂きました。 ワールドのための曲というもの、まだまだ少ないように思っています。 一つには、ワールド制作者が曲を作る人と一致しているケースが少ないという理由になると思いますが、曲を作る人もワールドを作る人もこの界隈にはたくさんいるはずなので、色々な相互作用が生まれていったら面白いだろうなと思っています。

おまけ

これですが...

ある日、三日坊主さんと話しながらぼーっと視界の端に三日坊主さんをとらえていると、情報に気づいてしまいました。 三日坊主さんと会ってから、約2年一切気づかなかったことです...

f:id:Raku_Phys:20201214234335p:plain f:id:Raku_Phys:20201214234407p:plain

もうお分かりでしょうか...。袈裟の模様が、なんと漢数字の「三」だったのです。 今年1,2を争う衝撃でした。10分ぐらい、そのことしか口から出ないぐらいの衝撃がありました。 しかも、まさかと思って、そのことを踏まえて三日坊主さんの後ろに回りこむと

f:id:Raku_Phys:20201214234554p:plain

はい、サイコロの4です。*3 3日目と4日目の間をループする坊主であるところの三日坊主さんの来歴を端的に表す、めちゃくちゃ意味のある袈裟の模様だったわけです。 ちなみにこの話は伏線です。お楽しみに。

*1:こうやって首が回らなくなっていきます。

*2:曲のタイトルは、あんまり深く考えない方です。階段なのでstairで良かったのですが、識別番号が欲しかったので丁度良い数字を探した感じです。

*3:ちなみに尖っている左上の丸はリップシンクして尖ります。

Amebientの音楽体験設計 (遷移編)

こんにちは。Amebient Advent Calendar 13日目の記事です。

もし、Amebientが何であるかがわからないという方は、先にVRChatで公開されているワールド と、phiさんの1日目の記事 を見て頂ければと思います。

今回は、Amebientの音楽体験設計 (遷移編)と題しまして、展開の切り替え部分にスポットを当てて書いていきたいと思います。今回は軽い記事です。決して時間が無くなったわけでは..。

世界とのInteraction

Amebientの特徴の一つに、行動・演奏の結果が 世界そのものに影響を与えてしまう というものがあります。 例えば、BGMを奏でるために初期配置された缶やフライパンを、外に運んでいって音楽を進めるとそれに伴って雲行きが怪しくなっていきます。 そして、いよいよ空が十分暗くなると、突風が吹き豪雨が降り、雷が落ちます。それを経て状況は次の展開へと遷移するわけです。

この遷移の瞬間に、今まで環境音として身をひそめていた雨風は音楽に参加してきます。 初回記事にも書いたように、Amebientは現実よりも少しだけ音楽的な世界です。 なので、音楽に世界がつられちゃってもいいよね、という気持ちでこのあたりは作っていきました。 ただし、どのぐらい明らかについてきちゃうかなどは結構な試行錯誤がありました。 今回はその試行錯誤の話を中心にしていきます。

試行錯誤

世界遷移のタイミングで、環境音が音楽に参加してくるという流れが固まった段階で一度遷移部分だけを、SonicPiを使って仮組みしてみました。 例えば、雷はglsl soundで作った爆発音のようなものを音程を変えながら何度か鳴らすことで主な部分は作られていますが、その音程やリズムのパラメータをSonicPi上で変えながら色んなバリエーションを作っていきます。 f:id:Raku_Phys:20201213220241p:plain その結果、第一版として次のようなが出来ていきました。

今のAmebientの雷と比べると大分リズミカルですね。 そして、この一つ目の雷を組み込んだ遷移サンプル音源は次のようなものになりました。

これをphiさんとcapさんに共有してみたところ、パっと聴きは感触良さそうだったんですが... f:id:Raku_Phys:20201213222332p:plain 少し話していくと、phiさんの理想形とは違っていることがわかってきたので... f:id:Raku_Phys:20201213222445p:plain 雷のリズムっぽさを消して、より自然っぽい感じに修正してみたわけですが...

たしかに、雷がリズムっぽすぎるという表面上の齟齬は無くなった音源なわけですが、(自分も納得して作ってない音源ですし)、どうやらもっと根本的なコンセプトで違うのだということが分かってきます。 f:id:Raku_Phys:20201213223226p:plain 最終的に言葉でうまくまとめられる概念になったかは際どいのですが、

  • 私:演奏者が世界の進行を能動的に引っ張っていく
  • phiさん:なんとなく音を鳴らしていたら、偶然世界がついてきた

という相違に帰着されるように思います。 さて、どう折り合いをつけていこう...と思ってこの日の数時間の議論は一旦終えたのですが...翌日言葉上のやりとりだけではなかなか折り合いを付けるのが難しい、と考えてくれたphiさんがSonicPiで作った音源を送り返してきてくれました。

いや...凄いですよね...。phiさんの視えているものが、音源からすぐに伝わってきましたし、言葉上かなり遠いように見えて、出音はかなり近いことが分かってきました。 音源上はかなりささいな違いだったんですね。(だから、言葉上の違いに気をとられて、大幅な修正をかけても折り合うわけはなかったんです...。)

最終的には、偶然にも聴こえるけれど実は音楽的に噛み合っていて世界/音楽を進行させる推進力となる遷移部分...のような言葉で表現するのは大変微妙ながら当時の自分としてはものすごく納得したコンセプトを持って次のような遷移部分となりました。

まとめと予告

今回の記事は、phiさんの1日目の記事に書かれていた、「衝突」を私の視点から書いてみる回になりました。 この議論は、Amebient制作期間の中で一番しんどくてかつ一番楽しいものだった気がします。 最終的な該当部分、15秒とかですけどね...長く続いていく曲の平坦な部分も大事ですが、遷移部分は短いからこそ重要とも言えるので時間をかけた価値はあったかなと思っています。 終末への移行部分もちょっと書きたかったですが...終末部分との関連が大きいので次回「終末編」で触れることにしようかと思います。決して時間が無くなったわけでは..。

Amebientの音楽体験設計 (展開編)

こんにちは。Amebient Advent Calendar 10日目の記事です。

もし、Amebientが何であるかがわからないという方は、先にVRChatで公開されているワールド と、phiさんの1日目の記事 を見て頂ければと思います。

今回は、Amebientの音楽体験設計 (展開編)と題しまして、世界進行に伴って展開していく音楽に関連した話をしていければと思います。

背景音楽からの遷移

展開部では、プレイヤー (体験者) が缶やフライパンなどのオブジェクトを移動することで、背景音楽的に奏でられていた音楽を一度解体し、そして再構築していきます。 すなわち、ここからプレイヤーは音を聴く側から奏でる側へと遷移していきます。

"音を奏でる側の人"というと、例えばピアニストや歌手ドラマーなどをまずは想像されると思います。 このような"演奏者"は、自分の出したい音、演奏したいことを表現するために、楽器を使って音を出していきます。しかし、偶々Amebientを訪れ、偶々"音を奏でてしまった"人の多くは、何かを表現しようという動機を持ち合わせてはいないはずです。自分の行っている操作が演奏だという認識すら持つことは無いかもしれません。

何かを表現しようとする意図を持たずに音を奏でれば、それは一般に音楽になり得ません。例えば、ピアノの鍵盤をランダムに叩いても音楽と呼べる音列にはならないでしょう。*1 しかし、逆に極端なケースとして、スイッチを押したら音楽が流れるボタンが有ったとして、それを意図せず押したとしたら、それは押した人の意思によらず音楽と呼べる音が流れだすはずです。

この両極端なケース(ピアノ/再生スイッチ)を見たうえで、どこからが演奏と呼べるものでどこからが演奏でないといったようなものは無いのではないかというのが私の意見です。例えば再生スイッチでも、2つに増えるだけで音を混ぜるタイミングの自由度が生まれて少しだけ表現の余地が生まれてきます。もう少し進めて、各スイッチの再生音量がコントロール出来ればさらに幅が広がっていきます。やや乱暴に括れば、再生スイッチにはじまりピアノに至るまで、演奏の自由度が高まれば高まるほど表現の幅は増え、そしてより演奏に自覚的でないと音楽として成立させられなくなっていきます。

やや回り道をしましたが。Amebientの体験者が意図を持った表現者でない、しかしワールドとしては音楽的でありたいという条件を考えると、楽器としての設計はピアノというよりは再生スイッチ側に倒してあげる必要があります。しかし、再生スイッチを押すだけではあまりにも体験として面白くありません。そこで、缶を雨だれの下に置くという操作の中に、"再生スイッチ"を隠します。すなわち、自由度を持って缶を雨だれに置いていると感じるようにしつつ、その結果不思議と音楽になってしまっているという体験を設計します。

リズムの部品

上記のような、 背景音楽からの遷移体験を実装としてAmebientで取った方針は、リズムを小部品に分割して散りばめることです。 一つ一つの雨だれは、さしたる意味を持たないように見えつつ、全体が集まると互いのリズムが絡まって強い推進力を生みだします。 このような、"リズムの部品"を見つけるために、打楽器のアンサンブルが主体となっているラテン音楽に目を向けました。

ラテン音楽

Amebientとラテン音楽、今いちピンと来ないかもしれません。ラテン音楽と言われると、Mombo No.5のような陽気な音楽を想像する人が多いと思います。

ただ、Amebientのリズム設計のReferenceとして見ているのは、こうした陽気さではなく、曲の背景を支え、推進させているリズムの枠組みです。

ロックやジャズ、ポップスといったジャンルでは、一つのバンドに加わる打楽器の担当はドラム一人であることも多い一方で、ラテン音楽ではコンガ、ボンゴ、ティンバレス、ギロ、クラーベ等、非常に多くの打楽器が同時に演奏されます。このように、多くの打楽器が別のリズムを演奏していても、一体となって一つの"グルーヴ感"を生み出すことに成功している背景には、"クラーベ"というラテン音楽のリズムを支配する概念が関係しています。

クラーベとラテン音楽の分類

クラーベとは、ラテン音楽のリズムの軸となるリズムです。 おそらく、次の譜面で表される「ソン・クラーベ」が最も有名かと思います。

f:id:Raku_Phys:20201210223520p:plain
ソンクラーベ

譜面を見ると、小節線をまたいで2つの音符がある小説と3つの音符がある小節があることが分かるかと思います。この2の方の小節をツー・サイド、3の方の小節をスリー・サイドと呼びます。そして、奇数小節が2の場合のクラーベをツー・スリー 、奇数小節が3の場合のクラーベをスリー・ツーと呼びます

このツー/スリーがクラーベの肝となる部分で、各打楽器で演奏されるリズムはツーの小節とスリーの小節で異なっています。ざっくりと言って、ツー・サイドは停止感、スリー・サイドは推進感を生む小節であり、その繰り返しを全楽器で共有することによって、ラテン音楽特有のグルーヴを生み出していきます。ソン・クラーベをベースにしたラテン音楽には、上で例にあげたマンボなどのジャンルがあります。これらは基本的に、キューバを起源とする音楽です。

一方、アフリカ及び、アフリカ系の移住民がキューバで発展させた音楽がルンバです。ルンバのリズムは、ソンクラーベと少しだけ異なるルンバ・クラーベを軸に作られます。譜面は次のようになっていて、スリー・サイドの最後の音符が半拍だけ後ろにずれたものです。

f:id:Raku_Phys:20201210223415p:plain
ルンバクラーベ

ルンバは、アフリカのサンテリアという宗教の音楽がベースになっていることもあり、他のラテンのジャンルと比較しても非常に土着的な雰囲気を持っています。 例えば、ルンバの中でもGuaguancoと呼ばれるジャンルの音楽は次のようなものです。

このRumba guaguancoというジャンルの原始的な雰囲気、決して華美ではない雰囲気の中にある強い推進力が、Amebientのリズムの核に合うと思い、AmebientのリズムのReferenceとして採用しました。

リズムの部品化と空間配置

Amebientでは、Rumba guaguancoの色々な楽器のリズムを1拍ずつ分解して雨粒として配置しています。これを実装するため、まずは次のような譜面を作りました。(画像粗くてすみません...。) f:id:Raku_Phys:20201210000533j:plain

これはどう読むかというと、①の拍に存在出来るリズムは①-(a,b,c)の三択といったような読み方です。この譜面をもとに、ビルの天井のフチや、鉄パイプから落ちる水滴ひとつひとつにリズムが割り当てられて空間的に配置されます。

リズムの核となっているのは、上記のようなリズムの部品ですが、より自由度を持って演奏を作りこみたい人のためにシーケンサー的な振舞い (1拍ずつ隣の水滴が落ちていく) をする雨粒も用意されています。 これらは、図のように空間的に分かれて配置されていて、音を作りたい人・偶発的な音に身をまかせて楽しみたい人がうまくすみ分けて共存出来るように作られています。 f:id:Raku_Phys:20201210233231p:plain

まとめと告知

展開編の内容のまとめ:

  • 自由度・意思を反映させる余地を増やせば、音楽として成立させるハードルはあがる
  • Amebientでは、自由度があるように思わせて、音楽として成立させるハードルは実は低いという設計をした
  • そのために、ラテン音楽にヒントを得て作った、互いに相乗効果を生むリズムの部品を分解して散りばめた
  • より発展的な演奏のために、シーケンサ的なパターンで落下する雨粒も用意することで、音を作りこみたいと思えばもっと自由度高く音を作れるようにした

次回は、各展開をつなぐ遷移部分にスポットをあてて書いていきたいと思います。

*1:人がそれを聴いて音楽だと勝手に解釈してくれる余地はあるかもしれませんが、それは特殊なケースです。