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;
);

PinkTSP信号をJuliaで作る

Julia言語でPinkTSP信号を作るプログラムを書いた。とは言っても、以前書いたMatlabのものをそのまま移植しただけ。そもそも参考にしたのは以下の文献。

  • 藤本卓也. “低域バンドでのSN比改善を目的としたTSP信号に関する検討.” 日本音響学会研究発表会講演論文集, pp.433–432. 1999年9月.
  • 守谷直也, 金田豊. “Logarithmic TSP 信号を用いた高調波歪の検討.” 日本音響学会研究発表会講演論文集, pp.637–638. 2004年3月.

最低でも2秒間の信号(4回の同期加算)を44100Hz/16bitで欲しいときには

julia> pinktsp_generate(2.0, 44100, 16, 4);

とすると、pinktsp_2972msec_44100Hz_16bits_4times.wavというファイルができる。1回あたりの信号長は2秒よりも長い2の累乗の長さになるようにしてあるので、結果として217÷44100=2.972秒となる(2の累乗の信号長にしておくとFFTが効率よく使えるので)。掃引方向を上向きにしたり(上記守谷文献参照)、スピーカ再生時にクリックノイズが出ないようにしたり、実務上の理由によりオリジナルの藤本文献とは違うことをいくつかしている。

f:id:amarui:20180513145808p:plain

この信号を使って録音したものをインパルス応答に戻すプログラムはまだ書いてない。また後日、時間があるときに。

コードは以下。

続きを読む

本日の給油(スーパーカブ110プロ/JA07)

給油日 オドメーター (km) 給油量 (L) 単価 (円/L) 燃費 (km/L) 距離単価 (円/km)
2017-03-18 8559.6 2.76 125.72 45.94 2.74
2017-04-29 8703.9 2.77 127.80 52.09 2.45
2017-04-29 8905.9 3.21 128.97 62.93 2.05
2017-04-30 9032.5 2.20 131.82 57.55 2.29
2017-05-01 9190.3 2.70 127.04 58.44 2.17
2017-05-01 9325.7 2.52 128.97 53.73 2.40
2017-05-01 9469.7 2.17 129.03 66.36 1.94
2017-05-02 9625.3 3.71 133.96 41.94 3.19
2017-05-02 9787.8 2.81 125.98 57.83 2.18
2017-09-15 10004.7 3.09 123.96 53.03 2.34
2017-10-04 10152.2 2.08 125.96 70.91 1.78
2017-10-18 10314.9 3.42 125.73 47.57 2.64
2018-05-05 10499.5 3.18 137.74 58.05 2.37

実に半年ぶりの給油。乗ってなかったのだなぁ。去年の同時期から1年間で1,000 kmも走ってない。

DSP.jlに対応した低域フィルタ

引き続きJuliaネタです。前回は、Bristow-JohnsonのパラメトリックEQを自作のfreqz関数で可視化してみました。

marui.hatenablog.com

ただ、プログラミング言語を使う際には長いものには巻かれておいたほうが良いので、Juliaのエコシステムで言及されているJuliaDSPに対応したものに更新したいと思います。フィルタ設計などで特に使うのはDSP.jlです。

続きを読む

パラメトリックEQ

先日Juliaでフィルタの可視化をしたけれど、あの時点ではまだフィルタの設計はMatlabに頼っていた。今回はRobert Bristow-Johnson氏の名作をもとに、パラメトリックEQを作る。ただし、今日ここに紹介するのはピークフィルタのみ。

続きを読む

Maxで使えるJavaのバージョンが8になっていた

Ableton/Cycling'74のMaxでは、いくつかの(Max以外の)プログラミング言語を使えるようになっています。Cycling'74が公式にサポートしているものにはJavaJavaScriptLuaがあり、エクスターナルを書くことを考えるとC/C++もあります。Max専用のDSLとしてGenExprもありますね。

Mac向けのMaxでは、Appleが用意していたJava 6だけがサポートされていて、Oracle版のJava 7以降はMaxでは使えないという状況が続いていました。Ableton/Cycling'74のユーザーフォーラムにも「Is installing Apple Java SE 6 unavoidable to use Max for Live on Mavericks?」などのスレッドが立っていて、セキュリティの心配があるJava 6を使わないといけないことへのJavaユーザの不満が綴られています。(Windowsではこの問題はなかったようで、新しいJavaへの対応は進んでいたようです)

そのスレッドに数ヶ月前、「Max 7.3ではOracle Javaの新版をサポートしたみたいだよ」とリンク(https://cycling74.s3.amazonaws.com/support/java_install.html)が張られました。Max 7.2.5Max 7.3.0のリリースノートを読み比べると、Java対応に関しての記述が変更されています。このリンク先をザックリまとめると、

となっています。ただ、文書内のJavaバージョンは「jdk1.8.0_91」となっていて、macOS 10.13 High SierraならびにJava 9の登場前のドキュメントっぽいです。

ためしに、今日時点で入手できるJava 8の最新版JDK 8u151をmacOS 10.13にインストールして試してみました。

$ java -version
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

で、/Application/Max.appについて「情報を見る」で「32ビットモードで開く」をオフにします。(下記スクリーンショットではオンになっています)

f:id:amarui:20171023123808p:plain

すると、ちゃんとmxj~のヘルプも動いてくれるようになりました。

f:id:amarui:20171023124057p:plain

ただ、64ビットモードにするといくつかのオブジェクトが動作しなくなる問題があります。また、Java 8で自作エクスターナルを作ったとしても、他の人に使ってもらうためにはJava 6への下位互換性を考慮して「javac -target」の指定をする必要がありそうです。

なお、Max 7のオンラインドキュメントにはmxjとmxj~のリファレンスが見つからない状態になっていますし、ローカルにインストールされているチュートリアルやドキュメントはMax 4時代から更新がなさそうで、今後のJava対応に関しては悲観的ではあります。ちなみにJava関連の一式は /Applications/Max.app/Contents/Resources/C74/packages/max-mxj にインストールされています。

*1:2015とあるけど中身のバージョンは2013年から変更なしのJava SE 1.6.0_65です。

本日の給油

給油日 オドメーター (km) 給油量 (L) 単価 (円/L) 燃費 (km/L) 距離単価 (円/km)
2017-03-18 8559.6 2.76 125.72 45.94 2.74
2017-04-29 8703.9 2.77 127.80 52.09 2.45
2017-04-29 8905.9 3.21 128.97 62.93 2.05
2017-04-30 9032.5 2.20 131.82 57.55 2.29
2017-05-01 9190.3 2.70 127.04 58.44 2.17
2017-05-01 9325.7 2.52 128.97 53.73 2.40
2017-05-01 9469.7 2.17 129.03 66.36 1.94
2017-05-02 9625.3 3.71 133.96 41.94 3.19
2017-05-02 9787.8 2.81 125.98 57.83 2.18
2017-09-15 10004.7 3.09 123.96 53.03 2.34
2017-10-04 10152.2 2.08 125.96 70.91 1.78
2017-10-18 10314.9 3.42 125.73 47.57 2.64