(^_^) MIDI日曜大工日記 (^_^)

1999年3月 長嶋洋一


先週、横浜で、笙奏者の東野珠実さんと、IRCAMから 一時帰国していた後藤スグルさんと再会しました。 後藤さんはIRCAMで作曲・パフォーマンス・研究にと 活躍している人です。後藤さんの自己紹介資料には、

こんなふうにセンサを着こなしたり、バイオリン型の こんなセンサも「楽器」として使っている姿があります。

このようなセンサとMIDIシステムをリンクさせるための 特製のインターフェース装置の開発を依頼されたことで、 後藤さんと知り合いになったのです。(^_^)

さて、その横浜でのことですが、後藤さんから、新しい リクエストがありました。6月からの新作でのヨーロッパ ツアーに使うのに、「腕時計のようなMIDIスイッチ」が 欲しい、というのです。MIDIバイオリンを弾きながら、 リアルタイム作曲系・音源系を制御する、という意図の ようです。僕は思わず、「スーパージェッター」の、 あの「流星号、応答せよ」の腕時計型リモコンを 思い出してしまいました。(ふ、古い...(^_^;))

そして翌日、さっそく秋葉原で、部品を捜して歩きました。 この作業が、まずは楽しいのです。とりあえず、お約束の 「秋月電子通商」に行ってみると、

こんな小さなキーホルダー型の電卓がありました。300円。 これは結構、いけそうです。帰宅してバラしてみると、こんな 感じでした。スイッチがちょっと多くて、配線が増えてしまう のがネックになりそうですが、いいセン行っています。(^_^)

また、御徒町に近いバッタ屋では、電卓のついた時計、 というモロにそのものがありました。1500円。(^_^;) バラしてみると、これもスイッチのスキャンマトリクス から線を取り出すのは容易だと判ったのですが、これ もMIDI送りの本体へのケーブルがちょっと増えるので、 ペンディングというところ。(^_^;)

結局、ガード下のいつものパーツ屋さんで、こんな小型 テンキーを入手しました。これなら、別に浜松の「マルツ 電波」でも、760円で売っているのですが。(^_^;)

また、腕に巻くベルトの部分については、自転車に載って ズボンの裾をチェーンに巻き込まれないための、マジック テープのこんなバンドを発見して解決しました。これを ハサミで切って短くして、アロンアルファでテンキーの裏に 張り付けただけなのですが(^_^;)、予想外にうまく 行きました。こういう事もたまにはあります。

さて、ここは浜松の自宅の自室、ASLそのものです。(^_^;) いつも、こんな感じで、作曲もシステム製作もソフト開発も やっています。作曲にKymaを使う時には、さらにその コントロール用のパソコンも加わり、マウスが4個並びます。 そういう、幅1メートルぐらいのマウスパッドが欲しいの ですが、どこにもありません。誰か知りませんか。(^_^;)

システム開発の時に活躍するのが、この正面の部品棚です。 色々と面白いものが入っていますが、ちょっと省略。

せっかくなので、本邦初公開の、机の引き出しの中身。 まず右側の最上段ですが、これはまぁ事務用品ということ で、とっても「まとも」でしょう。(^_^)

これは、中央の大きな引き出し。なんと部品と工具で 埋まっています。これはちょっと珍しいかも。(^_^;)

これは右側中段の引き出し。商売道具(^_^;)のハンダごて、 そしてあらゆるケース加工に役立つ電動ドリルなど。軍手、 各種接着剤、そして必殺業務用両面テープ、シャーシパンチ、 リーマなど、使える道具が満載です。(^_^)

これは右側下段の引き出し。なんだか判らないでしょうが、 ここには秋月電子や共立電子のキットが少なくとも20種類は 眠っていて、何かのネタでの登場を待っています。(^_^;)

そして、部品が揃ったところでどうするか、というのは、 お約束のこの本のような手順で進めていきます。まだこの 本を入手していない人は、書店に急ぎましょう。(^_^)

そして、例によって愛想のない、これが今回製作した 「後藤スペシャル・MIDIコントローラ」の回路図です。 ここからスタートして、日曜日でどこまで行くでしょう。

こんなふうにハンダ付けの道具を広げて、 あとは楽しい楽しいハンダ付け。(^_^)

ただし、ハンダ付け作業中の写真はありません。 こういう記録を作ろう、と思いついたのは、既に製作 が終わったあとだったので、御了承下さい。ハンダ付け の高等テクも御披露したかったのですが。(^_^;)

これが、ベルトのついたテンキーに、ケーブルの付いた ところ。ケーブルは8芯で、単にスイッチマトリクスの3本 をAKI-80の出力ポートから送り、マトリクスの4本のデータ ラインをAKI-80の別の入力ポートで監視するだけ、という 単純なものです。このマトリクスの部分にICを1個とか2個 とか置ければ、ケーブルの線を減らすこともできるのです が、今回はラクをしてこのあたりは馬鹿正直にやりました。

これが、基板の裏側と電池ボックス。実際には、厚みのある 両面テープで電池ボックスを貼り付けたのが敗因で(^_^;)、 ちょっとだけ、フタが閉まりにくいです。後藤さん、使う 時にはテープで巻いて下さい。ごめんなさい。(^_^;) スッキリしているように見えますが、このようにコネクタで バンドと本体とを切り離せるようにした事で、この配線の 本数が飛躍的に増えました。今回の配線は、このコネクタ 回りがほとんどと言っても過言ではありません。

ハンダ付けが終わったのは、午後になってからです。 次の作業は、カードマイコンAKI-80のプログラミング。 いつものように、まったくフローチャートも何もなく、 いきなりエディタを開いてアセンブラのCPUソフトを 書き、自作のROMエミュレータに転送して「せーの」 でリセットして走らせてチェック、という体制です。 机の上からハンダごてが去って、もう1台のDynaBook が積み重なって(^_^;)、開発環境マシンとして君臨 します。MIDIものですから、当然ながら、PowerBook はMAXを走らせてチェックする体制となっています。

これが、今回のチェック用MAXパッチ。MIDIの仕様は、 後藤さんもMAXで受けていかようにもなる、という事で、 MIDIの1チャンネルで、一方のテンキーが左上から順に、 MIDIプログラムチェンジの1-12番、もう一方は同じチャンネル で、MIDIプログラムチェンジの13-24番というように しました。このパッチはこのプログラムチェンジを受けて、 内蔵QuickTime音源で鳴らすだけの簡単なものです。 でも、両手の腕時計型バンドで「演奏」する、というのも 結構、いいカンジでした。これまで簡単すぎて作ろうとも 思わなかったのですが、これは僕も自分で欲しくなりました。

これが、愛用のAKI-80用ROMエミュレータ。この回路図 は「Java & AKI-80」という本に載っています。これを 実際に製作して遊んでいる、という人も何人もいます。

これが、開発中のパソコン画面。左側の秀丸エディタで ソースをエディットし、右側のDOS窓の中で、バッチを 走らせて、アセンブル、リンク、ROMエミュレータへの 転送、AKI-80のリセットを行います。

ちなみに、このソースプログラムはこんな感じです。

;-----------------------------------------------------------------------
;	Wrist SW for Suguru Goto : April 1998
;-----------------------------------------------------------------------

;##### RAM Map #####
	dseg
	org	0000h
tx_fifo		ds	256
tx_top		ds	1
tx_end		ds	1
counter		ds	4
led		ds	1
mode		ds	1
sw		ds	1
sw_old		ds	6
scan		ds	1
offset		ds	1
num		ds	1
line		ds	1

;##### I/O Map #####
	cseg
sio_a		equ	0018h
sio_b		equ	001ah
pio_a		equ	001ch
pio_b		equ	001eh

;##### MACRO #####
io_set	macro	@1,@2
	ld	a,@2
	out	(@1+1),a
	endm
io_put	macro	@1,@2
	ld	a,@2
	out	(@1+0),a
	endm

;##### RESET #####
	org	0000h
	ld      sp,09fffh
	di
	jp      main

;##### INT / NMI #####
	org     0066h
	retn

;##### Main #####
main:
	ld      hl,08000h
_ram_clear_loop:
	ld	a,0
	ld      (hl),a
	inc     hl
	ld	a,h
	cp      0ah
	jr	nz,_ram_clear_loop
	io_set	pio_a,0cfh		; Mode 3
	io_set	pio_a,00000000b		; 0:Out / 1:In
	io_set	pio_a,007h		; Interrupt Disable
	io_set	pio_b,0cfh		; Mode 3
	io_set	pio_b,11111111b		; 0:Out / 1:In
	io_set	pio_b,007h		; Interrupt Disable
	io_set	sio_b,00011000b		; Channel Reset B
	io_set	sio_b,00000101b		; Resister Point = 5
	io_set	sio_b,01100000b		; LED off (MSB)
	io_set	sio_a,00011000b		; Channel Reset A
	io_set	sio_a,00000100b		; Resister Point = 4
	io_set	sio_a,11000100b		; Mode
	io_set	sio_a,00000001b		; Resister Point = 1
	io_set	sio_a,00000000b		; Interrupt Mode
	io_set	sio_a,00000101b		; Resister Point = 5
	io_set	sio_a,01101000b		; Transmit Start
loop:
	call	led_check
	call	tx_data_check
	jr	loop

;##### Subroutines #####
tx_data_check:
	ld	a,(tx_end)
	ld	b,a
	ld	a,(tx_top)
	cp	b
	ret	z
	io_set	sio_a,00000000b		; Resister Point = 0
	in	a,(sio_a+1)
	bit	2,a
	ret	z
	ld	hl,tx_fifo
	ld	l,b
	ld	a,(hl)
	out	(sio_a),a
	ld	a,b
	inc	a
	ld	(tx_end),a
	ret
tx_data_set:
	ld	hl,tx_fifo
	ld	a,(tx_top)
	ld	l,a
	inc	a
	ld	(tx_top),a
	ld	(hl),b
	ret
led_check:
	ld	a,(counter+0)
	inc	a
	ld	(counter+0),a
	cp	0
	ret	z
	ld	a,(counter+1)
	inc	a
	ld	(counter+1),a
	cp	30		; <--- SW scan rate
	ret	nz
	xor	a
	ld	(counter+1),a
	call	sw_scan
	ld	a,(counter+2)
	inc	a
	ld	(counter+2),a
	cp	5
	jr	z,_led_on
	cp	70
	jr	z,_led_off
	cp	200
	jr	z,_led_res
	ret
led_out:
	ld	a,(led)
	out	(pio_a+0),a
	ret
_led_on:
	ld	a,(led)
	set	7,a
	ld	(led),a
	call	led_out
	ret
_led_off:
	ld	a,(led)
	res	7,a
	ld	(led),a
	call	led_out
	ret
_led_res:
	xor	a
	ld	(counter+2),a
	ret

sw_scan:
	ld	a,(mode)
	inc	a
	ld	(mode),a
	cp	12
	jr	nz,_scan_go
	xor	a
	ld	(mode),a
_scan_go:
	cp	0
	jp	z,_scan_0
	cp	1
	jp	z,_scan_1
	cp	2
	jp	z,_scan_2
	cp	3
	jp	z,_scan_3
	cp	4
	jp	z,_scan_4
	cp	5
	jp	z,_scan_5
	cp	6
	jp	z,_scan_6
	cp	7
	jp	z,_scan_7
	cp	8
	jp	z,_scan_8
	cp	9
	jp	z,_scan_9
	cp	10
	jp	z,_scan_10
	cp	11
	jp	z,_scan_11
_scan_0:
	ld	a,(led)
	and	10000000b
	or	00000001b
	ld	(led),a
	call	led_out
	ret
_scan_2:
	ld	a,(led)
	and	10000000b
	or	00000010b
	ld	(led),a
	call	led_out
	ret
_scan_4:
	ld	a,(led)
	and	10000000b
	or	00000100b
	ld	(led),a
	call	led_out
	ret
_scan_6:
	ld	a,(led)
	and	10000000b
	or	00001000b
	ld	(led),a
	call	led_out
	ret
_scan_8:
	ld	a,(led)
	and	10000000b
	or	00010000b
	ld	(led),a
	call	led_out
	ret
_scan_10:
	ld	a,(led)
	and	10000000b
	or	00100000b
	ld	(led),a
	call	led_out
	ret
_scan_1:
	in	a,(pio_b+0)
	and	00001111b
	ld	(sw),a
	ld	a,0
	ld	(scan),a
	xor	a
	ld	(offset),a
	ld	a,0
	ld	(line),a
	call	sw_check
	ret
_scan_3:
	in	a,(pio_b+0)
	and	00001111b
	ld	(sw),a
	ld	a,1
	ld	(scan),a
	xor	a
	ld	(offset),a
	ld	a,1
	ld	(line),a
	call	sw_check
	ret
_scan_5:
	in	a,(pio_b+0)
	and	00001111b
	ld	(sw),a
	ld	a,2
	ld	(scan),a
	xor	a
	ld	(offset),a
	ld	a,2
	ld	(line),a
	call	sw_check
	ret
_scan_7:
	in	a,(pio_b+0)
	and	00001111b
	ld	(sw),a
	ld	a,3
	ld	(scan),a
	ld	a,12
	ld	(offset),a
	ld	a,0
	ld	(line),a
	call	sw_check
	ret
_scan_9:
	in	a,(pio_b+0)
	and	00001111b
	ld	(sw),a
	ld	a,4
	ld	(scan),a
	ld	a,12
	ld	(offset),a
	ld	a,1
	ld	(line),a
	call	sw_check
	ret
_scan_11:
	in	a,(pio_b+0)
	and	00001111b
	ld	(sw),a
	ld	a,5
	ld	(scan),a
	ld	a,12
	ld	(offset),a
	ld	a,2
	ld	(line),a
	call	sw_check
	ret
sw_check:
	ld	hl,sw_old
	ld	b,0
	ld	a,(scan)
	ld	c,a
	add	hl,bc
	ld	a,(hl)		; old status
	ld	d,a
	ld	a,(sw)		; now status
	cp	d
	ret	z
	ld	(hl),a
	xor	d
	ld	e,a		; [E] event bit
	ld	a,(sw)
	and	e
	ld	c,a		; [C] ON event
	bit	0,c
	jr	z,_sw_1
	ld	a,0
	ld	(num),a
	call	midi_send
_sw_1:
	bit	1,c
	jr	z,_sw_2
	ld	a,3
	ld	(num),a
	call	midi_send
_sw_2:
	bit	2,c
	jr	z,_sw_3
	ld	a,6
	ld	(num),a
	call	midi_send
_sw_3:
	bit	3,c
	jr	z,_sw_4
	ld	a,9
	ld	(num),a
	call	midi_send
_sw_4:
	ret
midi_send:
	ld	b,0c0h
	call	tx_data_set
	ld	a,(offset)
	ld	b,a
	ld	a,(num)
	add	a,b
	ld	b,a
	ld	a,(line)
	add	a,b
	ld	b,a
	call	tx_data_set
	ret

	end
動作が確認できてソフトが完成したら、EPROMへの書き込み は最近では、もっぱらこの秋月電子のROMライタキットで 行っています。これは超便利で、これだけで何も要りません。

これが秋月のROMライタ転送ソフト。今回のCPUソフトも、 例によってとっっても小さく、あっという間にできました。 CPUソフトの開発期間は、約30分というところです。(^_^)

...ということで、完成したEPROMをAKI-80のROM ソケットに入れて、これで完成。なんと一日でできて しまいました。(^_^)

AKI-80の基板には、外付けとしてICが3個だけです。一応、 スキャンラインのバッファとして245を入れてみました。 電池は単3アルカリを4本。

電源スイッチは間違って切れない ように、一旦引っ張ってから倒すタイプのものです。これを 入れて、LEDが点滅していれば、マイコンは正常に動作して いる、ということです。(^_^)

これが全体の外観です。なかなかスッキリといきました。 うーーーむ、充実の日曜大工だなぁ。(^_^)

なお、この同じシステムをまた別に作って欲しい、という リクエストについてですが、僕は最初のマシンを作るのは 燃えるのですが(^_^;)、以前に作ったものと同じものを また作って、というリクエストはとっっても苦痛ですので、 ちゃんとしたギャラをいただかないと、ちょっとソノ気になり にくいです。このあたり、御了解いただきたいと思います。 潤沢な財力のある方の御依頼をお待ちしています。(^_^;)