いまどきMIDIで苦戦中

このサイトでも常日頃お世話になっているMIDI。実はむかしむかし、仕事でそのシーケンサーを自作した事がある。最終的にそれはMIDIドライバからカーネルにまで踏み込み、テンポもキーも動的に制御可能なのに加え、どんな状況下でも発音のタイミングがモタつかないところまで磨きあげた。あれは我ながら傑作だったなー(… 遠い目)。

と、それぐらい自信のあったモノを今回、また作る事になった。プラットホームはRPi。リアルタイムな演奏に加え、あるデバイスの制御をする予定なのでSMFのパースからスタートした。しかし当時のリソースは何一つ残っていない。そこで記憶を頼りにゼロから、と思ったらその記憶が完全にすっ飛んでて、ほんとのゼロからとなってしまった。そこでまずはSMFの復習から。

「ふむふむ、チャンクね、トラックね、デルタタイムね」とその仕組みはすぐに思い出した(=何も変わってない)が、それを不慣れなPythonでやろうとしてハマった。それというのもSMF(というよりMIDI自体)の規格が80年代初期のそれなもんで、処理の単位がビットである。更には整数を可変長な形式とし、それらをビッグエンディアンでギチギチに詰めている。これをポインタのない最近の処理系で扱う、というところにもうかなりの無理と矛盾がある。

ラチがあかないのでCで書こうかとも考えたが、それはそれでまた後々手間がかかるだろうと思い、ここはまず手慣れたPHPでという事にした。結果、どうにか全てのイベントを拾い出すところまでは辿り着いたが、本当にやりたい事はまだまだこれから。ゴールは遠い。

特等席発掘の日

昨日はみなとみらいで「ナカザワキネン野庭吹奏楽団」の定期演奏会を聴いてきた。全席自由だが、前売り完売とかでこの日は2階席をオープンしていた。これまでここではいつも1階席に座っていたが、このホールの形状からして2階席の方がbetterなのではないかと思っていたので、試しに今回はその2階席の最前列ほぼ真ん中に席をとってみた。

結論から言うとこれ「アタリ!」だった。直接音と間接音のバランスが良くて、どよんとした感じにならない。手すりの下に集音用のマイクが固定されているのも、もしかするとそのためかも。尤も今回はやや小編成のブラスだったのでフルオケのffがどうなのかはまたいずれ検証するが、恐らく○だと思う。

おっと、肝心の演奏はといえばそりゃもう文句なし。オケのそれとはひと味違う楽しさは格別。入りも良かったし、このまま「みなとみらい名物」として定着してくれたらと願う。

# このホール、もうちょい家から近いといいんだけどネ …

Lチカは奥が深い

先に入手はしたものの、時間がなくて放ったらかしになっていたエレキットのフルカラーLED(カソードコモン)を、新たに仕入れたブレッドボードに刺しRaspberryPi2から点灯させてみた。推奨抵抗値が同梱の紙に書かれていたが、今回は全部270Ω(手元にあって使えそうなのがこれしかない)。むろんただ点灯では面白くないので「PWMを使ってフルカラーらしく」である。

配線後にPowerON。足も切っていないので危なっかしいが、ここに0.25秒間隔でRGBそれぞれのデューティ比を0から100までランダムに設定している。やはり青が暗いかな? という気はするが、まあ動いたので○。

ただこれで判明したのは「相手がLEDなのだし精度の高いPWMは不要とはいえ、やはりここで信号線を3本も使ってしまってはあまりに勿体無い」というありきたりの事実で、次は複数のLEDをシフトレジスタでコントロール …

なんてカッコ良く書いてるが、実はここまでで既に「うひょー!」な気分でいる。というのも、以前これに近い事をやろうとしてハマり、自前でオシロ買おうかと真剣に悩んだ挙句に挫折した事があったから。なので今回もハラハラもんでやっていたのが、呆気なく動いちまったという次第。いい時代になったもんだと、つくづく感じる。

という訳で、次回は恐らくここをクリアした時。お楽しみに♪

毒食らわば皿まで

RPiと言えばraspbian=debian直系。そしてdebianと言えばPython。今はどうか知らんがひと頃、この方面には厄介な輩が多かった。それにとりたてて興味もなかったので、Pythonには長いこと近づかずにいた。

その後PostgreSQLの関数を書くのにPL/pgSQLではあんまりだと思い、勉強を兼ねてPL/Pythonを使ってみた。が、あれがないこれができないの連続でイライラ、そしてトドメは「三項演算子がない!」でテンション急降下。いちおう動くところまでは持っていったが「これ以上深入りはすまい」と心に誓ったものだ。

あの日から10年。そのRPiをいじっちゃいるがPythonはちょっと、という思いからPHPとCだけでここまで来たが、さすがにそうも言ってられなくなってきた。そこで再度調べてみたら、2.7でその三項演算子がインプリメントされたというではないか。まあ例によって変な書式だが、あるとないとでは大違い。本業の方でもいよいよ無視できないところに来ているし「ここはいっちょ再履修しますか!」という気分に、ようやくなったところ。

ただ、公私あわせこれで日常的に接する言語が9種。「浅く広く」という、俺的には最も忌まわしい状況になりつつある。何するにもCとアセンブラだけだったあの頃が懐かしい … あ、その前にBASIC乱立な時期があったなー。今の状況って、これと良く似ている気が。時代は巡るという事かな。俺にはよくわからん。うーん ….

まだまだLチカ段階だが

世の中を見渡すと、RPiでのサンプルはその殆どがPythonかRubyかCで書かれている。そしてどれもみなループの途中にsleep(1)を挟んで、というやり方。

むろんそれはそれでいいんだが、これだと点灯もしくは消灯させるという動作にかかる時間が考慮されていない。なので正確に言うと「1秒間隔で点灯・消灯」ではなく「点灯・消灯後に1秒待つ」となる。これをキッカリ「1秒毎」とするにはどうすれば良いのか?  今回はそれを、使い慣れたPHPとPHP-GPIOで実践した結果を備忘録がわりに。

答えから先に言うと、1秒間隔でその処理を別スレッドで実行して貰うようにすれば良い(というかそれしかない)。しかし現在のraspbianに含まれるPHP5.4にはこの機能がないので、拡張機能「Ev」をPECLで導入する。あとはEvのマニュアルを参考に、EvPeriodicあたりで。

# ネットに関連情報が少ないのは、PHPでこういう事をする人がいないから?

さて「Lチカを1秒間隔で」ぐらいならこれで充分だが、処理の内容が「データベースにアクセス」とか「リモートホストにデータを送信する」とかになってくると、それが確実に1秒以内に完了するようにするか、さもなくば処理が完了するまで次の処理を行わないようにしなければならない。またこれよりクリティカルなタイミングを要求される局面では、より正確なタイマーと、高い優先度での実行が必要となる。

実はこれ、いま企てているモノでは非常に重要なところでもある。どこまでの精度が必要となるのか、どういう実装とするか、これからじっくり考えることにする。

Tirez sur le pianiste de faux!