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