REAPERのJSFXでステレオ・オシロスコープ作ってみた

REAPERのプラグインを簡単に書けるJSFXという仕組みがあります。それをつかってステレオ音源のオシロスコープ(リサジュー曲線)を描くプラグインを書いてみました。やっていることは

  1. ディレイライン2ch分のオーディオ信号を溜める
  2. それを使ってグラフ描画

だけです。しかもディレイラインDelay, Basic Ring Buffer | JSFX Plug-Ins に書いてあったリングバッファをほぼほぼ持ってきただけです。ただ、今回はリングバッファの特色を使っていないですし、もっと効率の良い書き方に工夫できそうですね。

f:id:amarui:20180626124640g:plain

desc: maruware Oscilloscope (stereo)

@init
bufL = 0;
bufR = srate;
bufposW = 0;
buflength = srate * 0.025;

@sample
s0 = spl0;
s1 = spl1;
bufL[bufposW] = s0;
bufR[bufposW] = s1;
bufposW = bufposW + 1 ;
bufposW > buflength ? bufposW = 0;

@gfx 480 480
gfx_r = 0.4;
gfx_g = 0.4;
gfx_b = 0.4;
gfx_x = 0;
gfx_y = 0;
gfx_lineto(gfx_w/2, gfx_h/2, 1);
gfx_lineto(gfx_w, 0, 0);
gfx_x = gfx_w/2;
gfx_y = 0;
gfx_lineto(gfx_w/2, gfx_h, 1);
gfx_x = 0;
gfx_y = gfx_h/2;
gfx_lineto(gfx_w, gfx_h/2, 1);

gfx_r = 0.7;
gfx_g = 1.0;
gfx_b = 0.4;
gfx_x = gfx_w / 2;
gfx_y = gfx_h / 2;
n = 0;
while (n < buflength) (
  bx = -0.5 * bufL[n] + 0.5 * bufR[n];
  by = -0.5 * bufL[n] - 0.5 * bufR[n];
  px = (bx + 1.0) * gfx_w / 2;
  py = (by + 1.0) * gfx_h / 2;
  gfx_lineto(px, py, 1);
  n += 1;
);