「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



VB2005で作ったシリアルMIDIモニターの
プログラムとかを貼っておくページを作りました。
http://picavr.uunyan.com/warehouse_midi_mon.html

ウチのレンタルサーバー、拡張子VBのプログラム
とかが上手く読めなかったりするみたいなので、
ソースと実行ファイルをlzh形式に纏めなおしました。
解凍して使ってください。なんか、レンタルサーバー
ってアレコレ不便ね…

使い方とか少しずつ追記していきます。


そうそう、話変わって。この間買った2冊の本を読んでます。

まずは電気・電子回路入門―電気なんかこわくない!の方。
一通り読み終わりました。
盛りだくさん過ぎるほどの内容だったからどの程度
の中身かが気になっていたんだけど、サラサラ読めて、
しかもちゃんと内容が纏まってて、おさえるところは
キチンとおさえてて凄くいい。

複素数の解説もなかなか。まぁ、さすがにこの本1冊で
複素数関係まで含めて完璧に解説って訳にはいかない
ボリュームなんだけど、でもこの本1回読んだらあとは
ネットでなんとでもなるのでは?

後ろの方のデジタル回路周りの解説で、なぜかビデオ
信号から同期信号を取り出すトランジスタ回路が出て
くるんだけど(これがまた驚くほど簡単な回路で
ビックリ!)、作者の経歴を眺めてナルホド。

オイラ的には複素数、インピーダンス、アドミッタンス
周りの計算や、キルヒホッフ、テブナン、ノートン、
直列共振、並列共振あたりが整理できて良かったな。

っつーか、電気、電子の入門書にはここまでちゃんと
言及して欲しいなぁ。


もう1冊の電子回路とノイズ対策がわかる本の方はまだ
半分弱しか読んでないんだけど、期待以上、いや、
むしろ秀逸だな。オイラみたいにノイズ関係について
ちゃんとお勉強したことが無い人間には、原理や仕組み
がしっかり解りつつ、キホンはやっぱり大切なんだ
なってわかる本。解ってる人には当たり前なことばっかり
なのかもしれないけど。

スラスラ読めるんだけど、中身が濃い。オイラみたいに
ずっとソフトウェアばっかり扱ってきた人間にとっては、
ノイズとはナンゾヤ、ノイズ対策とはナンゾヤがゼロから
入れる感じ。いい。

タイトルから見るとノイズ対策がメインの本に見えちゃう
んだけど、どちらかと言うとまず「電子回路」とはナンゾヤ
の話があって、それを踏まえて電子回路の視点でノイズ
とはナンゾヤがゼロから解りやすく書いてある感じ。
もちろん対策まで。
なんとなくパスコン入れてちゃダメなのだ。


今回の2冊はヨカッタな。こう言う本にはもっともっと
早く知り合えてたらあれだのこれだのでトラブらずに
すんだのかもな…

でもまぁ、こうやって興味持ってる時にそれを満たして
くれる本に出会うのは、アタマに残りやすくていいな。




コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




MIDI機器→シリアル変換のテストをしていて、
市販のUSB-シリアル変換ケーブルだと上手く
動くのにFT232RLだと上手く行かないという不可解
な事象がおきてたわけですが、uさんから頂いた
情報でとりあえず解消しました。
http://brown.ap.teacup.com/nekosan0/793.html#comment

どうやら、FT232RLドライバの設定が原因になっている
ようです。上記の日のブログコメントに書いたとおり
原因はよく解ってないのですが、ドライバの設定画面
を開いて

そこからさらにAdvancedを開いて

latency timerを1msにしたら何の問題もなく
上手く動くようになりました。

どこらへんに境目があるのかよくわかりませんが、
程ほどのレイテンシに設定すると良いようです。

一方、何が根本的な原因なのかは今のところ
解ってません…
こまめにパケットを送らないとフン詰まりになる
ってことなんだろうなぁ…って気がするんだけど、
なぜそうなっちゃうのかとか、どの程度で
フン詰まりになっちゃうのかとか、その辺が…

まぁ、原因がVBのプログラムでもtiny2313の
ファームでも無さそうだということは判りました。
ひとまず安心といった感じ。



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




というわけで、FT232RLで上手く動いていない状態
のソース該当部分を貼ってみます。


'*************************************
'***** definition serial port *****
'***** & procedure declaration *****
'*************************************


Delegate Sub AddDataDelegate(ByVal b As Byte)

Private Sub AddData(ByVal b As Byte)

Dim b2hex As String


If ((Me.omit_ACTIVE_SENSING.Checked = True) And (b = &HFE) _
Or (Me.omit_TIMING_CLOCK.Checked = True) And (b = &HF8)) Then
'omit ACTIVE SENSING or TIMING CLOCK
'do noting
Else
If (b >= &H80) Then 'status byte?
If (b <> &HFE And b <> &HF8) Then
input_message.AppendText(ControlChars.CrLf)
Else
input_message.AppendText(" ")
End If
Else
input_message.AppendText(" - ")
End If

b2hex = Microsoft.VisualBasic.Right("0" + Hex(b), 2)
input_message.AppendText(b2hex)
End If

End Sub


Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

Dim bDataReceived As Byte
Dim addr As New AddDataDelegate(AddressOf AddData)
Try
bDataReceived = SerialPort1.ReadByte
Catch ex As Exception
bDataReceived = ex.Message
End Try
input_message.Invoke(addr, bDataReceived)

End Sub



簡単な概要を補足。

シリアルからDataReceivedハンドラで1バイト単位
でデータを受け取って、invokeでAddDataサブを
呼び出すようにしておいて、データを受け取った際の
処理実体はAddDataサブ側に記述。AddDataサブ側では
バイナリデータをHEXの文字列にしてテキスト
ボックスに追加してます。
(input_message.AppendTextメソッドね)

特にアヤシイ処理はやってないはずなんだけどなぁ…


invokeとdelegateで別スレッドを立てずに、
DataReceivedを受け取ってそのサブルーチン
側で直接処理しちゃえば何とかなるのかな?

そもそもシリアル入力の処理って別スレで
処理しなくても構わないのかな?その辺の
仕様(?)周りが良くわかんないんだよな…


そもそもinvokeとdelegateの周りが良く解ってない
ってことなのかな?

あとで
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200710/200710_07100071.html
http://blogs.msdn.com/shozoa/archive/2007/07/09/python-workshop-hands-on.aspx
このへんとか読み直してみようか…。



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




例のtiny2313とVBで作ったシリアル
MIDIモニター。とりあえず普通に動くことが
確認できたので、念のためと思ってもう1個の方の
MIDIマスターキーボードに接続してみたら、「F8」
(16進)がズラズラーーーーと。

timing clock信号みたい。そうかぁ。timing clock信号
を出力するMIDIマスターもあるのね…。

ということで、他にもそういう恒常的に出つづける
信号が有るのか無いのか調べてみることに。
…とりあえず無さそう。

VB2005を開いてプログラムを修正。F8(timing clock)
もomitできるように機能追加。


さて、さらに念のためということでシリアルi/fの
バリエーションとしてFT232RLも試してみることに。

これまではATEN製のシリアル-USB変換ケーブル
経由でテストしていたんだけど、これをFT232RL経由
に繋ぎ変えたらなんだか変なことに。


鍵盤を弾いてからモニターの画面上にMIDI
メッセージが表示されるまでに数秒のラグが出ちゃう。

入力処理側が間に合わなくなって、バッファが上手く
掃けないまま溜まってしまっている感じだなぁ。

プログラムの間違えとは考え難いんだけどなぁ。
ATEN製のシリアル-USB変換ケーブルでは動いて
いるわけだし。
FTDI社のドライバとVBプログラムの相性か?

何が悪いのかイマイチ良くわかんないんだけど、
とりあえずPCのハードのせいかもと思ってもう1台
のPCでも同様に実行してみる…

同じ結果だ。

どうやら個別事情というよりは、FTDI社のドライバ
と今回作ったプログラムでは相性が出るという理解を
したほうがよさそうだな?


大した処理はやってないんだけどなぁ…
シリアルポートにバイナリで1バイトデータが受信
する毎にDelegateで別スレッドでテキストボックスに
追記していくだけの処理なんだけど。


…あれかな?

1バイト分の処理が終る前にさらに次の1バイトが届いた
っていうDataReceivedのハンドルを拾って、
   「1バイト分処理するスレッド」
が次々と生成されちゃって、その複数のスレッド同士
でリソース競合しちゃってるとか?
そのスレッド同士が一斉にテキストボックスに書き込もう
とするから、その調停(スレッドの再起動とか?)で
不要な処理時間を要しているとか…?
(DB更新とかで言うところのデッドロックね)


同じUSB経由でもATEN製ドライバと変換
ケーブルなら出ないのに、FT232RLだとダメなのは
何でだろうねぇ?


1バイト1バイトパラパラと疎らにデータ送信できることが
前提のシリアルi/fと、1パケット1パケットまとめて
i/fするUSBとでは、相性がよくないってこと
なのかな。

どうしたものやら…



コメント ( 2 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




ここのところ取り組んできたシリアルMIDIモニタ
がひとまず完成。

PCのシリアルポートにMIDI機器を繋いで、
そのMIDI機器とのやり取りをハックする
という単純な仕組み。MIDIから入力した
ログデータをファイルに保存しておく機能も
登載。


各社のシリアルMIDIドライバではなく、単に
シリアルポートに接続したRS232C機器と同等
の扱いなので、ドライバ周りの相性に影響され難い
というのがいいところ。
以前実験した時に、ドライバの相性で接続でき
なかったUSB-シリアル変換ケーブル経由でも
問題なく接続できちゃう。

マイコン類でMIDIの工作をする時のモニター
プログラムとして便利かな、と。


ただ、あくまでシリアルインターフェースの機器
として入出力しているだけなので、MIDI機器の
接続方法によっては制約がでることも有りますが。

→外付けMIDIキーボードをwindows内蔵の
 ソフトウェアMIDIに繋いで鳴らそうという
 場合は、それらの間にこのモニターを挟んで使う
 ことが現状できません。

元々はMIDIマスター(キーボード等)から
MIDI音源などに向かって流れる経路をデータを
眺めるという用途で作りました。

なので、MIDIマスターの出力を例の変換器経由
でシリアル端子から入力し、今回作ったモニター
プログラムでモニターしながらこの信号をさらに
シリアル端子からMIDI音源に繋いで音源から
音も出すというのはok。

オイラの想定していた用途としてはこの現仕様で
充分事足りるので、暫くはこのままの仕様でokと
思ってるんだけど、今後の仕様追加について
ちょっと考えておくことに。


やっぱMIDIマスターからの入力をモニター
しながらwindows内蔵のソフトウェアMIDI
を鳴らすのも出来た方がいい気がするし、
SMFなどを入力して、タイムラインに
沿ってMIDI信号を画面表示しながら
MIDI機器にデータを吐き出すような
機能もあればいいな…とか。


せっかく出来上がったので、プロジェクト
ファイル一式アーカイブにして公開しようと
思ってるんだけど、プログラム作る時に
イロイロ弄ってたらプロジェクト一式
入っているフォルダの中に色んなものが
取り込まれちゃったりしててアレなので、
とりあえずexeファイルとvbのプログラム
ソース本体と、フォーム定義のソースあたり
を載せておくと実際に実行したり、ソース
レベルで弄りましたり出来るかなぁ?

普段VBなんて使わない人間にとっては、
VB2005ってどこからどこまでがプロジェクト
一式なのかが良く判らんのよねぇ…



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする



« 前ページ 次ページ »