2007年2月 4日 (日)

続・ひさびさに

前回の反応が遅い件の続き。

不要なMIDIメッセージを破棄したり、イロイロ小細工をするものの一向に改善する気配なしだったのですが、VSCのコントローラ画面をよく見ると、MASTER LEVELのインジケータはキー押下と同時にゲージが上がる(=正しくメッセージが送れてる)のに、音だけが送れて発音されていることに気づきました。

ということで改めてVSCの設定を見直すと、「発音反応速度」なる設定項目が・・・

そんなわけで無事解決。「MIDITHRU」として公開中です。

とりあえずMIDIキーボードをPCに繋いで演奏してみたい方はどうぞ^^

| | コメント (1) | トラックバック (0)

2007年1月28日 (日)

ひさびさに

日記更新です。なんかずいぶん長い間風邪ひいてた気がします。

よくよく考えると新しいマシンで更新するのってこれが最初なんですねえ・・・(しみじみ

まあそんなわけで、今回はUSB MIDI経由でMIDIキーボードを接続し、VSCで音を出す実験です。ていうかVSCってMIDI INないんですね。VirtualなSCなのに・・・

調べてみたところmidiInOpen()のコールバックでMIDI INの入力って簡単に読めるらしいので、それをMIDI OUTに垂れ流すプログラム組んでみたんですが・・・

遅い!! とにかく遅い!! 衛星中継の漫才のごとく遅いっ!!

0xFnを無視しても何しても遅いんだよなー、誰か助けてー。

| | コメント (4) | トラックバック (0)

2006年1月 8日 (日)

たまにやるとすっかり忘れてますが

ということで去年の9月の続き。今回は画面の初期化くらいまで。

やる気の問題により横シュー作成に変更したいと思います。DirectX9です。

まずはDirect3Dの一連の初期化処理。

winmain.cpp

initD3D()関数でだーっと初期化してます。ホントはアダプタの種類だとかイロイロ考えないといけないらしいですが、サンプルなんでテキトウです。それぞれの関数仕様はヘルプとか見てください。

あとミリ秒精度のタイマを使うため、マルチメディアタイマの初期化も追加してます。今はまだあんまたいしたことしてないですが。

timer.cpp

WinMain()で生成したIDirect3D9とIDirect3DDevice9はレンダリング時に参照しますが、レンダリングはDLL化されたアプリ側で行います。参照はProviderインタフェース経由で行います。

provider.h

実際の描画処理。まだ初期化とバックバッファの反映部分のみ。そのうち増えます。

render.cpp

アプリ側呼び出し部。exus_init()で初期化を行い。exus_main()の最後で描画(バックバッファのコピー)を行っています。

exusst.cpp

さしあたり気持ちとして20msごとに画面を更新するような仕様。いや、何分まだ黒い画面しか出ないのでちゃんと動いてるのかわかんないですが。

| | コメント (0) | トラックバック (0)

2005年12月28日 (水)

小ネタにもほどがある

26日は予想外に早く帰れたので年賀CGも描かずに小ネタプログラム作ってました。もう2日も前ですが。ちとサーバプロセスの起動状態をバッチとかコンソールからチェックしたかったので・・・

しょぼいソースですが、興味のある方はどうぞ。

ちなみにネタ元はこの辺。ソースは2003/XP以外は救ってないので、リンク先のサンプルよりは見やすいくらい?<存在価値

| | コメント (2) | トラックバック (0)

2005年10月 2日 (日)

アプリの終了と入力処理

今日は爽やかな秋晴れと涼しい風の吹く、すごしやすい1日でしたねえ^_^ 思わず部屋掃除したあと、板間でお昼寝してましたです。

ということで今回は終了処理(の呼び出し部分)とマウス入力です。まずは終了処理の方から。

終了処理はフレームウィンドウで×がクリックされた場合と、アプリ側で終了アクション(終了ボタンなどがクリックされた)が発生した場合の両方を処理させます。基本的にアプリ側主導で終了処理を行わせるため、ウィンドウプロシージャはWM_DESTROYを検出した場合、アプリ側に終了要求を通知します。

また、アプリ側はオープニングやゲーム本体など状態によりコードが差し替わるため、その都度アプリ側からフレームウィンドウに対して終了要求を受け付けるための関数を登録します。

まずはアプリ側の終了要求の受け取り関数のdsbmain_requestQuit()です。とりあえず現時点ではdsbmain_exit()への遷移を指示だけ行います。また、dsbmain_init()ではdsbmain_requestQuit()をインタフェースを介してControlクラスに登録しています。

dsbmain.cpp

続いてControlクラスの終了処理関数の登録部分とそのインタフェース。終了処理関数はControl::setRequestQuitCallback()で登録し、Control::requestQuit()で呼び出します。

provider.cpp

control.h

control.cpp

最後にウィンドウプロシージャ。WM_DESTROYでControl::requestQuit()するように変更しています。

なんつうか、ウィンドウに関する処理とアプリケーションに関する処理を分離したいがために、ややこしいことなっちゃってます。

次はマウス入力。パッド入力にしたいところですが、PCだとマウスじゃなきゃヤだって方もおられるので、まずはマウスに対応させます。

しかしながら、ゆくゆくパッド対応にもしたいため、マウスイベントをどうこうするでなく、アプリ側のメイン処理でマウス状態を読み取る方式とします。まずはクリック座標をバッファに蓄積して読み出す方式をリングバッファ方式で作ってみます。リングバッファというと実装すると防御力の上がる魔法のアレです。

まずはバッファ制御クラスとマウスドライバです。いろいろメンドウなのでマウスドライバはバッファ制御クラスを継承させちゃいます。

ringbuff.h

ringbuff.cpp

なんかゴチャゴチャ書いてますが、要はFIFOでバッファの上限まで行ったら読み終わったバッファを再利用するってことです。ちなみにスレッド非対応というか、write()が同時に発生するとバッファ壊します。今はまだ対応しなくていいや。

mouse.cpp

マウスドライバ、というよりはアクセサですが、マウスのクリック座標をバッファに格納する関数、取り出す関数を持ちます。write()で格納する箇所は前述のウィンドウプロシージャに追加していますので確認してください。

最後にアプリ側のマウス読み出し処理とインタフェースです。

アプリ側の処理は前述dsbmain.cppにあるとおりで、dsbmain_init()でマウスに対しinit()、start()を行います。読み取りはdsbmain_main()で行っており、バッファからデータを読み出せた場合はデバッグログを出力して動作を確認します。最後はやや儀礼的ですがstop()を実行しています。

以下はインタフェース中のマウス処理に関する部分です。インタフェースだけにたいしたことはやってないですが・・・

相変わらずテストとかしてないので、なんかの条件を満たすとたちどころに動かなくなるかもしれません。

次はそろそろアプリケーションの構造を考え始めないといかんなあ・・・

| | コメント (0) | トラックバック (0)

2005年9月18日 (日)

前回の宿題について

ここんとこ酒飲んだりマージャンしたりな生活です。こんばんは。

今回は、前回あんまうまくいってなかった、DLL側からメイン側のインスタンスを使ってメンバ関数を呼び出す方法についてです。ヘッダに書くのはやっぱ嫌ですもんねえ・・・

まずは本体側のクラス定義。純粋仮想関数ならokらしいのでインタフェースとクラス本体を定義します。Control以外の関数とかもきっと使うと思うので新規にクラス作っときます。

control.hはsetNext()を.cpp側に戻してます。

最後dsbmain.cpp。あんまり変わりはないですが、ProviderオブジェクトをProvider_Interface*で受け取ります。control.cppの呼び出し側も修正しています。control.cppは今回はたいして修正してないので掲載を省略してますが。

今回はDLL内のLNK2019対策のみ。なんかControl内の定義がProvider_Interfaceだとうまくコンパイルできないのが釈然としないですが、まあいっか。

つか全然進まねえ^_^;

| | コメント (0) | トラックバック (0)

2005年8月29日 (月)

半日悩んでこれが精一杯ですよ

今日は昼間から酒飲んでエロゲソングとか歌ってダラダラしてました、はに○です。ダメ人間まっしぐらですね。

本日は本体処理のカラだけ作ります。

本体処理は1.初期化→2.主処理(ループ)→3.終了処理ってたいがい作りますが、オープニングだとかタイトル画面だとかゲーム本体だとかでそれぞれやるだろうと思われるので、前の処理に次の処理を指定させて対処します。また、せっかくなので、いらなくなった処理はメモリ上から追い出すため、DLLを使って動的ロードします。図にすると下な感じです。

003

いや、ホントに消えてくれるんすかね?

とりあえずまずはWinMain()の呼び出し部分。

Control::main()の呼び出しと前後の準備を追加しています。

続いて画面遷移を制御するクラス。

Control::setNext()はDLL内から次の処理を指定するために使用するワケですが、これがヘッダ内に書いてやらないとリンカがLNK2019でエラー出しちゃうんですわ。まあ、書いちゃえばいいんですが、いつか破綻しそう。なんとかならねえかなあ・・・

続いて本体処理。こっちはまだテスト用のテキトウなコードのみ。

とりあえずログ見て呼び出せてること確認。

なんか、もう終わんない気がしてきました。

| | コメント (1) | トラックバック (0)

2005年8月23日 (火)

とりあえずふぇいたるなエラーを表示する

とこだけ追加。終了間際にダイアログを表示する用。

毎度ながらヒネリなしの3本立て。

通常のメッセージ表示は別に考えます。

| | コメント (0) | トラックバック (0)

2005年8月17日 (水)

温室効果ガス-6%削減

微妙に増えてそうな言い回しですが、PCでの録画待機のため電源制御バッチでも仕込もうかと思って調べてみたものの、スタンバイ状態に移行するコマンドって標準でついてこないんですね。

仕方ないのでhttp://www31.ocn.ne.jp/~yoshio2/vcmemo18-1.htmlとかあちこちパクりながらsuspendコマンドつくってみました。めどい。

ソースつけて置いとくので興味のある方はどうぞ。

| | コメント (0) | トラックバック (1)