since 2006 ~ 2013
自作電子楽器ノブログ
ブログ更新は以下に移行中です。
->Analogfeeder.com
自作midiデバイス2修正中
f0097833_1414289.jpg

自作midiデバイス1の応用をやっていきましょう。

-------スイッチに反応してmidi信号を送る-------
前のアセンブラでは、こちらの意図にかかわらず、1秒ごとにmidi信号を送るだけのものでした。
これでは、何にも面白くないので、スイッチに反応してmidi信号を送るようにしてみましょう。


----------テスト動画----------
スイッチを押すごとにmidi信号送信

注意 音が出ます!!

音が悪いですが・・・
このようにかなり面白いことができそうです。



注意してほしいのがチャタリングという現象です。

チャタリングとは、機械接点がOFF→ONまたはON→OFFへ移行する際、瞬時に変化するのではなく、ON/OFFを何回か繰り返しながら状態が移行する現象のことです。

チャタリングの継続時間は、数100μs~数msと人間から見ればほんの一瞬のことで感知することはできませんが、高速な電子回路にとってはだいぶ長い間オンオフが繰り返されているように感じるはずです。
f0097833_033148.jpg

スイッチを組み込む場合、これを防ぐ必要があります。

さらに
------複数のスイッチを入力させてmidi信号を送る-------
ことをやってみます。

これは、実際にmidiデバイスを作るうえでとても有効です。
これができたらMPCみたいにできます。

さてそれをするにはどうすればいいでしょうか?

もし使っているPICの入出力端子が8個あるとしたら、スイッチは8個つなげばよいですね。
たしかに8個つないでそれぞれのスイッチが押されたときにそれぞれ違うmidi信号をおくってやればいいわけです。
しかし、8個じゃあなーあ。。と思いませんか?



実は工夫次第で、入出力端子が8個でなんと16スイッチに拡張できるのですよ!!

その便利な方法はキーマトリクスと呼ばれる方法です。
これは別に凄い方法ってわけではなく、普通に電卓とかパソコンのキーボードに使われています。


どういう仕組みかというと、
f0097833_2093927.jpg

こんな感じです。
これで8入出力で16スイッチです。

どんな感じで読みこむかというと、
0,1,2,3端子を出力、4,5,6,7端子を入力に設定します。
そして、
一番上の行の四つのスイッチの状態を読みます。
0端子をLoにして、あとの1,2,3をHiにします。
そして、4,5,6,7端子で電圧を読みます。
もし、一行目の一番左のスイッチがonならば、端子4はLoになり、ほかの5,6,7はHiのままです。
つまりonのスイッチにより、入力にLoがおくられます。
Offならば、Hiです。
次に1端子をLoにして、0,2,3をHiにします。
そして、同様に4,5,6,7を読みます。

以上のことを繰り返して、計16のスイッチの状態を作り出します。

別に4×4にしなくても、2×6とか3×5とかもできます。
けれど、8入力では、4×4が最大になりますね。

アセンブラはこちらです。(注意書き方が自己流のため更新される場合があります)
; CPU configuration
processor 16f84A
include
__config _HS_OSC & _WDT_OFF & _PWRTE_ON

; variables


tempequ H'1F'
xmitequ H'1D'
check0 equ H'0E'
j equ H'1B'
check1 equ H'0F'
cnt04 equ H'0C' ;0.4mS待つサブルーチン用カウンタ
cnt20 equ H'0D' ;20mS待つサブルーチン用カウンタ


; Program

org0


start:
bsf STATUS,RP0 ; ファイルレジスタSTATUSのRP0をセット(1)する → バンク1
movlw H'00'
movwf TRISA
movlw H'01'
movwf TRISB ; ファイルレジスタTRISAの1と2ビット目のみON → RA0とRA1は入力
bcf STATUS,RP0 ; STATUSのRP0をクリア(0) → バンク0
clrf check0

main

loopa1
movlw H'EF'
movwf PORTB
btfss PORTB,0 ; スイッチの状態チェック
goto t1 ; スイッチがONの時
bcf check0,1
loopa2
btfss PORTB,1 ; スイッチの状態チェック
goto t2 ; スイッチがONの時
bcf check0,2
loopa3
btfss PORTB,2 ; スイッチの状態チェック
goto t3 ; スイッチがONの時
bcf check0,3

loopa4
movlw H'DF'
movwf PORTB
btfss PORTB,0 ; スイッチの状態チェック
goto t4 ; スイッチがONの時
bcf check0,4
loopa5
btfss PORTB,1 ; スイッチの状態チェック
goto t5 ; スイッチがONの時
bcf check0,5
loopa6
btfss PORTB,2 ; スイッチの状態チェック
goto t6 ; スイッチがONの時
bcf check0,6

btfsc check0,1
goto loopa1
btfsc check0,2
goto loopa1
btfsc check0,3
goto loopa1
btfsc check0,4
goto loopa1
btfsc check0,5
goto loopa1
btfsc check0,6
goto loopa1
btfsc check0,0
goto loopa1
goto noteoff

t1
call T20mS
btfsc PORTB,0
goto loopa1
btfsc check0,1
goto loopa2
goto noteon1
t2
call T20mS
btfsc PORTB,1
goto loopa1
btfsc check0,2
goto loopa3
goto noteon2
t3
call T20mS
btfsc PORTB,2
goto loopa1
btfsc check0,3
goto loopa4
goto noteon3
t4
call T20mS
btfsc PORTB,0
goto loopa1
btfsc check0,4
goto loopa5
goto noteon4
t5
call T20mS
btfsc PORTB,1
goto loopa1
btfsc check0,5
goto loopa6
goto noteon5
t6
call T20mS
btfsc PORTB,3
goto loopa1
btfsc check0,6
goto loopa1
goto noteon6
noteon1:
movlw0x90
movwfxmit
callsendmidi

movlw0x3C
movwfxmit
callsendmidi

movlw0x7F
movwfxmit
callsendmidi
bcf check0,0
bsf check0,1
goto loopa1

noteon2:
movlw0x90
movwfxmit
callsendmidi

movlw0x3C
movwfxmit
callsendmidi

movlw0x3F
movwfxmit
callsendmidi
bcf check0,0
bsf check0,2
goto loopa1

noteon3:
movlw0x90
movwfxmit
callsendmidi

movlw0x3C
movwfxmit
callsendmidi

movlw0x19
movwfxmit
callsendmidi
bcf check0,0
bsf check0,3
goto loopa1
noteon4:
movlw0x90
movwfxmit
callsendmidi

movlw0x3C
movwfxmit
callsendmidi

movlw0x18
movwfxmit
callsendmidi
bcf check0,0
bsf check0,4
goto loopa1

noteon5:
movlw0x90
movwfxmit
callsendmidi

movlw0x3C
movwfxmit
callsendmidi

movlw0x17
movwfxmit
callsendmidi
bcf check0,0
bsf check0,5
goto loopa1

noteon6:
movlw0x90
movwfxmit
callsendmidi

movlw0x3C
movwfxmit
callsendmidi

movlw0x16
movwfxmit
callsendmidi
bcf check0,0
bsf check0,6
goto loopa1

noteoff;
movlw0x80
movwfxmit
callsendmidi

movlw0x3C
movwfxmit
callsendmidi

movlw0x7F
movwfxmit
callsendmidi
bsf check0,0
gotoloopa1


sendmidi:

startb:bcfPORTA, 0x02

movlwD'23'
movwftemp
loop1:decfsztemp,f
gotoloop1

movlwD'8'
movwfj

sendloop:
rrfxmit,f
btfscSTATUS, C
gotosend1

send0:nop
nop
nop
nop
bcfPORTA, 0x02
gotoendloop

send1:nop
nop
bsfPORTA, 0x02
nop
nop

endloop:

movlwD'22'
movwftemp
loop2:decfsztemp,f
gotoloop2

decfszj,f
gotosendloop

stopb:
nop
nop
nop
nop
nop
bsfPORTA, 0x02
movlwD'26'
movwftemp
loop3:decfsztemp,f
gotoloop3

return

T20mS
MOVLW D'50' ; 50(20mS)
; MOVLW D'100' ; 100(40mS)
MOVWF cnt20 ; (ループ回数として50をセット)
T20LP CALL T04mS ; 0.4mS待つ
DECFSZ cnt20,F ; ループ回数-1して0になったら次の命令をスキップ
GOTO T20LP ;
RETURN ; このサブルーチン呼出し元に戻る


; << 0.4mS待つサブルーチン >>
T04mS
MOVLW D'249' ; 249
MOVWF cnt04 ; (ループ回数として249をセット)
T04LP NOP ; 何もせず1サイクル消費
DECFSZ cnt04,F ; ループ回数-1して0になったら次の命令をスキップ
GOTO T04LP
RETURN ; このサブルーチン呼出し元に戻る
end
[PR]
by toucyy | 2006-07-06 14:09 | 自作midiデバイス
<< 蜂の巣 光悦 >>


PRODUCTS


レコードでの演奏(シンセサイザー)を可能にする
"Anvs"(アンブス) - Analog Vinyl Synthesizer -

Midi信号を他出力する
"Midiv" -Midi Distributor Divider-

ターンテーブルアニメーションを可能にする
"Taf1" -Turntable Animation Flasher-

LEDを使用したトリッキーな映像制作装置
(Taf1の機能拡張版)
"Taf2" -Turntable Animation Flasher 2-



PROFILE




Toucyy

某外資系半導体メーカー勤務、その傍らDJの経験とハードウェア、ソフトウェアエンジニアリングのバックグランドを生かし活動中。自作電子楽器でLive & DJ

patlo (yamamo2 + toucyy)
picnome、picratchbox開発者yamamo2さんとユニット組み、本格的に自作電子楽器でLiveやってます。

電子楽器と音楽と人とのつながりをいろいろ考えるのが最近のはまり。

------CONTACT------
"toucyyアットgmail.com"
(メールを送信する際はアットを@に変えてください。スパム対策用です)



イベント&ライブ等


2010年5月22~23日 MTM05 出展とプレゼンテーション "anvs"
http://www.oreilly.co.jp/mtm/05/
2010年11月20~21日 MTM06 出展 "anvs modular"
http://www.oreilly.co.jp/mtm/06/
2010年11月21日 Analog Synthesizer Builders' Summit 出展 "anvs modular"
http://analog-synth.jp/summit10/e_index.html
2011年12月3~4日 MTM07  出展 "Taf"
http://www.oreilly.co.jp/mtm/07/

2012年1月14日 TMUG20 (Tokyo Max Users Group) プレゼンテーションとライブデモ
http://tokyomax.jp/?p=1670
2010年7月10日 TMUG16 (Tokyo Max Users Group)  ライブ
http://tokyomax.jp/?p=696
http://toucylab.exblog.jp/14084312/




紹介記事



もうライブで使えるレベル――DIY楽器がますます進化



10th Analog Synthesizer Builders' Summit Party



Engadget Japan



ASCII.jp 「理屈にあわない楽しさを求めて 電子楽器をつくる人の哲学」



Sampling Loveのblog



VESTAX JAPAN



メディア&SNS



twitter

YouTube

DJイベント
"Elements"

茨城を拠点にさまざまな"要素"にこだわり行っているイベント

"Ruckus
[toucylab custom ver 1.2]"



PSP用のDJソフトウェアです。 Captain Dan氏のRuckusをベースにコントロールの微調整を行いました。
Download here !
-------------------------