2017年09月17日

ルトスワフスキ「パガニーニ変奏曲」公開

 ルトスワフスキの「パガニーニの主題による変奏曲」を YouTube で公開した。

20170917-1.png

 著作権保護期間中の楽曲の場合は、ブログに埋め込みをしたらいかんそうです。個人が収入を得ずに運営するサイトであればいいのだけど、このブログは Amazon のアフィリエイトがあるからダメ。アフィリエイト外してもいいんだけどね。何の収入にもなってないし、そもそもアフィリエイトリンクを貼っているのは収入目当てじゃなくて、書影と書名等の情報がまとめてあって便利だという理由なので。

JASRAC による規約の解説はこちら:「動画投稿(共有)サイトでの音楽利用 JASRAC」

 念のために JASRAC の作品コードを「作品データベース検索サービス」で調べてからアップロードしたのだが、別に何も聞かれなかった。特別な手続きは必要ないみたい。

 ところで、楽曲を含む動画を YouTube アップロードすると、結構な確率で「著作権侵害の報告」に引っかかる。誰が調べているのか知らないけど(AI か?)、もう少し精度を高くしてほしい。いちいち異議申し立てするの面倒臭いんだからさ。先日アップロードしたバルトークのピアノ協奏曲も、「アランフェス協奏曲」か何かの動画の著作権を侵害している、というクレームが来た。全然似とらんやろ。

posted by toshinagata at 14:49| 日記

2017年09月16日

Alchemusica のリビルド詳細

 Alchemusica のビルド環境を Xcode 3.2.6 → 8.2.1 に変えるため、あちこち手を入れた。SDK は 10.5 → 10.12, deployment target は 10.6(10.5 用のビルドはできなかった)。あまり必要ない気もするけど、作業内容を一応メモしておく。

 Cocoa 関連の API 変更への対応。

  • NSImagecompositePoint 系を drawInRect に置き換え。respectFlipped というパラメータがある。これを使えば、NSImagesetFlipped (deprecated) を使わなくてもよい。
    [[MyPopUpButton triangleImage] compositeToPoint: NSMakePoint(theRect.origin.x + theRect.size.width - 7, theRect.origin.y + theRect.size.height - 2) operation: NSCompositeSourceAtop fraction: fraction];
    →
    NSRect r;
    r.origin.x = theRect.origin.x + theRect.size.width - 7;
    r.origin.y = theRect.origin.y + theRect.size.height - 7;
    r.size.width = 5;
    r.size.height = 5;
    [[MyPopUpButton triangleImage] drawInRect:r fromRect:NSZeroRect operation:NSCompositeSourceAtop fraction:fraction respectFlipped:YES hints:nil];
    
  • NSWindowcacheImageInRect などが deprecated。NSViewbitmapImageRepForCachingDisplayInRect:, cacheDisplayInRect:toBitmapImageRep: を使えば代用できるが、結局キャッシュする際も各サブビューの drawRect: を呼び出しているので、それなら普通に描画しても一緒じゃん、ということで、キャッシュイメージを使わない方法で書き直してしまった。
  • NSFontdefaultLineHeightForFontdeprecated. これには定石があって、NSLayoutManager のインスタンスを一つ作っておいてそれに問い合わせる。NSWindowController の拡張クラスメソッドとして sharedLayoutManager を実装した。
    [font defaultLineHeightForFont]];
    →
    [[NSWindowController sharedLayoutManager] defaultLineHeightForFont:font];
    

 それから、CoreAudio 関連の API 変更に対応。一番大変なのは、AUMIDIController 関連の API の変更だった。10.11 では警告は出るものの一応動いているのだが、だいぶ前から deprecated なので、この機会に大修正。AUMIDIController は、MusicDevice を元に作成して、CoreMIDI から見えるようにするもの。CoreMIDI のイベントスケジュール機能が使えるので楽だった。これを使わないとなると、MusicDeviceMIDIEvent(), MusicDeviceSysEx() を使って、自分でイベントのスケジューリングをしないといけない。

 まず、MusicDeviceRenderNotify コールバック関数を作って、それを登録する。

static OSStatus
sMDAudioSendMIDIProc(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList *ioData)
{ ... }
/*  登録方法  */
CHECK_ERR(result, AudioUnitAddRenderNotify(ip->unit, sMDAudioSendMIDIProc, ip));
/*  登録解除方法  */
CHECK_ERR(result, AudioUnitRemoveRenderNotify(ip->unit, sMDAudioSendMIDIProc, ip));

 このコールバック関数の中で、MusicDeviceMIDIEvent() を使ってイベントを送る。

OSStatus MusicDeviceMIDIEvent(MusicDeviceComponent inUnit, UInt32 inStatus, UInt32 inData1, UInt32 inData2, UInt32 inOffsetSampleFrame);

 inOffsetSampleFrame は、コールバック関数に渡される inTimeStamp からのオフセット。これで、発音を開始するタイミングを指定することができる。サンプリング間隔の整数倍しか指定出来ないのが残念。ここは double で設計して欲しかった。(どうせ内部的には補間処理をしているはず)

 また、MusicDeviceSysEx() にはこの引数がない。SysEx を使って発音を制御する場合もあるので、ここもオフセットが指定できるように設計すべきだったと思う。

OSStatus MusicDeviceSysEx(MusicDeviceComponent inUnit, const UInt8 *inData, UInt32 inLength);

 コールバック関数は CoreAudio から呼ばれる。一方、MIDI イベントを送る関数は独立した pthread から呼ばれる。間にリングバッファを置いて、送り側からタイムスタンプ+MIDI データをバッファに書き出し、コールバック関数ではそのデータを取り出して処理するようにする。送り側の pthread はだいたい 0.1 sec 間隔ぐらいでまとめて処理しているので、リングバッファが一杯になることがある。そのとき、送ろうとしたMIDIイベントを取り下げて、次の処理のときにもう一度送れるようにしないといけない。また、コールバック関数の方は、基本的にはオーディオバッファ1回分の処理しかしないので、リングバッファ中のイベントがずっと先のタイムスタンプを持つ場合には、そのイベントを待たせないといけない。このあたりの処理がちょっとあいまいだったので、CoreMIDI を使うところも含めてかなり書き直した。

 一応 32bit では動くようになった。喜ばしいことに、前におかしかった SoundCanvas VA もちゃんと動作するようになった。Alchemusica 側で何か変な処理をしていたに違いない。

 64bit に移行しようとしていろいろ苦労したが、結局断念した。断念したのは、CoreAudio プラグインの CarbonView が表示できないんじゃないか、という懸念から。やってみたらできたのかもしれないけど、そのために必要な作業量を考えると、別に 32bit のままでいいんじゃない、と思った。10.11 でも 32bit で普通に動いてるしな。32bit アプリが一切動かなくなってから考えてもいいだろう。

タグ:Mac Alchemusica
posted by toshinagata at 20:04| 日記

2017年09月11日

Alchemusica リビルド:Sound Canvas VA ちゃんと鳴った!

 週末頑張って、Alchemusica を改訂しました。嬉しい効果は、Sound Canvas VA がちゃんと鳴ったこと!

 だいぶ前に「Sound Canvas VA の不具合」と称して書き込みをしたのだが、結局 Alchemusica の問題でした(同じデータで他のプラグインだと変な症状は出ないので、Alchemusica だけの問題とも言い切れないんだけど…)。ローランドさんごめんなさい。当該記事にも修正を入れておきます。

 なお、上の動画は、Alchemusica の出力を SoundFlower に設定して、QuickTime Player の「新規画面収録」でサウンド入力を SoundFlower にし、Alchemusica の画面を切り出して録画した。SoundFlower はいろいろなバージョンがあるので、自分の OS バージョンにあったものを探しましょう。"Yosemite/Mavericks/El Capitan/Sierra" 用バージョンが上のリンクからダウンロードできます。

posted by toshinagata at 00:08| 日記

2017年09月09日

Alchemusica をリビルド中

 Mac OS 10.11 にしてから Alchemusica の動作がおかしかったので、Xcode 8.2 でビルドし直している。一番変だったのは、ピアノロール画面で演奏中に演奏位置を示すマーカーが、通過した後に画面を乱してしまうこと。これは一部ロジックを書き換えて復旧した。それから、なるべく警告を減らすように修正。

 難敵なのは、AUMIDIController 関連の API。これは、10.5 から deprecated になっている。現在、32 bit だとまだ実装されているのだが、64 bit だと実装すらされていないため、64 bit でビルドするとコンパイルが通らない。仕方なく、今は 32 bit 限定でビルドしている。MusicDeviceMIDIEvent(), MusicDeviceSysEx() を使って、MIDI 演奏部分をかなり大幅に書き換える必要がある。これは後回しだな。

タグ:Mac DTM
posted by toshinagata at 00:58| 日記

2017年09月04日

ラズパイ用 3.5 インチ HDMI ディスプレイ:タッチパネルを使う

 以前に報告した HDMI 接続の 3.5 インチディスプレイ。タッチスクリーンを使いたくなったので、調べてみました。

 まず、/boot/config.txt に次の一行を書き加える。

dtoverlay=ads7846,cs=0,penirq=25,penirq_pull=2,speed=10000,keep_vref_on=0,swapxy=0,pmax=255,xohms=150,xmin=199,xmax=3999,ymin=199,ymax=3999

 リブートすると、タッチスクリーンが認識される。最近の Raspbian には最初からドライバが入ってるんですね。ただし、キャリブレーションはされていないので、位置はめちゃくちゃ。

 コンソールモードでは、ちょっと前に試した tslib を使うやり方でキャリブレーションできる。HDMI ディスプレイなので、TSLIB_FBDEVICE=/dev/fb0 であることに注意。

pi@raspberrypi:~ $ evtest
No device specified, trying to scan all of /dev/input/event*
Not running as root, no devices may be available.
Available devices:
/dev/input/event0:	ADS7846 Touchscreen
/dev/input/event1:	vnc-keyboard
/dev/input/event2:	vnc-abspointer
/dev/input/event3:	vnc-relpointer
Select the device event number [0-3]: ^C
pi@raspberrypi:~ $ sudo TSLIB_FBDEVICE=/dev/fb0 TSLIB_TSDEVICE=/dev/input/event0 ts_calibrate
xres = 800, yres = 480
Took 10 samples...
Top left : X = 3476 Y =  354
Took 8 samples...
Top right : X = 3523 Y = 3722
Took 10 samples...
Bot right : X =  502 Y = 3713
Took 11 samples...
Bot left : X =  514 Y =  381
Took 6 samples...
Center : X = 2011 Y = 2029
-27.441528 0.000618 0.208943
493.320007 -0.127012 0.000669
Calibration constants: -1798408 40 13693 32330220 -8323 43 65536 

 今回は X Window も使いたいので、そちらのキャリブレーションも必要。これは苦戦した。Web に出ている情報通りにやってもうまくいかない。結局、以下の方法に落ち着いた。まず、次のものをインストール。

pi@raspberrypi:~ $ sudo apt-get install xinput xinput-calibrator xserver-xorg-input-evdev

 次に、/usr/share/X11/xorg.conf.d に移動して、次のコマンドを実行。これは、libinput.conf よりも evdev.conf を後に読ませるため。

pi@raspberrypi:~ $ cd /usr/share/X11/xorg.conf.d
pi@raspberrypi:~ $ sudo mv 10-evdev.conf 45-evdev.conf

 さらに、同じディレクトリ中で、sudo nano 99-calibration.conf として、次の内容を入れておく。Option "Calibration" の行の数字は、ts_calibrate の時に画面に表示される X, Y の値を使う。

Section "InputClass"
    Identifier    "calibration"
    MatchProduct    "ADS7846 Touchscreen"
    Option    "Calibration" "502 3523 3720 354"
    Option    "SwapAxes"  "1"
EndSection

 念のため、デバイス番号を確認。これは ssh 経由ではなくて、X Window 上でターミナルを開いて実行すること。

pi@raspberrypi:~ $ DISPLAY=:0.0 xinput_calibrator --list
Device "ADS7846 Touchscreen" id=6
Device "vnc-abspointer" id=8

VNC 経由でアクセスしているため、vnc-abspointer が見えています。こちらをキャリブレーションしないように。

 デバイス番号は "6" だったので、これを指定してキャリブレーション。

pi@raspberrypi:~ $ DISPLAY=:0.0 xinput_calibrator --device 6
Calibrating EVDEV driver for "ADS7846 Touchscreen" id=6
    current calibration values (from XInput): min_x=502, max_x=3523 and min_y=3720, max_y=354

Doing dynamic recalibration:
    Setting calibration data: 98, 3952, 3885, 111
    --> Making the calibration permanent <--
  copy the snippet below into '/etc/X11/xorg.conf.d/99-calibration.conf' (/usr/share/X11/xorg.conf.d/ in some distro's)
Section "InputClass"
    Identifier    "calibration"
    MatchProduct    "ADS7846 Touchscreen"
    Option    "Calibration" "98 3952 3885 111"
    Option    "SwapAxes"  "1"
EndSection

 上に表示されている Option "Calibration" の値を使って、/usr/share/X11/xorg.conf.d/99-calibration.conf を書き直す。


pi@raspberrypi:~ $ sudo nano /usr/share/X11/xorg.conf.d/99-calibration.conf
...
    Option    "Calibration" "98 3952 3885 111"
...

 リブートすると、タッチパネルが X Window で使えるようになる。めっちゃ大変だったけど、これを一度経験しておくと、OS のアップデートで突然動かなくなったりしても(よくある)、対応できる。たぶん…。

タグ:Raspberry Pi
posted by toshinagata at 00:17| 日記

2017年09月03日

シマトネリコの剪定

 5月に剪定したばかりだけど、夏の間にもじゃもじゃ伸びてきたので、また剪定した。特に、花の咲いた後がオバケみたいに垂れ下がっていたのを切り落とした。また、向こう側が(日がよく当たるので)どんどん伸びていたのを重点的にカット。

20170903-1.jpg

 本当はこれぐらいの大きさにまとめたい。右が伸びているのは、少し離れたところにあるマンションからの目隠しのつもり。

20170903-2.jpg

 太い枝を切り詰めないといけないんだよな。5月の時の写真で見た方がわかりやすい。黄色の線のあたりで切り詰めたい。いっぺんにやるとまずそうなので、何年かかけて進めていくことになる。

20170903-3.jpg

 ナツミカンもちょっとどうしようもない感じになってきたので、「正しい形」にしていきたい。これも何年かかかりそう。先日妻の実家にお邪魔した時、庭のナツミカンがすばらしく美しく剪定してあったので、参考にさせてもらおうと思っている。

20170903-4.jpg
タグ:園芸
posted by toshinagata at 15:06| 日記