REAPERのプラグインを簡単に書けるJSFXという仕組みがあります。それをつかってステレオ音源のオシロスコープ(リサジュー曲線)を描くプラグインを書いてみました。やっていることは
だけです。しかもディレイラインは Delay, Basic Ring Buffer | JSFX Plug-Ins に書いてあったリングバッファをほぼほぼ持ってきただけです。ただ、今回はリングバッファの特色を使っていないですし、もっと効率の良い書き方に工夫できそうですね。
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; );