段階的なランダム変調では、一定間隔で新しい値を選び、次の更新までその値を保持します。このREAPERのワークフローでは、合成音と小さなカスタムJSFXゲインエフェクトを使い、明示した間隔と範囲でランダムな音量変化を作成します。

ここで扱うのは、持続する1つの音の音量が、レベル間を連続的に滑らずに予測不能に変化するようにする、範囲を絞った作業です。以下の自動化手順では、エフェクトのプログラム全体を一度コピーする必要があります。後半では、REAPER標準のオートメーションエンベロープを使って、編集可能な繰り返し階段状パターンを作る方法を説明します。

ランダム変調を段階的にする要素

結果を決めるのは、値が変化するタイミング、新しい値の選び方、その値への移り方の3点です。この手順では、タイミングは一定、レベルは疑似ランダム、遷移は即時です。更新の合間は、ゲインが一定に保たれます。

例として、−15 dBを250ミリ秒保持し、次の250ミリ秒は−9 dBに切り替わり、その後−18 dBに切り替わるパターンが考えられます。これらの数値は動作を説明するための例であり、測定値でも、出力されるシーケンスの保証でもありません。

REAPERのパラメータ変調システムには、Speed、Strength、Phase、方向のコントロールを備えたLFOがあります。オートメーションシステムには、別途Squareのポイント形状があります。これらは異なるツールです。LFOの速度は変調レートを制御し、矩形エンベロープの区間はポイント間で保持される値を定義します。Up and Running: A REAPER User Guideの第18章と第19章を参照してください。

以下のカスタムエフェクトでは、コード内で値の保持動作を明示しています。ステレオのゲインを直接処理するものであり、あらゆるプラグインパラメータに使える汎用の段階的ランダム信号源を設定するものではありません。

持続する合成音を用意する

空のREAPERプロジェクトを作成し、トラックを1つ用意します。そのトラックのFXチェーンにReaSynthを追加します。REAPERの説明によると、ReaSynthはMIDIアイテムから演奏できるシンセサイザーなので、録音や外部の音声ファイルは必要ありません。コントロールには、出力音量、サステイン、波形ミックスがあります。The REAPER Cockos Effects Summary Guide, ReaSynth。

音源は次のように簡単に設定します。

  1. プロジェクトのテンポを120 BPMに設定し、4/4拍子で4小節の区間を使います。
  2. トラックを選択し、その4小節を覆うタイム選択範囲を作成します。
  3. Insert → New MIDI Itemを選びます。
  4. MIDIアイテムをダブルクリックしてMIDIエディターを開きます。ノートを1つ描き、右端をアイテムの終端まで伸ばします。
  5. ReaSynthで、まずVolumeを約−12 dB、Sustainを0 dBに設定します。シンプルな音にするため、Square mix、Sawtooth mix、Triangle mixはすべて0のままにします。

MIDIアイテムの作成と編集手順は、REAPER User Guideの第13章に記載されています。ここで挙げたテンポ、長さ、レベルは設定例であり、アプリケーション上の必須条件ではありません。

変調を追加する前に、この区間を再生します。トラックから持続音が出ることを確認してください。途中で音が止まる場合は、ノートの長さとサステインの設定を確認します。音源自体のレベルが一定に保たれていると、変化するゲインを評価しやすくなります。

各ランダムレベルを保持するエフェクトを追加する

JSFXは、テキストプログラムで記述するREAPER内蔵のエフェクトシステムです。REAPERは読み込み時にコンパイルするため、この例では外部のプログラミングライブラリは必要ありません。構成は公式のJSFX Programming referenceに準拠しています。

View → FX Browserを開きます。ブラウザーのFXメニューからCreate new JS FXを選び、Stepped Random Gainなどの区別しやすい名前を付けます。Edit JS FXでソースを開き、最初から入っている内容を以下のプログラム全体と置き換えて保存します。作成と編集のコマンドは、REAPER User Guideの16.16節に記載されています。

desc:Stepped Random Gain
slider1:250<20,2000,1>Step duration (ms)
slider2:-18<-60,0,0.1>Level endpoint A (dB)
slider3:-6<-60,0,0.1>Level endpoint B (dB)
in_pin:Left
in_pin:Right
out_pin:Left
out_pin:Right

@init
remaining = 0;
gain = 1;

@slider
interval_samples = max(1, floor(srate * slider1 / 1000 + 0.5));
low_db = min(slider2, slider3);
high_db = max(slider2, slider3);
remaining = 0;

@sample
remaining <= 0 ? (
  level_db = low_db + rand(1) * (high_db - low_db);
  gain = 10 ^ (level_db / 20);
  remaining = interval_samples;
);

spl0 *= gain;
spl1 *= gain;
remaining -= 1;

これは完全なステレオ音声エフェクトであり、コードの一部ではありません。トラックのFXチェーンでReaSynthの後に追加します。名前が見つからない場合は、FXブラウザーの検索フィルターを解除してください。

このプログラムはrand(1)を使って疑似ランダム値を取得し、その値を2つのdB端点の間に割り当てます。この言語の条件構文、べき乗演算子、乱数関数については、JSFX Programming Reference — Language Essentialsに記載されています。

カウンターはREAPERの現在のサンプルレートであるsrateを使います。カウンターが切れるまで、各サンプルには保存された同じゲインが適用されます。左右両チャンネルに同じゲインを適用するため、このエフェクトは左右のレベルを個別にはランダム化しません。REAPERのsrate、spl0、spl1については、JSFX Programming Reference — Special Variablesに記載されています。

プログラムはこれらの資料と照合して確認しました。カウンターの計算も44.1 kHzと48 kHzで個別に確認しましたが、この記事のためにJSFXをREAPER上で実行したわけではありません。

ステップの間隔とレベル範囲を設定する

まず、Step duration (ms)を250、Level endpoint A (dB)を−18、Level endpoint B (dB)を−6に設定します。この設定では、1秒間に4回、新しい減衰値が選ばれます。コントロールを変更しない限り、選ばれた値は間隔いっぱい保持されます。

端点は、シンセサイザーの後段に適用するゲインを指定します。出力メーターの目標値ではありません。たとえば、−6 dBは約0.501のサンプル倍率、−18 dBは約0.126のサンプル倍率に相当します。最終的な出力レベルは、音源信号と後段のトラック処理によっても決まります。

目指す動作 設定例 変化する内容
ゆっくりした明確な平坦区間 1,000 ms 1秒ごとに新しいレベル
中程度の段階変化 250 ms 1秒間に4回、新しいレベル
速い段階変化 125 ms 1秒間に8回、新しいレベル
レベル差を小さくする 端点を−9 dBと−6 dBに設定 選択範囲が狭くなる
比較用に減衰を一定にする 両端点を−6 dBに設定 どの選択でも同じゲイン

120 BPMでは、8分音符の長さは250ミリ秒です。60秒を120拍で割り、さらに2で割って求めます。これは計算例です。付属のエフェクトはミリ秒を使用し、テンポの変更には追従せず、ステップをプロジェクトの拍子グリッドにも合わせません。

端点はどちらの順序で入力しても構いません。プログラムが順序を整えます。スライダーを変更すると、次に処理されるサンプルから新しい間隔が始まります。ランダムなレベルは補間せずに保持されますが、連続して選ばれる2つの値が偶然近くなることもあります。

代わりに編集可能な繰り返し階段状パターンを作る

タイムライン上の正確な位置に正確な値を設定したい場合は、オートメーションエンベロープを使います。公開されているエフェクトパラメータに段階的な変化を適用する、REAPER標準の方法でもあります。REAPERのUser Guide第18章には、パラメータエンベロープとSquareポイント形状が記載されています。

固定の音量パターンを作る場合は、まずカスタムJSFXをバイパスします。トラックのエンベロープコントロールを開き、Volumeエンベロープを表示します。手動編集時は、トラックをTrim/Readのままにします。

Shiftを押しながらクリックして250ミリ秒間隔でポイントを作り、それぞれを不規則なレベルに移動します。ポイントを右クリックし、Set Point Shape → Squareを選びます。次の区間でも値を保持したいポイントすべてに、この形状を適用します。エンベロープに、水平な平坦区間とそれに続く垂直な変化が表示されるはずです。

別のエフェクトのパラメータを使う場合は、目的のコントロールを操作してから、Param → Show track envelopeを選びます。代わりにそのエンベロープにポイントを追加し、形状を設定します。パラメータメニューの操作手順は、The REAPER Cockos Effects Summary Guideに記載されています。

不規則な値を手動で配置すると、固定パターンが作られます。再生のたびに新しいランダム値が生成されるわけではありません。パターンを再利用するには、時間範囲を選択し、エンベロープを右クリックしてAutomation items → Insert new automation itemを選びます。REAPERはオートメーションアイテムのループと、編集内容がほかのコピーにも反映されるプールコピーに対応しています。REAPER User Guide, Automation Items。

滑らかな変化、変化の欠落、再現性をトラブルシューティングする

エンベロープにまだ傾斜がある場合は、次のポイントまでの形状を確認します。Linearはランプを作り、Squareはここで必要な保持区間を作ります。矩形LFOと、複数レベルを手動で描いた階段状パターンも、目的が異なります。2つのレベルを単純に交互に切り替えるだけでは、任意のレベル列にはなりません。

カスタムエフェクトで変化がはっきりしない場合は、ReaSynthの後に配置されていること、有効になっていること、端点に異なる値が設定されていることを確認します。構造を確認しやすくするには、ステップを1,000ミリ秒、端点を−24 dBと−6 dBに設定してみます。その後、プロジェクトに必要な範囲に戻します。

ゲインが急に変化すると、サンプル倍率も即座に変わるため、クリック音が発生する場合があります。このプログラムには意図的に平滑化処理を入れていません。レベル差を小さくすると不連続の大きさを抑えられることがありますが、クリック音がなくなる保証はありません。遷移ランプを追加すると、即時に段階変化する動作が変わります。

このエフェクトはステレオトラック用に設計されており、最初の2つのオーディオチャンネルだけを変更します。オートメーションポイントの書き込み、選択したランダムシーケンスの保存、値を少数のレベルに限定する機能、テンポ同期には対応していません。REAPERでは通常、再生開始時にJSFXの@initセクションが実行され、このプログラムはそこでカウンターをリセットします。再起動後に同じランダムシーケンスが再現されるとは限りません。JSFX code-section reference。

自動生成されたレベルを保持したい場合は、カスタムゲインエフェクトを使います。特定の変化を編集、反復、保存したい場合は、矩形オートメーションを使います。どちらの方法でも、合成音をはっきりした平坦区間ごとに変化させられます。新しい値の生成と正確なタイムラインパターンのどちらを重視するかで、使い分けてください。

出典