らくとあいすの備忘録

twitter : lactoice251

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:専門家じゃないのでわからないですが...わからないからこそ気にしなたくない動機がありました。