*このパートはH8/300/TinyにMidiを導入するためのノウハウを蓄積するための場所です*
関連項目:

  
H8/3664
  
AKI-H8
  
PallarellPort増設
  
VHDL coding

  前の頁  次の頁
前頁では受信したMIDI信号を復調し、選択した受信結果を結果をポートから出力するまでのルーティンを解説した。ここではその応用例として、コントロールチェンジ信号の復調システムを構築する。以下に示すのは通常のMIDI受け→再送信のルーティンである。これを改造することで、コントロールチェンジ信号の復調とデータアウトが可能となる。具体的に変更する場所を赤字で示す。


rx_midi_check:
  
cmp.w r5,e5          ;r5: rx_top, e5: rx_end
  
beq _skip
  
bra _rx_routine
  
_skip:
  
rts

_rx_routine:
  
sub.l er1,er1
  
mov.w e5,r1
  
mov.b @(rx_fifo,er1),r0h  ; rx data -> [r0h]
  
inc.w #1,r1
  
bclr #1,r1h          ;rx buffer 512
  
mov.w r1,e5
  
btst #7,r0h          ;detecting status or data
  
beq after_second      ;jump when detecting data
  
cmp.b #h'F0,r0h
  
bls no_special
  
rts

no_special:
  
mov.b r0h,@sb
  
sub.b r1l,r1l          ; clear r1l -> @fsm
  
and.b #h'F0,r0h
  
mov.b #h'C0,r1h
  
cmp.b r0h,r1h
  
beq mark_2byte
  
mov.b #h'D0,r1h
  
cmp.b r0h,r1h
  
beq mark_2byte
  
bra mark_3byte
mark_2byte:
  
bset #is_2byte,r1l
  
mov.b r1l,@fsm
  
rts

mark_3byte:
  
bset #is_3byte,r1l
  
mov.b r1l,@fsm
  
rts
after_second:         ; we have rx data in [r0h]
  
mov.b @fsm,r1l
  
btst #is_2byte,r1l
  
beq check_3byte
  
mov.b @sb,r0l
   jsr @tx_fifo_set

   mov.b r0h,r0l
  jsr @tx_fifo_set

  
rts

check_3byte:
  
btst #has_byte2,r1l
  
bne send_3byte 
  
mov.b r0h,@byte2
  
bset #has_byte2,r1l
  
mov.b r1l,@fsm
  
rts

send_3byte:
 
  mov.b @sb,r0l
   jsr @tx_fifo_set
   mov.b @byte2,r0l
    jsr @tx_fifo_set
   mov.b r0h,r0l
   jsr @tx_fifo_set

  
bclr #has_byte2,r1l
  
mov.b r1l,@fsm
  
_end_rx:
  
rts


要はMIDI信号を再送出する部分をソックリ作り替えればよい訳だ。

まず、    
 
mov.b @sb,r0l
jsr @tx_fifo_set
この部分はステータスバイトのなので何れも不要。
 
次の部分
 
mov.b r0h,r0l ここではPGMの番号をやり取りしているので, r0l を、、、、
 
mov.b r0h,@pdr5 @pdr5 とすることで、ポート5からPGMナンバーを出力することが出来る。
 
そして、、、
 
mov.b @byte2,r0l
mov.b r0l,@pdr8
mov.b r0h,@pdr1
こちらは、コントロールチェンジを2ポートから出力している。ただし。ポート1の出力は変則的な配置なので、それに合わせた手当が必要となる。
      


折角なので、MIDI受信データを振り分ける仕組みについて解説を行っておこう。先に例示したMotorMix用の振り分けシステムと同様に、受信したヘッダーデータを判別してフラグを立てつつ、必要とあればヘッダーの次に来るデータを専用のレジスタに格納している。MIDIデータのうち、プログラムチェンジとプレッシャーは2バイトのデータ幅なので、この2つの種類のデータを確認した場合のみ、2バイトデータとして扱って再送信している。他のデータは上流で堰き止められているSySexを除いて基本的には筒抜けとなる。

つづく→