続・Max7日記 (1)

長嶋 洋一


→ Max7日記

→ 続・Max7日記(2)

→ 続・Max7日記(3)

→ 続・Max7日記(4)

→ 続・Max7日記(5)

→ 続・Max7日記(6)

→ 続・Max7日記(7)

→ 続・Max7日記(8)

2017年8月1日(火)

暑い暑い夏である。 前期の最終週、試験期間に入っているが、金曜日には「サウンドデザイン」最終合評があり、課題制作の学生からの質問メイルが刻々と舞い込んでくる。 そして週末はオープンキャンパスがあり、それが終わるとようやく夏休みである。
Max7日記(6) が「2017年4月20日(木)」を最後に終わってから、3ヶ月と10日ほど、日記レスの日々が続いていた。 この間、出張はゼロ、その理由は Max7日記(6) の「2017年4月3日(月)」あたりに書いてある。 今年は海外出張もナシ、そして国内出張も学会発表もほとんどナシ、というストイックな年なのだ。

その間に何をしていたかといえば、ひたすら文献精読、そして論文執筆の日々だった。 特にこの7月の1ヶ月は、本当に本当に集中した。 息をしていたかどうか忘れるほど(実際には息をしているが(^_^;))、毎日、時間のある限り、原稿を書き続けてきた。 先週は、mixiの日記に思わず、以下のように書いていた。

これまでそこそこ長らく生きてきて、後で「もうあんなに集中することは無理」と振り返ったような
集中力を1ヶ月ぐらい続けた期間というのが何回か、ありました。現在の自分の人生はあの
集中期間の賜物・・・というやつです。

そういう論文執筆を今月やってます。あと1週間。既に13万字を超えていよいよ山場であと数万字かな。
遂には、これから執筆する難所の攻略プランが夢に出てきて深夜に起き出してメモしたり。(^_^;)
ちょうど今週は前期末で合評とか忙しいのですが、もう勢いは止まらないゾーンに突入した気がします。
ただ執筆しているだけなのに毎晩くたくたになって帰宅して、翌朝には蘇って出かけます。今朝も6時半。
そして昨日、7月31日におよそ21万字の論文を書き終えて、次のステージ(チェック→議論)に進んだところなのだ。 あまりに根を詰めていたので、昨日は「脱力」することすら忘れていた。 今日になって、ようやくじわじわと緊張が解けてきているが、まだまだ朝5時前には目覚めて6時過ぎには研究室に出てしまう日々である。

研究室ページ をなぞる(リンクをコピペする)事は省略するが、もちろん4月からずっと、この前期もあれこれ進めてきた。 今日について言えば、原稿書きのためにずっと棚上げしていた「シングルCD→mp3化」という作業の最後の数十枚をやっつけて、 このような箱 を廊下に置いて、その情報をアカペラメンバーにメイルしたところである。 一昨日は珍しいブランクをまたいで今月初めてのカラオフに行き、36曲ほど堪能したが、今週末はオープンキャンパスのスタッフと中夜祭カラオケの予定が入っているので、精神的にも余裕ある状態で何よりだ。

そして過去のページを眺めていくと、 post-Gainer 日記 (5) の「2016年03月25日(金)」のところに、「日本音楽知覚認知学会創立30周年記念出版『音楽知覚認知ハンドブック』執筆」という話題を発見して、我に返った。 こういう原稿書きのお仕事があったのだ、と無事に締め切りより前に思い出すことが出来たのはラッキーな事である。 さらに同じ日のところにあった、「僕のドメインである[nagasm.org]の米国にあるサーバにsshして、SUACに届く日々の到着メイルがforwardされてずっとspoolされているのを消してみる」という作業をなぞってみた。ログは こんな感じ で、無事に数百MB溜まっていたスプールを消して軽快になった。

実験も製作もほとんどストップしての執筆期間がとりあえず終わったので、ぼちぼちあれこれ再開となるが、敢えてタイトルを「続・Max7日記」とした理由は、この夏にきっちりとMaxプログラミングのサーベイをしてみよう、と思い立ったからなのだ。 先週は こんな話題 があったり、ちょうど今週末には「サウンドデザイン」の課題も出てくるし、ちょっとあれこれMaxプログラミングのネタが溜まっているので、やはりタイトルはMax7ということで再開してみたい。 夏〜秋には3度目の正直の「バイオフィードバックセミナー」を予定していて、そこでも「Max大会」となる予定なのだ。

そして、これまでの「○○○日記」シリーズの一覧(リンク付き)は Max7日記(1) の冒頭にあるのは分かっていたが、「AKI-H8のシステムの一覧」をどこに書いていたか忘れてあれこれ探して、遂に 続々・Propeller日記(3)の「2013年2月24日(日)」 からだった・・・というのをようやく発見した。 これは今後に続く、今日の収穫である。(^_^)

2017年8月2日(水)

昨日の段階で こんなふうに どこに行くか不明だった迷走巨大台風5号は、どうやら九州から南西諸島方面に行きそうで、週末のオープンキャンパスは無問題になりそうだ。 朝イチで研究室に出てくると、「サウンドデザイン」課題のヘルプアポが2件、そして午後には「もしかすると44虎」のアポ、さらに後期ゼミに新たに1人が加わる、というようなあれこれが届いていて、メイル対応に追われた。 そして昨夜、突然の天啓で閃いたアイデアを、今日と明日に集中して進めてみる事にした。 オープンキャンパスでの展示のために、新しいMax7パッチの制作である。

スタートラインは上のようなものである。 要するに、iMacのWebカメラのライヴ画像を入力として、テンキーの「1」から「9」までの9種類の、異なったビジュアルエフェクトで自分の顔をあれこれ遊んでやろうというわけである。テンキー「0」とスペースキーは「素通し」で、エスケープキーでフルスクリーン表示となる。 そしてここから午前中〜昼休みまでかかって、5種類の画像処理サンプルを完成させた。 いずれもこれまでにやってきたものだが、ここにまとめられたのは収穫である。

上のパッチはマスターなので何もなし。

上のサブパッチは「1」の「自動回転曼荼羅」である。

上のサブパッチは「2」の「お化け屋敷」である。かつて碧風祭にメディア有志が「お化け屋敷」をやった時に作ったものである。

上のサブパッチは「3」の「モザイクズーム」である。「jit.rota」で簡単なのだが効果抜群。

上のサブパッチは「4」のeye_trackingである。サンプルそのままであるが、両目をトラッキングしてくれるのは不気味に気持ちいい。

上のサブパッチは「5」の「ジャバラ」である。遂に4分割から8分割バージョンまで完成してしまった(^_^)。 ここから午後はMaxプログラミングのアポ2件、新入生のアポ1件、そしてMaxプログラミングの質問メイル3件、と追われて完全ストップとなったが、夕方にようやく片付けて、以下のように今日の5つのモードのデモ動画を撮ってみた。

YouTube
キーはまだあと4つ残っているが、もうネタ切れである。 あとはオープンキャンパス中にでも作ってみようかな。 Maxプログラミングは楽しいのだ。(^_^)

2017年8月3日(木)

オープンキャンパス設置日前日の朝6時半である。 昨日の帰り際に研究室に来た学生から、「今夜はGWSで徹夜で映像の課題をやって、その後にサウンドデザインの課題をするので朝7時にマルチメディア室を開けて欲しい」との依頼を受けた。 徹夜のままプログラミングが出来るわけはないのだが(^_^;)出てきてみると、「昨日の17:30ごろ本日の7:00からサウンドデザインの課題をすべく、マルチメディア室を使いたいから開けてほしいとお願いした者ですが昨日の18:00以降他の教授に使用許可をいただいて無事作品の提出が完了いたしましたので朝開けてもらう必要がなくなりました。ありがとうございました。」とのメイルが届いていた。 まぁ終わったなら、なによりである。 そしてほかに1件、課題の相談メイルに速攻で解決返信して、これで午前中はぽっかりとMaxプログラミングの時間が出来た。 そして、今日の午後から展示準備作業するための準備として、上のように、今年のオープンキャンパス「長嶋組」(文芸センター正面左側)の展示の品揃え案をメモしてみた。 今年はスタッフが新入生2人と2回生の永田さん(去年に続き)という3人になったので、作戦として去年までと違っているところは以下である。 「怪獣王になる」はスペースが必要なので、場合によっては展示台数を現場で減らす可能性もある。 新入生スタッフが勉強を兼ねて1106に来るのは5限であり、自由創造工房で展示に使っているiMacを1106に持ってくるのは4限である。 残りを運ぶのは明日の本番にするか今日、一人で台車ごろごろするか、それは午後になって決めることにした。

そしてここからいよいよ午前中Maxプログラミング1本勝負、あれこれjitterのexamplesなどを発掘しつつ、なんとか昼休みまでかけて、残り4件も作ってしまった。 展示の実機で動くかどうかの検証が必要だが、まずはやっつけてみた、というのが重要だ。 ちゃんとメイルで届く何人もの学生の課題相談に対応しながらの、幸せな時間となった。

上のサブパッチは「6」の「サイケデリック」である。 こういう派手なものも展示ではウケるのではないか。

上のサブパッチは「7」の「波のように揺れる」である。 これはもう、jitter examplesそのままをなんとか自分のシステムに取り込んだ、というだけだが、なかなか面白い。

上のサブパッチは「8」の「画素塵芥崩壊」である。 ほぼ「jit.sprinkle」のデモという程度で、だんだん苦しくなってきた。

上のサブパッチは「9」の「Open-GL」である。 これだけは別途にマウスでぐりぐりしないといけないが、Webカメラの「動画」を3次元空間のplainのテクスチャとしてリアルタイムレンダリングしている、という凄いものだ。 これはカメラとかauto rotationとか、まだ改良の余地があるが、なんとかwindowをダブルにして共存させた。

上のメインパッチは、jit.windowをOpen-GLのためにダブルにしたので変更したものである。

上のサブパッチは、2つあるjit.windowをどのようにフルスクリーンにするか、という調停である。 あまりかっこよくないが、どうしても単一では合体できなかったので、苦肉の策なのだ。 以下のように今日の段階のデモ動画も撮ってみた。

YouTube
そして午後になって、学生のSOSがメイルだけでなく来室アポになってきたので、「3限はマルチメディア室に行く」と宣言して出かけていって、あとは夕方まで、びっしりと対応に追われた。

2017年8月7日(月)

迷走していた台風5号が以下のようにノロノロと近づきつつあるこの日は、朝から早々に暴風警報で集中講義の休講が決まった。 先週の金曜日は このように 「サウンドデザイン」の最終日とオープンキャンパスの設置日、土曜日は このように オープンキャンパス1日目(夕方からスタッフと中夜祭カラオケ5時間15曲)、日曜日は このように オープンキャンパス2日目(夕方から打ち上げマインシュロス)、とあっという間に過ぎていって、いよいよ夏休みである。

論文はいまだチェック中ということで、当面やるべきことは「音楽知覚認知ハンドブックの原稿執筆」と「今月下旬の北海道旅行の予約など」、という程度でかなり余裕があるので、午前中はたまっていたバックアップのデータ整理などを行い、午後になって、「サウンドデザイン」の最終課題を整理する作業に入った。 まったく急がないが、後期「メディア数理造形演習」あるいは来年の「サウンドデザイン」のために、全部でなくいくつかの参考になりそうなMaxパッチ作品をピックアップしておく、という作業である。 既に成績は付けて提出してしまっているので評価とは関係なく、先輩の作品パッチをほぼそのままパクッて素材だけ入れ替えたようなものはバッサリと捨てる、という作業でもある。

上のパッチは3回生の源馬綾香さんの作品で、テンキーの縦に並んだ「7」・「4」・「1」・「0」が、それぞれモデルの全身の上から4つのブロックのファッションのパーツを切り替える、という「着せ替え」モノである。 当初はブロックをまたぐロングスカートなどをデザインしてプログラムの矛盾を生んだが、ちゃんと全てを書き換えて成功まで導いた力作だ。

上のパッチは3回生の近藤涼香さんの作品で、輪郭まで用意された「顔」を好きに描いて、その全体を静止画として保存できるというものである。 絵心がある作品だが、この仕掛けは既に先輩作品にあったので、今回は選外(「作品集2017」には入れない)である。

上のパッチは芸術文化学科2回生の夏山幸也クンが他学科履修で受講しての力作である。 自分で打ち込んだBGMに対して、スペースキーを叩くと曲の断片がそのタイミングで鳴るとともにCGを書き加える。 最終的に終了すると、自分の「演奏」した音楽をサウンドファイルに、自分の「描画」を静止画ファイルに保存するためのダイアログが出てくる。

ここからデザイン2回生である。上のパッチは赤沼陽香さんの作品で、あちこち出没する「殿」をスペーキーで捕まえる、というものだが、ちょんまげがタコ焼きだったりという「外れ」があるので要注意というもの。難易度はそこそこ高い。

上のパッチは菅原詩南さんの作品で、普通の「だるま落とし」なのだが、パッチは綺麗に整理されていて、次第に難しくなる変化も加わり、良質のゲームとして完成度が高い。 Maxプログラミングをちゃんとマスターしている事を感じさせる良作である。

上のパッチは中澤有紀乃さんの作品で、普通に「だるまさんがころんだ」である。 音声の再生速度がランダムに3段階あり、「だるまさんがころんだ」の時間にソロソロと近く「手」をスペースで止めないとだるまさんが振り返って失敗となる。 色々と悩みながらなんとか完成に至ったのはよかった。

上のパッチは乗松咲那さんの作品で、全画面を書き換える「高速おみくじ」タイプである。 他にも同様の作品があったが、もうこのタイプはだいぶ食傷してきたので、今回はいずれも選外である。

上のパッチは深浦誠クンの作品で、よくあるランダムおみくじなのだが、ここは「絵心」と意外なオチで「残す」ことにした。

上のパッチは福吉大誠クンの作品で、よくあるシューティングゲームだが、これもセンスを感じたので作品集に収録である。 ただしパッチをちょっと変更して、counterで回す代わりにrandomに変更してある。 counterではあまりに「読めて」しまうので、metroのスピードを「150」から「225」に微妙にスローダウンした上で、難易度の高いランダム出現とした。

上のパッチは細田あきねさんの作品で、表示画面に4つの「lcd」を置いて、スロットマシンタイプのランダムで3種類のパターンを選ぶと、それらを組み合わせたファッションがメイン画面に出る、というしっかりとした作品である。 やはり「絵心」は大事になってくる。

上のパッチは松永真衣子さんの作品で、よくあるシューティングゲームだが、キャラとサウンドに惚れた。 このあたりのセンスは個人ごとに大きく違ってくるところだ。

上のパッチは渡部七海さんの作品で、よくある「もぐら叩き」なのだが、なんとこの叩かれる「太郎くん」は、叩くのに失敗すると悔しがり、叩かれると喜ぶ、という「ドM」なのだった。 どMの阪神ファンとしては、この作品を残すしかないのだ。 これで、2017年のMax課題作品集は このように 10作品を並べたものとなった。 なかなかの出来高である(^_^)。
そして夕方、いよいよ台風が直撃で近づいてきたので、スーパーでコロッケを仕入れて帰宅した。 「台風が来たらコロッケ」、というのはもはや全国的に定番らしく、スーパーではいつもに比べて多量のコロッケが並んでいた。

2017年8月8日(火)

台風一過の平日である。 たまたま ネットの記事 を読んでふと触発されて、手元にある3件の他にどれだけDVDが出ているかを確認した上で、勢いで「この夏休みに堪能しよう」・・・と衝動的大人買いをしてしまった。 あまり日々に余裕があるのも考えものである。

そしてここから、6月あたりにヤフオクでゲットしたまま放置されていた「 中古シングルCD 」からmp3に取り込んだ「懐かしのJPOP集」を以下のように整理した。 もちろんゲットしたもの全てではなくて、TMとかSMAPとかモー娘とかSPEEDとか、mp3化せずにそのまま捨てたものも少なくない。 これは今後、チラッと聞きつつ気になったものを残して、さらに後に再度チェックして、最終的にはカラオケのレパ候補としてiPodに入れるものをセレクトする、という膨大な作業のスタートである。 この夏休みはこういう作業も出来る余裕がある、というのは有難い。

ひたすら昔の音楽を、それもシングルCDとなったものを聞きかじる・・・というのは単なる趣味ではなくて、実は今年の秋以降の研究テーマとしてのネタを探る、という重要な目的もあるのだ。 これはどのようになるかは、やってみなければ分からない。
そして、バイオフィードバックセミナーに関して、辻下先生とのメイルが何往復かして、だいたいの予定が見えてきた。 9月中にまずは勉強会、そして10月末にBFセミナーである。 これで目標がハッキリしてきたので、いよいよ生体センシング、筋電センサ、バイオフィードバック、リハビリ・・・というあたりに注力していこう。

2017年8月9日(水)

いよいよ何もない、暑い夏休みの到来であるが、せっかくなので暑いのでなく熱い夏休みにしていこう。 情報処理学会からは、音情研の夏シンポの案内が以下のように届いた。 「好きな街」函館だが、残念ながら僕がもっと先に予定していた北海道旅行とかぶっている(札幌行きの出発日が同じなので函館行きの誰かとセントレアで会うかも?)ので、発表申し込みからパスしていた。 世間の流行と並んで、案の定、「ディープラーニング」「機械学習」などが散見しているが、まぁ直前になると会員がダウンロードできる予稿を、旅先の稚内・礼文・利尻あたりで拝見してみよう。
第116回 音楽情報科学研究会(夏のシンポジウム) のご案内
主催  情報処理学会 音楽情報科学研究会 (SIGMUS)

■日時・会場
日時: 2017年8月24日(木)13:00 〜 8月26日(土)12:15(GMI Workshop:8月23日(水)13:00〜)
会場: 公立はこだて未来大学

■プログラム
(1) 背景音楽のテンポが休息時の作業者に与える効果:生理的指標の評価
(2) MachineDancing: ポーズの変化に関する大局的制約と音楽と動作の局所的制約を同時に考慮したダンス自動生成手法
(3) 楽曲中の歌声とユーザ歌唱のリアルタイムアラインメントに基づく伴奏追従型カラオケシステム
(4) 既存歌唱曲アレンジのための歌声キーボード(配信NG)
(5) 複素ラプラス分布に基づく非負値行列因子分解
(6) モノラル音響信号に対する音源分離のための無限相関テンソル分解
(7) グラウンデッド・セオリー・アプローチ的方法によるピアノ演奏習得におけるチャンク形成要因の予備分析(配信NG)
(8) 多視点演奏映像を活用したピアノ演奏指使い分析ツールの提案(配信NG)
(9) 楽譜と演奏履歴を用いた深層自己回帰過程に基づく演奏タイミング予測
(10) 作者内一貫性と音楽的典型性を考慮した作曲支援インタフェース(配信NG)
(11) ディープラーニングによるループ音源の自動生成
(12) 特徴量軌跡の機械学習に基づくジャズセッションの自動生成
(13) 音楽音響信号から得られる音楽要素に基づく自動ピアノアレンジ(配信NG)
(14) 和音系列の統計的木構造解析とSplit-Mergeサンプリングに基づくメロディへの和声付け
(15) 音響的に自然な繋ぎ目の発見による楽曲ループ検出(配信NG)
(16) deepGTTMIII: グルーピング構造と拍節構造の自動獲得
(17) 調とリズムを考慮した階層隠れセミマルコフモデルに基づく歌声F0軌跡に対する音符推定
(19) 作曲者判定タスクのために分析すべき楽曲の長さ(配信NG)
(20) 多重ラベル分類を用いた意外性を有する楽曲検索・推薦手法の実験的考察
(21) TextTimeline: 文字表示を保持した発話テキストの音響特徴可視化
(22) 楽譜記述言語MusicXMLの拡張による楽典を考慮した和声解析フレームワークの提案
(23) ピアニストの演奏解釈を記述した演奏表情データベースの構築

■デモンストレーション:音楽情報処理の研究紹介XVI
 動的プレディクティブコーディングを用いた聴覚情報処理モデルとそれを用いたフレーズ作成システム
 音源解析技術を活用した自動カホン演奏ロボット
 ピアノ学習支援システムを用いた演奏習得におけるチャンク分析 - GTA を用いて-
 バイオリン初級者のためのマルチモーダル情報提示によるポジショニング学習支援システムを目指して
 音を力の変化の信号を使用して再生
 三次元に拡張したメロディ概形を用いたギター特殊奏法の自動検出法について
 スパイラルアレイモデルを用いた階層的調性構造を抽出する試みについて
 暗意-実現モデルに基づく作曲者らしさ識別へ向けての予備検討
 3視点演奏動画を用いたピアノ演奏者の指使い分析ツールの提案
 声量制御のための音声フィードバック器具の設計と実装
 歌唱から歌詞の発声タイミング抽出と発声タイミングモデルの提案
 筋電位とMIDI 情報を用いたドラム演奏における疲労度の簡易計測法の提案
 音楽音響信号の分散表現法の提案とその楽曲推薦システムへの応用について

■企画セッション
「音楽情報処理に関する最新研究動向の紹介」
複数の研究者より,最近開催された音楽情報処理に関連する国際会議への参加報告や研究動向の調査報告をしていただきます.
そして辻下先生と照岡さんとのメイルも行き来して、当面、9/16-17のBF勉強会に向けての僕のテーマ(宿題)などを、以下のように自分で整理/宣言した。 これからしばらくは、これを軸に進めていくことになりそうだ。

そして、教材として溜まっていた動画データを整理・バックアップなどしている合間に、フト上のようなGitHubに行き着いてしまい、ここから本日の寄り道が始まった。 まぁ考えてみれば当然だが、Cycling'74ではMax自体の開発関係もGitHubに上げているし、Max用SDKもまたGitHubに上がっているのだった。 ちょうどお仕事MacにはXcodeもあるし、ちょっと何かやってみる(出来るのか??)というのは、面白い寄り道である。

とりあえず両方をダウンロードすると上のようになった。 そして、Xcodeとともに CMake というアプリが必要になるよ、というのでダウンロードしてインストールした。 そして、まずはツールをビルドするためにターミナルを開いて・・・と説明に沿ってやっていったが、ターミナルからはインストールしたCMakeが見えず、なんだか試行錯誤していたら、以下のようにエラーが出て止まってしまった。

その後、CMakeとあれこれ格闘して、以下のようにエラーが出ずにビルド成功してXcodeに移行したが、そこでコンパイルしてみたものの、なんだか謎な状態にハマッてしまった。 いつもこうだが、出来てしまえばなんでもないのに、なかなかIDEというのは簡単にいかないものだ。

そして、お手軽なテンプレートが「Amazon S3」にあるよ・・・というのに連れられていくと、Amazonにログインさせられ、つまりはAmazonの有料ストレージサービスに持っていかれたので、ここで探検を断念バーグする事にした。 寄り道としては面白かったが、そんなサービスのユーザになって定期的に会費を取られ続けるというのはちょっと堪らないので、パスである。 便利な時代になったものの、油断すると危険の多いあれこれが待ち構えているのがネットなのだった。

2017年8月10日(木)

よく知らないが明日は祝日だそうで、いよいよお盆前の閑散としたSUAC構内である。 この夏の宿題としてもう1項目、「PAWセンサ活用・触覚癒しリハビリ」というのを早朝に思い出して、昨日の日記のToDoリストに加えた。 そして、今日はいっそのこと「音楽知覚認知ハンドブック・担当原稿執筆」というのに着手することにした。 まだ具体的に何を書くのかよく覚えていなかったので(^_^;)、まずは過去のメイル等から以下のように全体像を発掘してみた。 詳細はここには書かないが、僕の担当章の代表者である岡山大の小川先生(ドS)から僕(ドM)への最初の執筆依頼メイルは「 さて,本日のメールは長嶋先生にお願いがありまして,メールを書いております。絶対に断らないでください 」という書き出しだった。さすがである。
■企画概要
[ ジャンル ] 心理学(音楽心理学、音響心理学、聴覚心理学)、音響学、音楽教育学
音楽を作り、歌い奏で、聴くという行為は、人類にだけ存在する。音楽はどのように産出(作曲)され、知覚・認知(聴取)され、表出(演奏)されるのか。
また、なぜこれほど社会に受け入れられてきたのか。答えは未だ謎に満ちているが、徐々に科学的研究による解明が進んでもきた。その中核を担って
いる音楽知覚認知の研究とは、音楽を聴き理解し享受する活動の基礎にある心的過程の科学的・理論的な理解を目指すもので、現在はさらに幅広い
領域――音楽情報学、音楽と感情、演奏行為と心理、音楽的発達と教育、音楽療法、音楽と脳機能、音楽と対人相互作用など――を包含しながら
発展する学際分野である。本書(以降、「ハンドブック」)では、その複雑でダイナミックな音楽知覚認知研究の全貌を明らかにする目的で、関連多領域
にわたる研究知見のレビュー、重要概念/項目の解説、研究方法のガイド、最新トピックス紹介を含んだ総合的で良質な研究書を目指す。
■企画背景
日本音楽知覚認知学会は、音楽学、心理学、音響学、情報科学、音楽教育学、医学・生理学、およびそれらに接する学際領域に関わる研究者が
協力し、音楽の知覚・認知に関する進歩を図ることを目的とする学術団体」であると会則に謳われているように、本学会は音楽関連の多彩な分野から
研究者、大学院生、学生、演奏家、教育者、技師、療法家・臨床家などが集う異分野融合・連携の組織である。来る2018年に創立30周年を迎える
ことを記念して、総力を挙げてこれまでの学術的な蓄積を「ハンドブック」に分かりやすくまとめ、広く世に問うことにした。
●第6章 音楽学習と教育
第1節 音楽学習と教育に関する研究の概観
第2節 学びの場
	2−1 幼児がリズムと出会うとき
	2−2 学校教育現場でおこっていること
	2−3 インフォーマルな学び
	2−4 音楽教室の学習環境
第3節 学習方略・音楽のスキル
	3−1 まなぶこととまねること
	3−2 伝えること
	3−3 鑑賞授業における注意と気づき
	3−4 音楽技能と向かいあう
第4節 音楽性・創造性・社会性
	4−1 ゆらぎとしての音楽性
	4−2 創造性と向社会性
	4−3 ホルモンと音楽性
第5節 音楽の学びの問い直し
	5−1 総合活動としての音楽の意味
	5−2 次世代に向けて新しい音楽学習の提案
	5−3 コンピュータミュージックの未来予想図(長嶋洋一)
そしてメイルのやりとりの発掘から、音情研で発表した「Computer Music パフォーマンスはこの20年間で進歩したのか」と「新楽器へのアプローチ」のエッセンスを中心に据えて書いていい事、「教育者の立場というよりも,作曲家・演奏家の立場から書いていただくということも,了承していただきました」との嬉しい発言を確認した。 いちばん最新の確認メイルが「ということで,タイトルは,お任せいたします+作曲家・演奏家の立場で書いていただく,,ということで,いかがでしょうか?」なので、まぁ、タイトルまでお任せのようだが、せっかくなのでこのタイトルはイタダキ、で進めてみよう。

全体の枠組みの中で「第6章 音楽学習と教育」というのが並んで、各節はほとんど音楽教育とか発達心理学とか教育学であるが、その最後(既に窓際)の「第5節 音楽の学びの問い直し」の、さらに最後の「コンピュータミュージックの未来予想図」である。 これはもう、何を書いてもいいのだ、と開き直った。

2017年8月11日(金)

世間は「山の日」という祝日らしいが、SUACは集中講義期間で絶賛営業中である。 昨日から今日の昼過ぎまで何度も書き直し書き直しを繰り返した原稿を、タイトルを「コンピュータミュージック未来予想図」と改訂して、遂に午後に小川先生に送付した。 1600*2=3200文字がmaxという条件で、余裕をみて少なめに、本文2835文字というちっぽけな原稿である。
長嶋先生
は,早い!!!
一番乗りでございます。
御原稿,確かに,拝受いたしました+
一気に読ませていただきました。
非常に面白い!!!!
なんと軽やかな未来予想図でしょう。
有難うございます。
すべての原稿がそろってから,改めて,
皆さまあてに,「今後の初校までの手順」等の
メールを送信いたします。
まずは御礼まで
そして休日でも岡山大もお仕事中らしく、速攻で小川先生から上のような返信が来た。 あの原稿で「なんと軽やかな未来予想図でしょう」というのはちょっとお人好し過ぎる気がするのだが、まぁ楽天的な学会だからいいのかな。 これで、懸案が一つ片付いたことになる(^_^)。 ちょうど明日には突発オフの予定も立ち、まずまずの夏休みが続く。

2017年8月15日(火)

先週土曜日は某突発オフで9時間マラソンカラオケ完走41曲、13日(日)は終日あれこれデータのバックアップ地獄にハマッてしまってほぼ非生産的に経過、昨日の14日(月)はお盆のお出かけと甲子園観戦で完全に休日モード。 なかなかのんびりした夏休みであるが、まぁ世間はまだお盆なので、Max7を離れたぼちぼちもいいだろう。 ヤフオクで落札した中古ジャミネータがまた1本、旭川から届いたが、今年の後期はいよいよ「ジャミネータ改造大会」というのも考えてみよう。 今日は「脳波ネタ」で以下のようなちょっと(かなり)危ないニュースも発見した。脳波でステルス戦闘機を操縦するとはさすが中国。やれるもんならやってみて欲しい。(^_^;)

そしてここから午前中、集中してスケジュール検討とともに久しぶりにネット宿泊予約と格闘した。 この秋〜冬に出張遠征する予定の関西だが、なんともインバウンドでどこもホテルは既に満杯となっていて、あれこれやりくりするとともに、やや不本意ながら、後日キャンセルを前提として「帯」で予約の絨毯攻撃をすることになった。 国内でも海外でも、とりあえず「宿」とフライトを確保すればあとは何とかなる。 そして、午後になって懸案のVPP-SUACのハンダ付け・・・と思っていたら、なんと「第59期王位戦・予選トーナメント」(藤井4段vs小林9段)というアベマTVのライブ中継に気付いてしまい(^_^;)、お仕事Macの前を離れられないことになったので、夕方の医者行きまでの間、この夏休みの旅行に絡んだ「島旅リンク整理」というテーマに切り替えた。

今回の一人旅は珍しく出張が絡まない(後で音情研の夏シンポとぶつかってしまった)のだが、順調に行けば上の地図、初めての宗谷岬(日本最北端)に行くとともに、初めての稚内と礼文島利尻島にそれぞれ宿泊滞在ということで、また新しく2つの「島」をクリアできる予定である。 後述のように、日本最西端の与那国島、人が住んでいる(無人島を含まない)日本最南端の波照間島もちゃんと宿泊滞在しているので、いよいよ残りは日本最東端の納沙布岬(北方四島を除く)ということになる。 そこでフト夜中に思いついたのが、これまでに訪れた「島」のうち、Webに記録が残っている「島旅」へのリンクを整理しつつ、これまでに訪れた「島」をメモしておこう、という、いわば 海外渡航歴(備忘録) の国内・「島」版である。

考えてみると、旅好きで、中学時代の 東北一周SL写真旅 とか、高校1年の 本州一周寝台夜行乗り詰め4泊5日列車一人旅 など、山間部や本州の外周は旅したものの、「島」はほとんど行っていなかった。 なんと初めての「島」は、いきなり海外、大学2回生の サイパン・グアム が最初のようで、その後、大学3回生の時に合唱団の「夏の遊び合宿」で行った、鳥羽の菅島が、国内旅行として滞在した「島」の最初のようである。

上記の菅島と前後関係がやや曖昧だが、同じ大学3回生の時に、かつての伝説「吉田拓郎・かぐや姫 コンサートin つま恋(1975)」に高校2年の時に一緒に行った同級生と、吉田拓郎が三河湾の篠島で行ったオールナイトコンサートに行った。 ここで思い出す風景は、まだ暗くなっていない暑い夕方のコンサート冒頭に、前座として誰かがステージに上がった瞬間である。 拓郎の登場を期待した2万人の「帰れコール」の嵐の中で、「俺の歌も聞いてくれ」と負けなかった生意気な男が、今を思えば新人の長渕剛だった。

大学を卒業して企業の独身寮に入って、同僚と二人旅で九州・阿蘇の「南こうせつ・サマーピクニック」というオールナイトコンサートに行き、ついでに屋久島に行ったのがその次である。 当時は安サラリーマンの貧乏旅行なので、まず大阪南港からフェリーで九州に行き、さらにフェリーで屋久島に、というものだった。 しばらく後に家族旅行で再び2度目の屋久島に行った時(この時に「縄文杉」と感動の対面(;_;))には、子供たちにブルートレインを体験させたくて大阪から西鹿児島まで寝台列車で、鹿児島からは高速船となった。 さらにしばらく後に「未踏」合宿で、 3度目の屋久島 に行った時には、豪華にセントレア→鹿児島→屋久島のフライトとなった。 その翌々年、またまた家族で 4度目の屋久島 に行った時にはフライトでサッサと行った。

前後するが上記の最初の屋久島の翌年、再び同僚と二人旅で九州・阿蘇の「南こうせつ・サマーピクニック」オールナイトコンサートに行き、今度はついでに沖永良部島に行った。 鹿児島から沖縄まで、南西諸島のうち北側の奄美群島を点々と経由して沖縄まで行くフェリーに乗った。 港に着いたのに上陸していない途中の島としては奄美大島徳之島があり、さらにその先に与論島があって、この3島はいまだ未滞在として残っている。 ユースホステルに宿泊していたが大型台風が近づいてきて、帰途のフェリーはまず「港に入らず沖合に停泊」というので小さな舟で渡って、船腹から降ろされた縄梯子に飛び移るという荒技で乗り込んだ。

そして前後するが、1999年の 初めての沖縄 を皮切りに、怒涛の沖縄シリーズ(八重山諸島)が始まる。この年はお仕事モードで定期観光バス、同年の2度目もお仕事モードで宜野湾のライブハウス「島唄」のネーネーズに遠征、翌2000年の 3度目の沖縄 もお仕事モードで、今度は国際通りに「じんじん」を発掘した。

そして、2002年の 4度目の沖縄 からは、基本的にお仕事モードでなく、海外出張や国内出張のマイルを沖縄往復フライトに換えての一人旅モードに成長して、この年にはいよいよ沖縄離島シリーズの最初、座間味島に行った。 座間味島はいつも「とまりん」からの日帰りで泊まらないが、それは那覇に泊まってじんじんに行くのが最優先だからであり、以降、沖縄に行ってじんじんに行かない年は無いので省略する。 2004年の 5度目の沖縄 では学生とともに再び座間味島、 2005年の 6度目の沖縄 では那覇の「ゆいレール」制覇と「沖縄の温泉」を堪能した。 2006年の 7度目の沖縄 では息子とともに再び座間味島に行って初めてのホエールウォッチング、 2007年の 8度目の沖縄 では那覇からコザにバスで行き、琉球大の河野先生(その後、何度となく飲み歌い友達)とじんじんにて初対面。

そして、2008年の 9度目の沖縄 では遂に、沖縄本島から八重山諸島の石垣島に渡り、さらに高速船で波照間島に渡って、日本最南端の民宿に泊まった。 翌2009年の 10度目の沖縄 では学生とともに再び座間味島に行ってホエールウォッチングネーネーズのライブ。

そして2010年の 11度目の沖縄 では一気に、2度目の石垣島から、初めての西表島由布島竹富島とを周遊した。 翌2011年の 12度目の沖縄 ではまたまた学生とともに再び座間味島に行ってのホエールウォッチングネーネーズのライブ、さらにレンタカーのドライブで初めての伊計島に行き、グラスボートも堪能した。

続く2012年の 13度目の沖縄 では、3度目の石垣島から、フェリーで初めての与那国島に行って泊まり、日本最西端(天気が良ければ台湾が見えるという西崎灯台)まで散歩した。 同年の 14度目の沖縄 は出張だったので那覇のじんじんだけ、 翌2013年の 15度目の沖縄 ではまたまた学生とともに再び座間味島に行ってのホエールウォッチングとぅる・るん・てんのライブ、さらにレンタカーのドライブで2度目の伊計島ビーチに行き、グラスボートも堪能した。

続く2014年の 16度目の沖縄 では、4度目の石垣島から、初めての小浜島黒島を周遊した。

そして2015年の 17度目の沖縄 では遂に初めての宮古島に行き、レンタカーのドライブで初めての伊良部島下地島池間島来間島を周遊した。

同じ2015年の 18度目の沖縄 は出張とともに、米軍基地の埋め立てで問題となっている辺野古岬を見るために沖縄本島を一周して、初めての屋我地島古宇利島にも行った。 翌2016年の 19度目の沖縄 ではまたまた学生とともに再び座間味島に行ってのホエールウォッチングネーネーズのライブ、さらにレンタカーのドライブで2度目の伊計島ビーチに行き、グラスボートも堪能した。 翌2017年の 20度目の沖縄 ではまたまた学生とともに再びネーネーズのライブ、さらにレンタカーのドライブで3度目の伊計島ビーチに行き、グラスボートも堪能した。 同2017年の 21度目の沖縄 ではお仕事で2度目の宮古島に行った。

この沖縄シリーズとは別に、2012年には、本州の並びでの最西端である 五島列島・福江島 に行って、初めての電気自動車を堪能した。 記憶では「島」シリーズはこのあたりだと思うが、忘れていればまた追補することにしよう。 結局、藤井4段の将棋は夕方までに終わらず、結果は明日となってしまった。

2017年8月16日(水)

昨日の藤井4段の将棋は結局「完勝」だったという。 先月7月じゅうかかって全力で執筆した論文のチェック回答が届き、さらに1年間、時間をかけて全面改訂していこう、と前向きに方向性が出てきたこの日、まずは昨日の絨毯攻撃ホテル帯予約のキャンセルからスタートした(^_^;)。 そしてまずは、昨夜思い出してメモしていた「島」シリーズの追加である。

2007年にお仕事で新潟に行った時に、自費で延泊して渡ったのが、 佐渡島 である。 島内一周したり、佐渡金山で砂金を取ったり、たらい舟に乗ったりしたのだった。 神戸ポートアイランドなどの人工島を除けば、国内はおよそ、こんなところだろうと思う。

同じ2007年には、学生5人とともに 2度目のニューヨーク に行っていて、まぁニューヨークのマンハッタン島自体が「島」なのだが(これをぐるっと一周する周遊ボートにも乗った)、その南端からリバティ島に渡って「自由の女神」の足元にまで行ったのは、間違いなく「島旅」である。 2003年と2015年に行っているシンガポールもまぁ島国だが、これは2007年に行った台湾とともにパス。

そして2016年の 初のブルガリア では、黒海沿岸のEenlite(Sunny Beach)というリゾートでの国際会議に出張したが、その至近にあったのが、世界遺産の「ネセバル」という中世の古代都市の「島」だった。 橋を渡っていったので、たぶんこれも「島」だと思っている。

 

そして半年に一度の研究室設備点検が終わったところで、午前から昼休みまでかかって、懸案の実験に取り掛かった。 上のように、用意したのはオリジナルの「心拍センサ」と「ネコミミ」とMUSEである。 前期のゼミの時にネコミミを試していて、僕が喘息児童の持ち技「代謝低下心拍スローダウン」をやったところ、ネコミミが珍しいパターンで動作した・・・という現象のいわば「追試」である。
オリジナル「心拍センサ」では、COMBIのスポーツバイク(スポーツジムでバイクを漕ぐシステム)に付属している耳たぶセンサから得られた脈拍信号を平滑してArduinoに入れており、Arduinoは以下のような簡単なプログラムでそのピークごとにインクリメントする値をMaxに返す。 Max側ではその値が到着した時間間隔の移動平均をとってBPMとして、つまり1分間の脈拍データとして刻々と表示している。

int sensorPin = 0;
int ledPin = 13;
int sensorValue1 = 0;
int sensorValue2 = 0;
int sensorValue3 = 0;
int currentValue = 0;
int meanValue = 0;
int old_mean = 0;
int diff = 0;
int elapse_up = 0;
int count = 0;
int toggle = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, toggle);
  Serial.begin(115200);
}

void loop() {
  currentValue = 1023 - analogRead(sensorPin);
  meanValue = (currentValue + sensorValue1 + sensorValue2 + sensorValue3) / 4;
  diff = meanValue - old_mean;
  sensorValue3 = sensorValue2;
  sensorValue2 = sensorValue1;
  sensorValue1 = currentValue;
  old_mean = meanValue;
  if ( diff < -7 && elapse_up > 31 ) {
      count = (++count) % 1024;
      toggle = (++toggle) % 2;
      digitalWrite(ledPin, toggle);
      Serial.print(count, DEC);
      Serial.println();
      elapse_up = 0;
  }
  else if ( diff > 5 ) {
    elapse_up++;
  }
  delay(10);
}
「心拍センサ」のデータのグラフには、Arduino側でのアーティファクトによるミスカウントに由来する誤差はあるが、心拍低下技では80近いBPMが60近くまで低下したりして、なかなか優秀である。 これを実験している様子が以下のようであり、なかなかに怪しい(^_^;)。 以下のようにデモ動画を撮ってみた。

YouTube

そして、ここでMUSEも装着してさらに脳波(非線形変換で飽和せずに拡大したもの)まで表示しよう、とトライしたが、まずお仕事MacにはMUSEのツール自体が入っていなかったので、これをダウンしてインストールした。 そして「muse-io」のオリジナルスクリプトを起動したところ、何故かお仕事MacではMUSEとのBluetooth通信が不調でペアリング出来ず、仕方がないので実験机に移動して、いつものMacBookAirに切り替えた。 そして、途中で何度かMUSEのBluetooth接続が切れるもののボタン長押しで復帰させつつ、ちょっと長めに記録してみたのが以下である。 こちらもなかなかに怪しい(^_^;)。 こちらもデモ動画を撮ってみた。

YouTube

その後、予定変更に伴う宿のキャンセルとともに新たに宿を取り、一気に12月上旬の「日本音楽即興学会第9回大会」(京都精華大)に参加申し込みまでやっつけてしまった。本年度の第1号学会発表出張であり、せっかくなので禁断のT○Y○T○ネタをぶっ込むことにした。 残念ながら、まだここに書けない大人の事情があるが、相当に強烈な「概要」を書いてみた。 ここは予稿らしい予稿もないので、キャッチーに即興していいのだ。(^_^;)

2017年8月17日(木)

上のような「Kickstarterがようやく日本でもスタート」という嬉しいニュースが飛び込んできたこの日、いつも届いても読まずに捨てている「Cycling'74からMaxユーザへのニュースレター」をたまたまクリックして、なかなかの宝庫を発見してしまった。 今日はこれをザッと眺めて整理してみよう。 ニュースレターで届いたリンクは、「My Favorite Object」というチュートリアルの My Favorite Object: jit.gl.mesh というものなのだが、この最下段にはこのシリーズの他のリンクもあって、全体としては以下の10件がひとまとまりとなっているのが「My Favorite Object」なのだった。

bucket

「bucket」とは、入力データを次々と次段にシフトしていく、いわゆる「シフトレジスタ」であり、生体センシングの定番である「移動平均(Running Average)」に使っているものである。 これまで、以下のパッチの右側のようにやってきたが、真ん中のようにやる、という手もあるのを知った。

ただしこの両方に共通する欠点は、移動平均の段数、すなわちbucketのシフトレジスタ段数を明示的に示す必要があって簡単に段数を変更できないこと、そして大きな段数だとオブジェクトの単純な配線がかなりの手間になることだった。 そしてこのチュートリアルの作者「Cory Metcalf」氏は、以下のような、それ自体を開くとエラーが出るアブストラクション(これを呼び出すパッチと同じディレクトリか、Maxのファイル検索パスの通った場所に置かれるべきオフジェクト)として「bucket.avg.maxpat」を作っていたのだった。
これはなかなかにトリッキーで、パッチが開かれた時に、自分自身の内部のオブジェクト同士の結線をuziで回して完成させる、というものであり、以下のように、試しに同じ15段と50段を並べてみると今度はエラーが出ず、内部的にちゃんとbucketとpackが生成されるようにスクリプト記述している。 loadbangを受けて最後にthispatcherにスクリプトを書き込めばいいようだ(こんな手はやった事なかった)が、大きな収穫となった。

次の例は運動に関して位置座標から「速度」と「加速度」を得る、というもので、つまりは「微分」と「2次微分」であり、以下のように簡単に出来るよ、というものだった。

そして最後の例はbucketに入れたシンボルを逆順にする、というための「bucket.sym.maxpat」というアブストラクションを提示しての例だったが、これはどこからバグがあり(^_^;)、ちゃんと内部結線が生成されなかった。 まぁ、こういう事もある。

するとコメント欄には、「Pedro Santos」氏からのパッチで、以下のように「もっといい手があるよ」と素晴らしい移動平均パッチが紹介されていた。 こちらも任意の段数で設計できて、さらにはloadbangで特殊なスクリプトを使わずに、つまり移動平均を刻々としている最中にでも、その段数という変数を変更できる(ただしこれをすると全体のデータが行き渡るまでの間は誤差が生じる)のである。 これはもう完璧だ。 ここまでのサンプルをまとめたものが このzip である。

stutter~

次の「stutter~」とはその名の通り、MSPオブジェクトだが、ここでの例は以下のような、DJあたりが欲しそうな「Beat-Synced Looper」というものだった。 このzip である。 お仕事Macには内蔵マイクが無いので、とりあえずこれはそのうち実験してみる事にした。 コメントを見ると、なんだかうまく動かないという人もいるようである。

jstrigger

次の「 jstrigger」とはその名の通り、入力に対する処理をJavascriptで記述して出力する、というもので、以下のように6種類のサンプルが入った1個のパッチが このzip である。

基本的にはこういうスクリプト技を駆使するところにあまり深入りしたくないのだが、5番目の「たくさんの単語列(スペースで区切られた)をスペースをカットして全部ひっつける」というのは気に入った。 これが必要な時には、過去にいろいろ苦労していた気がするが、今後はこれはイタダキである(^_^)。 さらにコメントの部分で「Ben Bracken」氏が紹介した以下の例もまた、今後に使えるテクニックとなりそうだ。

multislider

次の「multislider」はいつも活用しているが、ここでの例は以下のようなシーケンサというものだった。 このzip である。 最初はなんだか分からなかったが、要するに2つのmultisliderを重ねて、上のレイヤーのものを半透明にしていると判明した。 インスペクターを複雑に設定しているようで、完全に解析していないが、まぁ当面はあまり使わないだろう、とパスした。

plot~

次の「plot~」は、要するに このYouTube動画 による16分のチュートリアル、ということでサンプルパッチも無かった。 どうもこの「My Favorite Object」というシリーズは、書き手もスタイルも種々雑多なものなのだ・・・とだんだん判明してきた。

trigger

次の「trigger」は、以下の5本のアニメGIF動画で説明してくれているものの、最初の4本は何も目新しくないものだった。 ただし一番最後のやつは「目から鱗」で、これまでいつもtriggerの項目を増やしたり減らしたりした時にはいちいち配線をやり直していたが、この手があったのか、と驚いた。 これは明日から役立つテクである。(^_^)

rate~

次の「rate~」はMSPで、かつて 宇宙人音楽 に使ったことがあった気がする。 書き手の「Gregory Taylor」氏は几帳面な人らしく、 このzip には10本のサンプルパッチが入っているが、面白いと思ったのは以下の最後の1本だけで、それもrampというよりは「ノイズをフィルタに入れる」という部分が今後に使えるかな(^_^;)、というものだった。

jit.slide

次の「jit.slide」はサンプルパッチとしてはほぼ似たような2本が入った このzip だけだが、なかなかに面白い収穫となった。 要するに「残像」モノであるが、パラメータに「up」と「down」があり、それぞれの「効き方」が違うのである。 その意味では、2番目のランダムよりも、最初の方がなんか活用できそうな気がした。

YouTube

YouTube

curve~

次の「curve~」は名前からMSPモノであるが、要するにカーブ関数を生成する、というものだった。 サンプルパッチとして4本が入った このzip は、そのままチュートリアルのものをなぞる事ができるが、これは知っていた範囲から越えるものはなかった。

jit.gl.mesh

最後の「jit.gl.mesh」はサンプルパッチとして3本が入った このzip である。 このうち最初の「basic_circle.maxpat」で、およその雰囲気が分かる。 要するにOpen-GLの3次元空間にメッシュ状の物体をランダム生成させて、それぞれのメッシュに着色する、というものである。

YouTube

そして、ライブカメラ画像を使う残り2本では、いずれも「jit.grab」がテクスチャ指定のパラメータを受け付けない状況である事が判明して、残念ながら「texture_fun.maxpat」は使えないものだった。 しかし最後の「texture_fun_more.maxpat」では、それでもなんだか面白いことになって、これはちょっと、今後使えるのかどうかは別にしても、ちょっと記憶しておくべし・・・という結果だった。

YouTube

たまたま見つけたチュートリアルのシリーズだが、なかなかに有意義な探検だった。 ここから今後、そのまま使えるものはないかもしれないが、一部には初めて知ったテクニックもあった。 こういう膨大なチュートリアルとフォーラムとMaxユーザの交流が、全てフリーでネット上にある、というのは、本当に、いい時代だなぁ。(^_^)

2017年8月18日(金)

朝イチで届いたニュースは「バルセロナでテロ」というものだった。 過去に2回、 2005年2016年 にバルセロナに行っているが、いずれも今回のテロの舞台となったランブラス通りを何度も歩いていたのでショックは大きい。 たまたま今年は(1996年以来)海外に行かないのだが、世界中がきな臭くなってきた。

またまた夜中に思い付いたアイデアから、研究室に出てきて最初にやったのは、上の「Peller-Min」の情報の検索である。 Mac OSの検索機能は、その単語がファイル内部に登場する全てのドキュメントの一覧を表示してくれるので、あっさりと発見できた。 上の写真とともに全体の紹介をしていたのは 「mbed日記 (1)」の2014年10月8日(水) であり、さらに 「続々・Propeller日記(2)」の2013年1月15日(火) のところに、以下の回路図とPropellerのspinソースまでちゃんと整理してあった。 さらに、涙ぐましい 製作風景 も発見した。 今日はこれをマルチメディア室の防音室に取りに行って、ちょっとやってみたい事があるのだ。

そして午前中から昼休みまでかかって、 このように マルチメディア室から1106に持ってきた「Peller-Min」を修理した。 この修理というのは、エンプラでよくある「溶けて剥がれる」という懸案のトラブルの修復であり、断線などは全くなかったので、なんとか元通りに復元できた。 今回はこれを「楽器」でない使い方をしてみよう、というアイデアなのだが、少し時間をかけて練りたいので、まずはここまで、とした。 仕様なども完全に忘却していたが、過去のMaxパッチ(拡張子がmaxpatでなくmaxbだったのでたぶんMax4か?)でそのまま動いたので、このあたりの互換性には感謝感謝である。

2017年8月19日(土)

いよいよ8月も終盤に入った週末である。 我が家のハムスター3代目がいよいよ長寿を全うしそうな状況で、じっと見守るだけの日々が続いている。 昨日の夕方にやりかけていた作業の続きとして、朝イチで約300曲から「2度聞き」で厳選した74曲を、2台のiPodに転送完了した。 容量に限界があるので、それぞれのiPodに入っていた1万枚以上の写真は全て消した。 あとはこれをひたすら聞いて、さらに絞ってマイレパに加えていくことになるので、ちょうど来週の北海道旅行で繰り返し聞き続けることになりそうだ。

午前から午後にかけて、以下の「jitter-examples」の中で、いつも使う「video」カテゴリ(この下に「quicktime」があり、movie再生とかWebカメラのキャプチャー等はココ)でなく、「render」カテゴリ、つまりOpen-GLのブロックを久しぶりに探検することにした。 目的は昨日セットアップした「Peller-Min」で動かす「何か」であり、まだ何もアイデアの無いところからのスタートである。 いつもはサブフォルダの中に入らずに「素」で並んでいる、「jit.gl.****」というのを順に叩いているうちに時間が経過するので、今日はサブフォルダから攻めてみよう。

ファイル名順に並んでいたので、最初に開いたのは「anim」というカテゴリのサブフォルダであるが、なんといきなりここは「当たり」だった。 以下は「anim.camera.advanced」というもので、なんとアニメの少年が3次元空間を歩いている。 このパッチのどこでこの少年のモデリングをしているのか(あるいは既に出来上がっているモデルを呼び出しているのか)、そしてどうやってアニメーションさせているのか、調べてみたい事はたくさんあるが、まずはザッと並べていこう。

OpenGL_01

以下は「anim.evalnotify」というもので、アニメーションの軌道(パス)を指定して動かせるようで、これはちょっと使いこなせるまで解読する意義がありそうである。 移動する物体は、ちゃんと居座る物体とぶつかる部分でめり込んでいくのが不気味に気持ちよい。(^_^;)

OpenGL_02

以下は「anim.node.pivot.simple」というもので、3つの物体を連結して一定のルールでアニメーションさせている。 それぞれの物体の位置をずらす指定も出来るので、これはより基本的なアニメーションの道具として、これも解読必須のサンプルだ。 ちゃんと個々の物体のマテリアルを指定するための出来合いのツールもMaxで提供されているようである。

OpenGL_03

以下は「anim.node.planets」というもので、アニメーションを階層構造で記述するというものらしい。 Director(もう学生は知らないか)、あるいは後継のFlash(これも消えていくのか)で言えば、キャスト内のアニメーションを記述して、そのキャスト自体をその外からアニメーションさせる、という事だろう。 階層構造もいいが、3種類のプリセットのビジュアルエフェクトも気に入ったので、どこかで使ってみたい。

OpenGL_04

以下は「js.anim.drive」というもので、Maxパッチが超シンプルになっている理由は、アニメーション生成に関するOpen-GLでの記述を、jit.render(Open-GL互換のjitter)でやらずに、Javascriptで記述されたOpen-GL記述をそのまま読み込む、というスタイルだからである。 これをがんがん駆使すればするほどMaxから離れていくが(^_^;)、おそらく処理速度は向上するので、これも要チェックである。

OpenGL_05

ここから「camera」・「camera.node.examples」・「gl.ula」という3つのカテゴリのサブフォルダについては、一応全てのサンプルを叩いたもののソソラレず、次の「lights.materials」で以下の「multi.lights.material」に出会った。 なかなかいい感じであり、そのままでも使いたい。

OpenGL_06

ここから「model」・「path」・「physics」という3つのカテゴリのサブフォルダについても、一応全てのサンプルを叩いたもののソソラレず、次の「Shaders」に向かった。 以下は「geom.normals」というもので、3D空間内に数学的に規定された曲面上のメッシュから、指定された色と形状と長さで法線ベクトル方向に多数のトゲが出ている、というものである。 なんだか使えそうで難解なものだ。

OpenGL_07

以下は「gm.videopoint」というもので、上にあった例の曲面の代わりに、なんとWebカメラの自分の顔が多数のヒゲで表現されている模様である。 これは面白いのでなんとかモノにしたいが、ちょっと難易度が高そうである。

OpenGL_08

ここから、残りの「slab」・「slab-helpers」・「Textures」という3つのカテゴリのサブフォルダについても、一応全てのサンプルを叩いたもののピンとこなかった。 まずまずの収穫だが、ここからお気に入りを厳選して、まずはjitterでどのように実現しているかを解読して、その後に自分なりに料理する「改造」の段階に進むことになる。 なかなか道は遠いが、なんとか面白いものを作っていきたい。

2017年8月20日(日)

朝、大学に出てくると、歩道から構内まで多数の高校生でごった返していた。 いつもの、大手予備校の全国公開模試なのだろう。 高校生も頑張っているが、大学生も頑張っていて欲しいものだ。 もちろん大学教員も頑張っていきたい。

YouTube

この日は昨日のMax-jitterサンプル探検で見つけたパッチの中から、面白そうなものを上のように解読・改造・改良の実験などを進めただけになった。 まだまだ面白いパラメータが残っているので、これはさらに深堀りしていく予定だ。
そして午後には、欠席する音情研の夏シンポの予稿が、1週間前となって情報処理学会から(会員向けに)公開されているのを思い出してダウンロードした。 さらに気づいたのが、その前の研究会、つまり今年の「音学シンポジウム」にも行っていなかったので、その予稿も全てダウンロードして、計83本の予稿をザッと眺めているうちに1日が終わった。

2017年8月21日(月)

いよいよ明後日からこの夏唯一の旅行に出かけるが、「島」シリーズだけではない、と気づいた。 今回、稚内で3泊するが、ホテルから徒歩圏内の稚内駅は、なんと「日本最北端の駅」なのだった。 6回目の沖縄 の時に沖縄の「ゆいレール」をみっちり制覇したが、いつも利用する那覇空港駅が「日本最西端の駅」であり、以下のようにその次の赤嶺駅が「日本最南端の駅」なのである。 つまり、残り「日本最東端の駅」である東根室駅だけを残して、こちらも北端西端南端を制覇することになるのだ。(^_^)

そして午前中に作業したのは、僕のWebの過去のページからいくつかのHTMLの改定である。 今の学生には分からないだろうが、昔のWebというのは回線が細くて、単なるJPEG画像であってもブラウザで表示されるのにじわじわと時間がかかったものだった。 ←こんなふうに写真をびしばし並べるWebページというのは、だいたい2012〜2014年あたりからである。 そこで、各ページには「写真へのリンク」として、僕はいつも★印を並べていたのだが、いちいちクリックするのは現在となっては手間でもある。

温故知新「1106風景」シリーズ :
そこで、SUAC開学の直前の記録として 開学直前のSUAC開学前日のSUAC の2つのページ、あとは このページ にある「1106研究室 ○○○○年○○月○○日の風景」というリンクのうち、「★印」タイプだった2001年から2010年までの10件について、いちいちHTMLを手作業で改定して上のようにサーバに上げて、研究室ページにもリンクを上げた。 まだまだこれは全体に対しては氷山の一角だが(^_^;)、とても全部を書き換える暇はないので、あとはいずれという事で。

そして午後は、上のように楽しい楽しい「jitter三昧」の試行錯誤の時間となった。 やっていると次第に分かってくるもので、適宜、パラメータ処理をサブパッチにしていくので、バッチ全体の見た目はそれほど変わらないようでも、内部的にはなかなか高度な処理(対応パラメータ)の増大を繰り返していく作業である。 一見してまだ似ているものの、Max7パッチのサイズが2倍とかに膨れているので、内部処理はかなり深化しているのだ。 世間はお盆明けの週といっても大学関係は夏休みなので、学会関係のあれこれが舞い込むこともなく、要するに邪魔の入らない至福の時間である。

この夏は全国的に天気はあまりよろしくない日々が続いていたが、フト週間予報を見てみると、稚内の雨模様となる日がちょっと繰り上がってきたが、まぁ稚内ではレンタカーとか稚内駅(観光施設化しているらしい)とかぐらいなので、傘とともに歩いても大したことはない(メインは「晩のお楽しみ」だったりする(^_^;))。 あくまで予報だが、その後の礼文と利尻が今のところ天気が良さそうなので、ちょうどこの季節にヨーロッパに行った時のような爽快さを体験できるとすれば御の字である。

YouTube

そして、3次元空間の光源を3個から6個まで(最大8個までいけるらしい)増設して、ただしそれぞれの軌道は連関性を持たせたバージョンとして上のようなところまで進んだ。 Maxパッチのサイズはさらに2倍、つまり今日の午後にスタートした時点から4倍にまで膨れていて、見えない部分での階層化・構造化が進んでいる。 これを元に明日はPellr-MinからのMIDI情報でぐりぐりさせたいが、同時にサウンドも出さないと淋しいし、あまり安直なこともやりたくないので、ここは旅行後までアイデアを温存させるかもしれない。

2017年8月22日(火)

運動会前日と遠足前日は朝からハイになる、というのは古今東西の真理である。 明日からいよいよ北海道旅行、という朝に研究室に出てみると、やはりとりあえずキャリーバッグを出してパッキングを始めてしまった。 今回は海外ではないのでパスポートも不要、さらに仕事の出張でもない自腹旅なのでこの日記も道中に記すこともなく、基本的には北の大地と北の島嶼でぼーーっとするのが目的となる。 天気予報を見てみると以下のように昨日と違っていて、稚内に到着する明日の晩の雨予報はなくなっていた。 要するに「行ってみるまで分からない」ということで、これこそ旅なので、それでいいのだ。 とりあえず先週までほぼ毎晩、自宅で晩酌していたのに、ここ2-3日ほど珍しく断酒しているのも、現地で美味しく飲むための無意識的な準備なのだった。

そして、8日間も水やり出来ないので、学部事務室にお願いして、研究室の 葉から芽 クンを預けて、2日おきぐらいの水やりをお願いした。 研究室内ではいくらLEDライトで終日電照しても駄目、と分かったので、今回の2代目は1106の窓際に置いているのだが、北側なのでほとんど日照の直射がない日々を耐えつつ育っているのだ。 初代(下の写真)は日に当てようと屋外通路に出していたら、強風でポッキリと折れてしまったので、2代目はかなり過保護になっている。

そして、Sketchingコミュニティの仲間から面白い情報が届いた。 僕が参加した過去のSketching ではいつも一緒だった、Kipp Bradford氏が、何かのカンファレンスでKeynoteをしたいので、以下の動画が置かれているサイトで「イイネ!(vote)」をしてネ、というものだった。 素晴らしい、活躍しているようだ。 調べてみるとTEDでもプレゼンしていた。さすがである。(^_^)

そして昼前から、昨日の続きのMax7プログラミングに・・・と昨日までの結果を眺めてあれこれ触っていたが、午後になって「今日は進めない」と決断した。 どうやっても中途半端なのと、「運動会前日と遠足前日」現象(^_^;)で、あまり入り込めない、と自覚したからである。 こういう時に無理に進めようとしても駄目なのは明白なので、お仕事データと昨日までのMaxパッチ等を持参MacBookAirに入れて、以下のようにMaxパッチを改訂してMacBookAirのスクリーンに入るように整理した。 こうなれば、もう1106ではこのプログラミングは一旦終了である。

そして、この日記も「もしかしたら」ということで、同様にお仕事Macにある(Webサーバと同期している)コンテンツをMacBookAirにコピーした。 旅行先でこれを改訂すると、いつもの出張モードと変わらなくなる(^_^;)のでいかがなもんだが、とりあえずの持参である。 ということで、午後これからはまったく別の作業(旅行直前リサーチならいくらでもネタはありそう)をするとして、今日はここまでである。

2017年8月23日(水)

午前11時、改装されたセントレアのラウンジで「朝からビール」、まさに当日ハイを堪能している。 ハートランドビールの生、というやつは一番搾りより遥かに沁みる美味であった。 夏休みも終盤のセントレアのラウンジは、子供達の嬌声で普段とはまったく違う盛り上がりだが、ここでMaxお仕事を・・・という目論見は美味しいビールとともに消え失せた(^_^;)。 だいたい、浜松から豊橋までのJR、そして豊橋→神宮前→中部国際空港と乗り継いだ名鉄、の車内でiPodで聞いていた、「3段階の断片視聴から選抜されたold JPOP」シリーズが、素面であってもいきなり沁みに沁みて、もう完全に「旅行ハイ」モード全開なのである。 このメモは昨日の文言の一部を改訂するためにMacを開いたついでに書いたのだが、中身は何もない酔っ払いの戯言なのでこれでオシマイである。(^_^;)

YouTube

「オシマイ」と書いていたが、札幌までのAIR DOの出発が20分ほど遅れて待たされている間にビールもだいぶ抜けてきて、機内で札幌アイスコーヒーを堪能したところから一転、上のように揺れる機内でのMaxプログラミングに没頭してしまった。 6個の光源を飛ばすパラメータをいろいろいじってみて、結局はcosとsinをダブルに持ってみると、リサジューの軌道は1箇所に収束せず微妙にズレつつもリサジューなのでときどき近所に集まる、という面白い状況にまで到達した。 ただしまだまだである。

2017年9月1日(金)

上のちょっとした進展から約10日が経過した。 その後、お仕事モードと決別して 初めての最北端と礼文島と利尻島 という8日間の北海道旅行を満喫し、浜松に帰ってきてからもあれこれ仕掛かり残務をこなして2日が経過した。 まだ旅の疲れが抜けないが、昨夜のW杯日本代表の予選通過の試合で、だいぶ元気が出た。

 

YouTube

そして今日の夕方になって、上のようにエアドウ機内で作ったMaxパッチにバグを発見して修正し、さらに光源の速度を落として移動半径も小さくしてみたところ、よりいい感じになったかな・・・というところで、9月の初日はオシマイである。 来週はあれこれその翌週に向けて仕込む時期になり、Maxプログラミングだけでなく、久しぶりにハードも作ってみたいと思っているが、その元気が回復するかどうかはこの週末の休息にかかっている。

2017年9月2日(土)

昨日は9月になったのでゼミの皆んなに「簡単に近況報告を。その他、後期に向けて」という一斉連絡を出したが、さっそく朝に研究室に出てみると3人からメイルが届いていた。 4回生のうららは前期のゴシックホラーを発展させたミニチュアドールハウス(室内)で、今度は写真でなく映像にするという。 これは進路とも繋がるし、全力で応援していこう。 音楽も作るというので、さくっと検索して のリンクとともに「音楽だけよりもSE(効果音)が重要」とメイルしてみた。

後期からゼミに加わる3回生の山本さんは来週4日〜8日がインターンシップらしいので、そこでまた成長してくるだろう。 デザインの若手教員に引き継ぎを打診したが引き受け手がなく空振りして、メディア造形学科が無くなることもあり、最近はSUACを会場とした「CGクリエイター検定試験」の団体受験が無くなってしまった。 しかし山本さんは個人的に相談に来て、静岡会場での前期試験を単独で受けてエキスパートを取得した頑張り屋さんなのである。 彼女もやりたい事がたくさんあるので、この後期から全力でさらに伸ばしていきたい。

院生のブンちゃんは「八月から、バイト先の人が鬱になりまして、代わりに、今まで、バイトし過ぎでした。最近、体調が崩れて、バイトが少し減らしています。来週、静岡大学の友達と一緒に琵琶湖に行きます。11日から、時間を作って、研究室に伺います」とのこと。 バイトはそこそこに、と伝えた。 後期はいよいよ僕の「メディアデザイン特論」で何かを作り上げていかなければならないので、ここからは頑張りどころだ。

そして備忘録としてメモしたが、上の5点が、今朝、フト、目覚めた瞬間に思いついた点である。 10本指は独立して動かない(薬指と小指はリンクしている)ので、無理に独立10パラメータとするのは「指が攣る」というのが、新楽器"MRTI2015"の反省点なのだ。 これまで、この方針変更に思い至らず、Max/jitterで実験していながらも最終的な姿にならなかったのが、これを思いついた瞬間に、確信が持てた。 この9月は、これに向けて進めていこう。(^_^)

 

明日の午前中は幸せに潰れる・・・と確定するような上のニュースも舞い込んできたこの日の午後、まだ「PAWセンサ8個を保持するインターフェースの形状と素材」のアイデアが練れていないのでさらに寝かす(また目覚めの時に閃くのを期待して)ことにして、このMax/jitterパッチを新方針に対応させて整備していくことにした。 大まかなアイデアはあるものの、例えば3次元空間でマウスによってオブジェクトをぐりっと回すとあとは自動で回転してくれる「auto-rotate」に対して、初期値として回転を与えられるのかどうか、YESとしてその方法は、というのは白紙なのだった。

 

そしてまず上のように、「jir.gl.handle」のヘルプからreferenceをひいて、「auto-rotate」でなくこれまでの「rotatexyz」でもなく、「rotate」で回転軸と回転角をインクリメント指定して連続して叩くことで、「auto-rotate」をなくして自動で回転できる事を発見/確認した。 まずはここからである。

YouTube

そして上のように、8個の光源を立方体の8頂点から対角側に線形移動させ、オブジェクトの回転は「auto-rotate」でなく自動で、というような雛形がなんとか出来た。 このままでは対頂角の位置にある2つの光源の軌跡が重なっているので、ちょっとだけズラす必要はあるが、なんとか想定している動きは出来てきた。 しかし、3次元空間での位置感覚はかなり乏しいという負い目をまたまた痛感した気がして、これでは宇宙空間にはとても出られないなぁ。(^_^;)

2017年9月3日(日)

この日の午前中は藤井4段が森内フリークラス永世名人に圧勝していく様子を眺めていて終わった。 そして午後になって、フトMaxのjitterサンプルを叩いていたところ、面白いものにぶち当たった。 以下の「lua.window.mouse.drawing.maxpat」というパッチで、「jit.gl.lua」を「jit.gl.lua @file mouse.drawing.lua」という書式で呼び出しているだけのもので、同じディレクトリに「mouse.drawing.lua」というファイルが置かれている。 たったこれだけなのに、Maxが苦手とする(ProcessingやFlashが得意とする)オブジェクト指向な感じで、どんどん新しい輝点を生成しては一定時間後に消滅させているのだ。

YouTube

調べてみると、どうも lua というのは、「Lua is a powerful, efficient, lightweight, embeddable scripting language. It supports procedural programming, object-oriented programming, functional programming, data-driven programming, and data description.」ということで、かなり歴史のある、そしてなんとブラジルで作られた処理系のようだ。 上のMaxパッチは、jitterがJavascriptなどでオブジェクトを記述するのをサポートしているのと同様に、luaでもオブジェクトを記述できる、というものらしい。

local gl = require("opengl")
local GL = gl
	
-- list of things to draw
local chains = {}
local current_chain

-- create an element in a chain
function create_link(pos, vel)
	local vmag = vec2.mag(vel)
	-- decay ranges from [0.93, 0.97], the faster the link, 
	-- the faster the decay
	local decay = math.max(math.min(50, 1/vmag), 4)
	decay = (decay-4)/(50-4)*0.04+0.93
	return {
		pos = pos,
		vel = vel,
		life = 1,
		decay = decay,
	}
end

function create_chain(pos, vel)
	return {
		create_link(pos, vel)
	}
end

function append_link(self, pos, vel)
	self[#self+1] = create_link(pos, vel)
end

-- decay the chain and remove dead links
function step_chain(self)
	for i=1, #self do
		local link = self[i]
		link.pos = vec2.add(link.pos, vec2.scale(link.vel, 0.4))
		link.vel = vec2.scale(link.vel, 0.95)
		link.life = link.life*link.decay
	end
	for i=#self, 1, -1 do
		local link = self[i]
		if(link.life < 0.1) then
			table.remove(self, i)
		end
	end
end

function draw_chain(self)
	gl.Begin(GL.POINTS)
	for i=1, #self do
		gl.Color(0, 0.5, 1, self[i].life)
		gl.Vertex(self[i].pos)
	end
	gl.End()
	gl.Begin(GL.LINE_STRIP)
	for i=1, #self do
		gl.Color(1, 1, 1, self[i].life)
		gl.Vertex(self[i].pos)
	end
	gl.End()
end

local last_pos = {0, 0}
function mouse(e, x, y)
	-- scale to [-1, 1]
	local dest_dim = this.dest_dim
	x = x/dest_dim[1]*2-1
	y = 1-y/dest_dim[2]*2
	local pos = {x, y}
	local vel = vec2.sub(pos, last_pos)
	if(e == "down") then
	elseif(e == "drag") then
		if(not current_chain) then
			current_chain = create_chain(pos, vel)
			chains[#chains+1] = current_chain
		else
			append_link(current_chain, pos, vel)
		end
	else
		current_chain = nil
	end
	last_pos = pos
end

function draw()
	gl.Enable(GL.BLEND)
	gl.BlendFunc(GL.SRC_ALPHA, GL.ONE)
	gl.PointSize(10)
	for i, chain in ipairs(chains) do
		step_chain(chain)
		draw_chain(chain)
	end
end

-- handle mouse events from window, 
-- convert to simpler "down", "drag", "up" events
local lastbtn = 0
local
function wincb(e)
	if(e.eventname == "mouse") then
		local x, y, btn = unpack(e.args)
		local mouse_event
		if(lastbtn == 0 and btn == 1) then
			mouse_event = "down"
		elseif(lastbtn == 1 and btn == 1) then
			mouse_event = "drag"
		else
			mouse_event = "up"
		end
		lastbtn = btn
		mouse(mouse_event, x, y)
	end
end

function dest_changed()
	-- set global window listener when context 
	-- changes so we listen to the proper "named" window
	listener = jit.listener(this.drawto, wincb)
end

function scriptload()
	-- also need to create it when the script loads
	listener = jit.listener(this.drawto, wincb)
end
上のリストが「mouse.drawing.lua」というテキストファイル(luaソース)の全てである。 なんせこの「lua.window.mouse.drawing.maxpat」というパッチは、qmetroでjitterウインドウを刻々とeraseしてはOpen-GLにレンダリングを指示する処理と、あとはフルスクリーン表示にする処理しか無いので、マウスの状態を追跡して、多数のオブジェクトを生成して消滅させる、という全ての処理を「jit.gl.lua」が指定する「mouse.drawing.lua」だけで行っていることになる。 外見はMaxだが、これは完全に「luaでのOpen-GLプログラミング」という事なのだ。 そこでとりあえず lua のサイトに行って、MacOSXにも対応しているというので「lua-5.3.4」というパッケージをダウンロードして、以下のようにmakeしてインストールしてみた。
nagasm-Mac-mini:lua-5.3.4 nagasm$ make macosx
cd src && /Applications/Xcode.app/Contents/Developer/usr/bin/make macosx
/Applications/Xcode.app/Contents/Developer/usr/bin/make all SYSCFLAGS="-DLUA_USE_MACOSX" SYSLIBS="-lreadline" CC=cc
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lapi.o lapi.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lcode.o lcode.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lctype.o lctype.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o ldebug.o ldebug.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o ldo.o ldo.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o ldump.o ldump.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lfunc.o lfunc.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lgc.o lgc.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o llex.o llex.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lmem.o lmem.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lobject.o lobject.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lopcodes.o lopcodes.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lparser.o lparser.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lstate.o lstate.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lstring.o lstring.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o ltable.o ltable.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o ltm.o ltm.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lundump.o lundump.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lvm.o lvm.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lzio.o lzio.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lauxlib.o lauxlib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lbaselib.o lbaselib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lbitlib.o lbitlib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lcorolib.o lcorolib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o ldblib.o ldblib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o liolib.o liolib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lmathlib.o lmathlib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o loslib.o loslib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lstrlib.o lstrlib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o ltablib.o ltablib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lutf8lib.o lutf8lib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o loadlib.o loadlib.c
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o linit.o linit.c
ar rcu liblua.a lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o 
ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lbitlib.o lcorolib.o ldblib.o liolib.o lmathlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o loadlib.o linit.o 
ranlib liblua.a
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o lua.o lua.c
cc -o lua   lua.o liblua.a -lm -lreadline 
cc -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_MACOSX    -c -o luac.o luac.c
cc -o luac   luac.o liblua.a -lm -lreadline 
nagasm-Mac-mini:lua-5.3.4 nagasm$ sudo make install
Password:
cd src && mkdir -p /usr/local/bin /usr/local/include /usr/local/lib /usr/local/man/man1 /usr/local/share/lua/5.3 /usr/local/lib/lua/5.3
cd src && install -p -m 0755 lua luac /usr/local/bin
cd src && install -p -m 0644 lua.h luaconf.h lualib.h lauxlib.h lua.hpp /usr/local/include
cd src && install -p -m 0644 liblua.a /usr/local/lib
cd doc && install -p -m 0644 lua.1 luac.1 /usr/local/man/man1
nagasm-Mac-mini:lua-5.3.4 nagasm$ make macosx test
cd src && /Applications/Xcode.app/Contents/Developer/usr/bin/make macosx
/Applications/Xcode.app/Contents/Developer/usr/bin/make all SYSCFLAGS="-DLUA_USE_MACOSX" SYSLIBS="-lreadline" CC=cc
make[2]: Nothing to be done for `all'.
src/lua -v
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
nagasm-Mac-mini:lua-5.3.4 nagasm$ 
しかし、Max内ではいい感じに活用できるものの、いきなりluaインタプリタでluaプログラミングするには、マニュアルとサンプルプログラムが必要である。 ArduinoやProcessingなどの完全なオープンソースの文化と違って、luaではGetting StartedのレクチャーやマニュアルやサンプルがWebには存在していなかった。 その代わりに、リファレンスブックを出しているのでAmazonで買ってね・・・というものだった(^_^;)。 まぁ、310ページのマニュアルがPDFで22ポンド、3000円ちょっとで入手できるとすれば素晴らしいことであり、リンクを辿ってPaypalで支払うと、ものの1分もしないうちに、以下のように PDFマニュアル  を入手できてしまった。 いい時代である。

 

そしてマニュアルの最初はいつも定番の「"Hello World"」である。 以下のように、「print("Hello World")」という中身のテキストファイルを"hello.lua"と名前を付けて保存して「% lua hello.lua」と呼び出してみると、見事に「Hello World」が表示された。 つまり、luaは正しくインストールされ、ターミナルで動くものになったわけである。

nagasm-Mac-mini:~ nagasm$ cd Desktop
nagasm-Mac-mini:Desktop nagasm$ ls
1106		hello.lua	ASL		jitter_test	schedule
nagasm-Mac-mini:Desktop nagasm$ lua hello.lua
Hello World
nagasm-Mac-mini:Desktop nagasm$ cat hello.lua
print("Hello World")
nagasm-Mac-mini:Desktop nagasm$ 
言語処理系として見てみると、ここまでで既に分かっていることは、「コメントは行頭に"--"らしい」・「デリミタ(行末の記号)は不要らしい」、「関数はfunctionであり、最後はendで閉じる」というあたりである。 C言語やJavaだと行末に「;」がないといけないが、最近はそういうのは流行らないらしい。 それほど特異な言語処理系でもないそうだ、と思ってみれば、上の「mouse.drawing.lua」を眺めてみると、なんとなくやっている事は分かってきた。 このあたり、日本語と英語ぐらいしか使えないものの、過去に200以上のプログラミング言語を扱ってきた(スグに忘却)僕にとっては、もっとも勘所がわかるところである。
and		break	do		else			elseif
end		false	for		function		goto
if		in		local		nil			not
or		repeat	return	then			true
until		while
予約語は上のものらしい。 たいていはお馴染みたが、「nil」はあまり使ってこなかったかな。 長いコメントは「 --[[ 」で始まって「 ]] 」で終わる範囲だが、使い方としては「 --[[ 」で始まって「 --]] 」で終わるように記述しておくと、冒頭の「 --[[ 」を「 ---[[ 」にするだけでコメントアウトを無効に出来る、などというテクニックが嬉しそうに書かれていた。 なんかラテン系のノリである。 セミコロン「;」を使うと、「a = 1; b = a * 2」のように複数のステートメントを1行に記述できるらしい。 もう使わなくなったグローバル変数には「a = nil」などと「nil」を与えるとガベージコレクションで消してくれるらしい。 この先、変数などのタイプあたりが定義されていて、それでChapter 1が終わりである。 まぁ、教科書としてはこんな感じだろう。
About the Book
I The Basics
	1 Getting Started
		Chunks
		Some Lexical Conventions
		Global Variables
		Types and Values
			Nil
			Booleans
		The Stand-Alone Interpreter
	2 Interlude: The Eight-Queen Puzzle
	3 Numbers
		Numerals
		Arithmetic Operators
		Relational Operators
		The Mathematical Library
			Random-number generator 
			Rounding functions
		Representation Limits
		Conversions
		Precedence
		Lua Before Integers
	4 Strings
		Literal strings
		Long strings
		Coercions
		The String Library
		Unicode
	5 Tables
		Table Indices
		Table Constructors
		Arrays, Lists, and Sequences
		Table Traversal
		Safe Navigation
		The Table Library 
	6 Functions
		Multiple Results
		Variadic Functions
		The function table.unpack
		Proper Tail Calls
	7 The External World
		The Simple I/O Model
		The Complete I/O Model 
		Other Operations on Files
		Other System Calls
			Running system commands 
	8 Filling some Gaps
		Local Variables and Blocks
		Control Structures
			if then else
			while
			repeat 
			Numerical for
			Generic for
		break, return, and goto
II Real Programming
	9 Closures
		Functions as First-Class Values
		Non-Global Functions
		Lexical Scoping
		A Taste of Functional Programming
	10 Pattern Matching
		The Pattern-Matching Functions
			The function string,find
			The function string.match 
			The function string.gsub
			The function string.gmatch
		Patterns
		Captures
		Replacements 
			URL encoding
			Tab expansion
		Tricks of the Trade
	11 Interlude: Most Frequent Words
	12 Date and Time
		The Function os.time
		The Function os.date
		Date–Time Manipulation
	13 Bits and Bytes
		Bitwise Operators
		Unsigned Integers
		Packing and Unpacking Binary Data
		Binary files 
	14 Data Structures
		Arrays
		Matrices and Multi-Dimensional Arrays
		Linked Lists
		Queues and Double-Ended Queues
		Reverse Tables
		Sets and Bags
		String Buffers
		Graphs
	15 Data Files and Serialization
		Data Files
		Serialization
			Saving tables without cycles 
			Saving tables with cycles
	16 Compilation, Execution, and Errors
		Compilation
		Precompiled Code
		Errors 
		Error Handling and Exceptions
		Error Messages and Tracebacks
	17 Modules and Packages 
		The Function require
			Renaming a module 
			Path searching
			Searchers
		The Basic Approach for Writing Modules in Lua
		Submodules and Packages
III Lua-isms
	18 Iterators and the Generic for
		Iterators and Closures
		The Semantics of the Generic for
		Stateless Iterators 
		Traversing Tables in Order
		True Iterators
	19 Interlude: Markov Chain Algorithm
	20 Metatables and Metamethods
		Arithmetic Metamethods
		Relational Metamethods
		Library-Defined Metamethods
		Table-Access Metamethods
			The __index metamethod
			The__newindex metamethod
			Tables with default values
			Tracking table accesses 
			Read-only tables
	21 Object-Oriented Programming
		Classes
		Inheritance
		Multiple Inheritance
		Privacy
		The Single-Method Approach
		Dual Representation
	22 The Environment 
		Global Variables with Dynamic Names
		Global-Variable Declarations
		Non-Global Environments
		Using _ENV
		Environments and Modules
		_ENV and load
	23 Garbage
		Weak Tables
		Memorize Functions
		Object Attributes
		Revisiting Tables with Default Values
		Ephemeron Tables
		Finalizers
		The Garbage Collector
		Controlling the Pace of Collection
	24 Coroutines
		Coroutine Basics
		Who Is the Boss?
		Coroutines as Iterators
		Event-Driven Programming
	25 Reflection
		Introspective Facilities
			Accessing local variables
			Accessing non-local variables
			Accessing other coroutines
		Hooks
		Profiles
		Sandboxing
	26 Interlude: Multithreading with Coroutines
IV The C API 
	27 An Overview of the C API
		A First Example
		The Stack
			Pushing elements
			Querying elements
			Other stack operations
		Error Handling with the C API
			Error handling in application code
			Error handling in library code
		Memory Allocation
	28 Extending Your Application
		The Basics
		Table Manipulation
			Some short cuts
		Calling Lua Functions
		A Generic Call Function
	29 Calling C from Lua
		C Functions
		Continuations
		C Modules
	30 Techniques for Writing C Functions
		Array Manipulation
		String Manipulation
		Storing State in C Functions
			The registry
			Upvalues
			Shared upvalues 
	31 User-Defined Types in C
		Userdata
		Metatables
		Object-Oriented Access
		Array Access
		Light Userdata
	32 Managing Resources
		A Directory Iterator
		An XML Parser
	33 Threads and States
		Multiple Threads
		Lua States
マニュアルPDFの「目次」部分を上のようにコピペして、いちいち手作業で整形しつつ眺めてみると、はっきりとluaの全体像が理解できてしまった。 最初の「I The Basics」は、まさに他の言語処理系とも同じような教科書になっている。 「2 Interlude: The Eight-Queen Puzzle」なんてのを挟むのもなかなか憎い。 注意点としては、「7 The External World」と「8 Filling some Gaps」あたりだろう。
続く「II Real Programming」では、「10 Pattern Matching」あたりにluaの最初の狙いが見えている。 「URL encoding」というのも今風である。 ここでの「11 Interlude: Most Frequent Words」というのもなかなか憎い。 「14 Data Structures」の中の「Queues and Double-Ended Queues」と「Sets and Bags」は要チェックだと思う。 「16 Compilation, Execution, and Errors」の中の「Error Handling and Exceptions」はイベントドリブンの肝だろう。
そしていよいよ「III Lua-isms」である。 Maxなどが苦手の「18 Iterators and the Generic for」、そして今度は「19 Interlude: Markov Chain Algorithm」という話題が加わっているあたり、これまでの数理科学をなぞった歴史が感じられる。 luaらしさの極致は「20 Metatables and Metamethods」・「21 Object-Oriented Programming」・「23 Garbage」にあるのだろう。 ちょっと面白いと思ったのは、「24 Coroutines」の「Who Is the Boss?」である。 「Coroutines as Iterators」と「Event-Driven Programming」、そして「26 Interlude: Multithreading with Coroutines」も要チェックだ。

最後の章にはなんと「IV The C API」が用意されていた。 ここの「28 Extending Your Application」のあたり、「Calling Lua Functions」・「A Generic Call Function」が、Maxとのインターフェースの部分だろう。 さらには「29 Calling C from Lua」や「30 Techniques for Writing C Functions」というのもあり、結局のところ、言語処理系は「孤高の独立」では有り得ない時代なのだ、と痛感した。 Propellerのspinなどは本当に例外の「孤高の独立」なのだ。 どうもluaというのは、上の3人のブラジル人の研究者たちが独力で1993年から続けているものらしい。 なかなか面白いものと出会ったが、しかしここで本格的にluaを隅々までやろうという気は起きない。 今であればPythonの方が見込みがあるが、それすらパスしているので、ここはマニュアルをつまみ食いしつつ、Max(jitter)から呼び出す部分だけを美味しくいただきたいところである。

2017年9月4日(月)

2ヶ月ごとに眼科に定期健診に通って緑内障と白内障の進行の程度や視野や網膜を調べているが、今日の午前中はこれで完全に潰れた。 まぁ視覚というのは人間にとって日々の生活ではもっとも重要なので、眼科はいつも老若男女で大混雑しているのだ。 眼圧を下げる点眼薬を処方してもらって昼休みの半ばに研究室に戻ったが、夕方にはカーマ(とその前の百均)に行ってちょっと探し物をしたいので、午後にちらっと昨日のluaを掘り下げることにした。 いざとなればluaのリファレンスマニュアルも手元にあるし、おそらくこれすら読まずに進めよう、という作戦である。

YouTube

まず最初に行うのは、luaで記述したプログラムが、「jit.gl.lua」の外側、つまりMaxパッチの普通のオブジェクトとどのように情報交換するか、というルートの確立である。 これは上のように、サンプルを参考として簡単に発見できた。 元々、入出力のインレットを「js」オブジェクトのように記述して生成することなく、「jit.gl.lua」には1つのインレットと2つのアウトレットが備わっているので、外部から何かを突っ込むのはここである。 その際に、何でもいいので名前を付けて入れればいいらしい。 例えば上の例では、「c_r」という名前で与えた数値が、luaプログラム側で「function c_r(v)」として定義することで振り分けられて、内部的に定義した「local color_r = 0.0」という変数に「color_r = v」で代入されて、たったこれだけでパラメータの引き渡しは完了であった。(^_^)

そしてここからは、あれこれ試行錯誤しつつ、luaがマウスの状態を取得してOpen-GLで描画するのでなく、完全にMax内のデータで描画すべくluaプログラムの改編に挑戦した。 途中で気づいたことを上に羅列メモしている。

YouTube

そして上のように、jitterウインドウ内のマウス状態をluaスクリプトが取得するのでなく、自分でMaxパッチ内に置いた「lcd」のマウス状態(つまり任意のセンサ情報などに置換可能)によって、luaプログラムがOpen-GLで描画する、というのをなんとか実現できた。 まだ一部にバグが残っているものの、以下がそのluaプログラム「lua_test002.lua」である。

local gl = require("opengl")
local GL = gl
	
-- list of things to draw
local chains = {}
local current_chain

local color_r = 0.0
function c_r(v)
	color_r = v
	print(v)
end

local color_g = 0.5
function c_g(v)
	color_g = v
end

local color_b = 1.0
function c_b(v)
	color_b = v
end

local line_r = 1.0
function l_r(v)
	line_r = v
end

local line_g = 1.0
function l_g(v)
	line_g = v
end

local line_b = 1.0
function l_b(v)
	line_b = v
end

-- create an element in a chain
function create_link(pos, vel)
	local vmag = vec2.mag(vel)
	-- decay ranges from [0.93, 0.97], the faster the link, the faster the decay
	local decay = math.max(math.min(50, 1/vmag), 4)
	decay = (decay-4)/(50-4)*0.04+0.93
	return { pos = pos, vel = vel; life = 1, decay = decay; }
end

function create_chain(pos, vel)
	return { create_link(pos, vel) }
end

function append_link(self, pos, vel)
	self[#self+1] = create_link(pos, vel)
end

-- decay the chain and remove dead links
function step_chain(self)
	for i=1, #self do
		local link = self[i]
		link.pos = vec2.add(link.pos, vec2.scale(link.vel, 0.4))
		link.vel = vec2.scale(link.vel, 0.95)
		link.life = link.life*link.decay
	end
	for i=#self, 1, -1 do
		local link = self[i]
		if(link.life < 0.1) then
			table.remove(self, i)
		end
	end
end

function draw_chain(self)
	gl.Begin(GL.POINTS)
	for i=1, #self do
		gl.Color(color_r, color_g, color_b, self[i].life)
		gl.Vertex(self[i].pos)
	end
	gl.End()
	gl.Begin(GL.LINE_STRIP)
	for i=1, #self do
		gl.Color(line_r, line_g, line_b, self[i].life)
		gl.Vertex(self[i].pos)
	end
	gl.End()
end

local last_pos = {0, 0}
function mouse(e, x, y)
	-- scale to [-1, 1]
	local dest_dim = this.dest_dim
	x = x/dest_dim[1]*2-1
	y = 1-y/dest_dim[2]*2
	local pos = {x, y}
	local vel = vec2.sub(pos, last_pos)
	if(e == "down") then
	elseif(e == "drag") then
		if(not current_chain) then
			current_chain = create_chain(pos, vel)
			chains[#chains+1] = current_chain
		else
			append_link(current_chain, pos, vel)
		end
	else
		current_chain = nil
	end
	last_pos = pos
end

function draw()
	gl.Enable(GL.BLEND)
	gl.BlendFunc(GL.SRC_ALPHA, GL.ONE)
	gl.PointSize(10)
	for i, chain in ipairs(chains) do
		step_chain(chain)
		draw_chain(chain)
	end
end
昨日の段階では謎だったluaスクリプトも、こうやってMaxで使えるところまで咀嚼してみれば、まぁJava程度のもので、それほど特殊な言語処理系ということでもなかった。 たった半日で、だいぶ親しみが湧いてきた。 こうなると、こちらのjitterプログラム改編は、まさにPeller-Minで制御したいグラフィクスに最適な気がしてきた。

するとここに、昨日、水爆実験を成功させたという隣国が、今度はICBMの発射の兆候・・・というニュースが流れてきた。 ちょうど早朝に利尻島の鷲泊地区内に警戒警報街頭放送が鳴り響いて驚いたところだったが、またか、という感じだ。 たった今、日本付近を飛んでいる飛行機と航行している船舶は上のようにぎっしりであり、こういうのをポンポン飛ばされると本当に困ったことなのだが、さすがに今回は中東のように「遠いところのお話」というわけではないので、日本人もしっかり「平和とは何か」を考える機会としては、それほど悪いことでもないのかもしれない。

2017年9月5日(火)

昨日の夕方、帰宅の途中にカーマと百均に寄ろう・・・と思っていたが、考えてみれば大学のスグ近くのSEIYUの並びにも百均があった事を思い出して行ってみると、ダイソーがあった。 そしてあれこれ「トレイ」のようなものを探して、5個の「ケース候補」を仕入れてみた。 これで540円というのは有難い時代だ。 そしてまずはいつものように回路図も何もなく こんなふうに PAWセンサをあれこれ並べてみた。

そして上のように、選ばれた食器にとりあえず8個のPAWセンサを取り付けて穴をあけたところで、ハテ"MRTI2015"についてはどこに書いていたっけ・・・と「NucleoF401RE」を検索ワードとしてあれこれ探して、ようやく 「Xcode日記(1)」の2015年5月14日(木) のところにある、と発見した。 ここからは、配線とNucleoF401REのプログラムとで、この過去の事例を参考にする、という作戦である。 ところが実際に見てみると、これは"MRTI2015"でなく、1個のPAWセンサのものだった(^_^;)。 ただしここで、 PAWセンサのマニュアル を再び発掘して、以下のようにとりあえず必要な情報をゲットできた。

そこでさらに探し回って、遂に 「Xcode日記(3)」の2015年6月29日(月) のところで、"MRTI2015"を製作している記述を発見した。 しかし、今回はPAWセンサを10個から8個にする一方で、全てのPAWセンサの情報(4チャンネル)を取得するので、そこにあったピン定義マップをまずはきちんと定義しないといけない。 "MRTI2015"の例ではPAWセンサのケーブルを一度、間違った配置にカットしているので、延長するケーブルを最小限にするように変則的な配置にして「全てはソフトで尻拭い」していたが、せっかくなのでそれはそのままのマップで間違いを減らしたい。 なかなかに面倒なパズルだが、これを"MRTI2015"の時の記述を改訂して、以下のように整理してみた。

We must merge the Arduino map and Morpho map, so we can use these pins !
Arduino-compatible headers
PA_0, PA_1, PA_4, PB_0, PC_1. PC_0 PA_5, PA_6, PA_7, PA_2, PA_3
Morpho headers
PC_2, PC_3, PC_5, PB_1, PC_4

NucleoF401REのプログラムも、ピン割り当てだけでなく、「薬指と小指はアナログ1本で2チャンネルのみ」とちょっと変則的だった"MRTI2015"に比べて、こちらは正統的でいいとしてもきちんと改訂する必要がある。 なかなかの思い出し作業となるが、まずは正しく配線するところからだ。 以下のピン配置図も再びダウンロードして印刷した。 NucleoF401REのジャンパをどうするかも忘却していたが、 このページの写真 に必要な情報を発見した。

そして、いざハンダごてを温めて・・・としていたら、以下のような切実なメイルがまた届いた。 かつて僕は、いつも活用しているWikipediaに寄付をしたのだが、その後にまた届いた寄付依頼には、対応しようとしたらうまく進まなくて断念したような気がする(^_^;)。 さて、どうしたものか。

Yoichiさま  周囲からは「やめたほうがいい」と言われました

これは予想外でした。

あなたは以前、膨大な数の読者が使うウィキペディアを存続させるためにを寄付されました。あなたの継続的なご支援に深く感謝しています。
今年もまた、あなたの力が必要です。

心からのお願いです。今日、もう一度寄付をお願いいたします。

私がウィキペディアを非営利組織として立ち上げたとき、周囲からは「後悔するだろう」と警告されました。でも、どうでしょう。立ち上げから
10年以上経った今でも、情熱的な支持者が支える唯一の非営利組織として上位10位のウェブサイトにランクインしています。

ウィキペディアが一般的なサイトだったならば、どのくらいの収益になるかを少しも考えたことがないと言えば嘘になります。でも、利益のために
ウィキペディアを運営していたら、人々がウィキペディアのコンテンツを真摯に作成することはなかったでしょう。また、コンテンツ自体の信ぴょう性
も疑わしいものになったはずです。ウィキペディアは私の所有物ではなく、すべての読者のものなのです。

今日、過去の寄付者のひとり一人が新たに寄付してくだされば、この募金活動は1時間以内に終了します。でも、まだその段階には達して
いません。募金活動を終わらせ、ウィキペディアをより良くするためにご協力をお願いします。

私たちは、無所属で特定の意図や意見に偏ることのないファクト(事実)の力を信じています。また、オープンソースによる知識を信じています。
私たちが完全に独立した立場にあるからこそ、これらの信念を持つことができるのです。特定勢力が報道を支配する今日において、その価値は
いつになく増しています。

たしかに、「知識は無料であるべきだ」と言っておきながら、読者に運営資金を求めるのは矛盾しています。でも、皆さま(膨大な数のウィキペディア
読者、編集者、寄付者)がウィキペディアを支援してくださらなければ、私たちが大切にするオープンソースの方針は大きな脅威にさらされます。

お願いです。 もし、ウィキペディアを活用しておられるのでしたら、広告を掲載することなく維持し、さらに成長できるよう1分のお時間をください。

よろしくお願いいたします。
ジミー・ウェールズ
ウィキペディア創設者

そこで、2500円きざみのメニューでなく、気合いで3000円を選んで寄付しようとしたが、以下のようにまたまたエラーが出て、送金できなかった。 これは前回とたぶん同じであるが、他のネットショッピングは出来ているので、向こうの問題である。 受け取ってくれないのでは、したいのに寄付できない。 残念でした。(^_^;)

そして午後に、 こんなふうに ハンダ付けをして、とりあえず出来たのでMacBookAirに繋いで、mbedのサイトに行って、過去に"MRTI2015"のためにNucleoF401REに書き込んだプログラムをそのままコンパイルしてダウンロードして転送してみた。 さらに、過去に"MRTI2015"のために作った、つまり去年の欧露ツアーでもボルドーやユトレヒトやエカテリンブルクやモスクワで公演/デモしてきたMaxパッチを走らせてみると、もちろん「薬指」・「小指」の部分だけはちょっとおかしいものの、それ以外はちゃんと動いてしまった(^_^)。

ハードのトラブルもなければ、MIDIプロトコルを115200のスピードでUSB通信するところまで含めて、結局1日でちゃんと動いてしまった、というのは大したものである。 あとは、NucleoF401REのプログラムを改訂して「薬指」・「小指」の部分をきちんとセンシングするようにするだけである。 Max側のプログラムはまったく新規に作るのだが、そのベースをちょうどこの日記でOpen-GLでやってきたわけだ。 なかなかに充実したので、あとは明日に進めることにして、気持ちよく帰宅することにしよう。

2017年9月6日(水)

この日は、午前2時に起き出してサッカー日本代表のサウジアラビア戦が残念な結果に終わったのを確認して午前4時過ぎに寝たりしたので、完全に時差ぼけ状態でのスタートとなった。 研究室に出てくると、以下のように英語でWikipediaの寄付担当からのメイルが届いていた。

Hi Yoichi,

Thank you for your email and your support for the Wikimedia Foundation. I'm sorry you encountered an error while attempting to 
donate, and that we did not receive your donation. I have researched in our payment processor database and the error code suggests 
the issue is related to your web browser. There are a few possible remedies to apply. Please ensure that you have Javascript enabled, 
that your browser is up to date, and that you are not whitelisting certain domains. In some cases switching to a different browser will 
resolve the issue. Finally, please make sure that all information requested on the donation form is complete.

Regarding other possible ways to donate, at this time the Foundation can accept donations by credit card, PayPal, checks, bank 
transfers, and a whole host of other ways as listed on our [Ways to Give page](https://wikimediafoundation.org/wiki/Ways_to_Give/en).

If you have any further questions or comments, please feel free to contact us again.

まぁ、僕の使っているFirefoxは他のネット支払いは普通に出来ているのだが、「ブラウザを替えてみろ」というのなら、というので、普段は使わないSafariにしてみると、以下のようにアッサリと支払いが出来てしまった。 そして、自動発信の感謝メイルが速攻で届いた。 これで懸案だったWikipediaへの寄付が、また出来たことになる。 やれやれ。

Dear YOICHI, 

Thank you for your support of Wikipedia and the Wikimedia Foundation.Your contribution of ¥ 3000 supports Wikipedia and helps 
secure thefuture of free knowledge for everyone. 
Wikipedia is possible because of a powerful idea: that people, likeyou and me, can participate in building the world’s knowledge 
and making it freely available to everyone, everywhere. 
Today, thanks to the support of millions of volunteer contributors and supporters, you can wander Wikipedia for hours. With more 
than 40 million Wikipedia articles and 35 million freely licensed images, Wikipedia can answer almost any question, and take you 
places you’ve never been. 
Your donation supports the creation and sharing of free knowledge in real, practical ways. It helps us make Wikipedia fast, secure, 
and accessible to everyone in the world. It helps us bring free access to Wikipedia in places where high mobile data costs prevent 
people from going online. It helps us support people who are digitizing knowledge currently locked away in analog archives. It protects
Wikipedia from threats to free knowledge and the open internet. 
Your support means that you can find the information you need now, wherever you may be--to settle a bet with a friend at a dinner 
party, or to understand the world around us. 
Donating to Wikipedia makes you the champion of a powerful idea. Wikipedia will continue to evolve, grow, and meet new challenges.
We’re excited and eager to meet these and more. Your donation will help us get there. We can’t thank you enough for your support. 
On behalf of the Wikimedia Foundation, thank you for investing in our future and taking this journey with us. 

Katherine Maher
Executive Director, Wikimedia Foundation 

そして午前にはマルチメディア室に移動して、1ヶ月以上も前から計画していた「テスト」を行った。 この後期から、SUACネットはちょっとシステムが変わって、インターネットに出て行く際のプロキシサーバの設定が不要になる、という変更が起きるのだが、実はMax7はこのプロキシを明示的に使っているので、変更後もOKかどうか、というテストは、後期を迎えるにあたって必須事項だったのだ。

歴史的にもMaxのコピープロテクトの厳重さには定評があった(フロッピーにMaxが入っている時代、そのフロッピーのコピーは絶対に無理、というのが業界の常識)が、Max4からMax6までは「チャレンジ&レスポンス」方式のライセンス制御となった。 つまり、Maxを使用するハードウェアに固有の情報をいったんCycling'74社に送ると、そのハードでだけMaxが起動できる、という暗号化されたレスポンスコードというおまじないテキストがメイルで送られてきて、これをインストーラに入れるとそのハードはずっとMaxが使える、という方式である。
しかし最近では「一定期間ごとにライセンスをオンラインで確認する」という方式が主流となり、アプリケーションとしてはMax6とあまり変わらないMax7で実質的に大きく変更されたのは、このライセンス制御の方式なのだ。 ところが、開学以来、多数のマルチメディア室/電子制御機器製作室のMaxライセンスを購入しているSUACの場合には、オンライン(インターネット)に直接でなくプロキシサーバを経由して接続するので、このMax7の起動時ライセンス確認に対応できなかった。 そこでCycling'74社のエンジニアと何度もメイルでやりとりして、最終的には「SUACのための仕様」として、新しいバージョンのMax7から、Prefernces項目の中に「URL proxy」というパラメータが新設されたのである。(^_^)
一般ユーザが空白にしているここに「sopro.suac.ac.jp:8080」と設定してやると、マルチメディア室などのMacは無事に起動時にCycling'74社のサーバに登録された情報とシステム内にインストールされている暗号化された「キーコード」を比較して、設定時間内であればそのまま起動し、設定時間を超えていれば新たなマシンとして起動して、Cycling'74社のサーバは「同時に起動されているSUACのマシン数」をチェックする、という流れである。 ちなみにSUACではこの設定時間を「1日」でなく「半年」としている。

そして、情報室と何度か電話でやりとりしつつ、「これまで」・「これから」の両方の状態のプロキシサーバに対して、無事にMax7は起動できることが確認できた。 具体的には、「URL proxy」にこれまで通りに「sopro.suac.ac.jp:8080」と設定しても、あるいは「URL proxy」を空白にしても、その設定後にMaxを再起動すると、ちゃんとライセンス確認されて正規に立ち上がる。 これで安心して後期からもMaxで講義を進められることが確認できたので、わずかな時間だったが、この安心感はなかなかの収穫である。

そして昼前から午後じゅうかけて、NucleoF401REのファームウェアの改訂の実験に取り掛かった。 ところがなんせ時差ぼけ頭のせいか、原因不明のトラブルに遭遇して頭を抱えることになった。 "MRTI2015"のプログラムをmbedのサイトで再コンパイルしてダウンロードしてNucleoF401REに書き込むとOKなのに、何故か、よりシンプルにしただけの今回のプログラムは、エラーも出ずコンパイル成功するのに、ダウンロードしてNucleoF401REに書き込むと、何らかのトラブルでdefaultのプログラム(オンボードLEDを高速点滅させるのでスグに分かる。僕のプログラムはこのLEDを消灯したままにしている筈なのに)に書き換わってしまい、肝心の改訂プログラムが書き込めない、という現象に悩まされたのである。

こういうトラブルは、(1)自分の作ったハードに問題があるのか、(2)NucleoF401REプログラムに問題があるのか、(3)デバッグのためのホストMac7プログラムに問題があるのか、はたまた(4)mbedのサイトの開発ツール自体に問題があるのか、原因が広範なので長年の経験が試されるところだ。 少なくとも「過去の"MRTI2015"のプログラムではうまくいく」というところから、どうやら(4)らしい・・・と攻めていって、遂に発見した。 mbed(ARM)の開発ツールやライブラリは刻々と知らされないうちに改訂されていくので、ここで整合性が取れなくなっていたのだ。 結局、新しく作った"PAW-eight"というプログラムに自動生成されるシステムライブラリ"mbed"が(改訂された副作用で)問題らしく、これをいったん消して、"MRTI2015"のプログラムにある(古い)システムライブラリ"mbed"をコピーしてやることで、少なくともNucleoF401REに書き込むことが出来る、と判明するまでに3時間ほど、かかった。

そしてそこからさらに2時間ほどかけて、最後に残った謎な現象を追いかけた。 8個のPAWセンサからそれぞれ4チャンネルのセンシング情報、計32チャンネルのセンサ情報が得られる筈なのに、何故か32本のグラフの最後の2本だけが動かない、というバグである。 こちらもあれこれ試行錯誤した結果、なんと製作に使ったNucleoF401REボードの「PC_14」ピンが何故か死んでいる、という非常に稀な原因であることを突き止めて、これを「PC_10」ピンに置換することで、ようやく完全にハードウェア(NucleoF401REファームウェアを含む)が以下のように完成した。

main.cpp

#include "mbed.h"
#include "MIDI_sub8.h"

int main(){
    int i, j, p, counter;
    unsigned char adc_new;
    i = j  = p = counter = 0;
    rx_top = rx_end = tx_top = tx_end = 0;
    adc_no = 0;
    MIDI.baud(115200);
    MIDI.attach(&rx_fifoset, MIDI.RxIrq);
    for(i=0; i<16; i++){
         LED_set(i, 0);
    }  
    for(i=0; i<32; i++){
         adc_old[i] = 0;
    }  
    while(1){        
        p++;
        if(p == 500){
            LED_set(adc_no * 2, 1);
            LED_set(adc_no * 2 + 1, 0);
        }
        else if(p == 1000){
            adc_new = ADC_get(adc_no * 2);
            if(adc_old[adc_no * 4] != adc_new){
                adc_old[adc_no * 4] = adc_new;
                tx_fifoset(0xB0);
                tx_fifoset(adc_no * 4);
                tx_fifoset(adc_new);
            }
            adc_new = ADC_get(adc_no * 2 + 1);
            if(adc_old[adc_no * 4 + 1] != adc_new){
                adc_old[adc_no * 4 + 1] = adc_new;
                tx_fifoset(0xB0);
                tx_fifoset(adc_no * 4 + 1);
                tx_fifoset(adc_new);
            }
            LED_set(adc_no * 2, 0);
            LED_set(adc_no * 2 + 1, 0);
        }
        else if(p == 1500){
            LED_set(adc_no * 2, 0);
            LED_set(adc_no * 2 + 1, 1);
        }
        else if(p > 1999){
            p = 0;
            adc_new = ADC_get(adc_no * 2);
            if(adc_old[adc_no * 4 + 2] != adc_new){
                adc_old[adc_no * 4 + 2] = adc_new;
                tx_fifoset(0xB0);
                tx_fifoset(adc_no * 4 + 2);
                tx_fifoset(adc_new);
            }
            adc_new = ADC_get(adc_no * 2 + 1);
            if(adc_old[adc_no * 4 + 3] != adc_new){
                adc_old[adc_no * 4 + 3] = adc_new;
                tx_fifoset(0xB0);
                tx_fifoset(adc_no * 4 + 3);
                tx_fifoset(adc_new);
            }
            LED_set(adc_no * 2, 0);
            LED_set(adc_no * 2 + 1, 0);
            adc_no++;
            if(adc_no > 7) adc_no = 0;
        }        
        tx_fifo_check();
        if(rx_fifo_check() == 1){
        }
        if(++j > 1000000){
            j = 0;
            counter = ++counter & 0x7F;
            tx_fifoset(0xC0);
            tx_fifoset(counter);
        }
    }
}

MIDI_sub8.h

unsigned char rxFIFO[256], txFIFO[256], adc_old[32];
unsigned char rx_top, rx_end, tx_top, tx_end, status, keyno, dcb;
int midi_message, adc_no;

RawSerial MIDI(PA_11, PA_12);
DigitalOut A_5(PB_8);
DigitalOut A_4(PB_9);
DigitalOut B_5(PC_7);
DigitalOut B_4(PA_9);
DigitalOut C_5(PB_4);
DigitalOut C_4(PB_5);
DigitalOut D_5(PB_7);
DigitalOut D_4(PC_13);
DigitalOut F_5(PC_9);
DigitalOut F_4(PC_8);
DigitalOut G_5(PB_12);
DigitalOut G_4(PB_6);
DigitalOut H_5(PB_2);
DigitalOut H_4(PB_15);
DigitalOut I_5(PA_15);
DigitalOut I_4(PC_10);
AnalogIn A_3(PA_7);
AnalogIn A_2(PA_6);
AnalogIn B_3(PA_5);
AnalogIn B_2(PA_0);
AnalogIn C_3(PA_2);
AnalogIn C_2(PA_3);
AnalogIn D_3(PA_1);
AnalogIn D_2(PB_0);
AnalogIn F_3(PC_0);
AnalogIn F_2(PC_5);
AnalogIn G_3(PC_2);
AnalogIn G_2(PC_3);
AnalogIn H_3(PB_1);
AnalogIn H_2(PC_4);
AnalogIn I_3(PA_4);
AnalogIn I_2(PC_1);

void LED_set(int num, int value){
    switch(num){
        case(0):
            A_5 = value;
            break;
        case(1):
            A_4 = value;
            break;
        case(2):
            B_5 = value;
            break;
        case(3):
            B_4 = value;
            break;
        case(4):
            C_5 = value;
            break;
        case(5):
            C_4 = value;
            break;
        case(6):
            D_5 = value;
            break;
        case(7):
            D_4 = value;
            break;
        case(8):
            F_5 = value;
            break;
        case(9):
            F_4 = value;
            break;
        case(10):
            G_5 = value;
            break;
        case(11):
            G_4 = value;
            break;
        case(12):
            H_5 = value;
            break;
        case(13):
            H_4 = value;
            break;
        case(14):
            I_5 = value;
            break;
        case(15):
            I_4 = value;
            break;
    }
    return;
}
    
unsigned char ADC_get(int num){
    unsigned short data = 0;
    switch(num){
        case(0):
            data = A_3.read_u16();
            break;
        case(1):
            data = A_2.read_u16();
            break;
        case(2):
            data = B_3.read_u16();
            break;
        case(3):
            data = B_2.read_u16();
            break;
        case(4):
            data = C_3.read_u16();
            break;
        case(5):
            data = C_2.read_u16();
            break;
        case(6):
            data = D_3.read_u16();
            break;
        case(7):
            data = D_2.read_u16();
            break;
        case(8):
            data = F_3.read_u16();
            break;
        case(9):
            data = F_2.read_u16();
            break;
        case(10):
            data = G_3.read_u16();
            break;
        case(11):
            data = G_2.read_u16();
            break;
        case(12):
            data = H_3.read_u16();
            break;
        case(13):
            data = H_2.read_u16();
            break;
        case(14):
            data = I_3.read_u16();
            break;
        case(15):
            data = I_2.read_u16();
            break;
    }
    return(data>>9);
}
    
int rx_fifo_check(void){
    unsigned char data;
    if(rx_top != rx_end){
        data = rxFIFO[rx_end];
        ++rx_end &= 255;
        if (data > 127){
            status = data;
            dcb = 0;
            return(0);
        }
        else if(status > 0xEF){
            return(0);
        }
        else if( (status > 0xBF) && (status < 0xE0) ){
            midi_message = (status<<16) + (data<<8);
            dcb = 0;
            return(1);
        }
        else if(dcb==0){
            keyno = data;
            dcb++;
            return(0);
        }
        else{
            midi_message = (status<<16) + (keyno<<8) + data;
            dcb = 0;
            return(1);
        }
    }
    return(0);
}

void rx_fifoset(void){
    rxFIFO[rx_top] = MIDI.getc();
    ++rx_top &= 255;
    return;
}

void tx_fifo_check(void){
    if(MIDI.writeable() == 1){
        if(tx_top != tx_end){
            MIDI.putc(txFIFO[tx_end]);
            ++tx_end &= 255;
        }
    }
    return;
}

void tx_fifoset(unsigned char data){
    txFIFO[tx_top] = data;
    ++tx_top &= 255;
    return;
}

これで明日には、センサ下部が浮いている部分をエポキシで補強したり、ケース内部にNucleoF401REボードがプラプラ浮いているのをなんとか固定する、という「最後の仕上げ」に入れることになった。 午後半日をかけたデバッグになってしまったが、まぁ、久しぶりのmbedなので、こんなところだろう。

2017年9月7日(木)

時差ぼけ解消のためにタップリと眠って、今日は朝イチで このように いつものエポキシ接着剤でNucleoF401REボードやケーブルを固定して、遂に新しいインターフェース「PAW-eight」が完成した。 32個のセンサ情報を以下のように個別にトリミング(センサごとの最大値と最小値をscaleのパラメータ化)して最終的に32チャンネルの「0-100」というバリューが綺麗に出るようにして、これでインターフェース部分は完成である。

YouTube

そしてOpenBCIから届いてきたメイルは、 WiFi Shield が出たよ、というものだった。 久しぶりなので、 Wifi Getting Started Guide を眺めてみたが、そこで画面のメニューに Fixing FTDI InBufferSize for OS X というのを発見した。 これはかつてOpenBCIで、そしてTWE-Liteでも共にぶつかっていた、「Mac OSX(当面は10.9〜10.11)はUSBドングルのシリアル処理を行うvirtual com port (VCP) driverの問題でリアルタイム通信でデータ落ちする、その解決法。ただしsystem configurationを書き換えて、さらにFTDIドライバを最新の2.3でなく2.2.18に入れ替える必要がある」というやつである。 調べてみるとこのページはいまだ過去のままであり、どうもほぼここでストップしている模様だ。 ここに入り込むと、一気にOpenBCIもTWE-Liteも遊べるのだが、「古いバージョンに環境を戻す」というのがいまだにひっかかる。 時間が解決してくれるとすれば、世界中の研究者が注目している「先端」の証拠になるが、進んでいないということは・・・ちょっと悩ましい。(^_^;)

さらにニュースとして、「量子力学から熱力学第二法則を導出することに成功」というのが飛び込んできた 。 どうやら これ らしいが、なんだかとても難解である(^_^;)。 プリゴジンが直感的に持っていた発想のようで、これが本当に検証されれば間違いなくノーベル賞ものだが、果たしてどうなるか。 時間学の視点からもとても興味あるが、「理論的に導出」というのでは話にならないので、これを傍証する実験を提唱して実際に確認する必要がある。 ノーベル賞は20〜30年後ぐらいかな。 タイトルとアブストラクトは以下である。

Fluctuation Theorem for Many-Body Pure Quantum States
We prove the second law of thermodynamics and the nonequilibirum fluctuation theorem for pure quantum states.The entire system obeys reversible unitary dynamics, where the initial state of the heat bath is not the canonical distribution but is a single energy-eigenstate that satisfies the eigenstate-thermalization hypothesis (ETH). Our result is mathematically rigorous and based on the Lieb-Robinson bound, which gives the upper bound of the velocity of information propagation in many-body quantum systems. The entanglement entropy of a subsystem is shown connected to thermodynamic heat, highlighting the foundation of the information-thermodynamics link. We confirmed our theory by numerical simulation of hard-core bosons, and observed dynamical crossover from thermal fluctuations to bare quantum fluctuations. Our result reveals a universal scenario that the second law emerges from quantum mechanics, and can experimentally be tested by artificial isolated quantum systems such as ultracold atoms.

その後、あれこれあれこれあれこれ後期に関する些事が重なり、4限には学生委員会の予定もあり、ぼちぼち進めた。 せっかく作ったインターフェースを生かすも殺すも、それを使ったアプリケーションが全てである。 既にjitterで実験してきた雛形があるので、次はここからが勝負だ。 まずは上のように、出来立てのセンサ〜インターフェース「PAW-eight」と、北海道行きの機内でまで実験を進めていたOpen-GLプログラムとを合体させた。 8本指に対応するのはこの8個の光源であり、これを「うにうに」動かす、というのが思いついたアイデアなのである。

YouTube

学生委員会が終わって研究室に戻って、とりあえず8個のセンサの4チャンネルのうち1個のデータだけを使って、光源を遠くから中心付近に寄せてくる・・・という基本的な動作をさせてみたのが、上の様子である。 まだまだこれでは「うにうに」の微妙さがまったく無いので、ここからが本番となるが、まぁ明日以降となった。 とりあえず、夏休みのテーマとして構想していたものの一部が、ようやく稼働してきた。 ここから「癒し」までの道のりが遠大だが、そこにチャレンジの夏休みなのだ。 とりあえずHTMLが200KBを超えたようなので、ここでpart1を終えて、続きはpart2にいくことにしよう。

→ 続・Max7日記(2)

「日記」シリーズ の記録