MIDI Merger
1998年8月 長嶋洋一
「トランジスタ技術」に載った「MIDIマージャ」
■概要■
本機は、4入力のMIDI情報をマージして1本のMIDI出力とするMIDIマージャである。
システムメッセージやリアルタイムメッセージについては完全に対応していないものの、
通常のMIDIチャンネルメッセージについては、4系統それぞれにMIDI入力4KB、
MIDI出力に8KBのFIFOバッファリングを行っているので、実用上は問題ない
センサフュージョン等を実現する。本機でオーバーフローするようなトラフィックの
センサ情報であれば、IndyだけでなくMacでも受けきれずにハングアップする可能性が高い。
システムとしてはAKI-80を使用し、MIDI用のUSARTとして71051を用いている。
本機は1号機と2号機で回路に若干の違いがあるために、ファームウェアについて
両方のリストを掲げた。
■システム(ハードウェア)■
本機の回路図は以下のようになっている。
■ファームウェア■
本機の1号機のAKI-80に組み込まれたファームウェアのソースプログラムは以下の通
りである。
;-----------------------------------------------------------------------
; 4-input MIDI Stream Merger : Jan.1993
;-----------------------------------------------------------------------
;##### RAM Map #####
dseg
org 0000h
rx_fifo_0 ds 4096
rx_fifo_1 ds 4096
rx_fifo_2 ds 4096
rx_fifo_3 ds 4096
tx_fifo ds 8192
rx_top_0 ds 2
rx_end_0 ds 2
rx_top_1 ds 2
rx_end_1 ds 2
rx_top_2 ds 2
rx_end_2 ds 2
rx_top_3 ds 2
rx_end_3 ds 2
tx_top ds 2
tx_end ds 2
rx_data ds 4
rsb ds 4
dcb ds 4
channel ds 4
keyno ds 4
port_a ds 1
port_b ds 1
;##### I/O Map #####
cseg
pio_a equ 001ch
pio_b equ 001eh
uart_0 equ 0080h
uart_1 equ 0082h
uart_2 equ 0084h
uart_3 equ 0086h
;##### MACRO #####
all_out macro @1
ld a,@1
out (uart_0+1),a
out (uart_1+1),a
out (uart_2+1),a
out (uart_3+1),a
endm
pio_set macro @1,@2
ld a,@2
out (@1+1),a
endm
rx_set macro @1,@2,@3
ld de,(@3)
ld a,@1
or d
ld h,a
ld l,e
in a,(@2+0)
ld (hl),a
inc de
res 4,d
ld (@3),de
ret
endm
rx_chk macro @1,@2,@3,@4
ld de,(@2)
ld hl,(@1)
and a ; CY <-- 0
sbc hl,de
ret z
ld a,@3
or d
ld h,a
ld l,e
ld b,(hl) ; [B] = Rx Data
inc de
res 4,d
ld (@2),de
bit 7,b
jr z,50$ ; running
ld a,b
cp 0f8h
ret nc
cp 0f0h
jr c,10$
xor a
ld (rsb+@4),a
ret
10$:
ld a,b
and 00001111b
ld (channel+@4),a
ld a,b
and 11110000b
ld (rsb+@4),a
xor a
ld (dcb+@4),a
ret
50$:
ld a,(rsb+@4)
cp 0
ret z
cp 0c0h
jr z,70$
cp 0d0h
jr z,70$
ld a,(dcb+@4)
cp 0
jr nz,90$
inc a
ld (dcb+@4),a
ld a,b
ld (keyno+@4),a
ret
70$:
ld c,b
ld a,(rsb+@4)
ld d,a
ld a,(channel+@4)
or d
ld b,a
call tx_fifo_set
ld b,c
call tx_fifo_set
ret
90$:
xor a
ld (dcb+@4),a
ld c,b
ld a,(rsb+@4)
ld d,a
ld a,(channel+@4)
or d
ld b,a
call tx_fifo_set
ld a,(keyno+@4)
ld b,a
call tx_fifo_set
ld a,b ; ******************
ld (port_a),a ; ******************
ld b,c
call tx_fifo_set
ret
endm
;##### RESET #####
org 0000h
ld sp,0ffffh
di
im 1
call initialize
ei
jp loop
;##### INT / NMI #####
org 0038h
ex af,af'
exx
call int_sequence
exx
ex af,af'
ei
reti
org 0066h
ei
retn
int_sequence:
in a,(uart_0+1)
bit 1,a
jr z,_next_1
rx_set 10000000b,uart_0,rx_top_0
_next_1:
in a,(uart_1+1)
bit 1,a
jr z,_next_2
rx_set 10010000b,uart_1,rx_top_1
_next_2:
in a,(uart_2+1)
bit 1,a
jr z,_next_3
rx_set 10100000b,uart_2,rx_top_2
_next_3:
in a,(uart_3+1)
bit 1,a
ret z
rx_set 10110000b,uart_3,rx_top_3
;##### MIDI Transmit Data Set : Input=[B] #####
tx_fifo_set:
ld de,(tx_top)
ld a,11000000b
or d
ld h,a
ld l,e
ld (hl),b
inc de
res 5,d
ld (tx_top),de
ret
;##### MIDI Transmit Check #####
tx_fifo_check:
in a,(uart_0+1)
bit 0,a
ret z
ld de,(tx_end)
ld hl,(tx_top)
and a ; CY <-- 0
sbc hl,de
ret z
ld a,11000000b
or d
ld h,a
ld l,e
ld a,(hl)
out (uart_0+0),a
inc de
res 5,d
ld (tx_end),de
ret
;##### MIDI Receive Check #####
rx_fifo_0_check:
rx_chk rx_top_0,rx_end_0,10000000b,0
rx_fifo_1_check:
rx_chk rx_top_1,rx_end_1,10010000b,1
rx_fifo_2_check:
rx_chk rx_top_2,rx_end_2,10100000b,2
rx_fifo_3_check:
rx_chk rx_top_3,rx_end_3,10110000b,3
;##### Program #####
loop:
call tx_fifo_check
call rx_fifo_0_check
call tx_fifo_check
call rx_fifo_1_check
call tx_fifo_check
call rx_fifo_2_check
call tx_fifo_check
call rx_fifo_3_check
call led_display
jr loop
;##### INITIALIZE #####
initialize:
all_out 0
all_out 0
all_out 0
ld hl,0e000h
ld a,0e8h
_ram_clear_loop:
ld (hl),0
inc hl
cp h
jr nc,_ram_clear_loop
all_out 01000000b
all_out 01001110b
all_out 00000101b
pio_set pio_a,0cfh ; Mode 3
pio_set pio_a,00000000b ; 0:Out / 1:In
pio_set pio_a,007h ; Interrupt Disable
pio_set pio_b,0cfh ; Mode 3
pio_set pio_b,00000000b ; 0:Out / 1:In
pio_set pio_b,007h ; Interrupt Disable
xor a
out (pio_a+0),a
out (pio_b+0),a
ld (port_b),a
ld a,0fch
out (uart_0+0),a
ret
led_display:
ld a,(port_a)
cpl
out (pio_a+0),a
ld a,(port_b)
set 0,a
out (pio_b+0),a
res 0,a
out (pio_b+0),a
ret
end
本機の2号機のAKI-80に組み込まれたファームウェアのソースプログラムは以下の通
りである。
;-----------------------------------------------------------------------
; 4-input MIDI Stream Merger (2) : May.1993
;-----------------------------------------------------------------------
;##### RAM Map #####
dseg
org 0000h
rx_fifo_0 ds 4096
rx_fifo_1 ds 4096
rx_fifo_2 ds 4096
rx_fifo_3 ds 4096
tx_fifo ds 8192
rx_top_0 ds 2
rx_end_0 ds 2
rx_top_1 ds 2
rx_end_1 ds 2
rx_top_2 ds 2
rx_end_2 ds 2
rx_top_3 ds 2
rx_end_3 ds 2
tx_top ds 2
tx_end ds 2
rx_data ds 4
rsb ds 4
dcb ds 4
channel ds 4
keyno ds 4
;##### I/O Map #####
cseg
pio_a equ 001ch
uart_0 equ 0098h
uart_1 equ 0090h
uart_2 equ 0088h
uart_3 equ 0080h
;##### MACRO #####
all_out macro @1
ld a,@1
out (uart_0+1),a
out (uart_1+1),a
out (uart_2+1),a
out (uart_3+1),a
endm
pio_set macro @1,@2
ld a,@2
out (@1+1),a
endm
rx_set macro @1,@2,@3
ld de,(@3)
ld a,@1
or d
ld h,a
ld l,e
in a,(@2+0)
ld (hl),a
inc de
res 4,d
ld (@3),de
ret
endm
rx_chk macro @1,@2,@3,@4
ld de,(@2)
ld hl,(@1)
and a ; CY <-- 0
sbc hl,de
ret z
ld a,@3
or d
ld h,a
ld l,e
ld b,(hl) ; [B] = Rx Data
inc de
res 4,d
ld (@2),de
bit 7,b
jr z,50$ ; running
ld a,b
cp 0f8h
ret nc
cp 0f0h
jr c,10$
xor a
ld (rsb+@4),a
ret
10$:
ld a,b
and 00001111b
ld (channel+@4),a
ld a,b
and 11110000b
ld (rsb+@4),a
xor a
ld (dcb+@4),a
ret
50$:
ld a,(rsb+@4)
cp 0
ret z
cp 0c0h
jr z,70$
cp 0d0h
jr z,70$
ld a,(dcb+@4)
cp 0
jr nz,90$
inc a
ld (dcb+@4),a
ld a,b
ld (keyno+@4),a
ret
70$:
ld c,b
ld a,(rsb+@4)
ld d,a
ld a,(channel+@4)
or d
ld b,a
call tx_fifo_set
ld b,c
call tx_fifo_set
ret
90$:
xor a
ld (dcb+@4),a
ld c,b
ld a,(rsb+@4)
ld d,a
ld a,(channel+@4)
or d
ld b,a
call tx_fifo_set
ld a,(keyno+@4)
ld b,a
call tx_fifo_set
ld b,c
call tx_fifo_set
ret
endm
;##### RESET #####
org 0000h
ld sp,0ffffh
di
im 1
call initialize
ei
jp loop
;##### INT / NMI #####
org 0038h
ex af,af'
exx
call int_sequence
exx
ex af,af'
ei
reti
org 0066h
ei
retn
int_sequence:
in a,(uart_0+1)
bit 1,a
jr z,_next_1
rx_set 10000000b,uart_0,rx_top_0
_next_1:
in a,(uart_1+1)
bit 1,a
jr z,_next_2
rx_set 10010000b,uart_1,rx_top_1
_next_2:
in a,(uart_2+1)
bit 1,a
jr z,_next_3
rx_set 10100000b,uart_2,rx_top_2
_next_3:
in a,(uart_3+1)
bit 1,a
ret z
rx_set 10110000b,uart_3,rx_top_3
;##### MIDI Transmit Data Set : Input=[B] #####
tx_fifo_set:
ld de,(tx_top)
ld a,11000000b
or d
ld h,a
ld l,e
ld (hl),b
inc de
res 5,d
ld (tx_top),de
ret
;##### MIDI Transmit Check #####
tx_fifo_check:
in a,(uart_0+1)
bit 0,a
ret z
ld de,(tx_end)
ld hl,(tx_top)
and a ; CY <-- 0
sbc hl,de
ret z
ld a,11000000b
or d
ld h,a
ld l,e
ld a,(hl)
out (uart_0+0),a
inc de
res 5,d
ld (tx_end),de
ret
;##### MIDI Receive Check #####
rx_fifo_0_check:
rx_chk rx_top_0,rx_end_0,10000000b,0
rx_fifo_1_check:
rx_chk rx_top_1,rx_end_1,10010000b,1
rx_fifo_2_check:
rx_chk rx_top_2,rx_end_2,10100000b,2
rx_fifo_3_check:
rx_chk rx_top_3,rx_end_3,10110000b,3
;##### Program #####
loop:
call tx_fifo_check
call rx_fifo_0_check
call tx_fifo_check
call rx_fifo_1_check
call tx_fifo_check
call rx_fifo_2_check
call tx_fifo_check
call rx_fifo_3_check
jr loop
;##### INITIALIZE #####
initialize:
ld hl,0e000h
ld a,0e8h
_ram_clear_loop:
ld (hl),0
inc hl
cp h
jr nc,_ram_clear_loop
pio_set pio_a,0cfh ; Mode 3
pio_set pio_a,00000000b ; 0:Out / 1:In
pio_set pio_a,007h ; Interrupt Disable
ld a,11111111b
out (pio_a+0),a
call wait_long
ld a,0
out (pio_a+0),a
call wait_long
all_out 0
all_out 0
all_out 0
call wait_long
all_out 01000000b
all_out 01001110b
all_out 00000101b
ld a,0fch
out (uart_0+0),a
ret
wait_long:
call wait_mid
call wait_mid
call wait_mid
call wait_mid
call wait_mid
call wait_mid
call wait_mid
call wait_mid
call wait_mid
call wait_mid
call wait_mid
call wait_mid
call wait_mid
call wait_mid
call wait_mid
ret
wait_mid:
call wait_short
call wait_short
call wait_short
call wait_short
call wait_short
call wait_short
call wait_short
call wait_short
call wait_short
call wait_short
call wait_short
call wait_short
call wait_short
call wait_short
call wait_short
ret
wait_short:
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
ret
end
MIDIマージャー回路図です 97/04/23 20:42
「DOS/V機(Windowsマシン)のためのインテリジェントMIDIインターフェース」
をAKI-80で作る、という企画の最初のステップです。
いきなりこの全体にいくと、製作ミスはパソコンを壊すことになりかねない(^_^;)
ので、まずはパソコンと接続する部分を除いて、AKI-80単体で動作確認できる
ようにしました。
(実は今日作り始めて、まだここまでしかできなかったという訳ですが(^_^;))
とりあえず、パソコンと接続するためにAKI-80のパラレルポートを全てリザーブ
した状態で、MIDIの2系列をマージして3パラに出力するようにしています。
MIDIは2系統の入力とマージした出力、それぞれを8192バイトずつのFIFOバッファ
に積むようにしています。
今回のバージョンでは、「単体モード/PCインターフェースモード」の切り替え
スイッチがいずれの状態でも、マージャになっていますが、次のステップでは
立ち上がった時のスイッチの状態に応じて、
・2入力MIDIマージ情報が3パラMIDI出力される(単体モード)
・2入力MIDIマージ情報がパソコンに行き、パソコンからの情報が
3パラMIDI出力される(PCインターフェースモード)
とに自動切り替えされるようになります。
今回の製作から次の本番に向けては、変更はありません。追加のみで行けます。
つまり、ここまでで製作すれば、MIDIマージャということで、それでも十分に
活用できるものです。(^_^)
なお、今回は、AKI-80の「ゴールドキット」ですので注意して下さい。
それから、回路図の2個所に登場する393は1個です。
回路図の3個所に登場する05も1個です。
あとでこの他に使うICは、74と08と245と574がそれぞれ1個ずつ、だけです。(^_^)
パソコンとのハンドシェークといっても、その程度なのです。
上記のような回路で、ゴールドキットで、以下のプログラムでMIDIマージャと
なります。(^_^)
:0700000031FFFFF3C36800AC
:200020004A004A004A004A00300030003000300008D9ED5B04E03EA0B2676BDB187713CB21
:20004000AAED5304E0D908FBED4D08D9ED5B08E03EC0B2676BDB1A7713CBAAED5308E0D934
:0400600008FBED4D5F
:20006600ED452100803E0077237CFEFF20F73ECFD31D3EFFD31D3E07D31D3ECFD31F3E00A3
:20008600D31F3E07D31F3E18D31B3E04D31B3EC4D31B3E01D31B3E14D31B3E02D31B3E20D4
:2000A600D31B3E03D31B3EC1D31B3E18D3193E04D3193EC4D3193E01D3193E10D3193E052A
:2000C600D3193E68D3193E03D3193EC1D3193E00D319DB19CB5F200F3E25D3103EB1D310F5
:2000E6003E003216E0180D3E25D3103E00D3103E013216E0ED5EFBDB18DB1ACD0C01CD428A
:2001060001CDD20118F5ED5B02E02A00E0A7ED52C83E00D319DB19CB57C83E80B2676B7E81
:20012600D31813CBAAED5302E0C9ED5B00E03E80B2676B7013CBAAED5300E0C9ED5B06E0E2
:200146002A04E0A7ED52C83EA0B2676B4613CBAAED5306E0CB78281E78FEF8D0FEF0380595
:20016600AF320CE0C978E60F320EE078E6F0320CE0AF320DE0C93A0CE0FE00C8FEC028156C
:20018600FED028113A0DE0FE00C2B3013C320DE078320FE0C9783210E03A0EE0473A0CE0CB
:2001A600B047CD30013A10E047CD3001C9783210E03A0EE0473A0CE0B047CD30013A0FE0BF
:2001C60047CD30013A10E047CD3001C9ED5B0AE02A08E0A7ED52C83EC0B2676B4613CBAA5A
:2001E600ED530AE0CB78281E78FEF8D0FEF03805AF3211E0C978E60F3213E078E6F032111F
:20020600E0AF3212E0C93A11E0FE00C8FEC02815FED028113A12E0FE00C243023C3212E0D8
:20022600783214E0C9783215E03A13E0473A11E0B047CD30013A15E047CD3001C978321522
:1C024600E03A13E0473A11E0B047CD30013A14E047CD30013A15E047CD3001C978
:00000001FF
AKI-80でインテリジェントMIDI I/F 97/04/27 10:03
お待たせしました。ようやくできました。(^_^)
約マル1日、解決してしまえばなんでもないバグで悩みました。(後述)
これまで色々なMIDIグッズをAKI-80で作ってきましたが、今回のマシンは間違い
なく、技術的にはもっとも高度なものです。各種の入力を溜めてMIDIで出す、
あるいはMIDI入力を溜めて各種の出力として出す、というような単純なものでは
ありません。相手はパソコン、そして最高速でハンドシェークしてデータを
絶対に落とさない、というインテリジェントMIDIインターフェースの完成です。
しかもこれは、MIDI入力の2系列を矛盾なくマージしてパソコンに送ります。
MPU401よりもsuperMPUでしたっけ?、に近い仕様です。(^_^)
パソコン側ですが、MIDIのバッファリング、マージなどの事は全てAKI-80が
やってくれますので、Windows95の「DOS窓」の中で、Cコンパイラで、タイミング
やバッファリングに関する心配をまったく考えずにプログラミングできます。
ただし、AKI-80からMIDI受信イベントがあった時にパソコンに対して割り込みを
かけていません。これは最近のパソコンは十分に速いので、ポーリングで十分
だからです。逆にパソコンからAKI-80へのMIDI送信要求は最高速のNMIです。
たとえば、以下のプログラムだけで、「MIDIマージ入力を画面に16進表示
しつつ、MIDIとしてソフト的に送信する」という動作をします。こんなに簡単に
なって、いいのでしょうか。(^_^)
===================================================================
main(){
int d;
port_init();
aki80_reset();
while(1){
d=csts();
if(d==0x1b) break;
else if(d=='r') aki80_reset();
d=midi_rx();
if(d>=0){
printf(" %02x ",d);
midi_tx(d);
}
}
}
midi_rx(){
int dd;
if((_inb(0x379)&0x20)!=0) return(-1);
_outb(0x20,0x37a); /* Input, [RD] = Low */
dd=_inb(0x378);
_outb(0x05,0x37a); /* Strobe */
_outb(0x04,0x37a); /* Default */
return(dd);
}
midi_tx(data)
int data;
{
while(1){
if((_inb(0x379)&0x10)==0){
_outb((data&0xff),0x378);
_outb(0x0c,0x37a); /* [WR] = Low */
_outb(0x04,0x37a); /* [WR] = High */
return;
}
}
}
aki80_reset(){
long ii,jj=0L;
_outb(0x06,0x37a); /* [WR] = [RD] = High , [RES] = Low */
for(ii=0;ii<50000;ii++){jj++;}
_outb(0x04,0x37a); /* [WR] = [RD] = [RES] = High */
}
port_init(){
_outb(0x04,0x37a); /* [WR] = [RD] = [RES] = High */
}
===================================================================
ポートのアドレスは標準では0x378-0x37Aです。これを別に使っている場合には、
パソコン側のCのプログラムでポート番号を変更設定するだけです。
上のプログラムでは、ポートの入出力が_inb()と_outb()という関数ですが、
これがCコンパイラごとに名前がそれぞれ違いますので、これだけ変更すれば
いいわけです。
さて、それでは、回路図です。
さきほどのMIDIマージャ回路をそのまま作り、さらに以下の回路を追加して下さい。
今回はかなりハードも難解です。一つのミスもパソコン、AKI-80の両方をハング
させる可能性があります。もっとも効果的に間違うとパソコンを壊す可能性も
あります。(^_^;)
AKI-80はゴールドキット、パソコンはパラレルポートを「双方向モード」に
システム設定して下さい。回路図ではもっとも標準のプリンタコネクタ(DSUB
で25ピン)に接続するようになっています。
次に、プログラムです。
以下の----------で挟まれた中身だけを***.HEXと適当なファイル名にして、
ROMライタで27C256などのEPROMに焼きます。
このプログラムは、[FMIDI005]という名前でいきましょう。(^_^)
---------------------------------------------------------------------------
:0700000031FFFFF3C36F00A5
:20002000470047004A004700470047003000470008D9ED5B06E13EA0B2676BDB187713CBE2
:20004000AAED5306E1D908FBED4D08D9ED5B0AE13EC0B2676BDB1A7713CBAAED530AE1D92B
:0400600008FBED4D5F
:20006600083E013218E108ED452100803E0077237CFEFF20F73ECFD31D3EFFD31D3E07D383
:200086001D3ECFD31F3E00D31F3E07D31F3E18D31B3E04D31B3EC4D31B3E01D31B3E14D321
:2000A6001B3E02D31B3E20D31B3E03D31B3EC1D31B3E18D3193E04D3193EC4D3193E01D319
:2000C600193E10D3193E05D3193E68D3193E03D3193EC1D3193E00D319DB19CB5FC20001E3
:2000E6003E25D3103EB1D310ED5EFBDB18DB1ACD5401CD8A01CD1A0218F53E25D3103E00C0
:20010600D3103E05D3193EE8D3193E05D3193E68D319ED5EFBDB18DB1ACD3301CDD703CD51
:20012600B702CD3301CDD703CD470318EC3A18E1FE00281ADB1C47CD78013E05D3193EE8F1
:20014600D3193E05D3193E68D319AF3218E1ED5B04E12A02E1A7ED52C83E00D319DB19CB41
:2001660057C83E80B2676B7ED31813CBAAED5304E1C9ED5B02E13E80B2676B7013CBAAEDE7
:200186005302E1C9ED5B08E12A06E1A7ED52C83EA0B2676B4613CBAAED5308E1CB78281E88
:2001A60078FEF8D0FEF03805AF320EE1C978E60F3210E178E6F0320EE1AF320FE1C93A0E56
:2001C600E1FE00C8FEC02815FED028113A0FE1FE00C2FB013C320FE1783211E1C97832120B
:2001E600E13A10E1473A0EE1B047CD78013A12E147CD7801C9783212E13A10E1473A0EE185
:20020600B047CD78013A11E147CD78013A12E147CD7801C9ED5B0CE12A0AE1A7ED52C83E29
:20022600C0B2676B4613CBAAED530CE1CB78281E78FEF8D0FEF03805AF3213E1C978E60F7C
:200246003215E178E6F03213E1AF3214E1C93A13E1FE00C8FEC02815FED028113A14E1FE3A
:2002660000C28B023C3214E1783216E1C9783217E13A15E1473A13E1B047CD78013A17E1A6
:2002860047CD7801C9783217E13A15E1473A13E1B047CD78013A16E147CD78013A17E14747
:2002A600CD7801C92100E03A00E16F703C3200E1C9ED5B08E12A06E1A7ED52C83EA0B2672F
:2002C6006B4613CBAAED5308E1CB78281E78FEF8D0FEF03805AF320EE1C978E60F3210E19B
:2002E60078E6F0320EE1AF320FE1C93A0EE1FE00C8FEC02815FED028113A0FE1FE00C228EC
:20030600033C320FE1783211E1C9783212E13A10E1473A0EE1B047CDAA023A12E147CDAA7E
:2003260002C9783212E13A10E1473A0EE1B047CDAA023A11E147CDAA023A12E147CDAA026B
:20034600C9ED5B0CE12A0AE1A7ED52C83EC0B2676B4613CBAAED530CE1CB78281E78FEF862
:20036600D0FEF03805AF3213E1C978E60F3215E178E6F03213E1AF3214E1C93A13E1FE000A
:20038600C8FEC02815FED028113A14E1FE00C2B8033C3214E1783216E1C9783217E13A1525
:2003A600E1473A13E1B047CDAA023A17E147CDAA02C9783217E13A15E1473A13E1B047CDAB
:2003C600AA023A16E147CDAA023A17E147CDAA02C92100E03A01E16F3A00E1BDC83E10D372
:1F03E6001BDB1BCB5FC07ED31E7D3C3201E13E05D31B3EE0D31B3E05D31B3E60D31BC9FE
:00000001FF
---------------------------------------------------------------------------
このマシンの場合、開発環境として、僕の自室の机の上には、
・このAKI-80マシンのROMソケットに挿さった自作のROMエミュレータに
アセンブラのプログラムを開発しては刻々と転送してリセットするため
のWindowsノート(プリンタポートで接続)
・このAKI-80マシンのホストとしてプリンタポートから接続し、ホストの
動作(上記Cプログラム)を刻々と開発したWindowsノート
・MIDI送り、MIDI受けの情報を設定したり表示するMAXパッチの走る
PowerBook
の3台が並び、インターフェース部分のディスクリート回路、プリンタポートの
ケーブルのピン配置、AKI-80のアセンプラプログラム、ホストのCプログラム、
チェッカのMAXパッチのどこに些細なバグがあっても全体はまったく動かない(^_^;)、
という状況でそれぞれを並行して開発していきました。
ピンと来る人は少ないかもしれませんが、これはなかなか無謀な開発です。
自分としては、数年前にはこの作業を3ヶ月以上かかって行ったことを思うと、
約2日でできたというのは、ちょっと嬉しいです。(^_^)
RE:AKI-80でインテリジェントMIDI I/F 97/04/28 16:03
> ちょっと時間がかかるとは思いますが,完成しましたら,またレポート
> いたします。
急がなくても大丈夫ですので、じっくり作って下さい。ちなみにこのマシン、
音情研の夏シンポでは持参しましょう。そこそこ小さくできました。(^_^)
本当は、ファームウェアでまだ若干、仕様向上の余地があるのですが、
これはリクエストが来たら対応することにします。
RE:NTTのICCのことなど 97/05/04 15:57
> 新宿の初台にある東京オペラシティタワーというビルの中に、NTTインター
> コミュニケーション・センター(ICC)という美術館があります。
あぁ、ICCに行ってきましたか。そういえばオープンしたのですね。
僕はオープン前に行っていました。(^_^;)
> 音関連では、自分の体内の音を聞く部屋、
実はあれは、来場者に心臓の音のセンサを取り付けて、自分の体内音を無響室で
聞かす、というのがウリなのですが、センサがどうしてもうまくいかず(^_^;)、
作曲者自身の音をサンプリングしたCDを鳴らしているだけだそうです。
あまり、それでは面白くないような気もしますが...(^_^;)
実はこのところ、かかりっきりでICCに関連したあるシステムを開発するために
実験しているところなのです。オープン前に行ったのも打合せのためでした。
ICCのオープニング企画のビエンナーレに入選した○○さんから、
突然に指名で特製センサの開発依頼メイルが届いたというわけです。
僕の普通のMIDIセンサは、普通はだいたいケースの穴開けからハンダ付け、
ソフトの開発まででおよそ1-2日仕事なのですが、今回のは何ヶ月もかかり
そうです。(^_^;)
あるスペース内で同時に動く複数のプレーヤの位置と頭の向きをリアルタイム
に検出しつつ、それぞれの心拍とスイッチ操作も含めてセンシングし、全て
ワイヤレスで集めてMIDI化します。システムはここにさらに音響系とリアル
タイム3次元CGマシンがそれぞれのプレーヤごとに走り、ヘッドホンとHMDに
送る、というものです。(^_^)
ハリウッドのモーションキャプチャーを買ってくればそのまま出来ることを
(ただし何億もかかります(^_^;))、二桁安く作るというのは面白いことです
が、なかなか大変です。いま自宅では、居間の赤外CCDカメラの映像がマイクロ
ウェーブで僕の部屋に届いたり、複数のワイヤレスの電波が行き来しています。
机の上も画像処理ボードの入ったパソコンラックや多数のパソコンで占有されて、
まったく落着かない状態です。あと1-2ヶ月でカタがつけばいいのですが、失敗
するわけにいかないものの、まだ見通しは立っていません。既に買った部品は
100万を大幅に超えています。(^_^;)
...と忙しい充実のゴールデンウイークを過ごしていると、IRCAMに納品
したセンサの噂をかぎつけて別のIRCAMの人からオリジナルマシンの開発
依頼の打診メイル(うーー、英語じゃぁ...(^_^;))が届き、さらに国内の
ある先生からは、英語の詩を音楽化したい、というこれまた面白いテーマの
打診メイルが届きました。こちらに関しては、一つ、新しい作曲のアイデア
も触発されたところで、新作に使おうかな、と思っています。(^_^)
RE:アンデパンダンプロジェクト(^^;) 97/05/12 17:33
> 生体センサの件,いろいろ考えたのですが,いきなり結論を出すのは
> 極めて困難(^^;)ですので,今考えている事をそのまま,あまり脈絡無し
> に書きますね(^^;)。独り言みたいなものと思って下さい。
いいですねーこのノリ。(^_^)
色々とやりとりしながら考えていきましょう。うっすらとした予感ですが、
このプロジェクトはもしかすると凄いところに行き着く可能性があります。
> 1.音楽の発生はアルゴリズムや通常の演奏(イメージ)にて行い,生体特有
> のゆらぎを「効果」として利用する。(テンポ,音程等をゆらがせる)
これは、もっとも安全です。ただし、見て聞いている人はもとより、
やっている本人でもこの「効果」がよくわからん、という事になります。
僕も、よくその関係のところがわからん、とよく言われます。
> 2.意識にてコントロールできる生体信号で直接演奏をコントロール。
> 筋肉からの信号で演奏するのが一般的。
> 「練習」すればイメージに合わせた演奏が可能。
> しかし演出を上手くやらないと「通常の楽器の演奏」と変わらなくなって
> しまう。
これも、通常の楽器の演奏と変わらないほどしっかりとしていれば
まだマシです。(^_^;)
去年の作品だと、自家製曲げセンサによる動きは手に持っているので
見て分かりやすいのですが、関節センサが衣装の下に隠れるだけで
「わからん」と言われます。まして、それがハンドパワーや念力
だったりすると(^_^;)、これはもう、いくら努力して結果が出て
いても、わからない事になります。
ここで美学的な問題となるのですが、
「わからなくてもいい」
という姿勢と、デモンストレーションのように
「わからないと意味がない」
という両極端な意見となります。
> 3.無意識に発生する生体信号にて演奏をコントロール。
> プレイヤーが意識しない感情等の動き(情動)を表に引っ張りだせる
> 面白味はあるが,生体信号と情動との相関を上手く把握しないと,
> イメージと違う方向にどんどん進んでいってしまう可能性がある。
> また舞台上で通常の精神状態でいられるか(^^;)という問題と,信号に
> よってはタイムラグの問題もある。
これは持っていき方ですが、一番、難しいかもしません。何より難しい
のは、作品を創る側が納得する、という障壁がいちばん高いかもしれない
ところです。(^_^;)
> それで以上の事を念頭において,自作可能な生体センサを分類してみます。
> (意識的コントロール)
> ・筋肉の動き (機械的,電気的(筋電))
> ・目の動き
> ・発声
> (無意識的ではあるが,意識的コントロールも可能)
> ・呼吸
> ・まばたき
> ・重心 (両足の荷重分布)
> (無意識的コントロール)
> ・脳波
> ・心拍
> ・皮膚電気抵抗
うーーーーむ、これらをズラッと並べて「自作可能な生体センサ」と言うと
いうのは凄いですよ。(^_^)
僕はこれまでにやったのは、
> ・筋肉の動き (機械的)
だけ、ということになります。(^_^;)
いま心拍センサを作っているのと、新作で「発声」を考えているところ
ですが。
> で私はどう考えているかですが,できれば心の動きで音楽作りたいですね。
> しかしどうやるかは未だ白紙です。
> いっそ割り切ってウケ狙いで行ってもいいかなとも思ってますが(^^;)。
怪しくていいですね。(^_^;)
無意識/半無意識の生体情報で「心の動き」と言ってしまうためには、
パラメータでリアルタイムCGを生成/動かす、というのを同時に投射
する、という手がありそうです。ズルイかなぁ。(^_^;)
RE:アンデパンダンプロジェクト(^^;) 97/05/18 21:44
> 自作できる脳センサといえば脳波です。
> 音楽応用という点では,まだまだ脳波も捨てたもんじゃないと思って
> ます。
うーん、いよいよ本格的に脳波ですか。(^_^)
ステージ上でPerformanceという特別な場でうまく出るか、拾えるか、
というのが課題かもしれませんね。もっとも、何か出ていればソレッぽく
するのはMAXで簡単だという意見もありますが。
> 脳波vs音楽のアプローチとしては2つの方向があります。
> 1.脳波で音楽を生成。
> 2.音楽で脳波をコントロール。
うーーむ、悩ましいですね。
1.は「そよ風の音楽」「DNA配置の音楽」「宇宙線ノイズの音楽」など
と同じで、まぁ結局のところは音楽情報化する人の匙加減を反映した
ものになります。「これが脳波音楽です」と真顔で言えた人の勝ちです。(^_^;)
2.も、ステージ上でブルーワーカーを縮めて汗がほとばしっている
のだったら振る舞いとコントロール情報との同期というか関連が見える
のですが、オ○ム風のヘッドギアからいくら電線が出ていてコンピュータ
につながっていても、脳波の制御との対応は見えません。とってもアヤシイ
だけ(^_^;)になりかねないところが難しいです。
> ・・・で,私がどう取り組むかですが,難しいですね。(^^;)
> 脳波は"声"ではなく"声の意味"と相関があるそうですから,勝手に音楽
> に拡張して,脳を"音楽の意味センサ"と考え,それを音楽のリアルタイム
> 発生にフィードバックしてみたらどうかなぁ・・
> とか思っていますが,どんなもんでしょう?(^^;)
確かに、テキストとして詩の朗読をPerformerが行うと、その内容の感情の
起伏によって脳波の変化は拡大するかもしれません。これをリアルタイムCG
で投射すれば、関係は少しは理解できるかもしれませんが。
実際に脳波の波形を眺めると、アイデアが湧くかもしれませんね。
僕はちょっと当面は心泊センサと画像認識にハマッていて余裕がないのですが。
あるいは、声楽の学生が脳波センサをつけながら、意味のある歌詞の音楽を
歌唱している最中の脳波を調べてみたいですね。
あ、カラオケでもいいのですね。(^_^;)
RE:RE^2:アンデパンダンプロジェクト(^^;) 97/05/19 19:56
今日は一日、ICCのための画像センサを開発していました。京都にある某社の
画像ボード2枚と、それぞれに対応した画像処理ライブラリというのを合計
50万円近く買っていますので、実はライブラリがイモで思った速度が出ない
とかボードのスペックがイマイチで性能が出ない(^_^;)、などと簡単に諦める
訳にもいきません。仕方なくライブラリを見捨てて自前でアセンブラ的に
ボードを叩くなど、大幅に仕事が増えそうです。(^_^;)
そして、どうにもライブラリがマニュアル通りの動作とならない、ボードの
マニュアルを見ると複数のページで情報が矛盾している(^_^;)、という事を
確認して電話してみると、
「あぁ、それはライブラリのバグですのでフロッピ送ります」
「あぁ、それはマニュアルの間違いです」
とまぁ、明快でした。(^_^;) うーーーーーーーーむ。(^_^;)(^_^;)
あと1ヶ月ほどはこの路線で頑張ってみて、どうしても性能が出なかったら
この50万は捨てですね。予算は大赤字です。
> ライブで生体センサを使うなら,やっぱり「意識的コントロール」
> ですね。そうなるとトップに出てくるのは「筋電」センサです。
> 勝つためには(^^;),機械的センサでは難しい,筋肉の速い動きや
> 弱い動きをどれ位抽出できるかがポイントです。また筋電は筋肉の
> 動きと同時に(ある意味では実際の動きより速いくらい)に検出でき
> ますので,そこら辺りも機械的センサより有利です。
タナカアタウのBioMuse演奏も、あまり高速なレスポンスというような
方向ではなかったと思います。今年の8月には山口のイベントで来日して
たぶん演奏しますから、できたらまた見たいと思っています。
そういえば、先日のJACOM韓国公演では、大阪芸大の▽▽クンが、
ほぼ裸の全身のあちこちに曲げセンサをビニールテープで取り付け(^_^;)、
まさに和製タナカアタウ状態のライブ演奏を行いました。僕はその時、
彼を「日本のタナカアタウ」と正式に認定したところです。(^_^)
> PS.余談ですが筋電の発見者は皮膚にわざと水泡をつくり,その中に
> 電極をつっこんだそうです。(^^;;;;)
うーーーーむ、痛々しいですが、なかなかキますねぇ。
だれか、針灸の業を持っている人はいませんか? (^_^;)
音楽演奏とMAXとの絡み方 97/05/21 09:06
> >>DSP-MAXならMIDIレベルだけでなく音響レベルで
> >>MAXできるのです。
> MACで出来るのですか、MIDIデータだけだとつまらないのですが。
ここで整理しておきましょう。楽譜が無いと演奏できないよ、というような
受動的な音楽演奏家(^_^;)は放っておいて、ここでは多くのアグレッシブな
音楽家がいかにMAXをパートナーとして音楽するか、という戦略についてです。
なお、リアルタイムのパフォーマンスですから、当然、MAXに演奏者の
ニュアンスを伝えるためのセンサはいずれでも使います。これはデフォルト
として省略しています。
(1)MIDI楽器とMIDI音源とMAXを使う
演奏にMIDI楽器やオリジナルMIDIセンサ(^_^)を使って、この演奏情報を
MIDIとしてMacのMAXに食わせます。あとは楽しい楽しいMAXプログラミング
でアルゴリズムを仕込んで、MAXの出力はMIDI音源や原人コッツ楽団です。
ただし、最近は物理モデル音源が出てきましたので、これを丁寧にMIDI
制御してやれば、FMやPCM時代の無愛想な音よりはいいものが出てくる
かもしれません。
また、生ピアノのMIDIピアノを使ったタイプは、分類上はここに属します。
あるいは、サンプラーに取り込んだ自然音響をMIDIで鳴らすのもそうです。
(僕の場合には、IndyをHDRとしてMIDI制御して鳴らすのですが、同じです)
電子音源の音が嫌いな作曲家はこの方針をとる訳です。(^_^;)
(2)生楽器とMIDIエフェクタとMAXを使う
コントローラは別にあるとして、演奏家はアコーステック楽器を演奏して、
この音響をマイクで拾います。(同時にピッチtoMIDIで電子音源を利用する
場合も多いです)
そして、センサやピッチtoMIDIでの制御の部分をMIDI経由でMAXで組んで、
これをMIDI制御できるエフェクタに与えて、生音響へのエフェクトをインタ
ラクティブにする、というものです。僕の師匠も、最初はここからでした。
世界を舞台に活躍する木村まりさん(作曲家、バイオリニスト)は、最初は
次のISPWを[ピッチ抽出+エフェクタ]として使っていましたが、性能が
よくないのと重たい(^_^;)ために、最近のツアーではPowerBookとアメリカ
のどこかのピッチtoMIDIとアメリカのどこかのエフェクタを愛用しています。
「竹管の宇宙」のシステムでも、生音にヤマハのエフェクタをかけて
これをMIDI制御し、さらに空間を振り回すためにFOSTEXのMIDIミキサー
を2台使って、4チャンネルのボリュームをMIDIでグワグワと回しました。
(3)生楽器とDSP-MAXを使う
このMAXは、今は亡きNeXTコンピュータに、今は亡きISPWというDSPボードを
入れる、という環境でのみ動きます。(^_^;) 日本では国立音大の莱さんの
ところ、慶応の岩竹さんのところ、あと振津さんが使っていましたっけ。
既にこのコンピュータとボードは生産されていないので、プレミアがついて
まだまだ現役らしいです。MAXのオブジェクトとして「FFT」などがあって、
音響信号処理DSPのアルゴリズムをMAX感覚で組めます。(^_^) 情報としては
MIDIもまったく対等に使えます。
これがシリコングラフィクス(SGI)に移植されて出る、と言われてからもう
3年、まだ出てきません。IRCAMの連中はSGIへの移植作業よりも、持っている
古いマシンを使って作曲する方が楽しいのでしょう。(^_^;)(^_^;)
ただし、SGIはIndyからO2になっても、基本的にオーディオ部分はあまり
変わっていませんので、性能的にはISPW(i960が1枚に4個)ほどは出ない
と思われます。
また、MacのDSPボード対応とか、DSPボードを積んだNeXTSTEPマシンへの
移植の噂もありますが、まぁ無理でしょう。(^_^;) Windowsというのは
論外です。(^_^;)
....というようなところです。(3)が出てこない(出てくると、
値段は70-80万という話ですが)ので、僕はIndy上でC言語でGranular
Samplingのソフト(自分で書くので当然、MIDI制御も可能です)や音響信号
処理のソフトを書いたりしていますが、MAXと違ってまったく不便です。(^_^;)
ということで、Macユーザであれば(1)か(2)ということになります。
ただし、まだまだ可能性はいくらでもあると思います。
ここだけの話(^_^;) 97/06/02 07:03
音楽情報科学研究会・夏のシンポジウムの案内についての追加案内です。
例によって「ここだけの話」(こことJACOM-ML)ということで、
既に僕のチュートリアルで用意したレジメから、内容をざっとお知らせ
いたします。ここだけの話ですので、他言は無用です。(^_^;)(^_^;)
夏シンポに参加できない方は、個々の項目について、ここで議論を提起
していただいても結構です。
けっこう、刺激的なフレーズが並んでいると思うのですが。(^_^;)
■チュートリアル「MIDIの活用とMIDIのプログラミング」■
===================================================
MIDI とは
===================================================
● MIDI以前の時代のComputer Music
・電子音楽とノンリアルタイムミュージック
・アナログシンセとCV
・アナログシーケンサ
・ドラムマシン
・電子オルガンの自動伴奏/自動演奏
・楽器拡張としてのMIDI
・MIDIシーケンサ
・MIDI音源
・MIDIシーケンスソフト
● MIDIの概要 (1)ハードウェアとプロトコル
・電気的条件と電気的分離
・シリアル通信のプロトコルとUART
・ボーレートと誤差
・芋蔓THRUとMIDIケーブル長
・ハードウェア階層の遅延に関する誤解
● MIDIの概要 (2)MIDI通信ソフトウェアの条件
・MIDI送信
・MIDI受信と割り込み
・FIFOバッファリング
・MIDIのマージとは
・時間管理とタイムベース
・二つのイベント時間管理方式:絶対時間と相対時間
・二つのイベント記述方式:STGTとデルタタイム
・二つのデルタタイム記述方式:MPUとSMF
・ソフトウェア階層の遅延に関する真実
● ポストMIDIの動き
・カラオケ
・ZIPI
・RMCP
・インターネット・ストリーミングMIDI
===================================================
MIDI 規格と SMF 規格と GM 規格
===================================================
● MIDIの概要 (3)MIDIメッセージの概説
・ノートイベント
・プログラムチェンジ
・コントロールチェンジ
・ベンド
・その他パラメータ
・リアルタイムメッセージ
・エクスクルーシブメッセージ
・SMPTE同期関係
・メッセージのオリジナル化
● MIDIの概要 (4)MIDIの長所と短所、活用の注意点
・メーカの出す仕様と隠す仕様
・ソフトウェアMIDIツールの危うさ
・音楽情報科学にMIDIを使うことの危険性
・MIDIに「同時」は無い
・タイムベースに関する迷信
・音源とアサイナについて
・音源の遅延に関する迷信
・MIDIの長所
・MIDIの短所
● SMF規格の概要
・SMFとは
・SMFフォーマット0
・SMF<-->STGTコンバータ
・音楽情報科学におけるSMFの活用法
● GM規格とGS音源とXG音源
・GM規格とカラオケ
・ローランドとGS音源
・ヤマハとXG音源
・アカイ、カシオ、カワイ、コルグなどの動向
・楽器業界とカラオケ業界とゲーム業界とネットワーク業界
・インターネットとソフトウェアシンセサイザ
===================================================
MAX による MIDI プログラミング
===================================================
● MAXとは
・マックス・マシューズ先生とIRCAM
・プログラミング不要
・オブジェクト指向
・階層化/構造化
● アルゴリズム作曲/interactive Computer Music
・MAXとアルゴリズム
・リアルタイム作曲
・インタラクティブ・アートのツールとしてのMAX
● MAXパッチの実例
・基本パッチのデモ
・カオスのシミュレーション
・センサのパターンマッチング
・時間的制御
・Computer Music作品での実例
● MAXのプログラミング実習
・ [1]:パッチとオブジェクト
・ [2]:bangトリガとバリュー
・ [3]:階層化と構造化([s][r]とサブパッチ)
・ [4]:MIDI情報のプログラミング
・ [5]:seqオブジェクト
・ [6]:時間要素(metro/line/delay/pipe)
・ [7]:数学的アルゴリズム
・ [8]:センサ入力のパターン認識
・ [9]:乱数と確率分布の与え方
・[10]:テーブルの活用
● MAXの新しい展開
・スピーチ
・サウンド
・画像駆動
・音響信号処理
・スコア
===================================================
PC での MIDI プログラミング
===================================================
● パソコンとMIDI処理との関係
・「MIDIインタフェース」の形態
・無電源タイプの落とし穴
・RS232Cタイプの問題点
・PowerBookでの注意点
・MIDI送信はタコでもできる
・MIDI受信は高級パソコンでも落とす
・リアルタイム処理の分業を考える
・OSとMIDIの相性
● ローランドMPU-401とインテリジェントMIDIインターフェース
・MPU401の時代的要請
・MPU401の動作
・UARTモードの移行
・「サウンドブラスター互換」の罠
● PC9801でのMIDIとIBM-PCでのMIDI
・MPUはMIDI処理の王道
・RS232Cタイプの注意点
・Windows時代のMIDI処理
● アセンブラによるMIDIプログラミング
・MIDIボード/UARTの設定
・割り込み処理の設定
・MIDIバッファの確保
・MIDI処理本体の記述
・Cプログラムとの結合
● CによるMIDIプログラミング
・ライブラリの活用
・ライブラリの自作
・メインルーチンでの処理
・割り込みルーチンとの関係
● JavaによるMIDIプログラミング
・Javaでできることとできないこと
・Java-Cコンバータ
・MIDIプラグインを叩く
・MIDI処理ドライバとの通信
===================================================
Unix 上の MIDI プログラミング
===================================================
● UnixマシンとMIDI環境
・Unixの強みと弱み
・MIDI入力の恐ろしさ
・Unixシーケンサとモタり
● IRIX(SGI)のMIDI環境
・IRIX Media Library
・そのバグと対策パッチ
・MIDI処理の注意点とポイント
● IRIX/Motif/Open-GL上でのCによるMIDI/CGのプログラミング
(添付資料を参照)
● RMCPを用いたMIDIプログラミング
(添付資料を参照)
===================================================
MIDI とリアルタイム Computer Music
===================================================
● MIDIセンサ
・AKI-80の活用
・センサキットの活用
・A/Dの方法の検討
・MIDI化の手法
・MIDIセンサの実例
● センサフュージョンとパターン認識
・イベント検出
・データ変換
・シーン切り替え
・安全弁について
・センサフュージョンのポイント
● MIDIによるグラフィクス・コントロール
・MAXでDrawする
・MAXでPICTを動かす
・MAXでQuickTimeを動かす
・DirectorのMIDIオブジェクト
・ビデオ・スイッチング
・Open-GLでMIDI制御CGソフトを作る
● リアルタイムComputer Musicの実例
● 問題点と課題の検討
● まだ実現できていない事[世界最先端への道]
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
...しかし、こんな内容、とうてい5時間ほどでやれるモノでは
ありませんねぇ。(^_^;)(^_^;)
|