7/17日記 ===== プログラム ===== * 進捗 - ファイル読み込み(最初は同期、可能なら非同期読み込み)\\ 更新ボタンを改造 - 組込み関数の追加\\ オーディオ・MIDI・スピード変更・MMLを実装。MMLは改造中。 - コンパイルしたデータとサウンドの譜面を紐づける実装\\ Note表現を改造中 - ADSR、フィルタの実装、加えてエフェクトの実装\\ まだ ---- * 別のところから色々やってなんとかそれっぽいものができそう。 * 参考資料。猫でも分かるプログラミングだった。 * http://www.kumei.ne.jp/c_lang/sdk2/sdk_161.htm * ホットキーというより、キー入力のインターセプトを実装した感じ。 * まずGUI上でショートカット作って、フラグを立ててインターセプト処理を有効にしてしまう。 * いきなり処理をインターセプトしてしまうのは危険なので、全体フックするショートカットはオプションで。 ---- * メッセージ関連 * https://learn.microsoft.com/ja-jp/windows/win32/winmsg/keyboardproc * > アプリケーションが GetMessage または PeekMessageA/PeekMessageW 関数を呼び出し、処理するキーボード メッセージ (WM_KEYUPまたはWM_KEYDOWNがある場合は常に、この関数を呼び出します。 * だそうです。 * もしくはこれ。 * https://learn.microsoft.com/ja-jp/windows/win32/winmsg/lowlevelkeyboardproc * ただ、以下の理由よりKeyboardProcでいいみたいね。ここらへんは使い勝手知らないしなあ。 * https://qiita.com/kob58im/items/df01765c5059f725174c * できるならShift+F12とかで更新したいんだけど、これができるかどうか。 * https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-getkeystate * これで知れるようであれば話は終わりなわけでな。 * あと、DLL上のメモリの作成場所の関係で値がうまく更新されないことが判明。以下の方法で変数の作成場所を明確にしておく。 * https://www.chihayafuru.jp/tech/index.php/archives/3264 * なるほど、Boolとして取るときは、最下位ビットだけが取れるからトグル扱いになっちゃうんだ・・・ * https://takabosoft.com/134 * https://www.silicloud.com/ja/blog/c%E3%81%AEgetasynckeystate%E9%96%A2%E6%95%B0%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/ * 結局関数内で情報取得することにした。これだとDLLにした意味あったんだろうかとも思うが、GLFWでグローバルなキー取得ができない以上どうしようもないなと考えた。 ---- * と思ったら、GetAsyncKeyState使ったらウィンドウの外でもキー入力取れちゃってるんですが! * DLL検証した意味がまったくなくなったよ畜生!wwww * おまけに停止の機能もつけた。 * ただ、インターセプトしなきゃいけない場合、DLL経由での処理が必要となる。 * 今のところ不要ではあるものの、要望が来たら実装かなあというところ。(優先度を下げる)