「音を止める」と聞くと、波形の再生ボタンを一時停止して、その瞬間の形を静止画のように残す姿を想像します。しかし、スピーカーへ同じ値を出し続けても鳴るのは持続音ではなく、膜が一定の位置へ寄ったままになる直流です。音として聞こえ続けるには、空気を揺らし続けなければなりません。

Granular Freezeが止めるのは波の振動ではなく、音の中を進む再生位置です。流れてくる音を数ミリ秒〜数十ミリ秒の小さな断片、グレイン(grain、音の粒)に刻み、ある一瞬の周辺から取った粒を何度も重ねて鳴らす。同じ場所の波は動き続けるので音は出ますが、次の場所へ読みに行かないので出来事は先へ進みません。音を「連続した波」ではなく「粒の集まり」として扱い直すと、再生位置と時間の進みを切り離せるわけです。

上部の元波形を細かな粒に区切り、左では読み出し位置が右へ進むたびに異なる粒が並ぶ通常再生、右ではマーカーを一点に固定して同じ場所の粒を繰り返し並べるフリーズを比較した図。位置を進めれば音は前へ進み、位置を止めれば同じ場所の粒が鳴り続ける

音は数字の列だという連載の起点 から見ると、ここでの操作はバッファに保存した数字をどこから読むか決めているだけです。リングバッファでディレイを作った回 では読み出し位置を一定速度で回しましたが、Granular Freezeではその位置を一点の周囲に留めます。前作のアシッドベース入門 が波形をフィルターで動かす番外編G系列の1本目なら、今回は音の時間そのものを粒へほどく2本目です。

粒の切れ目を窓でなめらかにする

グレインを作る最も素朴な方法は、バッファから短い区間をそのまま切り出すことです。ただし、切り出した先頭と末尾の振幅がゼロとは限りません。たとえば波形が0.7のところで突然始まり、別の高さで突然ゼロへ戻ると、スピーカーの位置が一瞬で跳びます。この不連続が広い周波数成分を生み、「プチッ」というクリックノイズになります。

そこで各グレインには窓関数を掛けます。窓関数とは、短い区間の両端をゼロへ絞るための振幅の形です。Hann窓なら、長さ $N$ のグレインの $n$ 番目へ掛ける値は $w(n)=0.5-0.5\cos(2\pi n/(N-1))$。先頭で0から立ち上がり、中央で1になり、末尾でまた0へ戻ります。

窓なしではグレインの両端が垂直に切れてクリックノイズが出るのに対し、Hann窓ありでは振幅が山型に立ち上がって中央で最大となり、末尾へなめらかに消える対比図

窓を掛けると切れ目は消えますが、1粒だけでは両端が無音になります。そこで次の粒を少し早く始め、窓の山どうしを重ねます。粒の長さを表すgrain sizeを短くすると、凍結位置の細かな質感を拾いやすく、金属的で粒立った音になりやすい。長くすると元の音程や声らしい響きが残りやすい一方、元の時間変化も少し抱え込む。この数十ミリ秒の選び方が、静止した音の輪郭を決めます。

密度を上げると粒が連続音になる

1秒あたりに鳴らすグレイン数をdensity(密度)と呼びます。密度が低く、前の粒が消えてから次が始まる状態では、耳は一つひとつを「プッ、プッ」と分かれた音として追えます。密度を上げて複数の窓が重なると、どれかの粒が常に鳴っている状態になり、粒の列は切れ目のない持続音へ変わります。この重なりがオーバーラップです。

低密度では山型のグレイン間に隙間があり粒として聞こえる一方、高密度では複数のグレインが重なり、合計振幅がなだらかで連続した帯になる対比図

密度は多ければ多いほどよいわけではありません。同時に鳴る粒が増えると振幅も足し合わされるので、音量をそのままにするとクリップします。実装では重なり数に応じて各グレインのゲインを下げるか、出力側で余裕を持たせます。密度が低い領域では粒のリズムが、高い領域では滑らかな面が聞こえる。この点から線、線から面への変化が、グラニュラー処理の面白さです。

位置とピッチを散らすと音の雲になる

凍結位置を完全な一点に固定すると、まったく同じ断片が同じ周期で並びます。素材によっては規則性が耳につき、短いループのような「ブーン」という癖が出ます。そこで位置へごく小さなランダム幅を足します。position jitter(位置ジッター)とは、基準位置の前後からグレインの開始点を少しずつ選び直すばらつきです。

さらに各グレインの再生速度をわずかに変えるpitch spread(ピッチの散らばり)を加えると、粒ごとに音程が少しずつずれます。中心となる音は残しながら、同じコピーばかりが重なる規則性をほどけます。

中央のフリーズ位置の周囲からposition jitterで散らばった複数のグレインを取り出し、pitch spreadで高さを少しずつ変えて重ねると、出力側に揺らぎを持つ粒状の音の雲ができる図

これは空間の反射を写し取って残響を作る畳み込みリバーブ とは違う方向の質感作りです。畳み込みが部屋の応答で音を包むのに対し、Granular Freezeは音そのものを多数の小片へ分け、時間とピッチのばらつきで雲へ組み替えます。jitterを広げすぎれば元の瞬間から離れ、pitch spreadを広げすぎれば音程の芯が消えるので、自然なフリーズには「固定点の周囲をほんの少し曇らせる」程度が効きます。

Freezeという技法はどこから来たのか

音を粒として捉える考えは、デジタル音響より古く、1946〜47年に物理学者デニス・ガボールが提示した音響学的量子理論まで遡ります。音を微小な時間と周波数を持つ粒の集まりとして記述する理論でした。1959年には作曲家ヤニス・クセナキスが、録音テープをはさみで細かく切って貼り直すという物理的な方法で、手作業のグラニュラー合成を実現します。

1975年、カーティス・ローズはグラニュラー合成を初めてコンピュータ上で実現しました。計算機の中なら、粒の位置、長さ、密度、ピッチを大量に制御できます。ローズは2001年の著書『Microsound』で、この音符より小さな時間領域の理論、歴史、作曲技法を体系化しました。

エフェクトとしてのFreezeを考えるうえで重要な実例が、フランスの電子音響音楽研究機関GRMに由来するGRM ToolsのFreezeです。約30秒のバッファへ音を取り込み、その中の一区間を指定して、ループ、重ね合わせ、ピッチシフトをしながらリアルタイムに動かせます。内部ではバッファを数サンプル単位までグラニュラー化して重ね、時間を留める効果を作ります。GRM Toolsの原型はユーグ・ヴィネが作り、1994年以降、エマニュエル・ファヴローらによってプラグイン化されました。FreezeやShufflingは、今日のグラニュラー系エフェクトへつながる源流のひとつです。

現在の制作環境にも同じ考えはあります。Ableton Live標準のGrain Delayは、入力を小さな粒として取り込み、指定時間後に粒ごと再生するエフェクトです。Frequencyがgrain sizeをHzで表し、ピッチシフトや時間・ピッチのばらつきを調整できます。AbletonのGranulator(Max for Live)は、サンプルを短い断片に分け、重ね合わせとクロスフェードで再生するグラニュラーシンセサイザーです。道具の名前や目的は違っても、「どこから粒を取り、どのくらい重ね、どれだけ散らすか」という設計は共通しています。

録音で聴くフリーズの質感

道具の話が続いたので、最後に「この質感を丸ごと聴かせてくれる音楽」を少しだけ紹介します。グラニュラー・フリーズは、前回のTape Stop のAvicii「Levels」のように誰もが知るヒット曲の決め技になっているわけではありません。むしろ音を細かい粒に崩して時間を宙づりにする、その手触りそのものを味わうタイプの音楽で生きます。下の2枚は、まさに「粒の雲」が作品まるごとに広がっている代表格です。

坂本龍一『async』のアルバムジャケット

坂本龍一 / 2017

async

晩年の坂本龍一が、ピアノや環境音を断片的・粒状に扱ってつくったアルバム。音が一点で漂ってなかなか前へ進まない場面が随所にあり、日本の耳になじみのある入口としても聴きやすい一枚です。

Fennesz『Endless Summer』のアルバムジャケット

Fennesz / 2001

Endless Summer

ギターの音をノートパソコンで粒に砕き、真夏の光のような音の雲へ組み替えた一枚。この記事で作った「固定点の周囲をほんの少し曇らせる」質感が、そのまま一続きの音楽として立ち上がっているのが聴けます。

ジャケット画像はMusicBrainz / Cover Art Archive由来の画像を記事内に同梱して配信しています。

宣伝を少しだけ。Harmonizeは筆者が個人開発している音感トレーニングアプリです。この記事のグラニュラー合成機能を持つアプリではありませんが、音を聴き分ける練習の道具として公開しています。

触ってみる

デモでは、まず音を鳴らしてからFreezeを有効にし、波形上の位置が一点に留まる瞬間を見てください。入力は先へ進んでいるのに、出力はその周囲の粒を鳴らし続けます。grain sizeを短くすると粒立ちが細かく硬くなり、長くすると素材の音程や響きが残りやすくなります。

うまく表示されないときは、デモを別タブで開く

densityを下げると、窓の山と山の間が開いて、持続音が粒の連打へほどけます。反対に上げると粒が重なって面になります。position jitterは凍結位置の周囲をどこまで探すか、pitch spreadは粒ごとの再生速度をどこまで散らすかを決めるつまみです。最初は両方をゼロにして短いループ感を確かめ、それから少しずつ広げると、固定された一点が揺らぐ雲へ変わる順序を追いやすくなります。

どう実現するか

実装の中心は、長い音を一度再生することではなく、短い再生を少し先まで次々に予約するグレインスケジューラです。基準となるフリーズ位置 freezePos に小さな乱数を足して開始位置を決め、Hann窓を掛けた粒を hop 秒ごとに並べます。

const hann = Float32Array.from({ length: 128 }, (_, n) =>
  0.5 - 0.5 * Math.cos(2 * Math.PI * n / 127)
);

function scheduleGrain(when) {
  const offset = freezePos + random(-positionJitter, positionJitter);
  const rate = 2 ** (random(-pitchSpread, pitchSpread) / 12);

  const grain = audioCtx.createBufferSource();
  const envelope = audioCtx.createGain();
  grain.buffer = capturedBuffer;
  grain.playbackRate.value = rate;
  envelope.gain.setValueCurveAtTime(hann, when, grainSize);

  grain.connect(envelope).connect(audioCtx.destination);
  grain.start(when, offset, grainSize);
  grain.stop(when + grainSize);
}

for (let when = audioCtx.currentTime; when < audioCtx.currentTime + 0.1; when += hop) {
  scheduleGrain(when);              // hopを短くするほど密度と重なりが増える
}

AudioBufferSourceNodeは一度だけ再生する部品なので、グレインごとに新しく作ります。start(when, offset, duration)offsetを進めれば通常再生、同じ値の周囲へ留めればフリーズです。各粒をGainNodeへ通してHann窓を掛ければ切れ目のクリックを防げます。実際にはスケジューラを短い間隔で呼び、常に現在時刻の少し先まで予約しておくと、画面描画の揺れから音のタイミングを守れます。

粒を鳴らし続けても、読み出す場所を進めなければ時間は進みません。Granular Freezeは、音を止めずに「音の中の時計」だけを止める技法です。

参考文献