8入力8出力ビデオマトリクス・スイッチャ
1997年2月 長嶋洋一
■概要■
本機は、RCA端子によるNTSCビデオ信号の8入力8出力のスイッチマトリクスをMIDI
でリアルタイム制御するマシンである。ビデオ信号をフレームバッファに格納せずにそ
のままアナログ的にスイッチングしているので、厳密にはフレーム内の非同期ノイズを
発生するが、センサ等を用いたマルチメディア・パフォーマンスにおいては十分な機能
を持っている。スイッチングのデバイスにはMAXIM社のMAX456を、MIDI制御系には
カードマイコンAKI-80を用いている。
■システム(ハードウェア)■
本機の回路図は以下のようになっている。
■ファームウェア■
本機のAKI-80内に組み込まれたファームウェアのソースプログラムは以下の通りであ
る。
;-----------------------------------------------------------------------
; 8-in 8-out Matrix Video Signal Switcher : Feb. 1996
;-----------------------------------------------------------------------
;##### RAM Map #####
dseg
org 0000h
rx_fifo ds 4096
rx_top ds 2
rx_end ds 2
rsb ds 1
dcb ds 1
channel ds 1
keyno ds 1
select ds 8
timer ds 3
disp_sel ds 1
freeze 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
move macro @1,@2
ld a,@1
ld (@2),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 4,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,00000000b ; 0:Out / 1:In
io_set pio_a,007h ; Interrupt Disable
io_set pio_b,0cfh ; Mode 3
io_set pio_b,00000000b ; 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,00000011b ; Resister Point = 3
io_set sio_a,11000001b ; Receive Start
im 2
ei
in a,(sio_a+0) ; dummy read
xor a
out (pio_b),a
ld a,11000110b
out (pio_a),a
ld a,10000110b
out (pio_a),a
ld a,11000110b
out (pio_a),a
move 0,select+0
call maxim_init
move 1,select+1
call maxim_init
move 2,select+2
call maxim_init
move 3,select+3
call maxim_init
move 4,select+4
call maxim_init
move 5,select+5
call maxim_init
move 6,select+6
call maxim_init
move 7,select+7
call maxim_init
loop:
call display
call rx_data_check
jr loop
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 4,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 0a0h
ret nz
ld a,(channel)
cp 00fh
ret nz
ld a,(keyno)
cp 0
jp z,_sel_0
cp 1
jp z,_sel_1
cp 2
jp z,_sel_2
cp 3
jp z,_sel_3
cp 4
jp z,_sel_4
cp 5
jp z,_sel_5
cp 6
jp z,_sel_6
cp 7
jp z,_sel_7
ret
_sel_0:
ld a,b
and 00000111b
ld (select+0),a
jp _sel_disp
_sel_1:
ld a,b
and 00000111b
ld (select+1),a
jp _sel_disp
_sel_2:
ld a,b
and 00000111b
ld (select+2),a
jp _sel_disp
_sel_3:
ld a,b
and 00000111b
ld (select+3),a
jp _sel_disp
_sel_4:
ld a,b
and 00000111b
ld (select+4),a
jp _sel_disp
_sel_5:
ld a,b
and 00000111b
ld (select+5),a
jp _sel_disp
_sel_6:
ld a,b
and 00000111b
ld (select+6),a
jp _sel_disp
_sel_7:
ld a,b
and 00000111b
ld (select+7),a
jp _sel_disp
_sel_disp:
ld c,a
ld a,(keyno)
ld b,a
ld a,c
call maxim_set
ld a,(keyno)
call display_main
ld a,1
ld (freeze),a
xor a
ld (timer+2),a
ret
display:
ld a,(timer+0)
inc a
ld (timer+0),a
cp 0
ret nz
ld a,(timer+1)
inc a
ld (timer+1),a
cp 80 ; ***********:
ret c
xor a
ld (timer+1),a
ld a,(freeze)
cp 0
jr z,_display_go
ld a,(timer+2)
inc a
ld (timer+2),a
cp 3
ret c
xor a
ld (timer+2),a
ld (freeze),a
_display_go:
ld a,(disp_sel)
inc a
and 00000111b
ld (disp_sel),a
display_main:
and 00000111b
ld l,a
rlca
rlca
rlca
ld e,a
ld h,0
ld bc,select
add hl,bc
ld a,(hl)
or e
out (pio_b),a
ret
maxim_init:
ld b,a ; [a]=input, [b]=output
maxim_set:
and 00000111b
or 01000000b
ld e,a
ld a,b
and 00000111b
rlca
rlca
rlca
or e
out (pio_a),a
and 00111111b
out (pio_a),a
or 01000000b
out (pio_a),a
ret
end
■ソフトウェア■
本機を制御するコントローラとしては、MIDIを経由していればシーケンサでも構わな
いが、サンプルとして以下の[matrix_test]というMAXパッチを用意している。これを
アレンジして、任意のマルチメディア・パフォーマンスに対応したMAXパッチを作るこ
とができる。
なお、制御するのは「あるビデオ出力チャンネルは、どのビデオ入力からの信号が割り
当てられるか」という関係であり、「このビデオ入力をどこに出力させるか」という逆
方向の対応ではないことに注意すること。この逆に、全てのビデオ出力が同じビデオ入
力に割り当てられて同じものが出力される、という設定は可能である。
以下に示すのは、1996年11月3日に神戸・ジーベックホールで行った研究発表イベン
トのインスタレーションとして、本機を使用した作品のパッチ例である。
■使用上の注意事項■
本機の使用方法の注意点はただ一つである。本機の電源を投入する際には、それより前
に全てのビデオ入力信号が正常状態で入力されていなければならない。つまり、立ち上
がり時にビデオスイッチLSIが「正常にビデオ入力されていない」と認識したチャンネ
ルのビデオ入力は、その後に与えられても、正常なビデオ出力として得られないで異常
な信号として出力されてしまう。このために、起動時には、本機に接続される全てのビ
デオ信号機器を正常に立ち上げてから、最後に本機の電源を投入すること。
■機能仕様■
MIDIチャンネル「16」のポリフォニック・プレッシャーとして、
・ノート「0」のバリュー(0-7) --- 出力[1]に与えられる入力[1-8]
・ノート「1」のバリュー(0-7) --- 出力[2]に与えられる入力[1-8]
・ノート「2」のバリュー(0-7) --- 出力[3]に与えられる入力[1-8]
・ノート「3」のバリュー(0-7) --- 出力[4]に与えられる入力[1-8]
・ノート「4」のバリュー(0-7) --- 出力[5]に与えられる入力[1-8]
・ノート「5」のバリュー(0-7) --- 出力[6]に与えられる入力[1-8]
・ノート「6」のバリュー(0-7) --- 出力[7]に与えられる入力[1-8]
・ノート「7」のバリュー(0-7) --- 出力[8]に与えられる入力[1-8]
という対応でスイッチマトリクスを設定する。このノート番号については、下位3ビッ
トのビットパターンでマスクせずに、絶対的な値として比較しているので注意。また、
バリューについては下位3ビットのビットパターンでマスクしているので、たとえばデー
タ[8]はデータ[0]というように解釈される。
|