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

ハーフマラソン

第46回タートルマラソン国際大会ハーフマラソンの部を完走してきました。2014年10月の同大会のグロスタイムが2時間08分30秒(ネットタイム2時間00分11秒)で、今回がグロス2時間06分10秒(ネット2時間02分15秒)なので、それほど変わらず。ただ、数日前にギックリ腰をやったりして絶不調だったので、まぁまぁかなと。

グロスが短くなってネットが長くなったのには、スタート位置が少し前方になったことの影響があったのかも。

JavaScriptではじめてのグラフ描画

環境にできるだけ依存せずにグラフを描いたりしたいとなるとHTML5かなぁと思い、はじめてのJavaScript。まだ配列の使い方を調べていないので、sinもcosも直に計算&描画してます。

f:id:amarui:20171007110807p:plain

使ったHTMLファイルは以下。

続きを読む

本日の給油

給油日 オドメーター (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

燃費が良すぎて何かがおかしい気がする。長距離巡航だったけど、それにしても……。

MatlabのfreqzもどきをJuliaで

MatlabOctaveにはfreqzという関数があり、FIR/IIRフィルタの周波数特性・位相特性を計算しグラフ表示してくれます。PythonでもSciPy.signalに同名の関数があります。似たことをJuliaでやってみました。

今回は双二次フィルタを見てみましょう。標本化周波数44,100 Hz、中心周波数1,000 Hz、ゲイン12 dB、Q=2.0のピークフィルタを準備しました。

samprate = 44100;
B = [1.1417, -1.9797, 0.8583];
A = [1.0356, -1.9797, 0.9644];

特性を見たい周波数範囲を設定し、それをzさらにsへと変換して使います。ここでは16 Hz〜ナイキスト周波数を256段階の対数分割してみました。

# calculate frequency
# (using logspace since we are going to use semilogx for plotting)
fL = 16;
fH = samprate/2;
f = logspace(log10(fL), log10(fH), 256);
z = f / sampfreq * 2*pi;
s = exp.(-1.0im * z);   # convert from digital frequency

次に、各周波数での伝達関数の値を計算します。下の式に代入して計算するだけ。

f:id:amarui:20170927203946p:plain
[tex: H=\frac{b_0 + b_1 s + b_2 s2}{a_0 + a_1 s + a_2 s2}]

# calculate transfer function
H = (B[1] + B[2].*s + B[3].*s.*s) ./ (A[1] + A[2].*s + A[3].*s.*s);

Polynomialパッケージを使って汎用性を高めても良いのですが、僕の考えている使用用途は双二次フィルタだけなので、このままで。

さて、振幅特性をグラフにしてみましょう。abs.()で絶対値を計算してからデシベルにします。

using PyPlot
semilogx(f, 20*log10.(abs.(H)));
grid();
xlabel("Frequency (Hz)");
ylabel("Gain (dB)");
savefig("freqz_abs.png")

f:id:amarui:20170927145542p:plain

次に位相特性もグラフにしてみましょう。今度はangle.()で位相を抜き出し、ラジアンを角度に変換しています。

semilogx(f, angle.(H)*180/pi);
grid();
xlabel("Frequency (Hz)");
ylabel("Phase (angle)");
savefig("freqz_phase.png")

f:id:amarui:20170928163008p:plain

Matlabfreqzのグラフと見比べてみましたが、だいたい同じ結果になっているようでした。Matlab版は横軸が線形になっているので見た目が違いますが。 f:id:amarui:20170928162206p:plain