(^_^) 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が点滅していれば、マイコンは正常に動作して
いる、ということです。(^_^)
これが全体の外観です。なかなかスッキリといきました。
うーーーむ、充実の日曜大工だなぁ。(^_^)
なお、この同じシステムをまた別に作って欲しい、という
リクエストについてですが、僕は最初のマシンを作るのは
燃えるのですが(^_^;)、以前に作ったものと同じものを
また作って、というリクエストはとっっても苦痛ですので、
ちゃんとしたギャラをいただかないと、ちょっとソノ気になり
にくいです。このあたり、御了解いただきたいと思います。
潤沢な財力のある方の御依頼をお待ちしています。(^_^;)
|