Sketching日記(7)

(実際のところは「Max8日記」かも)

長嶋 洋一


→ Sketching日記(1)

→ Sketching日記(2)

→ Sketching日記(3)

→ Sketching日記(4)

→ Sketching日記(5)

→ Sketching日記(6)

→ Sketching日記(8)

→ Sketching日記(9)

→ Sketching日記(10)

→ Sketching日記(11)

→ Sketching日記(12)

→ Sketching日記(13)

→ Sketching日記(14)

→ Sketching日記(15)

→ Sketching日記(16)

→ Sketching日記(17)

→ Sketching日記(18)

→ Sketching日記(19)

→ Sketching日記(20)

2020年9月28日(月)

いよいよ今週から後期、対面(in-person)講義の再開である。 午前中にマルチメディア室に行ってみると、 このように 「仕切り」が完璧に出来ていたが、ブラインド全開ではプロジェクタのスクリーンが見えないので、とりあえずブラインドを下ろしておいたが、実際には換気も必要になってくる。 そして、マルチメディア室のMacがとりあえずちゃんと動くことを確認した。 必要なのはMax7の起動時のデモモード(パッチを保存できない)を解除するために、電源ONした最初にいったんMax7を起動して、PreferencesでProxyが指定されているのを削除してから一旦Max7をQuitして、再び起動する・・・というおまじないである。 これは来年3月末までは続くことになる。

 

その後、研究室に戻って、後期の3科目のページとして、 インタラクティブプロダクト演習メディア数理造形演習基礎演習E のページをやっつけで作ってみた。 これは日々刻々と更新していくことになる。

 

そして、業者に発注していた非接触体温計も このように 届いた。 電源ボタンを押して2-3秒で計測できて、電源ボタンを離せば5秒ほどでシャットダウンする。 これは素晴らしい。 実際の講義は10/1(木)の インタラクティブプロダクト演習 と10/2(金)の メディア数理造形演習 から始まるのだが、9/30(水)には新入生がようやく大講義室に集まってのガイダンスがある。 水曜日はゼミの日だがこれにバッティングする可能性があったので(結果的には午前の1回生ガイダンスに行く必要はなくなった模様)、さらに1日、前倒しして、明日の火曜日の2限に「有志ゼミ」でなく「正規ゼミ」を行うことにした。 ただし「研究室でのゼミは教員を入れて5人以内」というお達しがあったので、とりあえず4回生にはZOOMで参加してもらう体制でスタートする。

2020年9月29日(火)

ばたばたと新学期は始まった。 朝イチからセッティングして、後期ゼミ初日は このように 無事に進んだ。 1106に慣れている4回生は北京の王さんとともにZOOM参加で、1106ゼミは初めてとなる4人が集まったが、ぼちぼち順調に推移した感じである。

 

 

 

 

 

ちなみに(リンク切れするが)全90分の記録動画は これ である。 これで明日は1回生(お互いに顔合わせするのは幻の入学式の代わりに初めて!!)のガイダンスがあり、午後には各領域の2回生ガイダンスがあって、あとはもう怒涛のように後期に雪崩れ込む。 1人でもコロナ感染者が出れば急遽1週間ほど全学ストップして、その後もどうなるかまったく不明・・・という綱渡りの日々が始まるのだ。

 

そして、フト思い立って、上のように久しぶりにmbedのサイトに行ってみた。 過去の日記のどこに書いたかも忘却の彼方なのだが、NucleoF401REのプログラミングが出来なくなった・・・というトラブルを放置したままだったのだ。 過去にびしばしNucleoF401REを活用してきたシステムでは、mbedサイトのオンラインコンパイラで完成したバイナリをデスクトップにダウンロードして、あとはNucleoF401REをUSBに繋いだら自動マウントされて出現するアイコンにドラッグ&ドロップで書き込みが終了していた。 ところがmbedが謎の「mbed OS」というのになってからというもの、この「過去の資産」が全く使えなくなってしまっていた。 コンパイルの段階でほぼ「予選落ち」のようなfatal errorが出てしまい、同様に戸惑った過去からのデベロッバの嘆きとかがユーザーフォーラムに書き込まれていたので、まぁmbed側のバグだろうから落ち着くまでは放置、と決めていた。 そして今日やってみると、同様に過去の資産は全滅だが、試しにexampleをコンパイルしてみるとちゃんと成功して、ダウンロードしたバイナリをドラッグ&ドロップすれば成功する、というのを確認できた。 つまり、昨日までは「もうNucleoF401REは使えないカモ」だったのが、「NucleoF401REを使うのであれば新たにゼロから作ればいい」と事態は進展したわけである。 とりあえず、これは「良し」とすべきだろう。

 

その後、帰る前にあと少しやってみよう・・・と、mbedのサイトで、出てきたエラーメッセージから検索をかけてみると、 Mbed online compiler problem - compilation needed after long time と、まさに僕と同じように悩んだデベロッパのトピックがあった。 そしてその中で「I solve the problem by removing and reimporting the mbed library.」という記述を見つけて、駄目モトでやってみると、なんとなんと 過去のプログラムでコンパイル成功する方法 というのを発見してしまった。 上はその様子である。 このYouTube には、2つの「過去に開発したNucleoF401REプログラム」について、 (1)コンパイルをしたらエラーが出た、(2)ライブラリを最新にアップデートした、(3)コンパイルしてみると成功した!! という流れを記録してみた。 どうやらこれで、「過去に開発したNucleoF401REプログラムは今後も使える」・「過去のプログラム手法を今後も発展できる」という重要な確認が出来たことになる。 ゼミでの手応えもあった朝から始まって、なんとも充実の実感に溢れた1日となった。(^_^)

2020年9月30日(水)

正式には明日、10月1日から後期スタートであるが、今日は以下のように午前に 1回生ガイダンス があり、午後にも2回生領域別ガイダンスがあって、実質的には学内に多数の学生がドッと戻ってきて、今日からもう新学期である。 昨日の帰り際に大きく進展(回復)したmbed環境を受けて、研究室に出てきた朝イチでやった作業は、過去に開発した全てのNucleoF401REフログラムに対して、ライブラリのアップデートを行って、一部でちゃんとコンパイル成功することを確認した。 これで、ここ数ヶ月、モヤモヤしていた「Propellerの開発環境」と「NucleoF401RE(mbed)の開発環境」の謎が全てクリアになり、あと少しだけ残っているのは一部のArduinoでのトラブルであるが、Arduinoはたくさん種類があるので、問題のあるものは使わなければいいのだ。

 

そして午後には 2回生ガイダンス があり、他にもあれこれあって1日が終わった。 これまで半年、ほとんど研究室から出ないという超運動不足の日々を過ごしてきたためか、学内をちょっと移動してちょっと階段を上っただけで、けっこう疲れた。 これでは明日からが心配だが(^_^;)、まぁ、これでいよいよスタートなのだ。

2020年10月2日(金)

昨日の講義初日は、午前の「インタラクティブプロダクト演習」を終えた段階で、ようやく再開した通常授業の雰囲気と、久しぶりに出てきた学生たちの熱気にテンションMAXとなり、翌日は4-5限のために行けないので急遽有休を出して予約して早退し、ちょっと早めだったが「祝再開JoyJoyヒトカラ」に繰り出して5時間半62曲を堪能した。 そして今日は朝イチで眼科に通院し(いまだ「角膜上皮剥離性糜爛」は治らず、視点のちょうど真上の「不良上皮」のために視力0.3が続いてもう9ヶ月目に突入)、午後の「メディア数理造形演習」で、受講する精鋭とどんな話をしようか・・・と作戦を考えているところである。
それにしても、昨日の このニュース  には驚いた。この首相も長くはないな、と呆れつつ確信した。 過去に国会でこの制度についてやりとりしたという記録が ここ  にあり、関係した部分(発言147〜160)をダウンロードしたのが これ  であるが、どう考えても、今回の任命拒否は、おかしい。こりゃ駄目だぁ。(^_^;)
そして、ぼちぼち「メディア数理造形演習」のマルチメディア室に向かおうか・・・という3限の終わり頃になって、「トランプ大統領、COVID-19陽性」というニュースが飛び込んできた。 まぁ、マスクを馬鹿にして何もしていなかったのだから絵に描いたような「自業自得」であり、こちらもこりゃ駄目だぁ(^_^;)。 そして4-5限では、 メディア数理造形演習 に参加の精鋭11人と、なかなか「濃い」時間を過ごした(と自分では思っている)。 久しぶりの講義にヘロヘロになったものの、この充実感は何物にも代えがたい。 やはり対面授業がbestなのだった。

2020年10月3日(土)

怒涛の新学期冒頭が過ぎ去って、おそらく国内の大学なども同様のためか、ピッタリとメイルも届かない週末となった。 とりあえず来週の準備としては、火曜日の「基礎演習E」が初日、そして水曜にはゼミである。 木曜の「インタラクティブプロダクト演習」はオムニバスの各教員の週に入るので何もしない週がしばらく続くので、ゼミと共に金曜の「メディア数理造形演習」に向けて全力投球ということになる。 ここでフト思い立ち、11月初旬に開催される音楽情報科学研究会で発表するネタ(Muse 2)をだいぶ忘却していた事に気付いて、思い出しを兼ねて一通り「デモ」をしてみて、それを動画で記録してYouTubeに上げることにした。

 

 

 

 

当日はZOOMでのプレゼンは例によって「Keynoteの棒読み(Powerpointの棒読み)」を避けるために、またまたライヴのアドリブで話す予定だが、そこで実際にMuse 2を装着してデモするつもりなので、万一、トラブルで失敗した時には「ここを見てね」というYouTube動画を保険のために上げておく、という意味もあるのだ。 そして途中でちょっとモタモタしたものの、約20分の YouTube動画 を作ることで、忘れかけていた段取りをだいぶ思い出した。 まだ発表まではほぼ1ヶ月あるので、また近づいたら、講義の中で学生に見せつつデモする事で「思い出し」をすることにしよう。

2020年10月4日(日)

今年は3月あたりからずっと、COVID-19のために世界的にテンションが下がっている年なのだ、と実感している。 正確には、COVID-19のためにではなくて、そのためにこの前期はリモート体制となったために、学生たちと直接 このような エキサイティングな日々を送れないのでテンションが下がっているのだった。 その証拠に、出張もないので毎週土日は必ず研究室に出てくるものの、あまり何かを作るとか何か実験するとかの意欲がそれほど盛り上がってこない半年だった。 ところがいざ、後期がスタートしてみると、元気な学生たちと顔を合わせたことでこちらも元気をもらったのか、今日は突然に「Propellerやりたい」と思いついた。

 

そこで 日記シリーズ から辿ってみると、「Propeller日記」の Part1 は「2008年2月9日」から始まって、以下の写真のような実験(ソフトウェアで2系統のNTSCビデオ信号を生成しつつ、ビットごとにシリアル処理をしてMIDI送信・MIDI受信 !!)をして、「2008年5月21日」の Part5 で「トランジスタ技術」誌に2ヶ月連続で記事を書いたあたりまでで一旦、終わっていた。

 

そして、「Arduino日記 」・「Processing日記 」・「SuperCollider日記 」などを執筆しつつ(MaxとProcessingとSuperColliderとがOSCで情報交換しつつ同時に共存 !!)海外出張していた時期があって、その後に 続・Propeller日記 として「2012年8月27日」にスタートしていた。 その Part3 の「2012年9月25日(火)」に登場していたのが、その日に納品された「P8X32A Propeller QuickStart」(下の写真)であり、 Part4 の「2012年10月29日(月)」に、とりあえず「LED点灯」プログラムを走らせていた。 今日、思い立って研究室の棚から発掘してきたのが、この「P8X32A QuickStart」ボードなのだった。

 

その後、「続・Propeller日記」は、「ArduinoとGainerとPropellerを排他的に搭載する」というSUAC boardの設計をしつつ 続々・Propeller日記 に入って、その Part3 の最後、「2013年2月26日(火)」でSUAC boardが完成したところで一旦終了して、1年と2ヶ月ほどした「2014年4月16日(月)」に、単発の Part4 で、「どうやら、Propellerにようやく、時代の注目が集まってきたようである」と書いていたが、実際にはこれはその通りにならなかった(^_^;)。

 

その後の日記シリーズは、2013年から2015年まで「RaspberryPi日記」・「PureData日記」・「Max6日記」・「mbed日記」・「Myo日記」・「Xcode日記」と続いて、次にPropellerが登場したのは postGainer日記Part4 の「2016年03月02日(水)」・「2016年03月05日(土)」あたりから、 Part5 の「2016年03月22日(火)」・「2016年03月31日(木)」・「2016年04月07日(木)」あたりまでで、Propeller応用システムとしては最新の、リニア振動アクチュエータを使った「VFB10」を作ったところだった。

 

YAHOO.COMで「p8x32a quickstart」と入れて出てきた P8X32A Propeller QuickStart (Rev.B) のページに行ってみると、Overviewとしては「 The QuickStart is an evaluation board for the Propeller. As an open-source reference design the QuickStart board provides basic Propeller circuitry. Developers may use our PCB layout files as their own to speed their project towards completion. As a project board the QuickStart is fully expandable and provides unimpeded access to all I/O pins through an expansion header but includes some button inputs and LEDs to demonstrate programming. With USB power and a selection of QuickStart Project examples it's also the fastest way to get up and running. 」ということである。 Key Featuresとしては「Propeller P8X32A microcontroller」・「Power and program via USB Mini-B」・「Expansion header provides access to Vss, Vdd, 32 I/O pins」・「5 MHz crystal on board may be disabled by removing SMT jumper, allowing replacement with external through-hole crystal」・「Eight resistive touch buttons」・「Eight buffered LEDs」ということであり、実験だけでなく、全てのピンが出ているのでこれを組み込みにも使えるのだった。 そこでさっそく、業者にあと10個ほど購入する見積もり依頼をメイルした。 だいぶ昔の記憶を蘇らせる感じだが、以下がこのボードの詳細な仕様である。 約10年前に出たボードであるが、現在の最新Arduinoに対しても、mbed NucleoF401REに対しても、遜色ないというどころか、いまだ現役で超強力な仕様なのだ。

そこで P8X32A Propeller QuickStart (Rev.B) のページの「Download & Documentation」から、 QuickStart-Guide.pdf  と QuickStart-Schematic.pdf  と ExecutionTime.pdf  という技術資料をまず、ゲットした。 さらにちょうどいいサンプルプログラムとして Touch-Buttons-LED-Demo  というのがあったので、さっそく久しぶりのIDE「bst」でやってみると、ものの数分でアッサリと「スイッチ電極を触るとLEDが光る8つのチャンネル」をコンバイルする、というデモが このように 出来てしまった。

 

そして、収穫はここからである。 P8X32A Propeller QuickStart (Rev.B) のページの「Download & Documentation」にあったのが、 Jon-Titus-Experiments.pdf  という492ページのテキスト(pdf)と、その中に出てくる「P8X32A QuickStart」ボードのPropellerサンプルプログラムをまとめた Jon-Titus-Experiments-Code.zip  である。 なんだか凄いぞ・・・とこの厖大なテキストをフリー公開している著者を調べてみると、この Jonathan A. Titus という人は、なんとあのPDP-8(DEC)を開発した人だという。

このテキスト  は以下のように23個の「実験」から構成されているが、いやいやハードロジックからトランジスタまで遡って詳細に解説して、それが現代では「P8X32A QuickStart」のこんな簡単なPropellerプログラムで出来ちゃうんだよ・・・というテキストだった。 これは、ちょっとあまりに昔のネタで今の学生には不要かもしれない部分はあるものの、僕には隅から隅までピンとくる(というよりもビンビン来る(^_^))、エレクトロニクスからマイクロコントローラまでの基礎をじっかり網羅的に解説した「実験」なのだった。 レベル的には電子情報工学領域の大学院生ぐらいだが、実に素晴らしいものを見つけてしまった。

ここまでは簡単だったものの、実際にこのデモのPropellerプログラムをきちんと眺めてみると、もう忘却の彼方となっているspin言語とPropellerアセンブラの、かなりトリッキーなものである事が判明してきた。 見た目はシンプルだが、中身はとてもとても深いのだった。 以下はメインとなるspinプログラムである。
CON
	_CLKMODE = XTAL1 + PLL16X
	_CLKFREQ = 80_000_000

OBJ
	Buttons  : "Touch Buttons"

PUB Main
	Buttons.start(_CLKFREQ / 100)		' Launch the touch buttons driver sampling 100 times a second
	dira[23..16]~~						' Set the LEDs as outputs
	repeat
		outa[23..16] := Buttons.State		' Light the LEDs when touching the corresponding buttons 
そして、以下がメインから呼ばれている"Touch Buttons"のプログラムであり、spinとアセンブラの両方から出来ている。
CON
	BUTTON_PINS  = $FF					' The QuickStart's touch buttons are on the eight LSBs
	SAMPLES  = 32						' Require 32 high redings to return true

VAR
	long  Results

PUB Start(Rate)
	Results := Rate
	cognew(@Entry, @Results)				' Launch a new cog to read samples

PUB State | Accumulator
	Accumulator := Results				' Sample multiple times and return true
	repeat constant(SAMPLES - 1)			'  if every sample was highw
		Accumulator &= Results
	return Accumulator

DAT
		org
Entry                                                                                                                                    
              rdlong	WaitTime, par
              mov		outa, #BUTTON_PINS		' set TestPins high, but keep as inputs
              mov		Wait, cnt				' preset the counter
              add 		Wait, WaitTime
Loop
              or		dira, #BUTTON_PINS		' set TestPins as outputs (high)
              andn		dira, #BUTTON_PINS		' set TestPins as inputs (floating)
              mov		Reading, #BUTTON_PINS	' create a mask of applicable pins
              waitcnt	Wait, WaitTime			' wait for the voltage to decay
              andn		Reading, ina				' clear decayed pins from the mask
              wrlong	Reading, par				' write the result to RAM
              jmp		#Loop

Reading			res       1
WaitTime		res       1
Wait 			res       1
2008年に書いていた Propeller日記 では、 Propellerマニュアル  と首っ引きで、上のプログラムの1行1行の全てを解読して理解してきたのだが、それはもう脳内からほぼ完全にクリアされてしまっている。 これまで、いくつものPropellerシステムを開発してきたが、その最初の頃に作ったモジュールをほぼブラックボックスとして繋いできているだけで、アセンブラのトリッキーな処理などは一切、手を加えずに「単純にそのまま再利用して」来たのだった。 これをまた久しぶりにゼロからやるのは、なかなか厳しいかもしれない(^_^;)。 しかし、久しぶりに日曜の半日をかけてこんな作業が出来たのは、まさに新学期になって触れ合った学生たちからの熱気のお陰なのだ。

2020年10月5日(月)

睡眠というのは、心理学でも脳科学でも生物学でも永遠の謎である。 昨日は数年ぶりにPropellerのプログラム、それも上のようにspinだけでなくアセンブラをこの日記に載せたものの、まったくピンと来ない忘却の彼方だった筈なのに、何故か夜中に目覚めた時には、12年前に「トランジスタ技術」誌に書いたPropellerの概要がきちんと思い出されていて、さらに朝までの惰眠の間には、なんと「Propellerアセンブラの仕掛けまで解ったつもりになって目覚めた」という夢を見た(^_^;)。 そして研究室に出てきて上のプログラムを眺めてみると、本当に細部の細部は別にして、ちゃんと「分かった」。 こうなれば、 Jonathan A. Titus さんの力作である素晴らしいテキスト Experiments for the Propeller Quickstart Text  をここでザッと眺めつつ解説して、そこに出てくるPropellerプログラムでリハビリするしかない。

 

An Introduction

全23章からなる「実験」の前にイントロという章があり、その末尾にはJonathan A. Titus氏のラボらしい上の写真がドンと鎮座していた。 興味があるならどうぞ頑張って勉強して楽しんで下さい、という冒頭の英語はとても簡単であり、一読に値する。 その最後には「IMPORTANT」として、このテキストの実験ではコンセント(100V-120V-240V)に繋がる強電のPower Supplyが必要であるものの、実際の電子回路では1.5Vの乾電池で8本分の直流12Vまでの弱電しかないので安心だ、と書いてくれていた。 ちょうどこの前期の僕の 基礎演習E でも、解説の冒頭できちんと書いていた部分に対応していた。 以下、この「An Introduction」で見出しとして並んだ項目を、以下にごくごく簡単に紹介するので、電子工学の入り口を勉強してみたい人は、元の テキスト  と対応させて確認してみて欲しい。

Experiment No. 1 - How To Measure and Use LED Characteristics

第1章では15ページから32ページまでかけて、LEDについて、これでもかという程に詳しく解説してある。 「基礎演習E」の的場さんの回では、LEDにボタン電池(3V)を繋いで点灯させているが、これは電子工学的にはちょっとあまりに安易であることが、この章の解説から理解できる。 LEDのメーカが提供するデータシートの読み方から始まり、LEDの光の指向性、以下のような電磁波の「波長」と「色」の関係、アノードとカソード、順方向電圧と電流制限抵抗、電圧と電流との関係、LEDの色ごとに必要な順方向電圧、電流制限抵抗を色々に変えてのLED点灯実験、関連して抵抗器の電力容量、などなど、まぁこれは基本の基本であるものの、ここまでちゃんと理解しなくても活用できるLEDについて、徹底的に解説している。 PDP-8を開発していたような時代には、LEDという部品も安定していなかったので、そういう時代背景の迫力が伝わってきた。

Experiment No. 2 - Flash LEDs with the 555 Timer

第2章では16ページから51ページまでかけて、ディジタルの基礎の部分をザッと駆け抜けている。 タイトルは「555でLEDを点灯させる」だが、実質的にはディジタル回路に関する総ざらえである。 話としてはまず両端に電圧計を付けたコンデンサに抵抗を経て電源を供給するところにスイッチを入れて、「ONすれば電圧は次第に電源電圧まで上昇」・「OFFすると電圧は次第にGNDへ」ということで、これを繰り返すのがディジタルだ、と解説。

 

そして上のように「555」というICを紹介して、外付けの2個の抵抗と1個のコンデンサの充放電で連続的に上下する電圧が、スレショルドとトリガによってディジタル的に「H」か「L」の2値が出力される原理を解説して、さらに実際に抵抗とコンデンサとLEDを繋いだ回路での点滅を体験する。 解説では時定数から周波数の計算方法も紹介されているが、まぁこれはブレッドボードでカットアンドトライしたり、ポテンションメータ(半固定抵抗)で可変にするので、計算なんてのはしなくても大丈夫である(^_^;)。 「OPTIONAL」として、色々な単位についてのdimension解析の解説もあるが、まぁここもとりあえずはスキップしても何も困らない。 僕がこのあたりをやった時には、たぶんまだ世の中に「555」が出ていなかったのか、記憶にあるのも手元にあるのも、VCO(電圧制御オシレータ)の 74HC123 とか 74LS124 とか 74LS624 とかだったので、あまり実際に555を使った記憶はない。 全てAKI-H8などのマイコンでやってきたからである。

 

ここから話は上のように、「555」の出力と反転出力に2個のLEDを付けると、そのデューティ比が等しくない、つまりディジタルといっても方形波である事を説明して、555の出力にJ-Kフリップフロップ74LS76を繋いで、きっちりとデューティ比が50%の矩形波になる・・・という方向に進んでいく。 74LS76というのは僕の研究室の部品棚には無くて、74HC74というか74HC174とか74HC374などがある。 そして2個のLEDから今度は4個のLEDを点灯させるために、2個のF/F(フリップフロップ)の入った74LS93で2段カウンタとして、2ビットの2進数に相当する表示をするとともに、LEDを負論理(ディジタル信号が[L]で点灯、[H]で消灯)であるためにインバータの74LS04によって反転させる、以下のような回路に到達する。 こういう実験は、まさにサラリーマン時代、河合楽器の研究開発センターに配属された新入社員時代に、最初にやった気がする(^_^)。

テキストではその後、「Digging Deeper into the 555 Timer Circuit」という解説で、伝説のICとも言える「555」の内部について、詳しく解説している。 また、7493を2段接続して、合計で8ビットのバイナリカウンタを構成した回路を紹介しているが、これは僕がテキスト センサとマイクロエレクトロニクスの概要 の中で、74HC393を使って紹介した以下の回路とまったく同じものになっている。(^_^)

Experiment No. 3 - Counters and Numeric Displays

第3章では、前章で作ったカウンタの出力を表示するディスプレイデバイスとして「7セグメントLED」が登場する。 今の学生にはピンと来ないかもしれないが、現在のようなフルドット・ディスプレイが登場する前にあったのは「7*9ドット」など、LCDモジュールでお馴染みのドットマトリクスLCDだったが、その前にはさらにドット数が減って、以下のようなたった7個のLEDで「0」から「9」までの数字を表示する、という、エレベータの中などでいつも見ているアレである。もう少し増やして「米」のようにして、読みにくいながらアルファベットまで出来ものもあったが、とにかくこのディスプレイは、人類史において相当に長い歴史を持っている。

人間が「数字」と読み取れる情報をたった7個のセグメントに変換したデザインも凄いが、その並びは2進数であるディジタルの数値表現とはまったく関係ない。 7セグメントの図をたくさんコピーして、いちいち「0」ならコレとコレ、「1」ならコレとコレ・・・と対応表を作ってみれば分かるが、それを基礎的なディジタル電子回路(ANDとORとNOT)で構成すると、とっても面倒になる。 そこで当時は、「4ビット2進数の入力」→「7セグメントのLED表示」というのを実現するための専用ICが登場した。 これが以下の7447であり、その内部回路は以下のようになっている。

このあたりのディジタル技術の進展は1970年代のものである。 僕が大学を卒業して新入社員としてここらの勉強をしていた1980年代前半には、このようなICが活躍していたものの、1980年代から登場したマイクロコントローラ(MCU)によって、テキストの次章で紹介するように、この「4ビット2進数の入力」→「7セグメントのLED表示」は全てMCUのソフトウェアが行うようになった。 一時は一世を風靡した7447も、その後は完全に消えた。 ちなみに僕はめったに「7セグメントLED」を使うことがなかったが、実験室の部品棚にはジャンクで仕入れた正体不明(メーカも型番も不明)の大型7セグメントLEDがいくつもあったらしく、調べてみたら応用例として以下の2件が出てきたので紹介しておこう。

上は2006年から2007年にかけての冬休みに製作したもので、見ず知らずのメイルで依頼が届いた「sanoさん」のための特製マシンである。 音楽仲間とバンド活動をしている「sanoさん」は、ドラムマシンをコントロールするための制御装置を希望したので、実験室にあった正体不明の大きな7セグメントLED(メーカも型番も不明)を活用してみた。 大きなタッチボタンを叩くと、その間隔からシーケンサのテンポを決定するMIDI情報を送信するというものであり、メイキングは ここここ にあった。 ちなみにMCUはAKI-H8であり、そのソースコード(アセンブラ)は以下である。 テキストの次章に出てくる「参照テーブル」がちゃんと定義されている(^_^)。

;-----------------------------------------------------------
;	[Sano MIDI Tempo Controller]	January 2007
;-----------------------------------------------------------

;##### Port Defines #####
smr		.equ	h'0fffb0
brr		.equ	h'0fffb1
scr		.equ	h'0fffb2
tdr		.equ	h'0fffb3
ssr		.equ	h'0fffb4
rdr		.equ	h'0fffb5
p2ddr	.equ	h'0fffc1
p2dr	.equ	h'0fffc3
paddr	.equ	h'0fffd1
padr	.equ	h'0fffd3
pbddr	.equ	h'0fffd4
pbdr	.equ	h'0fffd6
iprb		.equ	h'0ffff8
tstr		.equ	h'0fff60
tsnc	.equ	h'0fff61
tmdr	.equ	h'0fff62
tfcr		.equ	h'0fff63
toer	.equ	h'0fff90
tocr	.equ	h'0fff91
tcr0	.equ	h'0fff64
tior0	.equ	h'0fff65
tier0	.equ	h'0fff66
tsr0	.equ	h'0fff67
tcnt0	.equ	h'0fff68
gra0	.equ	h'0fff6a

;##### Vector Defines #####
	.section vector,data,locate=h'000000
	.data.l	start
	.org	h'000060
	.data.l	int_timer0

;##### Work RAM Data Defines #####
	.section ram,data,locate=h'0fef10
tx_top		.res.w	1
tx_end		.res.w	1
div_d		.res.w	1
div_t		.res.w	1
tap_cnt		.res.w	1
phase		.res.b	1
timer1		.res.b	1
timer2		.res.b	1
flag			.res.b	1
tempo		.res.b	21
preset		.res.b	1
sw_old		.res.b	1
sw_prev		.res.b	1
sw_new		.res.b	1
old_buf		.res.b	1
eve_buf		.res.b	1
status		.res.b	1
up_p		.res.b	1
down_p		.res.b	1
	.org	h'0ff400
tx_fifo		.res.b	1024

;***** Constant Table Defines *****
	.section rom,data,locate=h'001000
tempo_1:
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	40-49
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	50-59
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	60-69
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	70-79
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	80-89
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	90-99
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	100-109
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	110-119
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	120-129
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	130-139
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	140-149
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	150-159
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	160-169
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	170-179
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	180-189
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	190-199
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	200-209
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	210-219
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	220-229
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101, b'11011011, b'01011111, b'01101101	; 0-4	230-239
	.data.b	b'01110111, b'11110111, b'00111101, b'11111111, b'01111111	; 5-9
	.data.b	b'10111111, b'00001101										; 0-4	240
tempo_10:
	.data.b	b'01101101, b'01101101, b'01101101, b'01101101, b'01101101	; 4	40-44
	.data.b	b'01101101, b'01101101, b'01101101, b'01101101, b'01101101	; 4	45-49
	.data.b	b'01110111, b'01110111, b'01110111, b'01110111, b'01110111	; 5	50-54
	.data.b	b'01110111, b'01110111, b'01110111, b'01110111, b'01110111	; 5	55-59
	.data.b	b'11110111, b'11110111, b'11110111, b'11110111, b'11110111	; 6	60-64
	.data.b	b'11110111, b'11110111, b'11110111, b'11110111, b'11110111	; 6	65-69
	.data.b	b'00111101, b'00111101, b'00111101, b'00111101, b'00111101	; 7	70-74
	.data.b	b'00111101, b'00111101, b'00111101, b'00111101, b'00111101	; 7	75-79
	.data.b	b'11111111, b'11111111, b'11111111, b'11111111, b'11111111	; 8	80-84
	.data.b	b'11111111, b'11111111, b'11111111, b'11111111, b'11111111	; 8	85-89
	.data.b	b'01111111, b'01111111, b'01111111, b'01111111, b'01111111	; 9	90-94
	.data.b	b'01111111, b'01111111, b'01111111, b'01111111, b'01111111	; 9	95-99
	.data.b	b'10111111, b'10111111, b'10111111, b'10111111, b'10111111	; 0	100-104
	.data.b	b'10111111, b'10111111, b'10111111, b'10111111, b'10111111	; 0	105-109
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	110-114
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	115-119
	.data.b	b'11011011, b'11011011, b'11011011, b'11011011, b'11011011	; 2	120-124
	.data.b	b'11011011, b'11011011, b'11011011, b'11011011, b'11011011	; 2	125-129
	.data.b	b'01011111, b'01011111, b'01011111, b'01011111, b'01011111	; 3	130-134
	.data.b	b'01011111, b'01011111, b'01011111, b'01011111, b'01011111	; 3	135-139
	.data.b	b'01101101, b'01101101, b'01101101, b'01101101, b'01101101	; 4	140-144
	.data.b	b'01101101, b'01101101, b'01101101, b'01101101, b'01101101	; 4	145-149
	.data.b	b'01110111, b'01110111, b'01110111, b'01110111, b'01110111	; 5	150-154
	.data.b	b'01110111, b'01110111, b'01110111, b'01110111, b'01110111	; 5	155-159
	.data.b	b'11110111, b'11110111, b'11110111, b'11110111, b'11110111	; 6	160-164
	.data.b	b'11110111, b'11110111, b'11110111, b'11110111, b'11110111	; 6	165-169
	.data.b	b'00111101, b'00111101, b'00111101, b'00111101, b'00111101	; 7	170-174
	.data.b	b'00111101, b'00111101, b'00111101, b'00111101, b'00111101	; 7	175-179
	.data.b	b'11111111, b'11111111, b'11111111, b'11111111, b'11111111	; 8	180-184
	.data.b	b'11111111, b'11111111, b'11111111, b'11111111, b'11111111	; 8	185-189
	.data.b	b'01111111, b'01111111, b'01111111, b'01111111, b'01111111	; 9	190-194
	.data.b	b'01111111, b'01111111, b'01111111, b'01111111, b'01111111	; 9	195-199
	.data.b	b'10111111, b'10111111, b'10111111, b'10111111, b'10111111	; 0	200-204
	.data.b	b'10111111, b'10111111, b'10111111, b'10111111, b'10111111	; 0	205-209
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	210-214
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	215-219
	.data.b	b'11011011, b'11011011, b'11011011, b'11011011, b'11011011	; 2	220-224
	.data.b	b'11011011, b'11011011, b'11011011, b'11011011, b'11011011	; 2	225-229
	.data.b	b'01011111, b'01011111, b'01011111, b'01011111, b'01011111	; 3	230-234
	.data.b	b'01011111, b'01011111, b'01011111, b'01011111, b'01011111	; 3	235-239
	.data.b	b'01101101, b'01101101										; 4	240
tempo_100:
	.data.b	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0			; -	40-69
	.data.b	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0			; -	70-99
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	100-
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	110-
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	120-
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	130-
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	140-
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	150-
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	160-
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	170-
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	180-
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	190-
	.data.b	b'00001101, b'00001101, b'00001101, b'00001101, b'00001101	; 1	
	.data.b	b'11011011, b'11011011, b'11011011, b'11011011, b'11011011	; 2	200-
	.data.b	b'11011011, b'11011011, b'11011011, b'11011011, b'11011011	; 2	
	.data.b	b'11011011, b'11011011, b'11011011, b'11011011, b'11011011	; 2	210-
	.data.b	b'11011011, b'11011011, b'11011011, b'11011011, b'11011011	; 2	
	.data.b	b'11011011, b'11011011, b'11011011, b'11011011, b'11011011	; 2	220-
	.data.b	b'11011011, b'11011011, b'11011011, b'11011011, b'11011011	; 2	
	.data.b	b'11011011, b'11011011, b'11011011, b'11011011, b'11011011	; 2	230-
	.data.b	b'11011011, b'11011011, b'11011011, b'11011011, b'11011011	; 2	
	.data.b	b'11011011, b'11011011										; 2	240
preset_1:
	.data.b	b'10010000, b'11010111, b'10100010, b'10000110, b'11000101	; 0-4	0-9
	.data.b	b'10001100, b'10001000, b'11010100, b'10000000, b'10000100	; 5-9
	.data.b	b'10010000, b'11010111, b'10100010, b'10000110, b'11000101	; 0-4	10-19
	.data.b	b'10001100, b'10001000, b'11010100, b'10000000, b'10000100	; 5-9
	.data.b	b'10010000, b'11010111, b'10100010, b'10000110, b'11000101	; 0-4	20-29
	.data.b	b'10001100, b'10001000, b'11010100, b'10000000, b'10000100	; 5-9
	.data.b	b'10010000, b'11010111, b'10100010, b'10000110, b'11000101	; 0-4	30-39
	.data.b	b'10001100, b'10001000, b'11010100, b'10000000, b'10000100	; 5-9
	.data.b	b'10010000, b'11010111										; 0-4	40
preset_10:
	.data.b	255,255,255,255,255,255,255,255,255,255						; -	0-9
	.data.b	b'11010111, b'11010111, b'11010111, b'11010111, b'11010111	; 1	10-19
	.data.b	b'11010111, b'11010111, b'11010111, b'11010111, b'11010111	; 1	
	.data.b	b'10100010, b'10100010, b'10100010, b'10100010, b'10100010	; 2	20-29
	.data.b	b'10100010, b'10100010, b'10100010, b'10100010, b'10100010	; 2	
	.data.b	b'10000110, b'10000110, b'10000110, b'10000110, b'10000110	; 3	30-39
	.data.b	b'10000110, b'10000110, b'10000110, b'10000110, b'10000110	; 3	
	.data.b	b'11000101, b'11000101										; 4	40

;***** Reset --> Initialize --> Main Loop *****
	.section program,code,locate=h'002000
start:
	mov.l	#h'0fff0f,er7		; stack pointer set
	mov.l	#h'0fef10,er2
	mov.w	#h'0fe0,r1
	mov.b	#0,r0l
_ram_clear:
	mov.b	r0l,@er2
	inc.l	#1,er2
	dec.w	#1,r1
	bne	_ram_clear
	mov.b	#b'00100011,r0l
	mov.b	r0l,@tcr0		; Timer0 init : 2MHz clock
	bclr	#0,@tsr0		; Clear IMFA
	bset	#0,@tier0		; timer INT set
	mov.w	#100,r0			; 0.05msec INT
	mov.w	r0,@gra0
	jsr	@sci0_init		; SCI initialize
	mov.b	#b'00000000,r0l
	mov.b	r0l,@p2ddr		; set : Port[2] all input
	mov.b	#b'11111111,r0l
	mov.b	r0l,@paddr		; set : Port[A] all output
	mov.b	r0l,@pbddr		; set : Port[B] all output
	mov.b	r0l,@pbdr		; Port[B] all High - Latch Pulse
	mov.b	#1,r0l
	mov.b	r0l,@preset
	mov.w	#0,e1
	mov.w	#1,r1
_tempo_init:
	mov.b	#120,r0l
	mov.b	r0l,@(tempo,er1)	; tempo : 40-240
	inc.l	#1,er1
	cmp.b	#21,r1l			; preset : 1-20
	bne	_tempo_init
	mov.w	#417,r0
	mov.w	r0,@div_t
	mov.w	#1000,r0
	mov.w	r0,@timer1
	jsr	@preset_display
	jsr	@tempo_display
	mov.b	@p2dr,r0l		; init switches
	xor.b	#b'11111111,r0l
	and.b	#b'01111111,r0l
	mov.b	r0l,@sw_prev
	mov.b	r0l,@sw_old
	mov.b	#b'00100000,r0l		; tx start !
	mov.b	r0l,@scr
	bset	#0,@tstr		; timer start !
	andc.b	#b'01111111,ccr		; interrupt enable
main_loop:
	jsr	@timer_check
	jsr	@tx_midi_check
	jmp	@main_loop

;***** Main Routines *****
timer_check:
	mov.b	@flag,r0l
	bne	_timer_event
	rts
_timer_event:
	mov.b	#0,r0l
	mov.b	r0l,@flag
	mov.w	@div_t,r0
	dec.w	#1,r0
	mov.w	r0,@div_t
	beq	_div_hit
	bra	_timer_job
	rts
_div_hit:
	mov.w	@div_d,r0
	mov.w	r0,@div_t
	mov.b	#248,r0h
	jsr	@tx_fifo_set
_timer_job:
	mov.b	@timer1,r0l
	dec.b	r0l
	mov.b	r0l,@timer1
	beq	_1msec
	rts
_1msec:
	mov.b	#20,r0l
	mov.b	r0l,@timer1
	jsr	@tap_check
	mov.b	@timer2,r0l
	inc.b	r0l
	mov.b	r0l,@timer2
	cmp.b	#25,r0l
	beq	_25msec
	rts
_25msec:
	mov.b	#0,r0l
	mov.b	r0l,@timer2
	jsr	@sw_scan
	rts
tap_check:
	mov.b	@phase,r0l
	bne	_tap_increment
	rts
_tap_increment:
	mov.w	@tap_cnt,r0
	inc.w	#1,r0
	mov.w	r0,@tap_cnt
	mov.w	#1550,r1
	cmp.w	r0,r1
	bmi	_over_1550msec
	rts
_over_1550msec:
	mov.w	#0,r0
	mov.b	r0l,@phase
	mov.w	r0,@tap_cnt
	rts

sw_scan:
	mov.b	@p2dr,r0l
	xor.b	#b'11111111,r0l
	and.b	#b'01111111,r0l
	mov.b	r0l,@sw_new		; R0L : current scanned SW [0-6]
	mov.b	@sw_prev,r1l
	cmp.b	r1l,r0l
	beq	_not_chatter
	mov.b	r0l,@sw_prev
	rts
_not_chatter:
	mov.b	r0l,r2h
	and.b	#b'00000110,r2h
	cmp.b	#b'00000110,r2h
	bne	_not_reset
	jsr	@reset_tempo
	rts
_not_reset:
	mov.b	@sw_old,r1l		; R1L : old status
	mov.b	r1l,@old_buf
	cmp.b	r1l,r0l
	bne	_sw_event
	and.b	#b'00000110,r0l		; tempo up/down pushing ?
	bne	_pushing
	rts
_pushing:
	jsr	@pushing_check
	rts
_sw_event:
	mov.b	r0l,@sw_old
	mov.b	r1l,r2l
	xor.b	r0l,r2l			; R2L : event bits
	mov.b	r2l,@eve_buf
	jsr	@bit0_test
	jsr	@bit1_test
	jsr	@bit2_test
	jsr	@bit3_test
	jsr	@bit4_test
	jsr	@bit5_test
	jsr	@bit6_test
	rts
bit0_test:
	mov.b	@eve_buf,r2l
	btst	#0,r2l
	bne	event_bit0
	rts
event_bit0:
	mov.b	@sw_new,r0l
	btst	#0,r0l
	bne	tap_on
	rts
tap_on:
	mov.b	@phase,r0l
	bne	_tap_count
	mov.b	#1,r0l
	mov.b	r0l,@phase
	mov.w	#0,r0
	mov.w	r0,@tap_cnt
	rts
_tap_count:
	mov.w	@tap_cnt,r1		; R1 = tap interval (msec)
	mov.w	#250,r2
	cmp.w	r1,r2
	bmi	_tap_ok
	mov.b	#240,r2l
	bra	_tap_tempo_set2
_tap_ok:
	mov.w	#1500,r2
	cmp.w	r1,r2
	bpl	_tap_ok2
	mov.b	#40,r2l
	bra	_tap_tempo_set2
_tap_ok2:
	mov.w	#0,e0
	mov.w	#60000,r0
	divxu.w	r1,er0			; 50000 / tempo --> R0
	mov.b	r0l,r3l
_tap_tempo_set:
	mov.b	@preset,r1l		; preset : 1-20 [not used 0]
	mov.w	#0,e1
	mov.b	#0,r1h
	mov.b	@(tempo,er1),r2l	; R2L : tempo of this preset (40-240)
	mov.b	#0,r2h
	mov.b	#0,r3h
	add.w	r3,r2
	shlr.w	r2
_tap_tempo_set3:
	mov.b	r2l,@(tempo,er1)	; R2L : tempo of this preset (40-240)
	mov.b	#1,r0l
	mov.b	r0l,@phase
	mov.w	#0,r0
	mov.w	r0,@tap_cnt
	jsr	@tempo_display
	rts
_tap_tempo_set2:
	mov.b	@preset,r1l		; preset : 1-20 [not used 0]
	mov.w	#0,e1
	mov.b	#0,r1h
	bra	_tap_tempo_set3

pushing_check:
	mov.b	@old_buf,r0l
	and.b	#b'00000010,r0l
	beq	_push_down
_push_up:
	mov.b	@up_p,r1l
	inc.b	r1l
	mov.b	r1l,@up_p
	cmp.b	#10,r1l
	beq	_push_up_go
	rts
_push_up_go:
	mov.b	#0,r1l
	mov.b	r1l,@up_p
	jsr	@increment_tempo
	rts
_push_down:
	mov.b	@down_p,r1l
	inc.b	r1l
	mov.b	r1l,@down_p
	cmp.b	#10,r1l
	beq	_push_down_go
	rts
_push_down_go:
	mov.b	#0,r1l
	mov.b	r1l,@down_p
	jsr	@decrement_tempo
	rts
bit1_test:
	mov.b	@eve_buf,r2l
	btst	#1,r2l
	bne	event_bit1
	rts
event_bit1:
	mov.b	@sw_new,r0l
	btst	#1,r0l
	bne	tempo_up
	rts
tempo_up:
	jsr	@increment_tempo
	rts
bit2_test:
	mov.b	@eve_buf,r2l
	btst	#2,r2l
	bne	event_bit2
	rts
event_bit2:
	mov.b	@sw_new,r0l
	btst	#2,r0l
	bne	tempo_down
	rts
tempo_down:
	jsr	@decrement_tempo
	rts
bit3_test:
	mov.b	@eve_buf,r2l
	btst	#3,r2l
	bne	event_bit3
	rts
event_bit3:
	mov.b	@sw_new,r0l
	btst	#3,r0l
	bne	preset_up
	rts
preset_up:
	mov.b	@preset,r0l
	inc.b	r0l
	mov.b	r0l,@preset
	cmp.b	#21,r0l
	beq	_to_01
	jsr	@preset_display
	jsr	@tempo_display
	rts
_to_01:
	mov.b	#1,r0l
	mov.b	r0l,@preset
	jsr	@preset_display
	jsr	@tempo_display
	rts
bit4_test:
	mov.b	@eve_buf,r2l
	btst	#4,r2l
	bne	event_bit4
	rts
event_bit4:
	mov.b	@sw_new,r0l
	btst	#4,r0l
	bne	preset_down
	rts
preset_down:
	mov.b	@preset,r0l
	dec.b	r0l
	mov.b	r0l,@preset
	cmp.b	#0,r0l
	beq	_to_20
	jsr	@preset_display
	jsr	@tempo_display
	rts
_to_20:
	mov.b	#20,r0l
	mov.b	r0l,@preset
	jsr	@preset_display
	jsr	@tempo_display
	rts
bit5_test:
	mov.b	@eve_buf,r2l
	btst	#5,r2l
	bne	event_bit5
	rts
event_bit5:
	mov.b	@sw_new,r0l
	btst	#5,r0l
	bne	continue_send
	rts
continue_send:
	mov.b	#251,r0h		; continue
	jsr	@tx_fifo_set
	mov.b	#1,r0l
	mov.b	r0l,@status
	jsr	@preset_display
	rts
bit6_test:
	mov.b	@eve_buf,r2l
	btst	#6,r2l
	bne	event_bit6
	rts
event_bit6:
	mov.b	@sw_new,r0l
	btst	#6,r0l
	bne	startstop_send
	rts
startstop_send:
	mov.b	@status,r0l
	beq	_to_start
_to_stop:
	mov.b	#252,r0h		; stop
	jsr	@tx_fifo_set
	mov.b	#0,r0l
	mov.b	r0l,@status
	jsr	@preset_display
	rts
_to_start:
	mov.b	#250,r0h		; start
	jsr	@tx_fifo_set
	mov.b	#1,r0l
	mov.b	r0l,@status
	jsr	@preset_display
	rts
increment_tempo:
	mov.b	@preset,r1l		; preset : 1-20 [not used 0]
	mov.w	#0,e1
	mov.b	#0,r1h
	mov.b	@(tempo,er1),r2l
	inc.b	r2l
	cmp.b	#241,r2l
	bne	_led_run
	mov.b	#40,r2l
_led_run:
	mov.b	r2l,@(tempo,er1)
	jsr	@tempo_display
	rts
decrement_tempo:
	mov.b	@preset,r1l		; preset : 1-20 [not used 0]
	mov.w	#0,e1
	mov.b	#0,r1h
	mov.b	@(tempo,er1),r2l
	dec.b	r2l
	cmp.b	#39,r2l
	bne	_led_run2
	mov.b	#240,r2l
_led_run2:
	mov.b	r2l,@(tempo,er1)
	jsr	@tempo_display
	rts
reset_tempo:
	mov.b	@preset,r1l		; preset : 1-20 [not used 0]
	mov.w	#0,e1
	mov.b	#0,r1h
	mov.b	#120,r2l
	mov.b	r2l,@(tempo,er1)
	jsr	@tempo_display
	rts
tempo_display:
	mov.b	@preset,r1l		; preset : 1-20 [not used 0]
	mov.w	#0,e1
	mov.b	#0,r1h
	mov.b	@(tempo,er1),r2l	; R2L : tempo of this preset (40-240)
	mov.b	#0,r2h
	mov.w	#0,e0
	mov.w	#50000,r0
	divxu.w	r2,er0			; 50000 / tempo --> R0
	dec.w	#1,r0
	mov.w	r0,@div_d
	mov.b	r2l,r0l
	mov.b	#40,r2h
	sub.b	r2h,r0l			; R0L : offset for display (0-200)
	mov.b	#0,r0h
	mov.w	#0,e0
	mov.l	#tempo_1,er1
	add.l	er0,er1
	mov.b	@er1,r3h		;  --> (tempo_1) --> r3h
	mov.b	r3h,@padr
	nop
	mov.b	#b'11111110,r3l
	mov.b	r3l,@pbdr
	nop
	mov.b	#b'11111111,r3l
	mov.b	r3l,@pbdr
	mov.l	#tempo_10,er1
	add.l	er0,er1
	mov.b	@er1,r3h		;  --> (tempo_10) --> r3h
	mov.b	r3h,@padr
	nop
	mov.b	#b'11111101,r3l
	mov.b	r3l,@pbdr
	nop
	mov.b	#b'11111111,r3l
	mov.b	r3l,@pbdr
	mov.l	#tempo_100,er1
	add.l	er0,er1
	mov.b	@er1,r3h		;  --> (tempo_100) --> r3h
	mov.b	r3h,@padr
	nop
	mov.b	#b'11111011,r3l
	mov.b	r3l,@pbdr
	nop
	mov.b	#b'11111111,r3l
	mov.b	r3l,@pbdr
	rts
preset_display:
	mov.b	@status,r4h		; status display mask
	rotr.b	r4h
	xor.b	#b'01111111,r4h
	mov.b	@preset,r0l		; preset : 1-20 [not used 0]
	mov.b	#0,r0h
	mov.w	#0,e0
	mov.l	#preset_1,er1
	add.l	er0,er1
	mov.b	@er1,r3h		;  --> (preset_1) --> r3h
	and.b	r4h,r3h
	mov.b	r3h,@padr
	nop
	mov.b	#b'11110111,r3l
	mov.b	r3l,@pbdr
	nop
	mov.b	#b'11111111,r3l
	mov.b	r3l,@pbdr
	mov.l	#preset_10,er1
	add.l	er0,er1
	mov.b	@er1,r3h		;  --> (preset_10) --> r3h
	and.b	r4h,r3h
	mov.b	r3h,@padr
	nop
	mov.b	#b'11101111,r3l
	mov.b	r3l,@pbdr
	nop
	mov.b	#b'11111111,r3l
	mov.b	r3l,@pbdr
	rts

;***** SCI init / MIDI Transmit Routines *****
sci0_init:
	mov.b	#b'00000000,r0l
	mov.b	r0l,@scr
	mov.b	#b'00000000,r0l
	mov.b	r0l,@smr
	mov.b	#15,r0l
	mov.b	r0l,@brr
	mov.w	#500,r0
_sci0_wait:
	dec.w	#1,r0
	bne	_sci0_wait
	mov.b	@ssr,r0l		; (dummy read)
	mov.b	#0,r0l
	mov.b	r0l,@ssr
	mov.b	#b'00001000,r0l
	mov.b	r0l,@iprb		; SCI0-int priority UP !
	rts
tx_midi_check:
	mov.w	@tx_top,r1
	mov.w	@tx_end,r6
	cmp.w	r1,r6
	bne	_tx_exist
	rts
_tx_exist:
	btst	#7,@ssr			; test TRDE
	bne	_tx_seq
	rts
_tx_seq:
	mov.w	#0,e6
	mov.b	@(tx_fifo,er6),r0l
	mov.b	r0l,@tdr
	bclr	#7,@ssr			; Transmit !
	inc.w	#1,r6
	bclr	#2,r6h
	mov.w	r6,@tx_end
	rts
tx_fifo_set:
	mov.w	@tx_top,r6
	mov.w	#0,e6
	mov.b	r0h,@(tx_fifo,er6)	; transmit data = [r0h]
	inc.w	#1,r6
	bclr	#2,r6h
	mov.w	r6,@tx_top
	rts
wait_500msec:
	mov.l	#500,er1
_wait_1:
	jsr	@wait_1msec
	sub.l	#1,er1
	bne	_wait_1
	rts
wait_1msec:
	mov.l	#2048,er5
_wait_2:
	sub.l	#1,er5
	bne	_wait_2
	rts
int_timer0:
	push.w	r0
	mov.b	#1,r0l
	mov.b	r0l,@flag
	btst	#0,@tsr0
	bclr	#0,@tsr0		; Clear IMFA
	pop.w	r0
	rte

	.end

上は2009年に製作した新楽器「Peller-min」である。 実際に2009年と2010年のコンサート/ライヴで演奏していて、そのYouTube記録は ここここここここここ にある。 メイキングは ここ にあり、2017年に修理した記録も ここ にあった。 ちなみにMCUはPropellerであり、そのメイン「Inst010.spin」のspinソースコードは以下である。 こちらも、テキストの次章に出てくる「参照テーブル」がちゃんと定義されている(^_^)。

CON
  _clkmode = xtal1 + pll16x
  _xinfreq = 5_000_000

OBJ
  midiOut : "MidiOut01"

PUB main | dummy, i[3], j[6], mode, ad, addr, k[4], value1[32], value2[32], value3, value4[32], value5[32]
  midiOut.start(27)
  port_initial
  repeat ad from 0 to 3
    k[ad] := 0                                          ' k[ad] = A/D channel (0-7)
    ad_initial(ad,k[ad])
  repeat i from 0 to 32
    value4[i] := threshold_init(i)
    value5[i] := max_value_init(i)
  j[5] := 8

  repeat

    if mode <> 0
      repeat ad from 0 to 3
        outa[10..8] := 5                                ' EOC check port (3..0)
        dummy := ina[ad]                                ' EOC bit (0=EOC)
        outa[10..8]~~
        if dummy == 0
          addr := ad<<3 + k[ad]
          value2[addr] := value1[addr]
          outa[10..8] := ad
          value3 := (255 - ina[7..0]) >>1               ' value3 = A/D data
          outa[10..8]~~
          if value3 < value4[addr]
            value3 := value4[addr]
          dummy := ( (value3 - value4[addr])<<7 ) / ( value5[addr] - value4[addr] )
          value1[addr] := dummy
          if value2[addr] <> value1[addr]
            dummy += $B00000 + ad<<16 + k[ad]<<8
            midiOut.fifoset(dummy)  
          k[ad] := ((k[ad]+1) & %111)
          ad_initial(ad,k[ad])

    i[0] := cnt & $6000000
    if i[0] <> i[1]
      i[1] := i[0]
      i[2] := cnt>>25
      dummy := $B40000 + i[2]
      midiOut.fifoset(dummy)
      out_574( %001, seg7_conv( (i[2])//10 ) )

    j[0] := cnt & $7FC00000     ' Switch Scan
    if j[0] <> j[1]
      j[1] := j[0]
      outa[10..8] := 4
      j[2] := ina[5..0]         ' Non Lock Type SW 6 bits
      outa[10..8]~~
      if j[3] <> j[2]
        j[3] := j[2]
        dummy := $B60000 + j[2]
        midiOut.fifoset(dummy)
      outa[10..8] := 5
      j[4] := ina[6..4]         ' Toggle Type SW 3 bits
      outa[10..8]~~
      if j[5] <> j[4]
        j[5] := j[4]
        mode := j[4]
        dummy := $B50000 + mode
        midiOut.fifoset(dummy)  
        out_574( %111, seg7_conv(mode) )
        if mode > 3
          out_574(4,$FF)                                                       
          out_574(5,$FF)                                                       
        else
          out_574(4,$00)                                                       
          out_574(5,$00)                                                       

PUB threshold_init(id)
  case id
    0: return(13)
    1: return(13)
    2: return(13)
    3: return(13)
    4: return(13)
    5: return(13)
    6: return(12)
    7: return(12)
    8: return(11)
    9: return(25)
    10: return(20)
    11: return(14)
    12: return(10)
    13: return(11)
    14: return(11)
    15: return(16)
    16: return(104)
    17: return(79)
    18: return(58)
    19: return(53)
    20: return(72)
    21: return(58)
    22: return(37)
    23: return(75)
    24: return(45)
    25: return(56)
    26: return(74)
    27: return(62)
    28: return(87)
    29: return(65)
    30: return(56)
    31: return(78)

PUB max_value_init(id)
  case id
    0: return(79)
    1: return(79)
    2: return(79)
    3: return(79)
    4: return(79)
    5: return(79)
    6: return(79)
    7: return(79)
    8: return(79)
    9: return(79)
    10: return(79)
    11: return(79)
    12: return(79)
    13: return(79)
    14: return(79)
    15: return(79)
    16: return(121)
    17: return(121)
    18: return(121)
    19: return(121)
    20: return(121)
    21: return(115)
    22: return(100)
    23: return(121)
    24: return(115)
    25: return(115)
    26: return(121)
    27: return(116)
    28: return(121)
    29: return(121)
    30: return(121)
    31: return(121)

PUB out_574(sel,data)
  outa[18..11] := data
  outa[21..19] := sel
  outa[22]~
  outa[22]~~

PUB seg7_conv(data)
  case data
    0: return(%00000011)
    1: return(%10011111)                    
    2: return(%00100101)                    
    3: return(%00001101)                    
    4: return(%10011001)                    
    5: return(%01001001)                    
    6: return(%01000001)                    
    7: return(%00011011)                    
    8: return(%00000001)                    
    9: return(%00001001)                    

PUB port_initial
  dira[7..0]~                   ' Input Bus <-- 245                                         
  dira[10..8]~~                 ' Input Select : %110 - %000 (disable = %111)
  outa[10..8]~~                 '  --> normal disable %111
  dira[18..11]~~                ' Output Bus --> 574
  dira[21..19]~~                ' Output Select : %111 - %000
  dira[22]~~                    ' Output Select Enable (active low)                                         
  outa[22]~~                    '   --> normal High
  out_574(%001,$FF)             ' 7seg Red LED off                              
  out_574(%111,$FF)             ' 7seg Green LED off
  out_574(4,0)                  ' Blue LED(1) off                              
  out_574(5,0)                  ' Blue LED(2) off                              

PUB ad_initial(ad,addr)
  case ad
    0:
      out_574(0,addr+%00000000)
      out_574(0,addr+%00001000)
      out_574(0,addr+%00011000) 
      out_574(0,addr+%00010000)
      out_574(0,addr+%00000000)
      return
    1:
      out_574(0,addr+%00000000)
      out_574(0,addr+%00001000)
      out_574(0,addr+%00101000) 
      out_574(0,addr+%00100000)
      out_574(0,addr+%00000000)
      return
    2:
      out_574(0,addr+%00000000)
      out_574(0,addr+%00001000)
      out_574(0,addr+%01001000) 
      out_574(0,addr+%01000000)
      out_574(0,addr+%00000000)
      return
    3:
      out_574(0,addr+%00000000)
      out_574(0,addr+%00001000)
      out_574(0,addr+%10001000) 
      out_574(0,addr+%10000000)
      out_574(0,addr+%00000000)
      return
 
また、サブ「MidiOut01.spin」のspin/アセンブラのソースコードは以下である。 MIDI出力するためのUSART機能を、いちいち1ビットずつ待機してシフトしてシリアルに変換する・・・という、なかなか出来ない力ワザを駆使しているのだ。
VAR
  long tx_Head, tx_Tail, tx_Buff[64]

PUB start(_midiPin) : status
  midiPin := _midiPin
  tx_top := @tx_Head
  tx_end := @tx_Tail
  tx_fifo := @tx_Buff
  bitticks := clkfreq / 31_250
  longfill(@tx_Head,66,0)
  status := cognew(@asm_entry, 0)

PUB fifoset(_tx_data)
  tx_Buff[tx_Head] := _tx_data
  tx_Head := (tx_Head + 1) & $3F
    
DAT
                        org
asm_entry
                        mov     midiMask,#1
                        shl     midiMask,midiPin
                        or      dira,midiMask
:fifo_check
                        rdlong  t1,tx_end
                        rdlong  t2,tx_top
                        cmp     t1,t2                   wz
              if_z      jmp     #:fifo_check  
                        mov     t2,t1
                        shl     t1,#2
                        add     t1,tx_fifo
                        rdlong  event_data,t1
                        mov     t1,t2
                        add     t1,#1
                        and     t1,#$3F
                        wrlong  t1,tx_end
                        mov     tx_data,event_data
                        shr     tx_data,#16
                        call    #send_event
                        and     tx_data,#%11100000
                        cmp     tx_data,#%11000000      wz
              if_z      jmp     #:byte_2
                        mov     tx_data,event_data
                        shr     tx_data,#8
                        call    #send_event
:byte_2
                        mov     tx_data,event_data
                        call    #send_event
                        jmp     #:fifo_check

send_event
                        xor     tx_data,#$FF
                        and     tx_data,#$FF
                        shl     tx_data,#1
                        or      tx_data,#1
                        mov     testBits,#10                        
                        mov     bitClk,cnt
                        add     bitClk,bitticks
:bit_send
                        shr     tx_data,#1              wc
                        muxc    outa,midiMask
                        waitcnt bitClk,bitticks
                        djnz    testBits,#:bit_send
send_event_ret          ret

t1                      long    0
t2                      long    0
midiMask                long    0
testBits                long    0
bitClk                  long    0
bitticks                long    0
midiPin                 long    0
tx_top                  long    0
tx_end                  long    0
tx_fifo                 long    0
tx_data                 long    0
event_data              long    0

                        fit

Experiment No. 4 - Microcontrollers and LEDs - Individual LED Control

そして第4章で、ようやくMCUとしてPropellerが登場する。 最初に一般的なマイコンについての概説があるが、これは僕もあちこちに書いてきたし、まぁ目新しいところはない。 Arduinoのサイトでもmbedのサイトでも、どこでも解説しているものである。 その後、満を持して、以下のように「P8X32A QuickStart board」が颯爽と登場して、ピンのアサインが紹介されている。 PropellerではP0からP31までの32ビット(内部に8個の32ビットCPUがあって並列動作する)の全てのピンがピンヘッダから出ているが、P28とP29は外部に置いたプログラム格納用EEPROMアクセスのために、またP30とP31はホストから通信する(→プログラムをRAM/EEPROMにダウンロードする)ために、それぞれ予約されていて、実質的には28ポートが完全に使用できるが、この「P8X32A QuickStart board」ではP0からP7が8ビットのタッチスイッチ用に、またP16からP23が8ビットのブルーLED表示用にハードが接続されている。

ここから テキスト  の第4章では、IDEを使ってPropellerブログラムをボードに転送する手順を紹介したところで、(1)8ビットLEDを0.25秒ごとにインクリメント表示するプログラム、(2)8ビットLEDを1つずつ点灯させて隣に移動させるループ、(3)点灯LEDが順に進んで右端まで行ったら折り返して左端まで来たらまた折り返すループ、(4)左右対称の幾何学的パターンを表示するループ、(5)音響機器のレベルメータのようにバーグラフ表示させる、というようなPropellerサンプルが紹介されている。 ただし、ここまでは8個ある並列処理CPUのうち1個しか使わない、Propellerプログラムとしてはメインのspinのみであり、あらためて再現するほどのことでもない。 しかし、せっかくダウンロードサイトから、このテキスト中のサンプルプグラムを集めた Jon-Titus-Experiments-Code.zip  もゲットしたので、これを解凍して第4章の6個のサンプルを順にコンバイルしてボードで走らせる、というのを YouTube動画 にまとめて上げた。

Experiment No. 5 - LED Bar-Graph Driver ICs Supplement MCUs

第5章では、タイトルとしては「LED Bar-Graph Driver ICs」となっているが、実質的には「アナログとディジタル」について理解を進めるという章になっている。 まず最初に、単電源コンパレータICのLTC1441(僕はOPアンプをそのように使うとしても、コンパレータICを使うことはほとんど無いのでこれは初めて)の「+」入力に+5Vを2分割した2.5Vを与えて、「-」入力には+5VとGNDを半固定抵抗で分圧した電圧を与える・・・という定番の実験で、入力のアナログ電圧がスレショルドを境にディジタル化(H/L)される事を確認する。 そしてLM3914という「Bar-Graph IC」を紹介するが、以下のようにこれは内部にリファレンス電圧を分圧する抵抗ネットワークと10個のコンパレータを持つICなので、そのまま自然に入力電圧を「バーグラフ表示」するには最適なものとなっている。

そして、何故か細部にこだわって、その後はリファレンス電圧を補正する抵抗の話に寄り道して(詳細は原典をどうぞ)、これによって「最低電圧でも最低ビットのLEDが点灯する」ように改良する。 アナログ的にここにこだわるのは、ちょっと今風ではない感じ(^_^;)だが、そこから「Non-Linear Measurements」へと話は発展して、指数関数でのパワー表示なども紹介したところで、この章はおしまいとなった。 まぁ、現在であれば、定数補正も非線形関数も、全てMCUのテーブルなり算術演算で片付けることになる。

Experiment No. 6 - Control the Brightness of LEDs with an MCU

そしていよいよディジタル的なアナログの話題として、マイコンによってLEDの明るさを連続的にコントロールする、という以下のPWMのお話に入る。 ここで気付いたが、どうやらこのテキストでは、Propellerプログラムはメインのspinの部分だけを紹介して、そこから参照されているアセンブラの部分は「出来上がったモジュール」として横に置いて参照するだけ・・・ということらしい。

多数のLEDをPWM制御する・・・というのは、もちろん僕は昔から相当に作ってきた。 SUACインスタレーション のページからザッと拾ってみても、以下のシステムは全て「多数のLEDをPWM制御」である(単純に多数のLEDをON/OFFしているものは除く)。 この他にも、mbed NucleoF401REを使ったPWMモジュールもあるので、まぁLED表示の定番テクニックだろう。


靄夜(もや) - AKI-H8


Cyber Kendang - AKI-H8


OTOcakecco - AKI-H8


誰かを待つ街 - Propeller


Hikari - Propeller


GHI2014 - Propeller


めざせ! 怪獣王 - AKI-H8


おばけろうそく - AKI-H8


召喚 ICカードバトラー - Propeller


タイムマシンの研究所 - AKI-H8

テキスト中のサンプルプグラムを集めた Jon-Titus-Experiments-Code.zip  の第6章のところを見ると、たしかに「pwmAsm.spin」というアセンブラモジュールがあった。 実際には、テキストにも注釈が書かれているように、ここには何故かバグがあって、bstでコンパイルしてもエラーが出たが、OBJエリアの謎の「pst : "Parallax Serial Terminal"」というのをコメントアウトしたら無事に動いたので、以下にその「pwmAsm.spin」のソースを置いておく。

{ usage
 OBJ
        pwm : pwmAsm
  ....
  pwm.start( Pin)               ' start pwm
  pwm.SetPeriod( period )       ' set pwm period in clock cycles
  pwm.SetDuty( duty)            ' set duty in %                               
  pwm.Stop
}
OBJ
'  pst   : "Parallax Serial Terminal"
VAR
  long  cogon, cog       
  long sDuty                     ' order important (the variables are read from memory in this order)  
  long sPinOut 
  long sCtraVal
  long sPeriod
  
PUB Start( Pin) : okay
'start pwm on Pin @ 80 kHz
  longfill(@sDuty, 0, 4)       
  sDuty := 50                   ' default duty
  sPinOut := |< Pin   
  sCtraVal :=  %00100 << 26 + Pin
  sPeriod := 1000
  okay := cogon := cog := cognew(@entry,@sDuty) + 1    
  
PUB stop
'' Stop object - frees a cog
  if cogon~
    cogstop(cog)
  longfill(@sDuty, 0, 4) 

PUB SetPeriod(counts)
' set pwm period in clock cycles, frequency = (_clkfreq / period)
   sPeriod := counts

PUB SetDuty(counts)
   if (counts < 0)
     counts := 0
   if (counts > 100)
     counts := 100
   sDuty :=counts*sPeriod/100
DAT
'assembly cog which updates the PWM cycle on APIN
'for audio PWM, fundamental freq which must be out of auditory range (period < 50?S)
        org
entry   mov     t1,par                'get first parameter
        rdlong  value, t1
        add     t1,#4                 
        rdlong  pinOut, t1
        or      dira, pinOut         ' set pinOut to output      
        add     t1, #4
        rdlong  ctraval, t1
        mov ctra, ctraval              'establish counter A mode and APIN
        add     t1, #4
        rdlong  period, t1
        mov frqa, #1                   'set counter to increment 1 each cycle
        mov time, cnt                  'record current time
        add time, period               'establish next period
:loop   rdlong value, par              'get an up to date pulse width
        waitcnt time, period           'wait until next period
        neg phsa, value                'back up phsa so that it  trips "value" cycles from now
        jmp #:loop                     'loop for next cycle

period  res 1                    
time    res 1
value   res 1
t1      res 1
pinOut  res 1
ctraval res 1
このモジュールを呼び出して、P22とP23の2個のLEDを交代にじわじわ点滅させるプログラム「Program 6.1.spin」が以下である。 YouTubeに上げるほど面白いこともないので、これはいつでも再現できる(自分で作ったものが既にあるものの、場合によってはこちらも使える)ようにサンプル集を整理しておいた。
CON
    _clkmode = xtal1 + pll16x           'Set MCU clock operation
    _xinfreq = 5_000_000                'Set for 5 MHz crystal
    max_duty = 100                      'Maximum 100% duty cycle
    pwm1pin  = 22                       'Control LED at P22
    pwm2pin  = 23                       'Control LED at P2  

OBJ
  pwm1  :  "pwmAsm"                     'Ensure you have pwmasm.spin file
  pwm2  :  "pwmAsm"                     'in your working directory

PUB go | x                              'declare x as a local variable
  pwm1.start(pwm1pin)                   'Startup for LED at P22
  pwm2.start(pwm2pin)                   'Startup for LED at P23
  repeat                                'Advance duty cycle from 0 to 100
    repeat x from 0 to max_duty
      pwm1.SetDuty(x)                   'LED P22 brightens
      pwm2.SetDuty(100-x)               'LED P23 dims
      waitcnt(1_000_000 + cnt)          'short delay between changes
    repeat x from max_duty to 0
      pwm1.SetDuty(x)                   'LED P22 dims
      pwm2.SetDuty(100-x)               'LED P23 brightens
      waitcnt(1_000_000 + cnt)          'short delay between changes
そして、第6章のこの後のトピックとしては、おそらくParallax社の標準IDEのSerial Monitorを使ったサンプルとして、シリアル経由でPWM値を与えてLEDをPWMドライブする(実質的なPWMの部分に変更ナシ)の話が続いたが、どうもbstのSerial Monitorとは互換性が無いのか、ウンともスンとも言わなかったので、以降はスキップすることにした。

Experiment No. 7 - Control 7-Segment Multi-Digit Displays with an MCU

そして、次に続く123ページから147ページまでのこの第7章では、いったんPWM制御は離れて単純なON/OFFではあるものの、第3章と第5章の話題をPropellerで実装するという、ようやく実用的な話題に到達した。 僕にとってはこれは既にあれこれやってきた事なので簡単に整理すると、以下のようなシナリオとなっていた。

7セグメントLEDはまだ部品棚にあるものの、それを探し出してきて半田付けして、この章のPropellerサンプルで点灯させる・・・というのは、苦労の割にあまり目新しいものが無いのでスキップすることにした。 これでイントロから第7章までザッと全体の1/3ぐらいの分量を見渡したことになり、ぼちぼち5限に入る時間となった。 朝からずっとやってきたが、さすがに疲れてきたので今日はここまで。 明日は午後に「基礎演習E」の初日もあるし、水曜からは毎日あるので、この続きがいつになるかは不明である。(^_^;)

2020年10月6日(火)

今日は「署名」から1日が始まった。 かつて「アベ政治を許さない」という署名サイトに賛同して署名したことがあったが、このサイトの署名は既に10万人を超えているそうで、ちかぢか「スガ政治を許さない」というムーブメントが盛り上がってきそうである。 コロナ陽性なのに周囲を巻き込んで出歩くトランプもトランプだが、どっちもどっち、やれやれである。

昨日はPropellerのお勉強が捗ったが、それには理由があった。 第70期王将戦挑戦者決定リーグの「藤井vs豊島」という好カードが、なんとAbemaTVで生中継されない(王将戦は大人の事情で有料の囲碁将棋チャンネルで生中継)という状況だったので、まったく余所見をせずにお仕事できたのである。 そして、夜中に結果だけ知ったものの、 詳しいこと は今日になって判明したのだが、なんと藤井聡太二冠が終盤にやらかしたのだという。 「ファンタ藤井」こと藤井猛九段(藤井システムの祖)は「終盤のファンタジスタ」(勝勢の将棋の終盤にやらかして敗北)という称号を持っていたが、もしかすると藤井聡太二冠に「ファンタ藤井2世」という嬉しくない称号が与えられるかもしれない。 まぁ将棋とはそんなもんで、だから人間の指す将棋が面白いのである。

今日は午後に「基礎演習E」の初日だが、どうも初日は定員調整などドタバタしたりして、さらに僕は今日の担当ではなかったので、せっかくなので新入生の顔を見に冒頭に行くとしても、ちょっとしたら研究室に戻ってきて、つまり今日も昨日に続いて「お仕事日和」となる事が判明した。 せっかくなので、担当週である来週までに、興味ある人は このページ を眺めてきてね・・・というQRコードを作って、印刷して持参することにした。 これを写メってもらうという作戦である。 ついでに、新入生と一緒に沖縄に3回ほど行っていた事(さらに一緒にパリ/リンツ/ウイーンに行ったこともあった)などを思い出して追加しておいた。 沖縄はコロナだけでなく、「じんじん」が閉店してしまったので、国内とはいえ海外同様に、「果てしなく遠いところ」になってしまった。(;_;)

Experiment No. 8 - How to Use Serial Communications to Control LED Displays

さて、Propellerサイトに置かれていた Jonathan A. Titus さん(ミニコンPDP-8の開発者)の素晴らしいテキスト Experiments for the Propeller Quickstart Text  の続きである。 前章では、Propellerからパラレル8ビットのデータバスと2-3ビットの制御バスによって、時分割で複数桁の7セグメントLEDを点灯させる、というところまでだった。 この第8章では、シフトレジスタを使うことで8ビット幅のデータバスを省略するテクニックが紹介されているが、アセンブラの高速ライブラリを使用せず、メインのspinで1ビットずつ上げ下げするという手間がかかるもので、よく分かっているものの僕はこの手法(シフトレジスタICの利用)は実際にはやった事が無い。 次章が「Better Serial Communications for LED-Display Control」となっていて、つまりこの章は「原理的に分かりやすいものの実用的ではない」テクニックを、電子工学的な理解のために紹介している章なのだ。 お話としては以下のように進行した。

これは懐かしい懐かしい、本格的なディジタル回路技術(システムクロックに従って回路全体が動く、というLSI全般)の基礎である。 僕がCQ出版社から以下の コンピュータサウンドの世界  を入門編として出版した時に、その本の上級編として同時に原稿を執筆していたのが 作るサウンドエレクトロニクス であり、音楽に弱いCQ出版はこちらの出版を断念したので、全てをWebでフリー公開している。

その 作るサウンドエレクトロニクス の第5章(最終章) ディジタルシンセサイザ では、まさにこのテクニック、時分割多重化によるディジタル演算で、単一のディジタル回路によって、16チャンネルの楽音信号生成処理(異なる音色、異なるピッチ、異なるエンベロープ[時間的音量変化])を「同時に」行うというものを紹介して、実際に多数のICだけで実現してしまっているのだ。 上のシフトレジスタの波形遷移図とは格段に違っていて、概念的には こんな感じ だが、実際に回路のタイミング設計としては こんな設計 をしなければならない。 これは正にプロの仕事であり、おそらく普通の電子情報系の大学院生ぐらいでは理解しきれないだろう。 最終的には回路図は3枚に分割されているが、 これこれこれ とで全体が構成されていて、以下のように実際に半田付けをして完成した回路からは、パソコンからMIDIで演奏情報を送ると、実際にその最終のA/Dコンバータの出力端子から というようなサウンドが鳴ってくれたのである(^_^)。

さて テキスト  に戻ると、Propellerにシフトレジスタ74HC595を繋いで8個のLEDをドライブする、という以下のような回路図があり、その後はこれを動かすPropellerプログラムの解説が続いていた。 アセンブラのライブラリを使わず、メインのspinだけで、データのLEDを送ってはシフトする・・・という、まさに「教科書通り」の進行である。 中身としては、これまでの話の単なる延長をしっかりと解説しているだけであり、この回路を実際に使うつもりのない僕としては、あっさりとスキップすることにした。 タイミングとして、単なる「wait」を使って足踏みしているなど、このシステムは実用的ではないのだ。

そして、データ8ビット分をシフトレジスタでパラレル化できたところで、次には「複数桁」の7セグLEDをドライブする回路に発展し、さらに、これら「各桁のセレクト信号」をいちいち全ビット持つのもナンだ・・・ということで、この章の最後の図は以下のようになっている。 内部的には、データの8ビットの上にさらに4ビットを増設した12ビット幅と定義を拡張して、最上位4ビットをシフトレジスタに入れてデバイスセレクト信号とする、というものであり、この章までの技術をまとめたものとなっている。 「デコーダ」(138とか139)という便利なものを登場させていないので、本章では4桁のLEDのために単純に4ビットを割り当てるなどここまでが限界だが、まだまだ回路はシンプルにする事ができる(デバイスセレクト信号のビット幅は4→2、8→3、16→4などと縮減可能)のだ。

Experiment No. 9. - Better Serial Communications for LED-Display Control

前章がいわば「馬鹿正直にシフトレジスタを使う方法」だったのに対して、この章が「Better」と言っているのは、メインのspinでいちいちビットシフト等をするのでなく、アセンブラのモジュール「 SPI_Asm.spin 」を用意したのでこれを使いましょう・・・ということであり、このテキストの特性として、そのアセンブラの SPI_Asm.spin は天から与えられたブラックボックスとして「使う」だけで、中身についての解説は一切ナシ、という姿勢となっている。 実際には僕のMacでは SPI_Asm.spin が謎のフォントで文字化けして見えないし、それ以外は技術的に前章と比べてとりたてて目新しいものが無いので、ここはごく簡単に紹介しておこう。
まずは複数のシフトレジスタを区別して使うために「チップセレクト信号」の概念を紹介した。 チップセレクト信号(CS、あるいはチップイネーブルCE)は、マスターからスレーブを区別するために「排他的に」供給される信号であり、各スレーブは、自分のCS信号がアクティブ(通常は負論理なので「L」)である時だけ、メインのデータラインの信号に反応し、非アクティブ(「H」)であれば、データラインの信号を暖かく無視することにしている。 そのため、ホスト(ここではPropeller)としては、複数のスレーブのCSを同時にアクティブの「L」にしてはイケナイのだが、それをハード的に禁止する方法がないので、ちょっとシステム的には危険である。 ここに「アドレスデコーダ」(139とか138)を使えば、確実に排他的なCS信号が出てくれるのだが、ここまでこのテキストでは出現していない。

Experiment No. 10 - How an MCU Controls an LED Matrix

そして第10章では、これまでの「7セグメントLED」(上の左)から、新たに「ドットマトリクスLED」(上の右)に対象を拡大していく。 ドットマトリクスであれば、これまでの「数字」から、けっこう自由度の高い「文字」とか、あるいは頑張れば「グラフィック」表示全般にまで拡張していけるのだが、過去にはけっこう高価なデバイスだったこと、本章でも出てくるであろう、ドライバ周りなども面倒なこともあり、たぶん僕はこれまでこのタイプのLEDは使っていなかったような気がする。 ドットマトリクスLEDではまず最初に、以下のようにどちらのタイプであるかを確認して回路設計していく必要がある。

このテキストでは、このドットマトリクスLEDが「5×7」という構成ということで、上のように7ビットのRowと5ビットのColumnをそれぞれシフトレジスタで作る・・・というこれまでの手法を延長している。 ただし、7ビットのRowと5ビットのColumnについては、もはや完全に抽象的な「座標のデータ」になっているので、まぁ、あとはPropellerのソフトでなんとかする、という作戦である。 さすがにドットマトリクスLEDになると、「7セグメントLED表示用IC」のような限定デコーダは無理なので、完全にマイコンのソフトウェア勝負となる。 すると、簡単な類推で分かることだが、以下の「A」のように、表示したい全てのフォント(文字/記号/数字)に対して、「5×7」の7ビットのRowと5ビットのColumnごとに、そのフォントを表示するための厖大なデータテーブルをプログラムが用意しないといけなくなる。 これはちょっと想像しても嫌になる仕事であり、さらに「ブログラム格納エリア(RAM)」容量がそこそこ限定されているPropellerでは、RAMにこのフォントテーブルを配置したら、肝心のプログラムを持てなくなってしまう。

ところが、実はPropellerはこの機能を最初から内部的に持っている(^_^)のである。 テキストのこの章の解説には出てこなかったが、 Propellerマニュアル  から発掘してみると、以下のように、チップ上のROMエリア(変更できないデータを高密度に格納)に、ちゃんと以下のようなフォントテーブルを持っているのだ。 それもよく見てみると、英語の文字/記号/数字だけでなく、ウムラウトの付いたドイツ語文字とか、かなりマニアックな各国の文字、そしてさらには回路図記号やタイミングチャート用のフォントまである。 このあたり、Parallax社のCEO(彼自身が最上のエンジニアを自認)のこだわりが詰まっているのだ。

Experiment No. 11 - Drive 7-Segment Display Modules with the MAX7219

せっかく前章ではドットマトリクスLEDを扱ったのに、この章では再び7セグメントLEDに戻っている。 ただしそこには差があって、前々章までは「シフトレジスタ」を使って、Propellerソフトウェアの方でいろいろと苦労してようやく4桁の7セグメントLEDに数字を表示していたのに対して、MAXIM社の専用ICであるMAX7219を使って、Propellerの方では単に「表示したい桁」と「表示したい数字」を送るだけで楽をしよう・・・という、テキストが実用的なところに入っていくイントロでもあるのだ。 実際にこの章で実験するシステムの回路図と実際のブレッドボードは以下である。 ただしその前にこの章の前半では、Propellerシステムを実際に作っていくための重要なポイントを押さえているのだ。

ここでのキーワードは「Logic-Level Conversion」である。 僕はこの部分は「SUACboard」を設計して実際に試作屋の「P板.com」社で製作した時にじっくりやったが、Propellerは「+3.3Vシステム」なのである。 ところが、ここで登場するMAX7219も、あるいは従来のディジタル回路というのは、全て「+5Vシステム」なのだ。 この両者は、単純には共存できないのである。 発掘してみると、このあたりについては、 続・Propeller日記(3) の「2012年9月22日(土)」あたりに書いていた。 Propellerの「PropStickUSB」の部分を以下に再録しておこう。

これはPropellerに限らず、mbed NucleoF401REでも、最近の+3.3V系のArduinoでもXBeeでも全て同じことなので、とても重要である。 「電源に+3.3Vを使って、信号レベルもGNDと+3.3Vである」というデバイス/ボード/システムにすべて共通することである。 ただし一応、それぞれの半導体は「LS(Low Power Schottky)」でなく、「HS-CMOS(High Speed CMOS)」である、と限定しておく(事実上はこれで全てOK)。
テキストにまず書かれているのは、以下の「74HC04」である。 これは+5V電源のHS-CMOS ICなので、入力のスレショルドレベルは電源中央の2.5Vであり、「+3.3V系のCMOS出力」は「L」でほぼGND、「H」でほぼ+3.3Vなので、スレショルドに対して十分に「H」と解釈されるので、「+3.3V系 → +5V系」のレベルコンバータとして使える。 ただしインバータなのでロジックが反転することに注意である。

次に、この逆、「+5V系 → +3.3V系」のレベルコンバータについてである。 Propellerなど+3.3V電源のICの入力に、+5V系のデバイスからの信号(GNDと+5V)が加わると、「H」である+5Vは入力信号の「絶対最大定格」を越えているので、基本的には素子破壊のため絶対に禁止である。 そこでテキストでは、以下のSparkfunのBOB-12009などのように、信号レベルのうち「H」を+5V系から受けて+3.3Vとして出すような「ロジックレベル・コンバータ」の使用を推奨している。 ただし実際には、いくつかのサイトで「便宜的に推奨」とされている方法として「直列に1kΩの抵抗を入れる」というテクニックも一般的であり、僕が開発した「SUACboard」でもこちらを採用した。

また、1チップで8チャンネルの「Adafruit 8-channel bi-directional logic-level converter module」という、以下のようなものもあるという。 もしかしたらこれは購入して研究室のどこかにあるかもしれないが、今のところ切実な用途は無い、という状況である。 さらにテキストでは「SN74LVC4245A "Octal Bus Transceiver and 3.3V to 5V Shifter with 3-State Outputs" IC」というのも紹介されている。 電圧シフトだけでなく、スリーステート双方向バッファとして使えるというものらしい。

Experiment No. 12 - Have an MCU Take Real-World Temperature Measurements

ここから先は、どうも色々な周辺チップとPropellerを組み合わせて「何かするシステム」を設計していくお話になっている。 ただし、よくある事だが「テキスト本と付属サンプルブログラム」とが合致していなくて、実際に試そうとするとうまく行かない・・・というパターンがすぐに露呈した(^_^;)。 この第12章では、MAXIMの DS1620 という、「Digital Thermometer and Thermostat integrated circuit, 8-pin DIP」というデバイス(+3.3V系)を用いて、ディジタル温度計を作ろう、というサンプルを取り上げている。 DS1620はホストとのシリアル通信によって温度データを供給するが、この部分はspinでいちいち書かなくても、このデバイス用に特化したライブラリとしてParallax社が作った DS1620_JT2.spin というサブモジュールをメインの横に置いて、それを呼び出すだけでOKである。 ただしよくサンプルプログラムを見てみると、「_README_.txt」の内容と、置かれているファイルが不整合で(^_^;)、そのままでは実現できない。 さらに、Windows用のIDEに固有の話(シリアルモニタ使用)が続いているので、ちょっと逃げたくなってきた。 「How to Interpret 2's Complement Values」とかいう重要な話(2の補数による数値表現)など勉強になる話もあるが、ここはスキップすることにした。(^_^;)

Experiment No. 13 - Create A Thermometer with a Digital Display

この第13章は、前章で取り上げた温度センサICのDS1620と、その前の章で取り上げた7セグLED表示ドライバのMAX7219とを組み合わせて、Propellerボードとこれらを以下のように組み合わせて(ちょっとブレッドボードの写真はゴチャゴチャしているが(^_^;))、下のようなプログラム・フロー(コマンドとデータの具体的な流れ)を実現する、というものである。 ただしここでも、メインから呼び出されるアセンブラのライブラリモジュールは全てBlack Boxで解説が無く、なんとも物足りない印象がある。

Experiment No. 14 - Explore the DS1620 Sensor-Alarm Operations

この第14章では、MAXIMの DS1620 を単なる温度センサとして使うのではなくて、Propellerとはシリアルで双方向通信を行って、温度データを受け取るだけでなく、コマンドと規定値をDS1620に送って、DS1620が持っている「警報LED」出力を点灯させること、さらに温度変化に対する特性として「ヒステリシス」について解説しているところが新しい。 以下が、その回路図、ヒステリシス特性の原理と実際の動作についての図である。 Propellerプログラムは前章と同様にいちいち追いかけるほどのこともない(こういう温度計ネタはあまり個人的に面白さを感じない)ので、これにてスキップである。

途中で以下のように「基礎演習E」の冒頭部分に顔を出したが、あとは朝からずっとやってきて、さすがに疲れてきたので今日はここまで。 明日はゼミもあり、この続きがいつになるかは不明である。(^_^;)

2020年10月7日(水)

今日は午前にゼミの日であるが、台風14号による雨雲が近付いてきているので、当初予定の明日のJoyJoyヒトカラを今日に変更するかどうか、雨雲レーダーのチェックを繰り返す日となりそうである(^_^;)。 朝イチで届いていたのはSketchingコミュニティからのメイルで、いつもはチラッと眺めて保存するだけだったが、今日はきっちりと反応した。 あまり詳細に書けないので一部を伏せるが、DeepL翻訳に丸投げした結果は「 ○○大学の先輩の昇進審査の真っ最中なんですが、ちょっと困っています。その人は正教授に昇進したいと思っていて外部の審査員が5人必要なんです。4人は助手や准教授ではなく 正教授でなければなりません。一人は学者ではなく、芸術家や社会活動家で"国内または国際的に重要な評価を受けている"人でなければなりません。また、問題の人物を知っている人や、彼らと密接に仕事をしたことのある人であってはいけません。最近、全ての教授が私たちを拒絶していることがわかりました。驚くことではありません。皆が過負荷になっています。でも、私たちはまだこれを終わらせたくありません。もしあなたが○○大学を知っていて喜んで協力してくれる人を知っているなら リスト外で連絡してくれませんか? 」というような話である。

実は僕は、このような話に協力した事が一度だけあったのだ。 国際会議ICMCやNIMEで何度も会っていて、お互いによく知っている、プリンストン大学の Perry R. Cook 氏から、プリンストンの教授に昇進するための審査に協力してくれ、と依頼されて、頑張って英語で推薦文を書いて、さらにSUAC事務局に「本学の教授の正式な推薦文」というお墨付きを取った正式な書類を米国に発送したのだった。 それが少しは役立って彼はProfessorになったのだが、プリンストン大学と言えばアインシュタインなど錚々たる人物を輩出する 世界的に凄い大学 なのだ。 実は僕は2003年1月に 初めてのNew York に行った時に、プリンストン大学を訪問していた。 その写真を抜き出したページを作ってみたが、 こんな感じ であり、とても素晴らしい大学キャンパスだった。(^_^)

そこでさっそく、DeepL翻訳の力を借りて、「僕でよければ協力したい」というメイルを出してみると、ものの30分ほどで返信が返ってきた。 それは「Thank you, Yoichi, and by coincidence, I met Perry many years ago, and love his work! Good call! I think we finally got our last person for the review day, but thank you very much for the offer! I have high hopes for the person in question.」というもので、やはりPerry Cookは有名人だった。 ただし、僕の英語力ではどうもこの後半の意味を完全に把握できていない。 感じとしては「ありがとう、でも最後の1人の審査員も確保できて、なんとかなりそうだ」(つまり僕の出番は不要になったが話はうまく進んでいるらしい[これはbestの進展])と解釈したのだが、正しいのだろうか??

そして2限になって、3人が1106にやってきて、ゼミは このように 順調に進んだ。 皆んな、それぞれのプロジェクトをサクサクと進めていて、まだまだこれから相談することも多いが、なかなか期待できるゼミが今年の後期も本格稼働してきた。 ちなみに(リンク切れするが)全96分の記録動画は これ である。 その後、ちょっと学生の「総合演習I」のプロジェクトに関して調べてみて、永井さんと古谷さんにそれぞれメイルしたりした。 このあたり、持っていない部品は早めに仕入れる(→実験)、というのが重要なのだ。

 

 

 

 

 

 

 

Experiment No. 15 - How To Use Digital-to-Analog Converters

そして、 Jonathan A. Titus 氏のテキスト Experiments for the Propeller Quickstart Text  の続きである。 前章までは、シリアル通信する温度センサDS1620の応用例などを作っていたが、この第15章では一転して、王道である「D/Aコンバータ」の話題となった。 イントロとして以下の「R-2Rラダー」による標準的なD/Aコンバータから話を始めて、Propellerから4ビット・パラレルの出力に対して16段階のアナログ電圧を出力する、というもので、まぁこれは僕は最初の単行本から何度となく書いてきたことなので、ここでそれらをいちいち探して触れないほど「基本中の基本」である。

そしてどこに行くのかと思ったら、あっさりと「Linear Technology LTC1450L 12-bit DAC with voltage output」という、以下の上のようなパラレル入力のD/AコンバータICに話は進んだ。 何の捻りもなく、これは僕の「SUACboard」でも、これまでの色々なシステムでも、まぁ外付けのDACチップはその時々で色々に変わるものの、これまた「基本中の基本」である。 ただしPropellerのプログラムについては、12ビット・パラレルを馬鹿正直に出すのでなく、以下の下のように、下位の8ビットと上位の4ビットを時分割的に出す、という定番の方法でサンプルプログラムが紹介されていた。 これまたよくある手法で、12ビットのD/Aが14ビットとか16ビットになっても、まったくそのまま応用できるというメリットがある。

次章からは「A/Dコンバータ」ということで、おそらくこの章のD/Aコンバータを使って「逐次比較型A/Dコンバータ」に行くのでは・・・という読みを残しつつ、今日はここまでである。 今日も明日も雨はソコソコだ、という読みでJoyJoyは明日にしたのだが、果たしてどうなるか、台風次第なのだ。

2020年10月8日(木)

台風14号が秋雨前線を刺激しての降雨は、昨日に続いて今日もそれほどではなく、朝イチで眼科通院、研究室に出てきてメイルチェック(とりたてて何もナシ)、そしてJoyJoyを予約して昼食、その後、早退するまでの2時間ちょっとだけが今日のお仕事タイムである(^_^;)。 Jonathan A. Titus 氏のテキスト Experiments for the Propeller Quickstart Text の続きであるが、いよいよ山場、2つの章をかけて「part 1」・「part 2」と分けるという「Analog-to-Digital Conversion」のテーマに差し掛かった。 前章の「D/Aコンバータ」でも実は関係しているのだが、特に「A/Dコンバータ」については、どうしても「サンプリング」(時間軸の離散化)と「ビット幅」(データ軸の量子化)という重要な概念を理解する必要があるので、ここを2つの章に分けるというのは正しい方針である(ただしザッと読んでみると、part 2ではA/Dチップの応用を紹介しているだけで、解説としては実質的に第16章のみ)。

Experiment No. 16 - Analog-to-Digital Conversion and How It Works, Part 1

第16章であるが、さすが「ミニコンの祖」らしく、いきなり話は「A/Dコンバータ」に入らない。 「The analog-to-digital converter didn't just appear in electronics at a "eureka" moment」(アナログ・デジタル変換器は、電子機器の中に「ユリイカ」の瞬間に登場したのではありません)とはなかなか難しくて、思わず"eureka"をWikipediaで引いてしまった。 「Eureka is an interjection used to celebrate a discovery or invention. It is a transliteration of an exclamation attributed to Ancient Greek mathematician and inventor Archimedes」(エウレカは、発見や発明を祝うために使われる口語。古代ギリシャの数学者で発明家のアルキメデスに由来する感嘆詞の音訳である)とのことで、「ユリイカ」という本があったような気もするが、つまり、エレクトロニクスの黎明期にはまだこの概念は登場してこなかったという事である。

これは当然で、初期のエレクトロニクスとは全てアナログの世界であり、これは時間軸もデータ(電圧/電流など)も全て、連続的な値をとるという世界である。 そこに「ディジタル」の概念が出現して、つまり時間軸はシステムクロックで切り刻まれ(サンプリング)、データ軸も量子化ビット数の精度に限定されてくると、ここに「A/Dコンバータ」というアイデアが登場したのである。 このあたりは僕の書いた この本 で上のような図で解説していたが、 こちらのテキスト ではこのような正統的な解説とは違って、第15章(前章)の以下の図を「アナログとディジタル」との比較の説明に使っただけで、あとは第16章は「PCM」で全ての話を進めていた。 歴史的には、たしかに当時の技術はスグに「A/Dコンバータ」に行かず、まずは「PCMオーディオ」(→これがコンパクトディスクCDの基本)に進んで、そこからディジタル技術が一気に花開いたのだが、これは現代のエレクトロニクス技術から見ると、教育的にはちょっと片手落ちである(^_^;)。

このテキストの進め方だと、一定間隔の時間スロットで、異なった入力アナログ電圧を表現するためには、以下のように、時間スロットのうちONである時間とOFFである時間との比(パルス幅)によって表現できる、というPWM(pulse width modulation)から話を始めている。 これはちょっとしたトリックで、この図だと、入力アナログ電圧は連続値(どんな細かな値でもとれる)でもOKで、それはパルス幅を対応する連続値(どこまでも正確に入力電圧に対応した幅)によって実現できるように誤解されてしまう。 僕が上記の本で示した図で言えば、二つに分かれた「離散化だけ」というような考え方であるが、これはまだ途中なのだ。

しかしこのテキストでは、以下のように、このPWM方式で出来たパルス幅と、より細かいパルス(Clock)とでANDをとってバイナリカウンタを駆動して、それをシリアル信号として伝送すれば(ここはまさにCDのイメージ)、PWMとほぼ同等でも「パルス幅」でなく「(単位時間あたりの)パルス数」というPCM(pulse count modulation)が実現できる、と解説を進めている。 これはちっとも間違いではないし、テクノロジーの歴史からはそのように進展したのだが、「その先」が示されていないところで終わっているのがちょっと残念なのだ。

そして第16章ではこれ以降、(1)ちょっとだけ前章の「D/Aコンバータ」の思い出し、(2)コンパレータIC「LM339」の動作の確認とこのICの詳しい解説(ピン配置など)、(3)Propeller→「D/Aコンバータ」(LTC1450C)→コンパレータ「LM339」で、Propellerからの電圧によってコンパレータの出力がON/OFFする動作の確認、(4)そのコンパレータの出力をPropellerの入力としてフィードバック、(5)これによって「逐次比較型A/Dコンバータ」が実現できる、・・・というシナリオで解説が進んでいる。 興味のある人は追いかけてみるといいが、とりあえず僕はスキップである。(^_^;)

そしてこのテキストではここで突然に、上のような「MCP3202 12-bit ADC」というよく出来たチップが登場する。 ここまでの解説を1チップにしていて、確かに上のような内部動作をしていて、2チャンネルのアナログ電圧に対して、内部回路が自動で「こちらの方が電圧が近いかな?」という電圧を刻々と生成してD/Aコンバートしてコンパレータで比較して・・・という結果が、最終的にはそのアナログ入力電圧に相当する「シリアルの」ディジタルデータとして出力される、という最新の「A/Dコンバータ」である。 僕に言わせれば、サンプリングにとってけっこう重要な「サンプル&ホールド」(S/H)回路について、さりげにスルーしているところが不満なのだが、もちろん解説としては間違いではない。
そして第16章は、PropellerにこのMCP3202を繋いだサンプルプログラムとして、2チャンネルのアナログ入力電圧を取得するという例が紹介されている。 AKI-H8とかGainerとかArduinoとかmbed NucleoF401REとか、およそPropeller以外の全てのマイコンには「シリアル通信(USART)」とか「A/Dコンバータ」といった「機能ブロック」が混載されているのだが、究極に美しいプロセッサであるPropellerには、そのような下品な「I/O」はまったく載っていないのである。 内部に8つも32ビットCPUがあって並列同時動作するので、それらにこういう「シモジモの仕事」を割り当てて回せばいい、というのがPropellerの哲学であり、世界的になかなか信奉者が増えない孤高の理由である。
その意味では、ここでの「外部にA/Dコンバータを増設」というのはちょっと下品な方法(^_^;)であり、Parallax社の提供するサンプルでは、たった2本のポートと外付け抵抗/コンデンサだけで、あとはPropeller内部のCPU(Cogと呼ぶ)の超トリッキーなアセンブラ・プログラミングのテクニックによって、D/AコンバータでもA/DコンバータでもPCMサウンド生成/音声合成でもNTSC/VGAビデオ信号生成でもMIDI送信/受信でも、なんでも全てやってしまう、というのが「究極のPropeller」なのだ。 もちろんこれを可能にするのは、Propellerというチップをゼロから設計したParallax社のCEOが、プロ中のプロ技術者として「史上最高の美しいアーキテクチャ」を追求した結晶だからであり、そこらへんの並のCPU(Propeller以外の全て)では逆立ちしても不可能である。 このあたりを知りたければ、 Propeller日記 をぜひ、じっくりと読んで欲しい。 僕も色々なドキュメントを公開しているが、これは 作るサウンドエレクトロニクス と並んで、ほぼツートップの最高峰なのだ。

Experiment No. 17 - Analog-to-Digital Conversion, Part 2

そして「A/D変換のpart 2」だというこの第17章では、LM335という温度センサICにスポットを当てている。 つまりこの章では、前章で登場した12ビットA/DコンバータのMCP3202とこの温度センサLM335を接続してPropellerに繋ぐことで以下のようなシステムとして、あとはPropellerプログラミングによって実用的な性能を持つ「ディジタル温度計」を作ろう、ということなのだった。

解説は温度の話、12ビット精度を確保する話、Propellerでの数値表現の話と続いて、最後は1チャンネル目の温度センサLM335に加えて、2チャンネル目のA/D入力としてCdSの光度センサも接続して「気温と明るさ」のセンシング・・・というところまで行って、第17章がオシマイとなった。 チラッと見ると次の第18章では「赤外線LEDを使ってリモコンを作る」??みたいな話のようだが、ここらで早退タイムが近付いてきたので、今日はここまでである(先週に続いて今週も有休を出した)。 テンションを上げて、傘をさしながらJoyJoyに向かうことにしよう。

2020年10月9日(金)

昨日は色々と曲順を変更して新鮮な感覚でヒトカラ5時間半を疾走したが、後で数えてみると計58曲でいつもと同じ出来高だった。 朝イチで研究室に出てくると、Microsoft Outlookのサーバが死んでいてメイルがしばし読めない(^_^;)という現象もあったが、ちょっとしたら回復した。 そしてAbemaTVを眺めてみると、なんと以下のように「竜王戦1日目」(初防衛か、通算100期か)がまさにスタートする直前だった。 どうせ初日はほとんど静止画みたいな画面(音声は解説の棋士と聞き手の女流の延々たるダベリ)が続くのだが、それでも一日中、音量をミュートしつつ2画面の片方にずっと出しておくことになりそうで、お仕事はたぶん捗らないだろう。(^_^;)

Experiment No. 18 - How to Use Infrared LEDs for Remote Control

さて、Jonathan A. Titus 氏のテキスト Experiments for the Propeller Quickstart Text の続きであるが、第18章のテーマは「赤外LED」であり、実際には赤外LEDと赤外線フォトセンサ(フォトダイオード・フォトトランジスタ)などについて紹介して、Propellerでは「赤外線リモコン」(テレビのリモコンとかスマホの赤外線通信)を「受信」してデータを表示する、という実験まで進めている。 まずは以下のように「赤外LED」の実例を紹介して(電気的には普通のLEDとまったく同じように点灯させるが人間には見えないだけ)、さらに光の強度は光源から「距離の2乗に比例して弱くなる」(逆2乗法則)と解説している。

ちなみにビデオカメラやWebカメラなどでは赤外LEDはバッチリ見えるので、インスタレーション作品などで画像認識する場合には、赤外LEDを使えば「眩しくない・気付かれない」というメリットがあるのは常識である。 そして次に以下のような「赤外フォトトランジスタ」の例を紹介しているが、これも普通の可視光センサとまったく同じである。 さらに、これら「フォトダイオード」と「フォトトランジスタ」を対面に配置して、その「隙間」まで一体となっている「フォトインタラプタ」を紹介して、このペアを隣接させると、「円盤の回転方向」を検出できる、という解説をしている。

この「隣接した2個のフォトインタラプタでディスクの回転方向と回転速度を検出」というのは、僕のゼミに弟子入りしたリュ・ジュンヒー君(韓国・ホソ大学の交換留学生としてSUACに来て4回生前期に僕のゼミで学び、母国で卒業後にSUAC大学院を受験してゼミ院生となり、現在では「チーム・ラボ」に転職して活躍中)の修了制作作品「POMPOM」で実際に活用していた。 詳しくは、 SUACインスタレーション のページの「POMPOM」のところの 最終プレゼンPDF の14ページにあるが、筐体の全体を3Dプリンティングで製作していて、回転テーブルの下部に、2個のフォトインタラプタの間を通過する「仕切り」まで全て、きちんと設計して一体化してあるのだ。 このシステムはまさにPropellerを使ったものであり、彼は電子回路も大学院で勉強し、さらにPropellerのプログラミングもかなり理解したのだった。

テキストはその後、赤外線リモコンなどの通信(キャリア周波数38kHz)について詳しく解説して、データ構造とかパケットの定義などに続いて、実際にPropellerのアランブラモジュールでこの赤外線通信を受信する実験に進んでいるが、ここでもアセンブラのモジュールはブラックボックスであり、spinの部分は追いかけていけば読めるので、ここでは深入りせずスキップして、これにて第18章はオシマイとした。 なんせ、4-5限の メディア数理造形演習 の講義ページを4限の直前までブラッシュアップする作業と並行なので、あまりこちらに深入りできないのである(^_^;)。

2020年10月11日(日)

昨日の土曜日は竜王戦第1局の2日目を「封じ手」を開けるところから観戦。 まさかの双方居玉のまま52手で羽生投了、という凄い瞬間までをライヴで見届けた。 その合間にぼちぼち、 メディア数理造形演習 に向けてちょっとした半田付けや金属加工をしたり、講義ページの今週の部分などをちょっと書いて過ごして、その間に台風14号も過ぎ去った。
ネットでは以下のように、「米AMD、米同業ザイリンクス買収に向け交渉進展 来週にも合意か」という、ほとんどの人にピンと来ないニュースが流れたが、いよいよCPUからGPUに続いて再びここでFPGAなのか・・・という感慨が深い。 僕は「PAL」という超小型の初期FPGAは使ったことがあるが、メーカではゲートアレイやスタンダードセルのセミカスタムLSIを作れたために、実践的なFPGAについてはほとんどノータッチで過ごしてきたものの、もしかしたらいつかどこかでやるカモ、というのは常に頭の奥底にあるのだ。

そして今日には、ようやく11月初旬の音楽情報科学研究会のプログラム案が運営委員会MLに流れてきたが、当初は2日間という予定だったのが1日だけになり、それも一般発表はたった3件(僕もトップバッターで発表)、それ以外は運営委員があちこち声をかけまくって集めた「国際会議既発表セッション」(予稿ナシ)、そして「萌芽・デモ・議論セッション」(それぞれたった10分だけ(^_^;))、という以下のようなものである。 やはり「出張の無いオンライン学会は人気がない」(現地に集うことが大きなモチベーション)という真理をまたまた証明することになった。

11月2日(月)
10:00 - 11:30 【一般口頭発表】
(1) 脳波センサ"Muse 2"・"Muse S"は新楽器として使えるか
(2) 演奏タイミングのズレを含む混合音に対するマルチラベルビートトラッキング
(3) 大局的構造に基づく正則化を用いた自己注意機構付き深層ドラム採譜
11:30 - 12:30 休憩
12:30 - 13:20 【国際会議既発表セッション】
	SMC/ISMIR
13:20 - 14:50 【国際会議既発表セッション】
(1)  Jazz Harmony Analysis with ε-Transition and Cadential Shortcut
(2)  Computer-Based Music Training with Hearing Impairments: Lessons From an Experiment
(3)  Expectation-based Parsing for Jazz Chord Sequences
(4)  Analysis of Song/Artist Latent Features and Its Application for Song Search
(5)  Chord Jazzification: Learning Jazz Interpretations of Chord Symbol
(6)  Auditory Gestalt Formation for Exploring Dynamic Triggering Earthquakes
(7)  Support System for Improvisational Ensemble Based on Long Short-Term Memory Using Smartphone Sensor
(8)  ONSET-INFORMED SOURCE SEPARATION USING NON-NEGATIVE MATRIX FACTORIZATION WITH BINARY MASKS
(9) Morphing-Based Reharmonization using LSTM-VAE
(10) The aesthtics of notation in Japanese Electroacoustic Music
14:50 - 15:10 休憩
15:10 - 16:00 【萌芽・デモ・議論セッション】
	渡辺みどり/山口恭正/田中瑞穂/城田晃希/能登楓
16:00 - 17:00 【特別企画:交流会?】
17:00-17:15 表彰・クロージング
明日の月曜には、午前にゼミの杉山さん、午後にゼミの永田さんのアポが入っていて、いよいよ「総合演習I」に向けて本格的な検討に突入である。 そこで今日の日曜には、この後期にスタートする 基礎演習E のページを火曜日のイントロ担当のために書き加えたりしたが、ゼミの月曜から火水木金とギッシリの予感なので、 Jonathan A. Titus 氏のテキスト Experiments for the Propeller Quickstart Text の続きを眺めておくことにした。 既に第18章まで、つまり全492ページ中の358ページまで進んできたので、残りはあと23%ほど(あと5章)である。

Experiment No. 19 - How to Create and Use 2-Way Infrared Communication

第19章は前章の赤外線シリアル通信(赤外線リモコンのハッキング)に続いての応用として、双方向で赤外線通信を実現する、というテーマである。 まず最初に、久しぶりに「555」ICが登場して、外付けのコンデンサと半固定抵抗によって、赤外線シリアル通信のキャリアである38kHzを生成する、というところをオシロ波形とともに解説しているがここはサッと飛ばしておこう。 結論としては、以下の図のように555からのキャリヤ信号(赤外線)は「IR receiver/sensor」TSOP38238によってディジタル信号としてLEDを点灯させる(実際には速くて点滅は見えない)ロジックレベルとなる。

ただし、ちょっとここからテキストの流れはやや迷走する(^_^;)。 例によって内部は伏せたままの「UART1 : "fullduplexserial"」というアセンブラ・オブジェクトによって、9600の非同期シリアル通信をPropellerは(専用のUARTチップなど使わずに)実現できますよ・・・とまずは説明している。 回路としては以下のように、PropellerからのUART出力信号をP25から出して、赤外線通信を受けたロジックレベルをP24に入れて確認できる、ということで、まぁこれが「Propellerでの王道」である。

ところが何故か、ここから「赤外線通信の歴史」という感じで1990年代の各社のIR通信専用チップなどのお話になって(おそらくベテラン先生は当時、それらをびしばし使い倒していたのだろう)、最終的に555など使わなくて済む「MCP2120」という赤外線通信専用チップが以下(上)のように登場して、このチップは双方向をサポートしているということで、あっという間に以下(下)のように双方向通信のシステムとなってしまった。

テキストはここから「IR-Communication Protocol」という話に入っていく。 先頭にまず「スタート・バイト」(7F)があり、続いてメッセージの「長さ」という数値(1バイト)があり、その次から1〜255バイトの可変長の「メッセージ・バイト」があり、最後に「チェックサム・バイト」がある、というアレである。 以下のようなプロトコルの話、Propellerのモジュールの構成、そして内部的なシリアル通信のデータ構造、という解説がずらっと続いているが、ここではあまり深入りしない。 本当はここでFIFOの話をしないとちょっと片手落ちなのだが、ハンドシェイクをしているという事は、FIFOを使わずに、バッファの溢れ処理は不要(バッファが空くまで次のデータ送信を許可しない)という、かなり低速の世界のことで終わっていた。 MIDIのように、高速にどんどんデータが勝手にやってきて、それを1バイトも落としてはイケナイ(鳴った音が消えなくなる(^_^;))、というような厳しい世界には入り込んでいないのだった。

本当に面白いのはMIDIのように、データの疎密があって、ある時にはギッシリと多量のデータが到来してもそれをきっちり受け取るためのFIFOバッファというのが必須になり、僕はPropellerのアセンブラ・ライブラリとして完全にゼロから自作してキッチリと動くものを公開しているが、さすがにこのテキストではそこまで厳しい世界には触れていなかった。 ちなみに僕は2015年の音楽情報科学研究会での発表論文 お触り楽器 の最後のあたりに、僕の著書 プロ電子技術者のコモンセンス に紹介した以下の図とともに、このあたりについて解説を書いておいたので、興味のある人は参照されたい。

Experiment No. 20 - How to Use an Infrared Distance Sensor

次の第20章は「How to Use an Infrared Distance Sensor」ということで、ここまでの流れから、Propellerのシリアル処理を活用して、赤外線LEDで発光して、返ってくる反射光までの時間を計測して、それを距離にする・・・というのを実現するのかと思ったら、全然違っていた(^_^;)。 なんと以下の、僕もさんざん使ってきたSHARPの便利な赤外線距離センサ(1106の部品棚にもたくさん在庫あり)を使って、そのアナログ出力電圧を外部のシリアルI/OのA/Dコンバータで読み出しているのだった。 センサからの距離データが線形でないので変換テーブルを持ち出したり、そのデータ整理にエクセルまで登場したが、中身としては大したものは無くてこの第20章もオシマイとなった。

残りは3章(第21章〜第23章)となったが、実はこれらは根は同じネタである。 つまり、+3.3V系のPropellerであっても、+5V系のArduinoやmbedなどであっても同じだが、たかだか1ポートでは普通のLEDを1個ぐらいしかドライブ出来ない。 それを「多数のLED」とか、さらには「モーター」など、要するに大電流・大電力に出力を拡張する方法、というのを最後の3章で解説しているのだった。 これは次の機会にまとめてチェックすることにしよう。

2020年10月12日(月)

カナダから、Boston Dynamicsの有名な犬型ロボットの Spot が「野良Spot」として街を歩いている・・・という動画が届いてスタートした新しい週である。 今日は2限にゼミの杉山さん、3限にゼミの永井さんのアポが入っていて、明日の火曜日にも2限にゼミの古谷さんのアポが入った。 やはり手慣れてきた4回生よりも、初めて「総合演習I」に取り組む3回生の方が動きがきびきびしているのだ(^_^;)。 そして火曜日の4-5限の 基礎演習E ではイントロ「発想を学ぶ」のコーナーの担当回があり、水曜のゼミへと進んでいく。

そして、朝にチラッと Jonathan A. Titus 氏のテキスト Experiments for the Propeller Quickstart Text の残り3章(第21章から)を眺めてみたところ、これはほとんど「そのまま紹介しない方が混乱しなくてよい」というものだった。 話題は上のようなPNPトランジスタとNPNトランジスタから始まって、後半ではMOSFETに進んでいくのだが、実例として登場する型番は「米国タイプ」なのである。 日本でトランジスタと言えばPNPタイプの「2SA###」・「2SB###」とNPNタイプの「2SC###」・「2SAD###」なのだが、このテキストに登場する米国のトランジスタは「2N####」みたいなものであり、僕もほとんどこれまで見かけたことも使ったこともなく日本国内では入手困難であるが、日本製の高性能トランジスタがたくさんあるので、わざわざ入手する必要性はゼロなのだ。
そこで、第21章「How to Use PNP and NPN Transistors to Control LEDs」と第22章「An Introduction to MOSFETs and LED Control」については、テキストの図(回路例が米国式)を離れて、今後、補足のお話として簡単に書いていくことにした。 さらに第23章「Use MOSFETs to Control LEDs and Motors」の「モータ制御」の部分も、実用的には秋月電子のキットに付属しているデータシートなどでほぼ網羅されているので、ほとんどこれにて テキスト は終了という感じとなった。 エレクトロニクスからマイコン黎明期のベテランの力作で内容は豊富であるが、現代のマイコン技術のテキストとしては、どことなく中途半端なところもあるのは仕方ないが、それにしてもここまで執筆してフリー公開しているというのは素晴らしい仕事である。(^_^)

その後、午前と午後にゼミ学生との作戦会議があって(上のように)、これで充実の1日は終わりである。 いずれ、カーマに部品買い出しに行ったり・・・というフェーズに進むことになりそうだ。

2020年10月13日(火)

昨日はゼミの永井さんアポの作戦会議で、「多数のLED」モノについて検討したが、そこでフト思い立って、「 靄夜 」のAKI-H8システム(MIDIから64個のLEDを個別PWM制御)というのを、手持ちのAKI-H8にザッと書き込んでしまおう・・・というのに着手した。 ところが、富士通のWindowsXPマシンと「DOS窓」の秋月電子の開発ツールまではちゃんと進んだものの、最後にAKI-H8のFlashメモリにプログラムを書き込む「FLASHメモリライタ」が「time out」エラーで失敗する、というトラブルに遭遇して、解決しないまま昨日は終わった。
しかし1日経つと良いこともあるもので、エラーの理由として「USBシリアルが認識されていない」という現象に気付いて、忘却の彼方から「ドライバの再インストール」という荒技で無事にシリアルが繋がり、一気に10枚ほどのAKI-H8に書き込むことに成功した(^_^)。 本当に「靄夜」プログラムが書き込まれているかは、今後これを使う時に確認するとして、完全に忘れていた「AKI-H8のプログラミング」について確認できたのは大きい。

そして2限にはゼミの古谷さんのアポがあり、一緒に「総合演習I」の作戦会議を進めて、まだ全貌は霧の中だが素晴らしいアイデアに到達してしまった。 ここからどう展開するかは古谷さんの腕の見せ所であり、とりあえず僕はSUAC出入り業者に2点ほど、制作に使えそうな材料の購入手配をメイルした。 ヒントは上の過去の先輩作品2点にあるが、詳細はまだ秘密ということにしておこう。(^_^;)
4-5限の 基礎演習E の前半に40分ほどのトークをしたが、その後は研究室に戻った。 というのも、時間学会の理事会(メイルの行き来)で、例の「日本学術会議の新会員任命拒否」に対する声明を出す、という話題で議論が沸騰しているためである。 スカ総理はまったく困ったものだ。

2020年10月14日(水)

このところ、近付いてきた3件のオンライン学会に関して「リハーサルのZOOM」などの情報が届いてきたが、初めてのオンラインとなる音知学会からも、 このような案内 が届いた。 なるほど僕は全く気にしないので気付かなかったが、ここで注意されているように、オンラインの発表を録画されたりすると、プライバシーの関係で嫌がる、そのために発表を控える人も出てきているのかなぁ・・・と思い至った。

そして2限になって、 このように ゼミが順調に進んだ。 皆んなそれぞれ、色々と考えているし、今期もどうなっていくか、ゴールが楽しみだ(^_^)。 ちなみに(リンク切れするが)全95分の記録動画は これ である。 そして明日の午後には委員会があるために、そのテンションのままJoyJoyに向かうことにした。 筒美京平さんを偲んで、今日は「昭和ポップス歌謡」特集、と決めている。

2020年10月16日(金)

水曜の晩JoyJoyヒトカラ5.5時間は、前週とまったく曲目も違っているのに、後で数えてみれば同じ58曲だった。 そして昨日の木曜日は朝イチで眼科通院(症状に回復ナシ(;_;))、3限にゼミの梅田さんアポで作戦会議(なんとMyoが活躍という計画!!)、4限に学生委員会があって、あっという間に過ぎ去った。

そして今日の午前には、上の2つの静岡県「GOTO EAT」キャンペーンの予約をするために待機した。 こういうキャンペーンに乗るのは個人的には好きではないのだが、なんせGOTOトラベルの方はどこに行くのも禁止という状態で出張も旅行も皆無となっていて、せめてこの割引で街中に出て(ここ半年以上、有楽街とか鍛冶町とか浜松駅とかに全く行っていないのだ(^_^;))、一人で焼肉屋にでも行こうか・・・という事なのだ。 結局、静岡県の方はスムースに2-3分で申し込み完了したが、商工会議所の方はローソンチケット丸投げであり、ローソンチケットのサーバが止まったりなんだかんだとリトライさせられたが、なんとか10数分でこちらも予約が完了して、とりあえずやれやれである。

その後、2限と3限には メディア数理造形演習 の講義テキストの拡充とか、持参するブツのチェックなどを進めた。 今年から「本気のjitter」を伝授するという方針で、毎週しっかり教材を作っていく予定である。 そんな中、Max8を起動すると、なんと上のように、ウインドウに「LICENSE FILE NEARING EXPIRATION」というのが現れた。 永久ライセンスを購入しているのに、こんなのが出たのは初めてである。 このプロトコルはSUACのfirewallを通らないので、このままでは使えなくなってしまう(^_^;)。 そこで こんな動画 を撮ってWebとYouTubeに上げて、以下のようなメイルを出してみた。 果たしてどうなるか。

Dear Cycling '74 staff,

Today my Max8 shows "LICENSE FILE NEARING EXPIRATION".
Please watch this movie : https://youtu.be/H_4bMzrIyAE

I have two permanent academic licenses of Max8, and this Mac is authorized with it.
My Lab (in my Univ.) cannot connect directly to Internet - the firewall seems to stop the special 
protocol of Max8 authorization like Library Manager (watch the movie).

I know that I can connect directly with Mobile WiFi Router, however I must to pay money to lent/use.

Please explain why Max8 says this - I have already authorized Max8 with my permanent license. In the 
future, every time this message appears, must I pay for Mobile WiFi Router ?

2020年10月17日(土)

昨日の メディア数理造形演習 は、ハンダ付けをして こんな感じ だった。 そして今朝にはCycling '74からメイルが届いていたが、Max8は「永久ライセンス」であっても、6ヶ月ごとにライセンス認証サーバに接続する必要がある、と判明した。 仕方ないので1106のお仕事Mac miniのために、遠隔教育対応で研究費でレンタルしているモバイルWiFiルータを自宅から持ってきて、あっさり認証できた。 残る5台はノートなので、最悪は駅のカフェとかカラオケに持参してフリーWiFiに繋いで認証することになる(^_^;)。 そして、昨日に届いていた3つのブツを このように 開けてみた。 これはゼミの皆んなに見せることになる。

2020年10月19日(月)

新しい週であるが、その週末の土日には「日本音楽知覚認知学会2020年度秋季研究発表会(オンライン)」があり、参加しなかったがZOOMテストなどもあったらしい。 さらにその翌週末の土日に「電子情報通信学会ヒューマンコミュニケーション基礎研究会(オンライン)」、その翌日の月曜に「情報処理学会音楽情報科学研究会(オンライン)」と、おそらく今年はこれでオシマイだと思うがオンライン学会発表が続く。 既に予稿は提出しているし全てZOOMなので、例によってプレゼン(PPT的なもの)を作らずにライヴで済ませる予定なのだ。 昼休みには知り合いの開業医のところでインフルエンザの予防接種を受けてきて、これでCOVID-19を別にすれば、冬に向けての準備はとりあえず完了である。

上のように、とりあえずこの後期に支援するゼミと「メディア数理造形演習」のプロジェクトなどに関するメモを書き出してみたが、まだまだここから変更につぐ変更の嵐となる。 4限にはゼミ杉山さんのアポでの作戦会議があり、訳ありで新たに廉価な非接触体温計をAmazonに発注してみた。 さらに、9軸センサ(旧版でもArduinoライブラリ実績あり)のボードが製造中止・・・という情報を発見して、あわててYAHOOショップの在庫1個を発注したり、互換品を業者に発注してみたりした。 そしてさらに、MicroBタイプのUSBケーブルで「極細」というのも発注したが、これは色々と深淵な理由があるのだった。

2020年10月20日(火)

朝イチでいくつかのメイルが届いていたが、今日の午後にはゼミの永井さんと材料の買い出しがあり、その打ち合わせのメイルから1日が始まった。 Cyclint'74からの返答もあったので、後でその確認も進めてみる必要がある。 しかしその前に返信したのは、以下のような怪しげなイベント関係である。 浜松の鴨江アートセンターで、タイのヘンリー・タンというアーティストと遠隔で脳波通信をするらしい。 SUACのMDWでも講師として来てくれた、ヤマハの長谷部さんが進めているもので、やはりMuse 2とMind Monitorでやっているとのことである。 サイトの情報は これ であり、いずれ消えるのに備えてローカルに保存したものが これ である。 ただし残念ながら、学会オンライン発表と重なっているので、「アーティスト・トーク」には行けない。(^_^;)

そしてシステム製作についてあれこれ構想しているところに永井さんが来て、しばしの作戦会議の後にカーマに行って、多量のアクリル板その他を仕入れてきた。 その後さらに、注文していた業者が このような あれこれを納品してくれて、1106研究室は一気に今期の実験/試作の雰囲気が高まってきた(^_^)。 大きな偏光板とか、「人肌のゲル」とか、バイオメタル・ファイバー(人工筋肉)とか、もう明日のゼミでの紹介と、それに続く実験が楽しみである。

2020年10月21日(水)

またまたゼミの日である。 朝からテンションを上げてあれこれ調べ物をして、過去の学生作品のために仕込んだシステムの資料などを発掘した。

そして2限になって、 このように ゼミが順調に進んだ。 ちなみに(リンク切れするが)全86分の記録動画は これ である。 そして午後には早退、またまたJoyJoyに向かうことにした。

2020年10月22日(木)

昨日はちょっと早めにJoyJoyに着いたので、予約していた「5時間半」を「6時間」に変更して全力ですっ飛ばしたのだが、今朝リストを見てみると「5.5時間、56曲」となっていた。 飲み歌い連続6時間で後半などは常に忘却しているので詳細は不明だが(それでも毎回ちゃんと帰巣本能で帰宅している)、どうも疲れたので30分近くを残して終了した模様である。 ただ座って歌っているだけなのに、今朝も全身に疲労感があったが、まぁそれだけ全力で絶唱熱唱してきたのだろう。(^_^;)

NIMEのメンバーMLにはMichael Lyonsから新しい話が届いた。 これまで、NIMEではそれぞれの開催地でProceedingsが出て、さらにNIMEのサイトでそれぞれの論文が公開されていたが、それを上のような arXiv.org という、オープンソースのサイトにも掲載していこう、というものだった。 「Submitting to arXiv - Quickstart」ということで、過去のNIME論文もここに出してよ・・・という YouTube動画 まで用意されていたが、ちょっと面倒なのでここは様子見である。(^_^;)

そして、北京の王さんが今週のゼミで紹介してくれたProcessingスケッチについての続報のメイルも届いた。 王さんが読んでいるのは、上のような The Nature of Code という書籍を中国語に翻訳した本らしい。 そこでさっそく、この本の電子版(PDFとサンプルコード)を購入した。 さすがオープンソース文化、「値段は自分で付けて」(^_^;)というもので、この本をいくらで購入して、そのうち何パーセントをProcessing.orgに寄付するか、という両方を画面内のスライダーを自分で設定できるのだった。 最初は両方をゼロにしてみると、それでも購入できる事が分かったが、さすがにそれもナンなので、最初のところに戻って、defaultのスライダー状態で、この本を10ドルで購入し、そのうち10%の1ドルがProcessing.orgに寄付されることになった。 僕の手元にはこの厖大な知的資源が完備したので、おいおいゼミと並行して、この日記でも眺めていくことにしよう。

そして3限にはゼミの田口さんが1106にやってきて、卒制の作戦会議を行った。 今回は造形でなく、WebCamでの画像認識で自分の顔によってコントロールするインスタレーション作品で、GaragaBandで好きな音楽をいろいろ作り込む感じに進みそうである。 4限にはTeamsでの教授会があったが、オンラインであれば接続だけして横で聞き流していられるので、実際に今日のここの日記はその教授会の時間に内職として書いているのだった。(^_^;)

2020年10月24日(土)

学生たちの作品制作プロジェクトの企画案があれこれ動き出し、そのためのアポもどんどん入り、忙しくなってきたのは嬉しいことである。 昨日の金曜日はいつものように朝イチで眼科通院、なんと保護用のソフトコンタクトレンズが外れていたと判明したが、以前に外れた時には痛くて予約なしに駆け込んだのに比べれば、まぁ経過は悪くないのかもしれない。
そして午前にはゼミの梅田さんのアポがあり、 このように 実験して(写真は途中まで。後日に追加の予定)、筋肉の造形を伸縮させるためには「人工筋肉」では駄目だ・・・と確認した。 1メートルの人工筋肉に15Vの電圧をかけて最大に縮んで4センチメートル、というのではまったく使えないのだが、その取説はWebには置いていなくて、実際に現物を購入すると付いてきて判明してガッカリする、というビジネスモデルだった(^_^;)。

その後、あれこれ講義の準備をして、4-5限には以下のように メディア数理造形演習 の講義が このように 進んだ。 研究室からいろいろ持っていって、皆んなにも体験してもらったり動態保存している先輩作品を見てもらったり・・・と、まさに遠隔でなく対面だからこその「当たり前の日々」の有り難さを実感した。

そして今日と明日は日本音楽知覚認知学会(と日本音響学会音楽音響研究会との共催)である。 土曜の午後と、明日の日曜は午前と午後ということで、僕の発表(Risset Rhythmの後半)は明日のラストであるが、2学会の共催、さらに学生の尻を叩いてポスターをかき集めてようやく、という苦労が偲ばれる。 要旨の付いたプログラムは これ であり、なかなかにハードな感じである。 今回は、ZOOMのバージョンアップによって「ブレイクアウトルーム機能」というのでポスター発表の小部屋に分割して移動できるらしい。

ところで今回の音知学会と音響学会MA研では、いまだに論文集が「紙」である(^_^;)。 発表者と希望者には、事後に3000円の予稿集代の振込用紙が郵送されてくるらしい。 オンラインの学会をZOOMでやっているのにいまだ「紙」だというのはなかなか珍しく、「紙」文化を後世に紹介するためなのか、まぁ素晴らしいことである。 そして当日用PDFに、わざわざ上のように予稿の全てのページに「オンライン研究会用」という薄い水色の大きな文字を斜めに入れたものを配布しているが、せっかくなので ここ に置いておこう(リンク切れするが賢明な諸兄であれば入手できる筈)。

そしてぼちぼち時間になったのでZOOMで繋いでみようか・・・とゃってみると、なんと上のように、ZOOMのIDとパスワードを入れてスタートせず、パスワードの画面にメイルアドレスを求められて、それを入れても「ZOOMに入る」のボタンが押せない(^_^;)というトラブルに遭遇した。 これはZOOMをあれこれ使ってみた中でも初めてである。 そこで学会の幹事にメイルして、結局、「ブラウザで接続」という謎の長い長いURLを入れてみると、ブラウザから外部アブリのZOOMが起動して、無事に以下のように入ることが出来た。 明日は発表だが、ちょっと不安が残る。

そして、今日の午後イチのポスターセッションについて、いちいち手作業でスクリーンショットを撮って、 このような 感じにまとめてみた。 その「特設サイト」というのは、ポスターとか説明動画がダウンロード出来ないようにしてあるので、こうするしかなかったのだ。 しかしその後も、ブレイクアウトルームに関してなかなかうまく動かずに、あれこれ皆んなで試行錯誤しつつ時間が過ぎ去った(^_^;)。 まぁ、それでも「開催ナシ」だった前期よりは、格段にマシなのだろう。
その後、夕方までサブのMacBookAirでずっとZOOMを開いておきつつ、あれこれ作業していたが、それでも「疲れた」。 片手間でもなんでも、とにかくZOOM学会は疲れるのである。 明日は午前から午後まであって、僕の発表は最後(14時付近)ということなので、今日よりもさらに手抜きをして疲れずに発表に備えないといけないのだ。

2020年10月25日(日)

音知学会オンライン発表の当日であるが、休日なので守衛所のところからカードキーで入構する時に、守衛さんに声をかけられて朝からドッキリした。 守衛さんの言うには、今朝、すでに入構した何人かの教員から「SUACの(WiFi)ネットが動いていない」(^_^;)との連絡があったというのだ。 SUACはネットワークのインフラは全てNTT西日本に丸投げしているので、休日にネットが止まると何も手出しできず、ひたすら月曜の朝にNTTのSEが出勤してくるまで待つしかなく、過去には何度もこれで泣かされてきたのだが、オンライン学会発表の当日にもしSUACネットが落ちていれば研究室から発表できないので、パソコンを抱えて24時間営業のWiFi完備のカラオケにでも行かなければならない。 ドキドキしながら研究室に行ってみると、無事にネットワーク(LAN)は稼働していて、研究室内にWiFiを飛ばすルータもDHCPもまったく問題なく、どうやらトラブルは中講義室(おそらく今日、講演会か何かイベントでもあるらしい)のWiFiが飛んでいないだけらしい、と判明してホッとした。 1106研究室にはAirMacルータが3台あるので貸し出しも可能なのだが、これだと事前にSUAC情報室にMACアドレスを登録した機器しか使えないので、急なトラブルでは無理である。 御愁傷様としか言いようがない。(^_^;)

午前中は「ショートプレゼンテーション」というセッションが2つ、15分ずつ合計11件あるのだが、この合間には、既に完全に忘却の彼方に行ってしまっていた 「Risset Rhythm」 温故知新 を思い出すことからスタートして、音楽情報科学研究会の夏シンポではその中でどこまで報告したのかを確認し、今日の発表もスライドを作らずライヴで語り倒すので、上のようにその準備などをずっと内職モードで進めた。

そして11時前には、上のように「昨晩深夜から、本学が加入する学術情報ネットワーク(SINET)に障害が発生しており、ネットワークが使用できない状況となっておりました」とのメイルが流れてきた。 どうやら休日なのに、連絡を受けてSUAC情報室スタッフが大学に出てきたらしい。 上流のSINETが落ちたらもう完全に駄目なので、これが今朝の08:03に復旧していて、本当にヨカッタ(^_^;)。

 

その後、ZOOMでステレオのサウンドがうまく出ない・・・という仕様とも戦いつつ(ステレオのサンプルサウンドをWebに置いてURLのQRコードを大きく表示)、上のようになんとか30分のプレゼンを乗り切って、これにて「Risset Rhythm」シリーズも終了である。 音知学会の方では「コロナ禍での音楽音響・音楽知覚認知の研究・教育」というラウンドテーブルが始まったが、発表が終わった直後の脱力感でそれを覗くこともソコソコに、今日はまぁ、オシマイである。 こんな感じだと、来週の日曜には電子情報通信学会でのオンライン発表、そしてその翌日の月曜にも音楽情報科学研究会でのオンライン発表、と2日連続なのだが、けっこう大変だなぁ、と気付いた。

2020年10月26日(月)

新しい週の始まりである。 昨日は北京の王さんから、「 The Nature of Code の最初の部分をやってみた」というメイルも届いていた。 さっそくProcessingスケッチを走らせてみたが、呼び出すモジュールを別スケッチとして分割しているなど、ちょっとプログラミングの「癖」としてあまり好きではなかった(^_^;)ので、歩調を合わせて、僕も別途にサンプル等を書き換えつつ追いかけてみる事にした。 手順としては、秘密裏に置いておく テキスト  を読み進めつつ、寄り道しながら サンプルスケッチ  を走らせて確認し、自分バージョンに改訂して保存していく、という事になる。
float x, y;

void setup() {
  size(400,400);
  frameRate(30);
  x = width/2;
  y = height/2;
}

void draw() {
  background(255);
  walk();
  render();
}

void render() {
  stroke(0);
  fill(175);
  rectMode(CENTER);
  rect(x, y, 40, 40);
}

void walk() {
  float vx = random(-2, 2);
  float vy = random(-2, 2);
  x += vx;
  y += vy;
  x = constrain(x, 0, width-1);
  y = constrain(y, 0, height-1);
}
上のProcessingスケッチ「sketch_00_000」は、このテキストには無いもので、これまで僕が安易に書いてきた例である。 これは正しく動き、表示ウインドウ内を正方形がランダムウォークするのだが、過去のC言語の手法で書かれていて、発展的ではない。 つまり、1個の正方形であればこれでいいとして、2個3個・・・と増えていったら、いちいちそれらを記述する必要がある。
Walker w;

void setup() {
  size(400,400);
  frameRate(30);
  w = new Walker();
}

void draw() {
  background(255);
  w.walk();
  w.render();
}

class Walker {
  float x, y;
  Walker() {
    x = width/2;
    y = height/2;
  }
  void render() {
    stroke(0);
    fill(175);
    rectMode(CENTER);
    rect(x, y, 40, 40);
  }
  void walk() {
    float vx = random(-2, 2);
    float vy = random(-2, 2);
    x += vx;
    y += vy;
    x = constrain(x, 0, width-1);
    y = constrain(y, 0, height-1);
  }
}
このテキストの「Introduction」ではまず一番最初に、Processing、つまりJavaが持っている「object-oriented programming (OOP)」について解説している。 上のProcessingスケッチ「sketch_00_001」は、このマナーに従って書き換えたもので、実行させると表示はまったく前のものと同じである。 クラスとして「Walker」というのを定義して、クラス内にwalk()とrender()の関数を記述して、setup()内で「w = new Walker();」として新しいオブジェクトを生成して、draw()からは毎回、「w.walk();」・「w.render();」とこのオブジェクトが関数をコールしている。 ちょっと面倒になったようだが、「正方形を2つにしてみる」と考えると劇的に違いが出てくる。
Walker w1, w2;

void setup() {
  size(400,400);
  frameRate(30);
  w1 = new Walker();
  w2 = new Walker();
}

void draw() {
  background(255);
  w1.walk();
  w1.render();
  w2.walk();
  w2.render();
}

class Walker {
  float x, y;
  Walker() {
    x = width/2;
    y = height/2;
  }
  void render() {
    stroke(0);
    fill(175);
    rectMode(CENTER);
    rect(x, y, 40, 40);
  }
  void walk() {
    float vx = random(-2, 2);
    float vy = random(-2, 2);
    x += vx;
    y += vy;
    x = constrain(x, 0, width-1);
    y = constrain(y, 0, height-1);
  }
}
上のProcessingスケッチ「sketch_00_002」は、クラスとしては1つだけ「Walker」というのを定義して、w1とw2という2つのオブジェクトを生成している。 これだけで、2個の正方形はそれぞれがランダムウォークしてくれる。 つまり、それぞれのオブジェクトは自分の中で自分の振る舞いを解決するので、外からは何もしていないのである。
Walker w1,w2,w3,w4,w5,w6,w7,w8,w9,w10;

void setup() {
  size(400,400);
  frameRate(30);
  w1 = new Walker();
  w2 = new Walker();
  w3 = new Walker();
  w4 = new Walker();
  w5 = new Walker();
  w6 = new Walker();
  w7 = new Walker();
  w8 = new Walker();
  w9 = new Walker();
  w10 = new Walker();
}

void draw() {
  background(255);
  w1.walk();  w1.render();
  w2.walk();  w2.render();
  w3.walk();  w3.render();
  w4.walk();  w4.render();
  w5.walk();  w5.render();
  w6.walk();  w6.render();
  w7.walk();  w7.render();
  w8.walk();  w8.render();
  w9.walk();  w9.render();
  w10.walk();  w10.render();
}

class Walker {
  float x, y;
  Walker() {
    x = width/2;
    y = height/2;
  }
  void render() {
    stroke(0);
    fill(175);
    rectMode(CENTER);
    rect(x, y, 40, 40);
  }
  void walk() {
    float vx = random(-2, 2);
    float vy = random(-2, 2);
    x += vx;
    y += vy;
    x = constrain(x, 0, width-1);
    y = constrain(y, 0, height-1);
  }
}
上のProcessingスケッチ「sketch_00_003」は、悪乗りしてその正方形を10個にしたものであり、こういう「多数のオブジェクトを生成する」というのは、オブジェクト指向のJava(Processing)が得意とするところで、Maxがちょっと苦手な領域なのだ。 しかし、どうもテキストとサンプルスケッチの対応がよく分からず、話としては面白く続いていくのだが、厖大なサンプルスケッチの扱いにちょっと困ってしまった(^_^;)。 テキストで示しているProcessingスケッチはどうやら提供されているサンプルのごく一部のようなので、テキストを単に追いかけていると、せっかくの面白いサンプルを飛び越してしまうようなので、ここまでの4つのサンプルを ここに  まとめておいて、今日はここまでで終了した。 4限にはゼミの杉山さんのアポもあるので、続きはまた明日以降である。

2020年10月26日(月)

 

昨日のゼミ杉山さんアポでは、実験Maxパッチも面白く進展したのだが、詳しくは明日のゼミで紹介することにしよう。 今日は午後に有休早退でJoyJoyという日であるが、昨日のProcessingの3つ目が不満だったところが、朝イチで一気に解決してしまった。 オブジェクト指向のいいところは、「多数のオブジェクトをいくらでも生成する」ところだが、昨日の最後のものは「Walker w1,w2,w3,w4,w5,w6,w7,w8,w9,w10;」などと定義していて、これでは「いくらでも」にはならない。 何か配列みたいなもので定義できるのでは・・・ということで、先週に王さんが制作したProcessingスケッチを眺めることで、一気に上のように多数をサッと生成することが出来た(^_^)。 ソースは以下である。 これでもう今日はノルマを果たしたようなものだ。

ArrayList walker;

void setup() {
  size(600,600);
  frameRate(30);
  walker = new ArrayList();
  for (int i = 0; i< 50; i++){
    Walker w = new Walker();
    walker.add(w);
  }
}

void draw() {
  background(255);
  for (Walker w : walker){
      w.walk();
      w.render();
    }
}

class Walker {
  float x, y;
  Walker() {
    x = width/2 + random(-280,280);
    y = height/2 + random(-280,280);
  }
  void render() {
    stroke(0);
    fill(175);
    rectMode(CENTER);
    rect(x, y, 40, 40);
  }
  void walk() {
    float vx = random(-2, 2);
    float vy = random(-2, 2);
    x += vx;
    y += vy;
    x = constrain(x, 0, width-1);
    y = constrain(y, 0, height-1);
  }
}
そしてMax8のバージョンが8.1.7になっていたので、お仕事Mac miniと、研究室の3台のMacBookAir(と2台のMacBook)の全てを最新にバージョンアップしたが、まだ「AuthorizationがSUACネットのfirewallを通らない」というトラブルは対応されていなかった。 状況をCycling'74に知らせたメイルから数日が経過しているので、いずれの新しいバージョンで対応されていることを期待したい。
あとは、金曜日の メディア数理造形演習 でGarageBandを紹介しようと研究室MacBookAirを走らせたら、なんだか新しいサウンドを勝手にダウンロード始めてしまい、過去の曲データが違った音色に化ける、というトラブルが発生したので、その対応に追われる1日となった。

2020年10月28日(水)

   

   

昨日のJoyJoyは5.5時間で55曲(1時間10曲という平均ペースは恐ろしいほど正確)だったが、中身としてはこれまでで初めての挑戦をしてみた。 いつも最初は「声慣らし」で低めの曲からスタートして、次第に声域が上がっていくのが僕のルーティンなのだが、今回はポルノグラフィティ連続6曲からスタートして、その後も女性の曲をいきなり連続で突っ込んで、結局、上のように このリスト  のたった2ページの範囲内だけを歌うことで55曲を完走したのである。 これは非常にレアな体験で、ちょっと朝から喉にダメージが残っている(^_^;)が、過去には到底出来なかったことなので、このヒトカラで歌唱力は確実に成長しているのだ。

上は今月の戦果であるが、先月のヒトカラ戦果は 「Sketching日記(part6)」 の最後に、そして、それ以前の今年のヒトカラ戦果も、同じ 「Sketching日記(part6)」 の「2020年9月2日(水)」のところに載っている。

そして今日は「卒業制作」の企画審査会議があり、ゼミは臨時に4限に変更という日となっている。 欠席連絡のあった王さんも持田さんも経過報告のデータは提出していてメンバーで共有し、無事にそれぞれの進捗報告などが このように 順調に進んだ。 ちなみに(リンク切れするが)全60分の記録動画は これ である。 明日は午前にゼミ梅田さんアポ、午後にはここには書けない重要な某お仕事、さらに午後にゼミ杉山さんアポがあって予定満載だ。

2020年10月30日(金)

もう週末、金曜日である。 午前にはいつも眼科通院、そして午後にかけて4-5限の メディア数理造形演習 の準備をみっちり進めて、無事に中身はとても「濃い」ものとなった。 各グループの企画検討も着々と進んでいるのが心強い。 そして明日から土日の2日間は電子情報通信学会のオンライン研究会(土曜の夕方には途中で抜けて家族の「GoTo食事会」)、週明けの月曜は情報処理学会音楽情報科学研究会のオンライン研究会、と予定が詰まっているが、まだプレゼン(ライヴのアドリブ)の準備は敢えてしていない(^_^;)。
土日月は学会を覗きつつ翌日の発表準備などに没頭することになり、祝日の火曜日も、午前からゼミ杉山さんアポが入っていてさらに午後にはJoyJoyということで、来週水曜日の企画審査会議と4限のゼミまで一気に進みそうだ。 この「濃密な」期間、ここの日記に載せるものとしてはオンライン学会のスクリーンショットが撮れるかどうかぐらいになりそうだ。

2020年11月2日(月)

一昨日の土曜日には電子情報通信学会ヒューマンコミュニケーション基礎研究会の1日目に参加し、夕方には久しぶり(8ヶ月ぶり)の有楽街に出かけて、胎内を入れて4世代の家族が集まっての「GoTo食事会」があった。 久しぶりに「これぞ焼肉」というのを堪能した。(^_^)

昨日の日曜日には電子情報通信学会ヒューマンコミュニケーション基礎研究会の2日目に無事、発表をライヴでやっつけた。 さらに今日、月曜日には情報処理学会音楽情報科学研究会での発表を、朝イチのトップバッターとして以下のように無事にライヴでやっつけたところで、まぁホッとしている。 ただし研究会は夕方まで続き、さらにその後にTeamsで「音楽情報科学研究会運営委員会」というのが待っているので、今日一日は音情研の日なのだ。 ちなみに全30分の発表の模様の記録動画は これ である。

今朝フト思いついて、今回はライヴ性を重視して、OpenBCIをかぶってMax8で脳波を見せたり、Muse2で表示しつつサウンドを鳴らして「心拍を落とす技」を初めて公開してみたが、どうやら無事に心拍はサッと低下してくれたらしい。 まぁ、これは十分にパフォーマンスとしては成功ではないだろうか(^_^;)。
そして、その後の「国際会議既発表セッション」と「萌芽・デモ・議論セッション」はチラッと覗いただけだったが、はこだて未来大の学生さんの「合成音声歌唱に固有なヴィブラートの楽譜レベルでの学習について」という発表が、研究の中身そのものよりも「歌声合成システム」UTAUというのがなかなか面白かった。 PDFは これ 、デモ動画は これ であるが、何かの機会にゼミあたりで紹介してみたい。

2020年11月3日(火)

祝日であるが、ゼミの杉山さんのアポがあって、「総合演習I」のプロジェクトに向けてちょっと進み始めた。 ちょうど昨日に中国から届いていた「非接触体温計」を このように 分解して、単にスイッチの状態を出すだけでなくせっかくなのでArduinoを内蔵して3色LEDを点灯させる・・・という方向で改造を始めたが、午前だけという時間切れのため、続きは木曜日にする事にした。 午後には早めに帰宅してJoyJoyである。(^_^)

2020年11月4日(水)

昨日のJoyJoyは5時間で63曲(やはり昭和の曲は短い!)だったが、中身としては先週の初めての挑戦の続きをしてみた。 先週は、プリントして持参している このリスト  の2ページ目と3ページ目の曲だけを歌うという「縛り」で55曲を歌ったが、そうなるとリストの他のページは真っ白である。 そこで昨日はちょっと無謀だと自覚しながらも、その続きの4ページ目と5ページ目の曲だけを歌うという「縛り」でスタートしてみた。

   

   

するとここはちょうど昭和ゾーンであり、ウォームアップも順調、そして男性の曲と女性の曲が程よく散らばっていて、なんと途中の「Drug Time」も無しで完走した。 「Drug Time」とは、いつも5時間とかヒトカラで歌い続けていて声が疲労してくると必ず途中(3時間経過あたり)で服用する、以下の漢方薬「響声破笛丸料」であり、ちっとも怪しくないものなのだ。 もう何年も前から愛用しているが、ネット情報によれば「声優、歌手などもこれを愛用している」ものだという。 何より、本当に効くのだ。 飲んで1分もすると、出なくなりかけていた声が出てくるのだから、漢方、恐るべしである。

そして今日は「総合演習I」の企画審査会議があり、ゼミは先週に続いて臨時に4限に変更である。 欠席連絡のあった田口さんも経過報告のデータは提出していてメンバーで共有し、無事にそれぞれの進捗報告などが このように 順調に進んだ。 ちなみに(リンク切れするが)全56分の記録動画は これ である。 明日は午前にゼミ杉山さんアポがあり、改造の続きを進めていこう。

さて、そしてここからは「考慮中」というお話である。 ちょうどNIMEコミュニティからは、来年のNIME2021の情報が届いた。 「New Interface for Musical Expression 2021 - June 15-18, 2021, New York University Shanghai, Shanghai. NIME2021 Theme: “Learning to Play, Playing to Learn”」というもので、なんとNY大学の上海キャンパスで開催だという。 果たして来年6月に中国に行けるのかどうかは不明だが、「これから」を考える時期なのだ。 今年はCOVID-19のために3月からというもの出張が完全にゼロになったが、既に上のようにオンラインで6件も発表していた。 そして今年度の残りについては、およそ以下のような候補が残っている。 もちろん、全てがオンラインである。 これらについては、およそ今月前半には作戦を立てて発表応募をする必要があり、考え所なのだ。

2020年11月5日(木)

この日は、Max8のトラブルに関して、ちょっとした進展があった。 何度もやりとりしていたCycling'74のスタッフからのメイルが届き、どうも「SUACのfirewallがCycling'74のサイトへのアクセスだけブロック(低速)している?」という疑惑が表面化した。 そこで、実際の様子を記録した動画を紹介したり、情報室のスタッフと相談したりしたが、たまたまその時には「出なかった」筈のMax8オーソライズ画面が、もの凄い遅れとともにうっすら出てきたりして、ちょっと動揺した。(^_^;)
そして午前にはゼミの杉山さんのアポがあって、「総合演習I」のプロジェクトに向けて、さらに進めて このように 中国から届いていた「非接触体温計」の改造が以下のようにほぼ終了した。

ただし、すでに「6軸センサ」を搭載して活躍していたSeeeduino Liteが何故か書き込みできなくなっている・・・というトラブルに遭遇してストップしてしまった。 どうも、Seeed社のボードの環境が安定していない模様で、「Arduino(Seeed社のもの)をUSBに挿してもIDEからシリアルポートが見えない」という現象が4台のMacに共通して起きてしまった。 既にファームウェアを書き込んで稼働しているSeeeduino Liteはいいのだが、それを改訂したり新しく書き込めないのでは困ったものである。 そこで仕方なく、Arduino Microに、別の3次元加速度センサを付ける(→全体として基板サイズはさらに小さくなる)、という方針に変更した。

2020年11月6日(金)

そして金曜日である。 いつものように朝イチで眼科に通院して、午前に研究室に出てきたところで、お仕事Mac miniでMax8の様子を見てみると、またまた「凄い時間がかかった後で」Max8オーソライズ画面が出てきたので、その様子を動画に撮ってCycling'74のスタッフに送った。 そして昨日からの懸案を、お昼前と昼休みの時間で一気に このように 進めて、なんとArduino Microバージョンでの改造が完了してしまった(^_^)。

さっそくこれは、4-5限の メディア数理造形演習 で、皆んなに紹介してみよう。 今日は「OSCの紹介」もあり、各グループの企画案もだいぶまとまってきているので、ぼちぼち制作の時間も始まることになる。

2020年11月7日(土)

まったく出張が無くなった今年は、例年と違って週末(土日)の予定はほぼ空っぽであり、研究室に出てきてあれこれ「仕込む」には最適な日々となる。 今年度の残り(来年1月〜3月)の学会発表候補は5件ほどであるが、当面、発表申し込み期限が確定していて目前なのは「電子情報通信学会 MEとバイオサイバネティックス研究会(MBE) ヘルスケア・医療情報通信技術研究会(MICT) : 2021年1月28日(木)」ということで、ここへの参加を検討してみた。 まず最初にやったのは、「MICT」と「MBE」という2つの研究会についての調査である。 調べてみると、まず、どうも「MICT」はこじ付けて発表するのはかなり厳しいと判明した。 そして「MBE」についてネットで調べてみると、電子情報通信学会誌の過去の解説記事で、「 サイバネティックスは,通信工学と制御工学を融合し,生理学,機械工学,システム工学を統一的に取り扱うことを意図して作られた学問であり,第二次世界大戦の後,ノーバート・ウィーナーによって提唱されたとされている. 語源は,ギリシャ語で"舵を取る者"を意味するキベルネテスである. ノーバート・ウィーナーが提唱した初期のサイバネティックスでは,次の3つのシステムの統合が常に考慮されていた. (1)管理する機械そのものが持つシステム, (2)機械を操縦する人間の誤差修正のシステム, (3)人間を指導する集団のダイナミズムを含むシステム. これを特に生体(バイオ)に特化したものが"バイオサイバネティクス"である. すなわち,生体の制御機構を統合的アプローチで解析する学問である. 生体の優れた制御機構を解析することによって,新たな機器の開発をめざすこともできる 」 というのを発見してちょっと安堵するとともに、「MBE」は生体に絡めばなんとか潜り込めそうな第一印象となった。

そこでいつもの「泥縄」であるが、YAHOOで「バイオサイバネティクス」の検索結果から得られた5本のPDF情報 をゲットして研究会の雰囲気を調べるとともに、上のようにまさに直球の「バイオサイバネティクス」という書籍の中古本をAmazonに発注してみた。 発表の日までにMBE研究会について「既知」になっていればいい・・・という、いつもの他流試合の攻略法である。 そして、以下のような「概要」とともに、無事に発表申し込みを完了してしまった(^_^)。 中身は僕のPAW-eightと、現在まさに進行しようとしているゼミの梅田さん作品と杉山さん作品であり、こうなれば作品もしっかり完成させなければならなくなるのだ。

インタラクティブなインスタレーションや体感ゲームなどのマルチメディア・デザイン教育を行うなかで、
情動/感情や意思決定に深く関係している「内受容感覚」や、リハビリテーション・認知症予防・メンタル
ヘルスケアなどに深く関係している「バイオフィードバック」に注目して、生体情報センシングの応用を
目指した実験や試作を進めている。本発表では、(1)触覚フィードバックを持つ触覚/触感センサを活用
したウェルネス指向のインタラクティブ・マルチメディアシステム、(2)筋電センサを活用したバイオフィード
バック・インスタレーションシステム、(3)頭部の傾きをセンシングするシューティングゲーム(→コロナ禍
での肩凝り/首凝りを解消するリラクセーション)、という3件のデザイン事例を取り上げ、オープンソース
文化によって理工系でないデザイン系学生でも実際に稼働するシステムを実現している事例を紹介する。
研究会は1月28日(木)ということで、午前には「インタラクティブプロダクト演習」の14回目があったり、午後にはデザイン学部教授会とデザイン研究科教授会がある日なのだが、なんせオンラインなので、まぁなんとかなるだろう・・・という読みである。 とりあえず教授会の時間帯だけは「希望としては外して欲しい」とリクエストしてみたが、果たしてどうなるか。
インタラクティブ・メディアアートの一領域であるライヴComputer Musicにおいて約30年にわたって
作曲/公演の活動を続けてきた事例の中から、身体運動とインタラクションについて考察して報告する。
Computer Musicの世界では、音楽表現のために伝統楽器を改造したり「新楽器」を開発することも作曲の
一部であるが、音楽表現としてパフォーマー/ダンサーの身体動作をメインにした形態の公演も一つの主流
である。本発表では、使用されるセンシング技術やマッピング戦略についての解説と時間学的考察、パフォー
マンスにおけるインタラクションのデザイン手法、「ライヴ」である事の意義と重要性などについて検討し、
ヒューマンコミュニケーションとしての意味を議論したい。
そしてここで一念発起して、1月23日(土)〜1月24日(日)にある、「電子情報通信学会 ヒューマンコミュニケーション基礎研究会 (HCS)」についても、一気に上のような「概要」で発表申し込みを完了させてしまった。 この研究会は今月1日に発表したばかりなので、わずかに「土地勘」があり、またテーマとして「身体運動とインタラクション,および一般」とあったので、これはもう、久しぶりにComputer Musicネタでの発表がbest fitなのだった。 こちらも、「概要」を書きながらおよそのあらすじが見えるぐらいなので、どこかで一気に予稿も書き上げられるだろう。 なかなか充実した土曜日になったので、もしかすると次のJoyJoyは月曜でなく、明日の日曜になるかもしれない。

2020年11月9日(月)

非常勤講師を含めて「大学教員」を経験した者であれば誰でも知っているが、「個人調書」という書類を書く・・・という、(超つまらない)お仕事がある。 フリーだった時代(約30年前)には、非常勤講師として採用されるために色々な「業績」を盛り込んで印象を良くしようと努力したものだが、専任教員となってみると、毎年この時期に、この1年間の「業績」を発掘(最長では約1年前で忘却の彼方)して追記する、というのがなかなか面倒なのだ。 僕はワードを持たないので、SUAC事務局にあるワード文書をプリントしてもらった「束」を受け取って、訂正箇所と追記箇所に付箋を貼って、さらに訂正内容・追記内容をテキストファイル化してプリントしたものを添付しつつ、担当の総務室長にもメイルする、という段取りである。 しかし昨日の日曜日には、午前に「夕方から晩にJoyJoyヒトカラ」と決意して予約したことでテンションmaxとなって、一気に3時間ほどで今年の「個人調書」の改訂を完了してしまった。 去年版は全128ページだったところに10件ほど追記したので、おそらく130ページを超えるものになる。 この「束」が机上に残っていると毎日がやや憂鬱なので、ここでスッキリ終了した・・・というのは、おおいなる成果なのだ。

   

   

そして昨日のJoyJoyは5時間半で67曲(やはり昭和の曲は短い!)を完走して、もちろん途中では「Drug Time」もあった。 先々週と先週は、プリントして持参している このリスト  の2/3ページ目と4/5ページ目の曲だけを歌うという「縛り」だったので、当然ながらその続きとして6ページ目と7ページ目の曲だけを歌い、7ページ目の下段は無いので1ページ目の下段にあるアニソンを全て網羅してみた。 これで一応、 このリスト  の全ページにチェックがたくさん入ったが、それぞれのページにはまだ「抜け」があり、普段であれば歌っている好きな曲もたくさん残っている。 おそらく次回(土曜という気がする)は、この「落穂拾い」(チェック済の曲は重複せずに新たな曲だけ、という縛り)に挑戦することになりそうだ。 COVID-19(コロナ禍)によって出張も旅も行けず、学生とのアカペラも出来ず、というストレスに対抗して心身のホメオスタシスを維持するために、ヒトカラを続けるのは僕にとって唯一の生命線なのである。

明日にはゼミ杉山さんのアポがあったり、水曜日にはかわゼミの学生のアポ(カレンダーを制作するということで、OGの山村知世さんのカレンダーを見せる)もあったりするが、今日はぽっかりと時間が空いているので、ここで The Nature of Code をさらにチラッとやってみることにした。 テキスト  をザッと眺めた感じでは、以下のような章立てであり、すでに第4章のパーティクルまではザッとこの日記でも書いていたので、その続きの第5章「Physics Libraries」から眺めてみることにしよう。 サンプルスケッチ  の該当するものを走らせては考える・・・という感じとなる。 テキストの翻訳は全てDeepL翻訳に丸投げしたコピペである(^_^;)。

この章では、2 つのオープンソースの物理ライブラリ : Box2D と toxiclibs の VerletPhysics エンジンを検証します。それぞれのライブラリの長所と短所を評価し、特定のプロジェクトでこれらのライブラリを選択する理由を見ていきます 」と始まったが、僕は「Box2D」も「toxiclibs の VerletPhysics エンジン」も知らなかった。 ここはじっくりと読み進めていく必要がありそうだ。 「 Box2Dは、2006年にErin Catto氏がゲーム開発者会議のためにC++で書かれた物理学のチュートリアルから始まりました。過去5年の間に、豊富で精巧なオープンソースの物理エンジンへと進化しました。数え切れないほどのプロジェクトで使用されており、特に、受賞歴のあるパズルゲーム「Crayon Physics」や、携帯電話やタブレットで大ヒットした「Angry Birds」など、大成功を収めたゲームに使用されています 」とのことで、どうやら「物理的に動きのあるゲーム」のあのスムースさ(きちんとした物理モデルのライヴ・レンダリング)を支えているものらしい。 要するに2次元(つまりコンピュータやスマホやタブレットのスクリーンに相当)の世界(world)において、地上の重力加速度とともにきちんとした物理法則(特に「衝突」現象をサポート!!)が成立するような関係性を提供するライブラリということらしい。

ネット上の参照サイトとして、リファレンスについては Box2D site に全てがあり、特にProcessingコンパチのものは JBox2D site にあるという。 そしてこのテキストに関する全てのProcessingソースは PBox2D GitHub repository にあるという。 チラッと行ってみると膨大な世界になっていたが、さすがのオープンソース文化である(^_^)。 「 PBox2D は Box2D のすべてを処理するラッパーではないことを理解することが重要です。結局のところ、Box2Dは思慮深く整理された、よく構造化されたAPIであり、それを分解して再実装する理由はありません。しかし、Box2Dの世界を設定したり、Box2Dの形状をどこに描画するかを把握するのに役立つ小さな関数のセットがあると便利です。そして、これはPBox2Dが提供するものです。 」ということで、とりあえずはPBox2Dを試してみることになりそうだ。 また、Ricard Marxer氏が提供している Fisica というところには、「other Processing libraries that wrap Box2D for you」があり、これを見ることも「お勧め」だという。

そして、とりあえずまずは走らせてみよう・・・と PBox2D GitHub repository に行って、 box2d_processing.zip  というのをダウンロードしてきたが、いつもの「Processingの厄介なところ」にひっかかった。 上のように、解凍した「box2d_processing」を「libraries」の直下に置いてもエラーが出るのだ(^_^;)。 そこでProcessingソースを眺めて、このディレクトリ名を単に「pbox2d」とリネームしてみたりと試行錯誤を繰り返した。 そして、「pbox2d」の中の「examples」の下にあったほぼ同じProcessingサンプルがちゃんとコンパイル出来るのを参考に、以下のような3つの置換を施したところ、 このサンプルスケッチ でもコンパイルがエラー無く出来て、 テキスト  をそのまま追いかけられることが出来るようになった。

かなり「対症療法」的な対応であるが、とにかくテキストのサンプルが実際に走るというのは重要なのだ。 しかしその後、上記の「box2d_processing を pbox2d にリネーム」というのは実は不必要な間違いと判明して、「box2d_processing」を「libraries」の直下に置いて、上記の3点のProcessingソースの置換だけでエラー無く進められることを確認した。 その後はサンプルを次々に試してみたが、これはかつてゼミでやった「Unity勉強会」のデジャヴみたいなもので、要するに各種の物理モデルの綺麗な振る舞いに感嘆する・・・という感じの楽しい時間となった。

とりあえず「NOC_5_1」から「NOC_5_9」までの サンプル  を走らせてみた様子が上のProcessingソースとスクリーンショットであるが、静止画ではこの面白さは伝わらない。 まぁ、久しぶりのProcessingリハビリとしては充実の時間となった。

2020年11月10日(火)

今日はずっと予定表に書いていた「お仕事」を、朝イチで完了させた。 思えば去年2019年の6月に、仙台でのオリンピック・男子サッカーの予選と準決勝のチケットに当選して、申し込みと同時にチケット代28,160円の支払いをしていた。 そしてホテル(東横イン)の予約は「6ヶ月前から」というので、今年の1月には毎朝、その日の6ヶ月後の仙台の東横インの予約をしたが、オリンピック期間中は予約だけでなく同時に支払いということで、毎日毎日、僕のカードからはホテル代が支払われた。 そして、試合観戦後に青森に移動して「ねぶた」を観る、という全11泊12日の東北旅行の旅程が青森の高額なホテル予約/支払いとともに確定すると、行きのセントレア→仙台、帰りの青森→小牧、のフライトも全て予約/支払いまで完了して(2人分で総計は30万円位?)、今年2020年の夏は「熱いオリンピック」を満喫すると確定して、1月のうちに大学に7月下旬から8月上旬までの有給休暇の申請まで完了していた。

しかしCOVID-19のために「延期」が確定すると、有給休暇申請を取り消し、全てのホテルの予約を取り消し(手数料はコロナのために無料で、代金がカードに払い戻し)、フライトチケットをキャンセル(→カードに払い戻し)、あとはオリンピックのチケットの払い戻しだけ・・・となっていたのが、遂に今朝、手続きとして完了した(実際の支払いは12月あたり?)のである。 ANAのフライトのキャンセルもコロナのために手数料は無料、オリンピックのチケットもVISA経由だったので手数料は無料ということで、唯一、差し引きで取られたキャンセル手数料は、「青森→小牧」のフジドリームエアラインズだけ、ということで、さすがFDAはセコいのだった。 払い戻し手続きのためにお仕事パソコンに置いていた「オリンピック2020東北旅行」というディレクトリも用済みとなって、「オリンピック2020東北旅行_幻」という名前でzip化してバックアップHDDに移動した。 これで本当に「幻」となり、僕にとって「東京オリンピック」は、ほとんど記憶にない(当時6歳)1964年のものだけとなった。

そして午前中に、2ヶ月に一度のアトピーの薬を処方してもらいに徒歩5分の遠州病院に行って、お昼に研究室に帰ってくると、なんと SUACに爆破予告 が来たというメイルが学長から全学に届き、明日は終日、全学入構禁止となって、ゼミもパスとなってしまった(^_^;)。 このところ全国的に頻発している公立大への爆破予告だが、ようやくSUACも全国区として認知されたとか、「上智大と横浜国大とSUACが並んだ」とは名誉だとか、いろいろと感慨もある。 しかし、爆破予告の11月11日(水)午後3時に対して、上智大と横浜国大は全学入構禁止が当日の午後1時からであるのに対して、SUACだけは前日(今日)の19時からあとは当日ずっと終日である。 ちょっとビビり過ぎではないのか???

その後は、明日にアポのあった他ゼミ学生のアポの変更、ゼミメンバーへの中止連絡、その他あれこれあれこれのメイルが膨大に行き来したが、どうせガセで何もないと思っても、なんだかテンションが上がっている自分がいて、ちょっと面白かった(^_^;)。 4限にはゼミの杉山さんが来て、コロナにも関連するテーマの作品制作について、Max8プログラミングを一緒に進めて、さらに次に進めていこう・・・というところまで進展した。 ぽっかりと「休日」になってしまった明日はどうしたらいいのか、日頃から祝祭日も欠かさず研究室に出てくるというのに、それが明日だけはピンポイントで駄目だというのは、なかなか悩ましい日になるかもしれない。

2020年11月11日(水)

僕は自宅にパソコンを置かず(ネット環境も無い)、スマホも持たず、つまり大学の研究室にいる時や出張中(空港・駅・ホテル等のWiFi利用)を除いて、ネットアクセスどころかメイルすら届かない(読めない)、というのが、20年以上続いている生活の基本である。 そこで、休日(土日・祝日)も出張等の予定が無い限り、必ず自宅から研究室に出てくる(クルマで10分ほど)日々をずっと続けているので、COVID-19で出張がゼロとなった2020年3月からこの9ヶ月間、完全に「毎日1106研究室にいる」日々が続いてきた。 しかし、爆破予告で入構禁止という異常事態のため、今日は9ヶ月ぶりに研究室に行かず、こうして自宅の居間で、研究室から持ってきたMacBookAirと遠隔対応のために研究費でレンタルを継続しているモバイルWiFiルータ(超低速/極小データ量)でネットをアクセスして、この日記のHTMLを手元にダウンロードして改訂してサーバに上げている。 明日にはこのHTML等を研究室のお仕事Mac miniのマスターデータにコピーしないといけないので、こんな面倒なことは今日限りである。

そして、北京の王さんから今週の勉強の成果として届いていた、 Nature-of-Code  のIntroductionの章のまとめと練習問題を確認して、さらにちょっとだけ改訂したものを、上のように3つ作って、王さんに返信した。 これでなんとか、「自宅勤務」のお仕事もやったことになるだろう。 明日からはまた、平常な日々に戻っていって欲しいところだ。

その後は一昨日の続きとして、第5章の「box2d」にある残りの サンプル を全て、エラーの無いように改訂して走らせてみた様子が上のProcessingソースとスクリーンショットであるが、やはり静止画ではこの面白さは伝わらない。 これで「box2d」についてはだいぶ親しみが持てたが、もう一つの「toxiclibs」の方は、ライブラリをゲットしたようでどうも出来ていないらしいトラブルを抱えている模様なので、これは明日以降、研究室に戻ってからやってみることにした。

2020年11月12日(木)

昨日の爆破予告はもちろん何も起きずに過ぎ去り、大学からは「 静岡文化芸術大学への爆破予告に対し、警察の協力のもと、大学施設内の不審物の確認、不審者への警戒、施設周辺の警備の強化を実施するとともに、11月11日(水)終日、大学構内への立入りを禁止しておりました。その結果、爆破予告時刻において爆発等の被害はなく、その後も、大学施設内に特段の異常がないことが確認されましたので、11月12日(木)午前零時をもって立入禁止措置を解除いたします。また、11月12日(木)の授業は通常どおり実施いたします。ご理解とご協力をいただきました皆様に感謝いたします。今回の事案について、引き続き警察と連携しながら、必要な措置を講じてまいります。 」というようなメイルが一斉連絡されて一件落着である。 次回はおそらく上智大や横浜国大のように、爆破予告が15時であれば午前の講義は通常通りになるような気がする。

NIMEコミュニティからは、「The 2021 Guthman Musical Instrument Competition Finalists have been announced!」というニュースが届いた。 この Georgia Institute of Technology という大学ではずっと昔から、毎年「新しい楽器のコンテスト」というのをやっているのである。 今年のファイナリストなのかどうか、 Forms - Screen Ensemble  という作品プロジェクトと、 Cave of Sounds  という作品プロジェクトが大々的に紹介されていたが、まぁ中身はけっこうデジャヴものだった。

そして午前にはゼミの梅田さんのアポがあって、一緒に このように あれこれ検討しつつ、業者に発注する「ブツ」を検討した。 結果的にはエアー作戦でなく、「ある造形」をステッピングモータで「捻る」という作戦を進めてみることにした。 ただし、午後に気付いて梅田さんにメイルしたが、僕のアイデアスケッチには物理的な矛盾があった(^_^;)ので、まだまだ検討が必要になりそうである。 ステッピングモータの部分は、かつてリュジュンヒー君(現在は「チームラボ」)が制作した作品の時に作ったメモと秋月電子から購入していたモーターが出てきたので、ぼちぼち先行して作っていくことになる。

2020年11月14日(土)

昨日の金曜日の4-5限の メディア数理造形演習 は、ちょっと個人的には感慨あふれるものだった。 今年のこの科目の学生は、前期の遠隔の サウンドデザイン をしっかりと身に付けて、さらにかなり多くが僕の推薦を受けて、並行して後期の「インタラクティブプロダクト演習」も受けている。 つまり、COVID-19の遠隔というハンデを感じさせない精鋭軍団なのだが、その3チームの制作プロジェクトがとても素晴らしいスタートを切っているのだ。 過去の学生たちも素晴らしかったが、とりわけ今年の雰囲気は、同様に少人数ながら、とても期待させてくれる。 支援するこちらも頑張らないといけないのだ。

そして今日 (上の「モルディブの水上コテージに1年間泊まり放題315万円で」という記事に懐かしいモルディブを思い出した) は、夕方〜晩にいつものJoyJoyヒトカラを予約したテンションで、ゼミの梅田さんの卒制についてあれこれ考える日となった。 およその構想は立っていて、必要な部品も発注したり、一部の小物は面倒なので個人でAmazonに発注したのだが、全体としてうまく進むかどうか、ここから梅田さんと一緒に「メカ造形」に挑戦となるのである。 うまく行けば、なかなか面白い作品に仕上がるという「予感」に導かれつつ、まだまだ考えていくことになる。 さらにフト思いついて、11月2日にあった 音楽情報科学研究会での発表ライブ のYouTube動画のリンクを正しいものに戻して、視聴できるようにしてみた。 後半、脳波信号をライヴ表示しつつ脳波サウンドを鳴らしつつ「これから心拍を低下させます」とやって、実際に出来てウケたものである。 自分で見返したのは初めてだったが、なるほどここまで心拍がサッと下がれば、まぁウケるのだと納得した。

その後、かつてチーム「硬派」のシステムで使っていた「Arduino〜RGBリボンLED」のボードがちょっと異常動作をしていたのを思い出して、Firmataでなく、直接Max8からシリアルで出してArduinoで受けてPWMする・・・という、いわば「Arduino2Max」の逆の「Max2Arduino」というのを作ってみた。 異常動作の原因は、一緒に貸し出していた「12V2A」のスイッチングACアダプタが寿命を迎えたのか、新しいものに交換したらトラブルは消えて、さらに「Max2Arduino」での輝度制御も、上のようにMax8からのシリアルをArduinoからエコーバックしつつサクサク動くことを確認できた。 これは今後に使えるし、さっそく メディア数理造形演習 の3チームのうちの1つでも活用できそうである。(^_^)

2020年11月15日(日)

SUACから徒歩数分のところにある遠州病院でCOVID-19の院内感染・・・というニュースには驚いたが、毎年利用している遠州病院の人間ドックも、2ヶ月ごとぐらいに通院している皮膚科(アトピー薬の処方)も、ちょうど終わっていたので、ぎりぎり「すれ違い」ということで安堵した。 昨日のJoyJoyヒトカラは、当初5時間半で予約していたが、ちょっと早めに着いたら部屋を空けて(換気)くれていたので6時間に変更して、漢方薬の助けを借りつつなんと全75曲を完走した。 それも、このところ3回続けていた このリスト  の2/3ページ、4/5ページ、6/7/1ページ、という「かぶり無し」で歌ってきた、その残りの「落穂拾い」として歌ったので、このシリーズは4回で計260曲の「かぶり無し」となったが、まだ◎が5個でも歌いきれなかった曲とか、ハモり担当ということで避けた曲が残っている。 300とは言わないが、そこそこ自信のある曲が280曲程度ある・・・という感じだろうか。 この日はその余韻とともに、Amazonから届いた「バイオサイバネティクス」をじっくり読むという一日となった。

2020年11月16日(月)

「バイオサイバネティクス」はまだ読了していないが、なかなか面白い教科書であり、最後まで一気に行きそうである。 今日は2限にかわゼミ学生のアポがあって、OGの山村知世さんのカレンダー作品を見せたり、3限にゼミ・古谷さんのアポがあって、 このように 過去に製作したシステムが新しい作品の中で活躍する(蘇る)という可能性が拓けてきた。

そしてその合間の午前から午後にかけて、明日に迫った 基礎演習E の担当回の教材ページの準備をしたが、なんせ前期に遠隔でみっちりとやっていたので、そのコンテンツに完全に乗っかって、過去にない重厚な内容が完成した。 遠隔でも満腹なのに、これを対面でやったら、もう学生は十分にコンピュータ・エレクトロニクスの世界の奥深さを堪能できるだろう。

ネットからのニュースとしては、 こんなページ のkickstarterの情報が届いた。 マウスを持つ手の筋電をセンシングして、普通にマウスクリックする(150msec)よりも早く(80msec)クリック信号を出す・・・というもので、他人より速くクリックしたいゲームマニアには垂涎のものなのだという(^_^;)。 デモ写真(スライドショー)は これ であり、 解説動画は これ である。 「筋電情報はセンサで手の動きを検出するよりも早いのが最大のメリット」というのは、もう僕は10年以上も前からあちこちで力説しているが、それを傍証する製品の登場ということで、別にここに投資して欲しいとは思わないものの、なんだか嬉しい。

2020年11月17日(火)

ようやく 「バイオサイバネティクス」 を読み終えたが、いやいや参った、この本の最後あたりは凄いものだった。 改めて目次を並べると以下のようになっていて、おそらくは3人の著者の得意な分野に偏重しているのだが、大部分の話は「耳タコ」に近いデジャヴだったし、もっとも期待していた最後の「ブレイン・マシン・インタフェース」の話もかなり古くてショボく、いちばん最後の「バイオフィードバック」のところを期待したのに、用語の紹介だけ(ほぼ1ページ)だった(^_^;)。 制御工学と医学生理学との架橋を目的としているので仕方ないが、このいちばん最後の「バイオフィードバック」を起点としてそこからあれこれ考えている身にとっては、まぁ一読すればもうオシマイという本であり、Amazon購入は新刊でなく中古で良かった。
1.バイオサイバネティクス概論
	1.1 バイオサイバネティクスとは
	1.2 制御工学の復習
		1.2.1 制御とは何か
		1.2.2 プロセスの数学モデル
		1.2.3 ラプラス変換と伝達関数
		1.2.4 ブロック線図と等価変換
		1.2.5 プロセスの安定性
		1.2.6 プロセスの時間応答
2.生物に見られるシステムとそのモデル
	2.1 概説
	2.2 神経細胞
		2.2.1 神経系とは
		2.2.2 神経細胞と活動電位
		2.2.3 活動電位が生じる仕組み
	2.3 眼球運動系
		2.3.1 視覚情報の取込みと眼球運動
		2.3.2 眼球運動の必要性
		2.3.3 代表的な眼球運動
		2.3.4 眼球運動の構造
		2.3.5 眼球運動モデル
	2.4 聴覚系
		2.4.1 聴覚系の情報処理
		2.4.2 聴覚末梢系の構造と仕組み
		2.4.3 聴覚中枢系の構造と仕組み
		2.4.4 聴覚野の構造と仕組み
		2.4.5 聴覚モデル
		2.4.6 聴覚モデルの応用
	2.5 神経筋骨格系
		2.5.1 骨
		2.5.2 筋
		2.5.3 神経
		2.5.4 脊髄ネットワークの安定性
	2.6 循環器系
		2.6.1 心臓・循環器系の概要
		2.6.2 心拍変動および心拍出量変動のメカニズム
		2.6.3 心臓の興奮
		2.6.4 心拍制御のメカニズム
3.生体情報処理
	3.1 生体電気信号の特徴
	3.2 生体信号の計測
		3.2.1 心電図
		3.2.2 脳波
		3.2.3 筋電図
		3.2.4 眼電図
		3.2.5 近赤外分光法
		3.2.6 インピーダンストモグラフィー
		3.2.7 インピーダンスニューモグラフィー
		3.2.8 血中酸素飽和度計測
		3.2.9 呼吸機能の計測
		3.2.10 超音波計測
		3.2.11 発汗量の計測
		3.2.12 放射線による計測
	3.3 時間領域における情報処理
		3.3.1 心電図
		3.3.2 脳波
		3.3.3 針筋電図
		3.3.4 表面筋電図
	3.4 周波数領域における情報処理
		3.4.1 心電図
		3.4.2 脳波
		3.4.3 針筋電図
		3.4.4 表面筋電図
		3.4.5 アナログフィルタ
		3.4.6 ディジタルフィルタ
4.バイオサイバネティクスの応用技術
	4.1 人工内耳
		4.1.1 難聴と人工内耳
		4.1.2 難聴の仕組みと人工内耳適応
		4.1.3 人工内耳
		4.1.4 人工内耳手術後のリハビリテーション
		4.1.5 人工内耳の副作用
		4.1.6 人工内耳の展望
	4.2 人工視覚
		4.2.1 中途失明者と人工視覚
		4.2.2 人工視覚の種類とその特徴
		4.2.3 人工視覚の現状と今後の展開
	4.3 電動義肢・電動装具
		4.3.1 義肢
		4.3.2 装具
		4.3.3 機能的電気刺激
	4.4 心臓ペースメーカ
	4.5 ブレイン・マシン・インタフェース
	4.6 バイオフィードバック
コラム
	風邪と汗
	色の感受性
	オシレーションの不思議
	生物の群れモデル
	活動電位発生パターンとカオス
	透明人間と視覚
	環境にあわせて遺伝子発現を制御
	AED
今日は4-5限に 基礎演習E の担当回があるが、すでにWeb教材とか持参するブツなども完備している。 午後に献血が来たら行くとして、午前から午後までの時間は、残された学会発表の応募の検討ということになった。 今期(〜2021年3月まで)の候補5件のうち、既に「電子情報通信学会 ヒューマンコミュニケーション基礎研究会(HCS) 」・「電子情報通信学会 MEとバイオサイバネティックス研究会(MBE)・ヘルスケア/医療情報通信技術研究会(MICT)」の2件は応募済みなので、まだまだ募集が来ない(ただし運営委員なので「中の人」の状態を知っていて乗り遅れることはない)「情報処理学会 音楽情報科学研究会」はさておいて、残りは既に発表募集している2件、「電子情報通信学会 パターン認識・メディア理解研究会(PRMU) + 情報処理学会 コンピュータビジョンとイメージメディア研究会(IPSJ-CVIM)」・「情報処理学会全国大会」ということになる。

2020年11月18日(水)

今日は、先週スキップさせられたために2週間ぶりのゼミの日である。 昨日はPRMU研究会の幹事に問い合わせをして、電子情報通信学会のWebに載っていた「発表募集中」・「締切り未定」・「会場は筑波大学」という情報が全てガセだった(^_^;)ことが判明、12月に募集が出てくることが分かった。 そこでは、 メディア数理造形演習 のチーム「小さい手の持ち主」のシステムを実現するために必要なアルゴリズムを発表する・・・という計画を立てて、来週にはこのチームとのミーティングの予定も立った。

そして2限には、本ゼミ中間発表で欠席の持田さん(報告は全員で共有)を除いて全員が揃って、それぞれの進捗報告などが このように 順調に進んだ。 ちなみに(リンク切れするが)全63分の記録動画は これ である。 そして今週は木金土と午後に予定があるために、久しぶりのゼミで上がったテンションを抱えつつJoyJoyを予約して早退(実際は終日の「振休」手続き)することにした。

2020年11月19日(木)

昨日のJoyJoyヒトカラは、新しくプリントした このリスト  とともに6時間、飲みっぱなし歌いっぱなしで59曲(長い"Stairway to Heaven"があると少し曲数が減る)となったが、我ながらタフになったものだ(^_^;)。 さらに一昨日、眼科から電話があって金曜日は急遽休診になったとのことで今日に予約を移動していたので今日は朝イチで眼科通院、そして午後の学生委員会までの時間を使って、 メディア数理造形演習 の話題として「Processing」と「SuperCollider」を一気に紹介する・・・というヘヴィーな構想を準備した。 これに興味を持ってひっかかってくる学生が1人でもいたら素晴らしいのだが、まぁ過剰に期待せず、淡々と紹介していこう。
Processingは、ちょうど北京からリモートの王さんがNOCをやっているのでタイムリーである。 SuperColliderの方は、研究室の3台のMacBookAirに入れていなかったことが判明したので、最新の(OS10.11対応)SC3.11.2をダウンロードして動作確認した。 さらに久しぶりに、SuperCollider作品集 SC140 もゲットしてみた。 お仕事Mac miniにはSC3.9.3が入っていたものの、何故か新たにゲットしたSC3.11.2を走らせるとSuperColliderの画面が真っ黒になる・・・という謎の現象に遭遇したが、とりあえずSC3.9.3とSC3.11.2の両方を置いておくことにした。
3チームから届いた「進捗報告」もそれぞれなかなかに充実していて、さすが、前期のリモートでの「サウンドデザイン」・「基礎演習E」を乗り越えて、敢えてこの メディア数理造形演習 を履修してくれている精鋭軍団である。 負けずに気合いをこめて支援していこう。

2020年11月20日(金)

今日は午後に某会議、そして4-5限には、気合いを入れて メディア数理造形演習 に向かう日である。 朝イチで届いていたニュースは、「パイオニア、USBに挿すだけでパソコンの音質が上がるモジュール。10万円」という製品だった。 5ちゃんねるの反応は 「プラシーボ効果」・「技術があっても倒れる理由がここに」・「誰が買うねん」・「オカルトグッズ」・「オーディオイヤホン厨狂喜」・「これは怪しいぜ」・「燃費が良くなるシールみたいなものか」・「パイオニアがこんなものに手を出すなんて、俺は悲しいよ」・「落ちぶれたもんだなぁ」・「発電所によって流れてくる電気が違うから音が変わるんだよね」・「ピュア界では常識」・「すっかりオカルトメーカー」・「金の余ってる年寄りがカスタマー」・「お布施だぞ。信心が試されてる」・「先進的を名乗るなら直接脳に音を飛ばすくらいやってくれ」・「詐欺商品を出すまでに落ちぶれたか」・「社会に迷惑かけるなよ」 などと盛り上がっていた。

そして、天下のパイオニアがこれなら、天下のソニーはこれだ、というのが「"高音質設計"のソニー製microSDカードが発売、64GBで実売2万円」という、これまた非常識なプラシーボ製品の記事のリンクもあり、最後には定番の「電力会社の違いによる音質の違い」といういつものコピペがあった。 ピュアオーディオを極めるのであれば、ここまで「信心」しないといけないのである。 かつてパイオニアからの受託研究をした時に、川越事業所に何度も行ったが、遂にこんな製品を出すところまで来てしまったのか・・・となかなか感慨深い。 かつて技術士として企業のコンサルティングに関わってきて以来、三◯造船、積◯樹脂、島◯製作所、ヤ◯ハ、豊◯中研、そしてパ◯オニアと、大企業だからこそ「大企業病」が避けられないという実感にまた新しい1ページが加わった。

そして4-5限の メディア数理造形演習 では、冒頭に「Processingの話」・「SuperColliderの話」をブチかまして、その後は3チームそれぞれの作業時間とした。 僕は南棟4階のマルチメディア室と、北棟11階の1106研究室とを3往復か4往復したが、このところの運動不足に対してそこそこの貢献をしてくれた。 その結果、新たに業者にAmazonのブツを発注したり、各チームには1106研究室の機材とかマルチメディア室ロッカーの機材とか、自宅から持ってきた「ツボ足踏み」とか、いろいろなものが提供された。 果たしてどんな作品に成長していくか、本当に楽しみだ。 明日は推薦入試、またフェイスシールドでの面接であるが、気付いてみればこのHTMLは226kBを超えていた。 来週からはいよいよあれこれ製作していく感じなので、この日記はここでオシマイとして、続きは Sketching日記(8) に引き継ぐことにしよう。

→ Sketching日記(8)

「日記」シリーズ の記録