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で使われている該当部分を以下に示す。