September 9, 2019

ORCΛとSonic Piで変態エフェクターを作ろう

動機

ブティック系エフェクターが好きで、ギズモ屋さんknobs等で個性的で美しい音色のエフェクトペダルが紹介されるたびに胸躍らせてしまうのですが、1つ1つがそれなりのお値段なので物欲のままにあれこれ買い揃えるのは厳しい(というか1個買うのも結構ハードルが..)でもそれっぽい音は鳴らしたい!!という気持ちがありました。
一方、Sonic Piのv3.0から live_audio という関数が導入され、オーディオインターフェースからの入力をSonic Pi上でシンセとして扱うことができる様になりました。これでSonic Pi上からエフェクトをかけられる!!
また、ORCΛというElectron製でMIDIやOSCなどの信号をSonic Piなど外部に簡単に飛ばせるツールがあることを最近知りました。これで任意のタイミングでランダムに信号を飛ばせる!!

ブティック系エフェクターの中で個人的に特に好きなのが、エフェクトに対するパラメータのランダマイズ機構を持っているものだったりします(本記事タイトルの変態に相当)。
ORCΛとSonic Piを使ってパラメータをランダマイズした空間系エフェクトをかけつつ、好みの音像を作れるか試行した際の手順をまとめたのが本記事です。

環境

  • Mac OS X Mojave 10.14.6
  • Sonic Pi 3.1.0
  • ORCΛ 0.1.0
  • エレキギター(任意. 検証時はフェンダージャパンのテレキャスターを使用)
  • オーディオインターフェース(任意. 検証時はFOCUSRITEのScarlett 2i2 G2を使用)

※ORCΛの詳しい説明やORCΛとSonic Piのインストール/連携手順等については、以下の記事でまとめて下さっている方がいたのであらかじめご参照下さい。本記事での同様の記載は割愛します。
ライブコーディングツール「ORCΛ」と「SonicPi」の連携(備忘録、初心者向け)

オーディオインターフェースを接続後、 システム環境設定→サウンド から入力を接続したオーディオインターフェースに指定すれば準備はOKです。

ORCΛ

エフェクトのパラメータをランダマイズするにあたって、ORCΛから任意のランダムな信号を送り
Sonic Pi側で信号を受けてエフェクトのパラメータにセットする構成としました。

ORCΛ側で以下の様に信号を飛ばします。


ORCΛでは大文字の英単語と特定の記号がそれぞれコマンドになっています。
* はbangと呼ばれる信号の発火を行うコマンドで、 = で繋いだ値を送付します。
上記では、D(delay) コマンド(左右の引数を元にbangを行うタイミングを制御する)と
R(random) コマンド(左右の引数の範囲内の値をランダムに下部に出力する)を使用し
vと命名した配列にランダム値を格納した状態で1frame毎に信号を飛ばしています。

Sonic Pi

Sonic Piを立ち上げた状態で、右側Cueの部分にORCΛから送られた信号が確認できます。
以下でSonic Pi側で送られた信号をエフェクトのパラメータに指定し、オーディオインターフェースからの入力に
エフェクトをかけます。

require 'bigdecimal'

use_bpm 120

live_loop :bizzare_effect do
  use_real_time
  v = sync "/osc:127.0.0.1:orca側のポート番号/v"
  delayTime = (BigDecimal(v[0].to_s) * BigDecimal('0.1')).to_f
  sampleLength = (BigDecimal(v[0].to_s) * BigDecimal('0.1')).to_f
  reverbDepth = (BigDecimal(v[2].to_s) * BigDecimal('0.1')).to_f
  puts "delayTime: #{delayTime}"
  puts "sampleLength: #{sampleLength}"
  puts "reverbDepth: #{reverbDepth}"
  # delay
  with_fx :echo, amp: 1.0, decay: 5, phase: delayTime do
    # reverb
    with_fx :reverb, amp: 1.0, room: reverbDepth  do
      # reverse用に録音
      with_fx :record, buffer: buffer[:buff, 8] do
        live_audio :guitar, input: 1
      end
    end
    sleep 0.2
  end
  sleep 6
  # reverse
  sample buffer[:buff,8], rate: -sampleLength * 3, sustain: 3,  amp: 1.0, beat_stretch: 4, threshold: 90
end
  • use_real_time で、Sonic Piのデフォルトのレイテンシ設定を無効にしておきます。1
  • v = sync "/osc:127.0.0.1:orca側のポート番号/v" で、ORCΛから送られたOSC信号の配列を変数に格納します。
    ※実際の信号のパスは、Sonic Piの右ペインのCueに表示されるパスに読み替えて下さい。
    取得した配列のうち0番目の要素をdelayの間隔と後述するSample再生の長さ、2番目の要素をreverbの深さとして持っておきます。
    また、この際そのままだと整数値の為パラメータとして大きいので、小数値に変換しています。
  • with_fx の部分でそれぞれのエフェクトの引数に上記の値を渡します。
    ここで同時に、Sample再生に使用する入力の録音を record で行います。
  • live_audio :guitar, input: 1 でオーディオインターフェースからの入力を取得します。
    guitarの部分の名称は任意です。 input: 1 はオーディオインターフェースの入力設定になります。今回はmono入力としています。2
  • sleep 0.2 の間隔でループ処理が行われ、上記のエフェクトが更新されます。また、次のsleep後に record で録音した入力のreverse再生を行います。
  • sample buffer[:buff,8], rate: -sampleLength * 3, sustain: 3, amp: 1.0, beat_stretch: 4, threshold: 90
    録音の再生は sample で行い、この際 rate に負数を渡す事でreverse再生となります。sampleLengthを負数で設定します。

このコードを実行する事で、入力音の加工と再生が行われます。

結果

実際に鳴らした結果がこちらです。

やったぜ。

所感

見えている課題として、delayの間隔が変更されるタイミングでクリップノイズの様な細かいノイズが乗る場合があります..(ダメじゃないか)
演奏形態がノイズミュージックであったり、他の楽器と合わせたライブ演奏時の出音ではそこまで気にならないかもしれませんが個人録音ではやはり気になるかも。内部で何が起こっているかはSuperColiderの実行ログを当たれば分かる気がしますが、追いかける必要はありそうです。(素直にPOSSESSED買うか.. いや…)
一方、reverse再生は再生する長さを可変とした場合も綺麗に鳴ってくれました。(主観ですが)一般的なエフェクターだと固定長のreverseであったりloopと合わさる場合が多く、原音を維持したまま動的に長さや録音を変えつつコールアンドレスポンスの様に再生するには頑張りが必要な印象です。今回その点が簡単に出来たことは収穫でした。
また、エフェクトを自分の好きな様にかけられること自体に可能性を感じました。LiveCodingというとIDE上で自前で生成したシンセを使用するミニマル/テクノ系の演奏のイメージが強いですが、楽器演奏者からしても新しい音作りに応用できそうです。

+----- Share ? -----+

© YK 2023

Powered by Hugo & Kiss.