"MIBURI-Sensor"の製作

長嶋洋一


RE:MIBURIセンサー 96/08/25 09:58


◆こちらには、MIBURIユーザーが大勢いらっしゃるということなので、いろいろ
◆教えてください。

うーーん、興味はあっても実際にあのクソ高いマシンを持っているという人は
多くないと思います(^_^;)が、まぁ色々と注文を盛り上げてもっと「使える」
新しいバージョンの出現に期待していきましょう。(^_^)

◆このあいだ、VL70-mをMIBURIのMIDI OUT を使って、鳴らしてみました。私自信は
◆MIBURIユーザーではなく、MIBURI奏者に演奏してもらいました。

「MIBURI奏者」ですか。(^_^;)(^_^;)
すると、例の、
  「ド」両腕だらり
  「レ」左腕だらり、右腕90度曲げ
  「ミ」左腕だらり、右腕180度曲げ、または、右腕だらり、左腕90度曲げ
  「ファ」左腕90度曲げ、右腕90度曲げ
  「ソ」左腕90度曲げ、右腕180度曲げ、または、右腕だらり、左腕180度曲げ
  「ラ」左腕180度曲げ、右腕90度曲げ
  「シ」左腕180度曲げ、右腕180度曲げ
というのを駆使して、色々なメロディーを「弾ける」という技を修得した人
なのでしょうね。僕はあれを見ていると、なんだか悲しくなってきます。
操り人形みたいで、これぞプロのMIBURI奏者、というのを見たことがない
からでしょうか。(^_^;)

◆ただ、肝心のノート発音方法は、私にはなじめない方法です。(私は、VL70-mを
◆鍵盤かWX11で鳴らしています。)

そうですね。もともと、MIBURIはダイアトニックでもクロマティックでも、
とにかく機械的に離散化された「音階」のような情報を演奏するのには
向いていない、というか大切なメリットを殺しているように思います。
この意味では、MIDIのノートナンバの枠組みから外して、たとえばベンドの
レンジを5-6オクターブにできる音源で、単一ノートナンバで全てのピッチを
センサからのベンドのみで制御できた方がいいと思います。

◆その時に思ったのですが、MIBURIのセンサーをWX11(ヤマハのMIDI 笛)
◆吹奏時にも併用したら、もっとVL70-mを思うように(へんてこりんに)鳴らせる
◆んじゃないかと。

そうですね。僕もこれは賛成です。(^_^)
ただし、ヘンにMIDIの制約の枠組みがあるので、ちょっと限界はあると思いますが。

◆それで質問なんですが、MIBURIの肩のセンサーだけ独立して使うなんて事は可能
◆なのでしょうか?。もちろん改造して、ということになると思いますが。

まったく、可能です。というより、それが仕様です。(^_^)
僕が2台作ったセンサは、MIBURIの、左右の手首、肘、肩の合計6個のセンサから
の生情報を全て別個のMIDIチャンネルにアサインしてそのまま出力しています。
今のところ、チャンネルプレッシャーとしています。さらに1個のMIDI入力も
持っていて、この情報も6個のセンサとマージして1本でMIDI出力します。
実際にはセンサ情報があまり多量にならないように、ちょっとだけヒステリシス
特性を持たせて、ある程度の値で変化した時にのみ出力します。

ですから、
このセンサ(単3電池4本を入れた全体でタバコ箱を2つ重ねたほど)
をポケットに入れて、ウインドシンセの出力をMIDIマージ入力に差し込むと、
ウインドシンセを吹きながら肩や肘を(もちろん場合によっては空いている手首
をヒラヒラと(^_^))動かして、これによって各種のコントロールを付加すると
いうのは、基本的に楽勝です。処理のMAXパッチも簡単ですね。(^_^)

MIBURIセンサの改造と利用には、基本的にはいくつかの壁があります。ここでは、
その突破について検討してみましょう。

●センサのコードを切断してハンダ付けする必要がある
 これがある意味で最大の関門です。MIBURIの特性上、度重なる繰り返しストレス
にも断線してはいけない、というのが使命のためか、きわめて特殊な電線を使用
したコードとなっています。切断してニッパーで被覆を剥いて普通の延長ケーブル
のコードにハンダ付けしてみよう、とすると判ります。(^_^;)
まず、個々のコード内の芯としてポリエチレン系の細い糸が入っていて、これが
とても切断しにくく、残っているとハンダ付けを著しく阻害します。
さらに、電線部分も表面になにやらコーティングしてあり、なかなかハンダが
乗りません。ハンダ付けではベテランである僕もも、かなり苦労しています。
慣れていない人では、ついたように見えてもついていない、あるいは
ちょっとして剥がれてしまう、という危険性があります。
ちなみに、僕はこれまでに計12個のセンサ、それぞれに電源とGNDと信号で
合計36箇所の本番のハンダ付けをしていますが、今のところノートラブルです。
要は、慎重にやればいいのですし、切れたらまたつなぐだけです。(^_^;)

●センサには+5Vの電源を供給する
 センサは全て、個々にトリミング調整してあります。+5V電源とGNDを供給する
と、内部のセンシング/補正アンプが、それぞれのセンサごとにほぼ+5Vから
0Vまでの電圧として曲げ情報を出力してくれるようになっていて簡単です。
+5V電源は、コンピュータ系なら普通の+5V電源でいいですし、僕のマシンの
うち小型のものは、単3電池4本の6Vを、ロードロップの3端子レギュレータIC
で+5Vにして供給しています。消費電流はごく微小です。
あとは、このセンサ電圧を取り込んでMIDI出力するためのコンピュータ部分です。

●センサ出力の電圧をA/D変換して取り込む[1] AKI-80
 もっとも小型軽量ポータブルにできる方法ですが、技術力は必要となります。
ただしこの方法を実現できるようになっていれば、あとあと自由にMIDIセンサを
自作できます。理工系の学生にはお奨めです。(^_^)
 AKI-80でなくてもPICでも何でもいいのですが、CPUの載ったボードマイコン
で実際にA/D変換からMIDI出力まで作ってしまう、という方法です。僕はADC0809
というごく普通のICを1個だけで実現しています。このICは、+5V単一電源で、
6チャンネルの0V-5Vアナログ入力電圧をそれぞれ8ビットのディジタルに高速
変換してくれるので、ここでの用途にはバッチリです。
これがその回路図です
●センサ出力の電圧をA/D変換して取り込む[2] PC9801
 PC9801には、拡張スロットに挿入するA/D変換ボードが市販されています。
これを利用すると、A/Dの部分の自作が不要です。さらに、MPU-PC98IIのような
インテリジェントのMIDIボードがあれば、BASICであってもMIBURIセンサから
MIDI出力するマシンは簡単に実現できます。

●センサ出力の電圧をA/D変換して取り込む[3] DOS/V
 DOS/Vマシンでも、同様のA/Dボードがあります。さらに、25ピンのパラレル
コネクタにスポッと差し込めるA/D変換モジュールなんてのも、秋月電子の広告
に載っています。ここにサウンドブラスター互換のMIDIボードで、同様に
BASICでもCでも、MIBURIセンサからMIDI出力するマシンは実現できます。

●センサ出力の電圧をA/D変換して取り込む[4] Mac
 Macではよく知らないのですが、たしかADBコネクタに接続できる汎用の
A/Dモジュールみたいなのがあったような気がします。これをMAXから直接
呼び出すと、外にいったんMIDI出力せずに内部で必要な情報処理を行って、
あとは音源にそのままMIDI出力できると思います。このあたりは、実際には
やっていないので調査が必要ですが。

●センサ出力の電圧をA/D変換して取り込む[5] AKAIの電圧MIDI変換I/F
 型番とか記憶にないのですが、たしかAKAIあたりで、汎用の入力電圧を
そのままA/D変換してMIDI出力するセンサというかインターフェースがあった
ように記憶しています。他メーカだったかもしれませんが。ここにMIBURI
センサの電圧を与えれば、もうMIDIになって出てくれます。

●A/D変換されてMIDIになった情報を音源向けに加工する
 これはもう、MAXパッチの活躍の場ですね。(^_^)
センサからの情報の段階であまり形式を特化させてしまうと応用性がなくなる
ので、センサ出力のMIDI形式は「電圧そのまま」にしておいて、MAXをかませて
情報量を削減したり特性を変換するのがいいでしょう。
 なお、6個のセンサの情報をMIDI化するのには2つの方法があります。
一つは、たとえば「16チャンネルのコントロールチェンジ」というように
決めて、コントロール番号をセンサ番号にする、という方法もあります。
ところがこれだと、たとえば1番のセンサの値が3Fだとすると、
  BF 01 3F
というように3バイト表現となり、多量のセンサ情報としてはちょっと美しく
ありません。僕は今回は、チャンネルプレッシャーに割り当てて、
  D1 3F
というように、センサ番号をMIDIチャンネルにしています。これだと6つの
チャンネルを占有してしまうのですが、どうせチャンネルプレッシャーに
反応するMIDI機器なんて、ほとんどありません。(^_^;)
僕のシステムでは、たいてい、このセンサの情報はパターンマッチと処理の
ためのMAXに行くだけで、MIDI音源などにはその後段で供給されるので、この
センサ情報が直接には入らないので問題ないのです。
これがこのセンサを開発する時にテストしたMAXパッチです

これは、実際に作品の中でこのセンサを使った時のMAXパッチです

ということで、他にも興味のある方が出て来れば、MIBURI改造講座をやっても
いいです。まぁ、掲載ペースはあまり保証できませんが。(^_^;)

ところで、なかなか売れないMIBURIをもっと売れるようにする
ためのアイデアを一つ。(^_^)
現在のMIBURIの最大の欠点は、MIDI入力がない事です。

MIDI出力から全部でなくてもセンサ情報が出ているのですから、ユーザが
現在のMIBURIの「音源」としての機能に不満があれば、とりあえず出ている
MIDI情報をMAXで手軽に加工して、再びMIBURI本体のMIDI音源入力に戻して
鳴らしたい、とは誰でも思うことです。これができない、というのは致命的
です。物理モデルシンセをMIBURIの情報を(MAXで)利用して鳴らしたいのなら
もう1台物理モデルシンセを買え、というのは、ちょっとあんまりです。(^_^;)

本当を言えば、MIBURI内部で加工する以前の、6個のセンサのA/D出力データ
そのものをダラダラとMIDI出力でタレ流してくれる、というモードも欲しい
ところです。情報の処理はユーザに任せて下さい。MAXが普及した現在では、
メーカが加工して制限された情報というのはデメリットでしかありません。

RE:Hardware and Computer Music 96/08/25 09:59


◆今の若い技術者はあまりに覚える事が多すぎて、基礎的な事を
◆マスターしている時間が無いというのもあるかもしれません。

うーーむ、確かにそうなのですが。でも、ツール/環境がサポートしてくれる
ことで、「覚える」のでなく、「必要なら検索できる」という方法だけ
マスターすればいいのですよね。
昔の電子技術者は、入社するとTTLの番号とピン配置を全部覚えさせられたそう
ですが(^_^;)、今なら必要な情報をどのデータベースから引けるか、という
方法だけ身に付いていればいいのですよね。

◆修理だって、基板交換という時代です。

つい先日、僕のPowerBookが突然に立ち上がらなくなりました。HDクラッシュ
ではなく、それ以前の故障のようでした。そこで仕方なく、同じPowerBookの
モノクロを買って、開けて両方のHDを交換して無償修理に出しました。また
MAXが1インストール分、死んでしまうのはかなわなかったのです。
この結果は、マザーボード交換ということでした。HDの中身は無事だった
のですが、98と違ってMacの故障は本当に姿が見えなくて困りますね。
街の電気屋さんも、修理ができない時代ですからねぇ。(^_^;)

◆ハンダ付けどころか、オームの法則を知らなくたって、技術屋面出来るのです。

MIBURIの改造をするには、オームの法則ぐらいは知っていて欲しいですね。
でも、この僕だって、電気屋になったのはサラリーマンになってからで、
いまだにまともには電子工学なんて学んでいないのですが....。

◆この辺が巡り巡って、原子炉事故なんてのになるのかもしれませんね。

原発フォーラムの話題(そんなのあるのかな(^_^;))かもしれませんが、最近
ではきっと、原発の制御ソフトとか開発する人は、放射能なんて実感を持って
知らないのかもしれませんね。

電源を逆接続してICが昇天する時のあの臭いと熱さ(^_^;)とか、バス信号の
衝突でオシロに現れるあの波形とか、とにかく実際のトラブルを皮膚感覚と
して理解していないエンジニアの作るシステムというのは、とっても恐いと
思います。
原発が暴走しても、セキュリティに穴のあるソフトを開発しても、そういう
エンジニアはゲームと同じように「リセットすればいいじゃん」と思うの
でしょうね。(^_^;)

RE:RE^2:MIBURIセンサー 96/08/25 22:37


◆趣味のラジコンでしばしばやっています。サーボのコネクタのハンダ付けとか
◆けっこう細かいです。

これで、最大の難関はOKですね。ハンダ付けは楽しいですよね。(^_^)

◆>>●センサには+5Vの電源を供給する
◆>>ロードロップの3端子レギュレータIC
◆ ははは、この辺から難しいですね。何のことやらさっぱり。秋葉原に行けば
◆ありますか?。

普通の3端子レギュレータの場合、+5Vの安定化電源を出力する7805等のICでは、
入力として+7.5V程度以上を与えないといけないのですが、いま雑誌の広告を
見ると、秋月電子で150円で売っている「LM2940CT-5」だと、5.2V入力で
5V電源になるそうですので、乾電池の+6Vでも十分です。

MIBURI-Sensor AKI-80 プログラム

;-----------------------------------------------------------------------
;	Miburi Sensor Box for [Asian Edge] : Feb. 1996
;-----------------------------------------------------------------------

;##### RAM Map #####
	dseg
	org	0000h
rx_fifo		ds	2048
tx_fifo		ds	2048
rx_top		ds	2
rx_end		ds	2
tx_top		ds	2
tx_end		ds	2
rsb		ds	1
dcb		ds	1
channel		ds	1
keyno		ds	1
buff		ds	1
timer		ds	2
led		ds	1
ad		ds	1
ad_old		ds	6
ad_buff		ds	1
ad_timer	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     0020h
	dw	_midi_
_midi_:
	ex	af,af'
	exx
	ld	de,(rx_top)
	ld	a,10000000b
	or	d
	ld	h,a
	ld	l,e
	in	a,(sio_a+0)
	ld	(hl),a
	inc	de
	res	3,d
	ld	(rx_top),de
	exx
	ex	af,af'
	ei
	reti
	org     0066h
	retn

;##### Main #####
main:
	ld      hl,08000h
	ld      a,0a0h
_ram_clear_loop:
	ld      (hl),0
	inc     hl
	cp      h
	jr	nc,_ram_clear_loop
	io_set	pio_a,0cfh		; Mode 3
	io_set	pio_a,11111111b		; 0:Out / 1:In
	io_set	pio_a,007h		; Interrupt Disable
	io_set	pio_b,0cfh		; Mode 3
	io_set	pio_b,00010000b		; 0:Out / 1:In
	io_set	pio_b,007h		; Interrupt Disable
	io_set	sio_b,00011000b		; Channel Reset B
	io_set	sio_b,00000100b		; Resister Point = 4
	io_set	sio_b,11000100b		; Mode
	io_set	sio_b,00000001b		; Resister Point = 1
	io_set	sio_b,00000000b		; Interrupt Mode
	io_set	sio_b,00000010b		; Resister Point = 2
	io_set	sio_b,20h		; Vector Address
	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,00010000b		; Interrupt Mode
	io_set	sio_a,00000101b		; Resister Point = 5
	io_set	sio_a,01101000b		; Transmit Start
	io_set	sio_a,00000011b		; Resister Point = 3
	io_set	sio_a,11000001b		; Receive Start
	im	2
	ei
	in	a,(sio_a+0)		; dummy read
	ld	a,00000000b
	ld	(led),a
	out	(pio_b),a
	xor	a
	ld	(ad),a
	call	ad_start
loop:
	call	living_led
	call	tx_data_check
	call	rx_data_check
	call	ad_check
	jr	loop

tx_data_check:
	ld	de,(tx_end)
	ld	hl,(tx_top)
	and	a			; CY <-- 0
	sbc	hl,de
	ret	z
	io_set	sio_a,00000000b		; Resister Point = 0
	in	a,(sio_a+1)
	bit	2,a
	ret	z
	ld	a,10001000b
	or	d
	ld	h,a
	ld	l,e
	ld	a,(hl)
	out	(sio_a),a
	inc	de
	res	3,d
	ld	(tx_end),de
	ret
tx_fifo_set:
	ld	de,(tx_top)
	ld	a,10001000b
	or	d
	ld	h,a
	ld	l,e
	ld	(hl),b
	inc	de
	res	3,d
	ld	(tx_top),de
	ret
rx_data_check:
	ld	de,(rx_end)
	ld	hl,(rx_top)
	and	a			; CY <-- 0
	sbc	hl,de
	ret	z
	ld	a,10000000b
	or	d
	ld	h,a
	ld	l,e
	ld	b,(hl)
	inc	de
	res	3,d
	ld	(rx_end),de
	bit	7,b
	jr	z,50$			; running
	ld	a,b
	cp	0f8h
	ret	nc
	cp	0f0h
	jr	c,10$
	xor	a
	ld	(rsb),a
	ret
10$:
	ld	a,b
	and	00001111b
	ld	(channel),a
	ld	a,b
	and	11110000b
	ld	(rsb),a
	xor	a
	ld	(dcb),a
	ret
50$:
	ld	a,(rsb)
	cp	0
	ret	z
	cp	0c0h
	ret	z
	cp	0d0h
	ret	z
	ld	a,(dcb)
	cp	0
	jr	nz,90$
	inc	a
	ld	(dcb),a
	ld	a,b
	ld	(keyno),a
	ret
90$:
	xor	a
	ld	(dcb),a
	ld	a,(rsb)
	cp	090h
	ret	nz
	ld	a,b
	ld	(buff),a
	ld	b,090h			; MIDI Channel = [1] fixed !!!
	call	tx_fifo_set
	ld	a,(keyno)
	ld	b,a
	call	tx_fifo_set
	ld	a,(buff)
	ld	b,a
	call	tx_fifo_set
	ret
living_led:
	ld	a,(timer+0)
	inc	a
	ld	(timer+0),a
	cp	0
	ret	nz
	ld	a,(timer+1)
	inc	a
	and	01111111b
	ld	(timer+1),a
	cp	30
	jr	z,_led_on
	cp	45
	jr	z,_led_off
	ret
_led_on:
	ld	a,(led)
	and	00000001b
	or	00100000b
	ld	(led),a
	out	(pio_b),a
	ret
_led_off:
	ld	a,(led)
	and	00000001b
	and	11011111b
	ld	(led),a
	out	(pio_b),a
	ret
ad_check:
	ld	a,(ad_timer)
	inc	a
	ld	(ad_timer),a
	cp	50
	ret	c
	xor	a
	ld	(ad_timer),a
	in	a,(pio_b)
	bit	4,a
	ret	z
	in	a,(pio_a)
	srl	a
	ld	c,a
	ld	a,(ad)
	ld	l,a
	ld	h,0
	ld	de,ad_old
	add	hl,de
	ld	a,(hl)
	cp	c
	jr	z,_ad_next
	ld	a,c
	ld	(hl),a
	ld	(ad_buff),a
	ld	a,(ad)
	or	0d0h
	ld	b,a
	call	tx_fifo_set
	ld	a,(ad_buff)
	ld	b,a
	call	tx_fifo_set
_ad_next:
	ld	a,(ad)
	inc	a
	ld	(ad),a
	cp	6
	jr	nz,ad_start
	xor	a
	ld	(ad),a
ad_start:
	ld	a,(led)
	and	00100000b
	ld	c,a
	ld	a,(ad)
	or	c
	out	(pio_b),a
	or	00001000b
	out	(pio_b),a
	nop
	and	11110111b
	out	(pio_b),a
	ld	(led),a
	ret

	end