MIDIカウンタディスプレイ
長嶋 洋一
■概要■
本機は、リアルタイム・パフォーマンスのためにシステムからMIDIによって3桁のLED
を表示させて、「現在の小節番号」などのパフォーマンス情報をPerformerに伝える
ためのAKI-80マシンである。情報には特別のプロトコルを規定している。
■システム(ハードウェア)■
本機の回路図は以下のようになっている。
■ファームウェア■
本機のAKI-80に組み込まれたファームウェアのソースプログラムは以下の通りである。
;-----------------------------------------------------------------------
; LED Bar Counter Display Box for "Strange Attractor" : Oct. 1994
;-----------------------------------------------------------------------
;##### RAM Map #####
dseg
org 0000h
rx_fifo ds 8192
rx_top ds 2
rx_end ds 2
rsb ds 1
dcb ds 1
channel ds 1
keyno ds 1
buffer ds 3
;##### 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,0ffffh
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 5,d
ld (rx_top),de
exx
ex af,af'
ei
reti
org 0066h
retn
;##### Main #####
main:
ld hl,08000h
ld a,0f0h
_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,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
io_put pio_b,00000111b
call led_write
loop:
call rx_data_check
jr loop
;##### Subroutines #####
led_write:
ld a,(buffer+0)
call data_to_segment
out (pio_a+0),a
nop
io_put pio_b,00000011b
nop
io_put pio_b,00000111b
ld a,(buffer+1)
call data_to_segment
out (pio_a+0),a
nop
io_put pio_b,00000101b
nop
io_put pio_b,00000111b
ld a,(buffer+2)
call data_to_segment
out (pio_a+0),a
nop
io_put pio_b,00000110b
nop
io_put pio_b,00000111b
ret
data_to_segment:
ld hl,table
ld b,0
ld c,a
add hl,bc
ld a,(hl)
ret
table:
db 01110111b,00010100b,01101101b,00111101b,00011110b
db 00111011b,01111011b,00010111b,01111111b,00111111b
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 5,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 00eh
ret nz
ld a,b
cp 10
ret nc
ld a,(keyno)
cp 5
jr z,_05
cp 6
jr z,_06
cp 7
jr z,_07
ret
_05:
ld a,b
ld (buffer+0),a
call led_write
ret
_06:
ld a,b
ld (buffer+1),a
call led_write
ret
_07:
ld a,b
ld (buffer+2),a
call led_write
ret
end
■ソフトウェア■
本機に[0]から[999]までの3桁の数字を表示させるためのサンプルのMAXパッチ
[LEDbox_control]は以下のようなものである。これを利用して、任意の
Performenceで本機によるディスプレイを利用できる。
具体的な作品に本機を利用した例として、
・1994年11月に行われたJACOMコンサートで発表した作品「Strange Atrtractor」
・1995年11月に行われた神戸国際現代音楽祭で発表した作品「Virtual Reduction」
・1996年7月に行われたJACOMコンサートで発表した作品「Asian Edge」
の作曲においてMAXで使われている該当部分を以下に示す。
|