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| 日記

2017年08月29日

ラズパイ+LuaJIT でゲーム

 ラズパイ+LuaJIT でゲームを作ってみました。

 大昔に8ビットマイコン用に作ったゲームのリメイクです。といっても誰も覚えてないけど。

 ジョイスティックを使って操作できるようになっています。キーボードでも遊べるけど、めっちゃ不便。

20170829-1.jpg

 ソースリストは https://github.com/toshinagata/rpi-ljsc にあります。cd examples; luajit fish.lua でどうぞ。

posted by toshinagata at 23:23| 日記

2017年08月20日

福岡・長崎旅行

 福岡・長崎に家族旅行に行ってきました。

 博多駅前に前泊。朝は西日本新聞。地元の新聞を読むのはいつも楽しみです。

20170820-1.jpg

 初日は、博多駅バスターミナルから西鉄バスで太宰府へ。バスは非常に混んでいました。高速を走るのに立ち客がいっぱいいたけど、いいのか? なお、半分ぐらいはアジア系の外国人だった。

 太宰府天満宮の太鼓橋。

20170820-2.jpg

 本殿への参道。

20170820-3.jpg

 お土産をいろいろと購入したあと、巡回バス「まほろば号」に乗って、竈門(かまど)神社に移動。ここが一味違った雰囲気で、たいへんよろしゅうございました。めちゃにぎわっている天満宮とは対照的に、ほとんど参拝客がいない。

20170820-4.jpg

 不思議な文が刻まれた参道の石碑。右に「春秋厳祭享」、左に「上下肅容儀」。意味はわからないが、「祭享」は祭り、「容儀」は容姿、「肅」はおごそかなさまを表すようだ。「春秋の祭事の時には身なりをちゃんとせい」みたいな意味なんでしょうか?

20170820-5.jpg

 このあと、太宰府市内に戻って、九州国立博物館を見学した。メイン建物の写真を撮り損ねたので、ホームページのスクリーンショットにてご勘弁。

20170820-6.jpg

 特別展(ラスコー展)はパスして常設展示だけを見たが、非常に面白かった。いわゆる「国立博物館」(=国立文化財機構直轄の博物館)の中では唯一の歴史系博物館ということだが、太宰府市の歴史的な位置付けも踏まえて、大陸との関連に多くのスペースが割かれている。

 2日目は特急かもめで長崎へ移動。

20170820-7.jpg

 ちゃんぽん発祥の店とされる「四海樓」で昼食。とても混んでいて、席につくまで40分ぐらい、注文してから運ばれてくるまでさらに20分ぐらい待ったかな。ちゃんぽんの味は、可もなく不可もなく、といったところ。麺はおいしいんだけど、スープがなんだか単調な味だった。もっとおいしいちゃんぽんを出す店が長崎にはあると思う。なお、窓際の席だったので、長崎港が一望できました。豪華客船が泊まっていた。

20170820-8.jpg

 路面電車を乗り継いで平和公園へ。ここに来るのは2回目なんだけど、前回は雨が降ってたんだよな。平和祈念像の背景は、やはり雲ひとつない青空がふさわしい。

20170820-9.jpg

 坂の上から浦上天主堂を望む。

20170820-10.jpg

 原爆死没者追悼平和祈念館に移動。坊が「ここも水なんだね」と一言。平和公園の入り口の「平和の泉」とモチーフが共通だ、ということ。原爆被害者にとって「水」が特別な意味を持つことに気づいてくれてよかった。

20170820-11.jpg

 再び路面電車を乗り継いで思案橋に移動、夕食にした。「ごまさば」が絶品。博多でもごまさば丼を食べたのだが、こちらの方がずっと鮮度が高い感じだった。博多あたりの鮮魚は長崎から送られているものも多いので、長崎の人は「魚のうまさでは福岡には絶対負けない」と思っているとのこと。ちなみに、サバの生食は九州独自の文化のようですね。

 ホテルに一旦戻った後、バスで稲佐山ロープウェイの登り口に移動して、稲佐山の夜景を鑑賞。天気が良くて、非常によく見えました。パノラマ写真を撮ってみた。ピントがイマイチだけど。

20170820-12.jpg

 翌日は、大浦天主堂からグラバー園へ。旧三菱第2ドックハウスから長崎港を望む。

20170820-13.jpg

 その後、眼鏡橋を見学。

20170820-14.jpg

 橋はほかにもいっぱいあるのに、眼鏡橋ばかりが有名なのは、なんだか不憫な感じがする。たとえばこの橋だって素敵じゃないですか。2つ北側にある東新橋。

20170820-15.jpg

 昼食は皿うどんのつもりだったが、予定を変更してトルコ風ライスのお店へ。コミックでも紹介されたという「ビストロ・ボルドー」に行った。11:30 過ぎに入ったのだが、40 分ぐらい待った。店主が一人で調理も接客も後片付けもやっているので、回転が非常に遅い。昼過ぎに行ったらまず入れないだろう。店主も客も心得た様子で、「1時間ぐらい待ってもらうけどいい?」「あ、じゃあやめとく」というような雰囲気だった。味は、すこぶる上品な味付けで、たいへんよろしかった。店主のにこやかな様子がまたいい。

 帰りは、特急かもめ、新幹線のぞみを乗り継いで、9時過ぎに名古屋に到着。今日は休んで疲れをとって、明日から仕事再開です。

タグ:お出かけ
posted by toshinagata at 14:41| 日記

2017年08月16日

Alchemusica をビルドし直した

 ラズパイで音を出す実験をしていて、音サンプルの作成に Alchemusica を立ち上げたら、なんかめちゃくちゃだった。一応動くのだが、画面が乱れたり、メニューがおかしくなったり。10.8 では大丈夫だったので、10.10 あたりからおかしくなったのかな。

 とりあえず、10.11 対応の Xcode 8.2.1 でビルドし直したところ、不具合は減ったみたい(なくなったかどうかはわからん)。10.5 はもう手元に動かせる環境がないので、10.6 で試したところ、こちらも動いている様子。ビルド時に 100 個以上警告が出ているので、じっくり見直した方がいいのだけど、時間がないな…。そもそもニーズがあるのかどうかもよくわからないし。

タグ:Mac
posted by toshinagata at 01:30| 日記

2017年08月14日

ラズパイ+AVR:自動水やり器完成

 自動水やり器、一応完成しました。別記事を書きました。→「自動水やり器の製作

20170814-1.jpg

 2日間ほど試験運用してみたところ、ちゃんと1日2回水やりができている模様。お盆の帰省中も、ちゃんと動いていてくれた。

 作ってから気がついたのだけど、水をやる設定時間がプログラム中にハードコーディングされているので、変更ができない。これは変更できるようにすべきだったな。小さいタクトスイッチ1個ぐらいなら追加できそうだから、「スイッチを長押ししたら時間設定モード」という仕様にはできるはず。まあ、今シーズンは今のままいけると思うので、来シーズンに向けての課題ということで。

posted by toshinagata at 19:06| 日記

2017年08月12日

さくらブログのスマホ対応(改良)

 以前にこのブログをスマホ対応にしたのだけど、いつの間にか、うまく見えなくなっていた。スマホで見ると、自動転送が無限ループしたような状態になってしまう。仕様が変わったんかなあ?

 少し試行錯誤して、一応見られるようにはなった。前と同様に、スマホサイトの「コンテンツ」は「自由形式」のみとして、その中身を下のように変更。

<SCRIPT LANGUAGE="JavaScript">
<!--
var url = location.pathname + "?from_sp";
if (document.referrer) {
  var ref = "referrer=" + encodeURIComponent(document.referrer);
  url = url + "&" + ref;
}
location.href = url;
// -->
</SCRIPT>

 ブログのパス名 (http://blog.d-alchemy.xyz/) に "?from_sp" をつけると PC 向けのサイトに誘導されるらしい。詳しくはよくわからないのだが、以前はクッキーでスマホ向けと PC 向けを区別していたのを、"?" 以下の文字列で区別するようになったのかな? とにかく、一応動くようになったので、しばらくこれで運用してみる。

 08/13 追記:やっぱりうまくいかない。これが正解か?

<SCRIPT LANGUAGE="JavaScript">
<!--
var url = location.pathname;
url = url.replace(/\/s\//, "/");
url = url + "?from_sp";
if (document.referrer) {
  var ref = "referrer=" + encodeURIComponent(document.referrer);
  url = url + "&" + ref;
}
location.href = url;
// -->
</SCRIPT>
タグ:ブログ
posted by toshinagata at 16:46| 日記

2017年08月09日

ラズパイ: Luajit で OpenVG を使う

 ラズパイ上のスクリプト言語の一つとして、Jun Mizutani さんに倣って、luajit を試してみた。これはいいですね。C のインターフェイスを内蔵していて、OS の共有ライブラリを直接呼べるのがいい。

 低レベル入出力関数の open() なんかも、こんな風に直接呼び出せるわけです。

local ffi = require "ffi"
ffi.cdef[[
  int open(const char* filename, int flags);
  int close(int fd);
]]
local O_RDONLY = 0
fd = ffi.C.open("/dev/input/event0", O_RDONLY)

 前にやった OpenVG のグラフィック描画 を、luajit で試してみた。Jun Mizutani さんの LjES を参考にした(一部コードを使わせていただいた)。

20170809-1.jpg

 昔の 8 ビットマイコンゲーム風動画。まだキャラクタが動いているだけだけど。

 コードはこちらに置いておきます。ラズパイ上でダウンロードして、tar xvfz ljsc_sample.tar.gz で展開して、cd ljsc_sample; luajit fish.lua で実行できます。

posted by toshinagata at 17:49| 日記

2017年08月06日

ラズパイのタッチパネル液晶:tslib を使う

 「ラズパイの液晶タッチパネルを使う」の続き。自前でキャリブレーションのプログラムを書いていたのだが、tslib を使えばいいじゃない、と今さらながら気がついた。ということで、再トライしてみた。液晶は前と同じで、Waveshare 3.2inch RPi LCD (B), 320×240

 まず、tslib のインストール。

pi@raspberrypi:~ $ sudo apt-get install evtest tslib libts-bin

 evtest でデバイス番号を確認。/dev/input/event0 だった。

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
Select the device event number [0-0]: 0

 ts_calibrate でキャリブレート。+印が5箇所に順に表示されるので、スタイラスでタッチする。

pi@raspberrypi:~ $ sudo TSLIB_FBDEVICE=/dev/fb1 TSLIB_TSDEVICE=/dev/input/event0 ts_calibrate
20170805-1.jpg

 ts_test でテスト。やっぱりX方向はノイジーで、ときどきポインタが飛んでしまう。

pi@raspberrypi:~ $ sudo TSLIB_FBDEVICE=/dev/fb1 TSLIB_TSDEVICE=/dev/input/event0 ts_test
20170805-2.jpg

 C で使おうとすると、もう一手間かかる。tslib のライブラリは /usr/lib/arm-linux-gnueabihf/libts-0.0.so.0 なのだが、これをフルパスで指定する必要があるみたい。また、tslib.h がどこにもインストールされていないので、必要な宣言をソースに埋め込む。

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
struct tsdev;
struct ts_sample {
  int x, y;
  unsigned int pressure;
  struct timeval tv;
};
extern struct tsdev *ts_open(const char *dev_name, int nonblock);
extern int ts_config(struct tsdev *);
extern int ts_read(struct tsdev *, struct ts_sample *, int);
extern int ts_close(struct tsdev *);

int main(int argc, const char **argv)
{
  struct tsdev *ts;
  ts = ts_open("/dev/input/event0", 1);
  if (ts == NULL) {
    printf("Failed to open /dev/input/event0.\n");
    exit(1);
  }
  if (ts_config(ts) != 0) {
    printf("Failed to configure touchscreen.\n");
    exit(1);
  }
  while (1) {
    struct ts_sample samp;
    if (ts_read(ts, &samp, 1) == 1) {
      printf("%d %d %d\n", samp.x, samp.y, samp.pressure);
    }
  }
  return 0;
}

 コンパイルして実行してみた。

pi@raspberrypi:~ pi@raspberrypi:~$ gcc -o tstest tstest.c /usr/lib/arm-linux-gnueabihf/libts-0.0.so.0
pi@raspberrypi:~$ ./tstest
133 180 65063
132 180 65104
131 180 65116
132 180 65114
135 186 0
^C
pi@raspberrypi:~$ 

 ここまで来れば簡単に使えるのだが、道のりが妙に長いな。Raspbian のパッケージで tslib をもう少しちゃんとサポートしてくれたら、楽に使えるんだけどな。

タグ:Raspberry Pi
posted by toshinagata at 11:01| 日記