【アップ】MMDAgentWebDicMaker公開
お久しぶりです。熱伝導です。
以前練習で作ったEasyMMDAgentDicWriterですが、兼ねてからなぜこの程度のものでPython導入させなきゃいけないんだろとか我ながら思っていたのでjsで作り直し、サイト上でちょこちょこっと変換できるようにしました。
ファイルに直接書き出すわけではないのですが、LineTracerからコピーして貼り付けるだけなのでプログラミング慣れてない人にはこちらの方が楽だと思います。
以下ページになります。
MMDAgentWebDicMaker
【追伸】
1年ぶりでぐらいですか・・・ずいぶんほっといたなぁ
MMDAgent本体の方は、地味にバージョン上がってたり、jado版でプラグインが動かせなかったり、やっとこできたluaでのシナリオ管理フレームワークのプロトタイプが本当にこれいるか?と疑心暗鬼になったりで完全に投げ出してました。
私生活的にも転職したりと転機だったので、これを気に復活したいな・・・。
とりあえずモチベ下がらないように小さめのプラグインから作っていこうかなと考えてます。
【雑記】MMDAgent邪道版導入!
忘れてましたが連絡用・たまに雑談ツイッターアカウント用意しました。たぶんサイドバーあたりに追加されてるはず・・・熱伝導です。
夢にまで見たPMX!!!!!!ありがとうございますっ!!!!!!
【雑記】ボカロ歌舞伎観てきました
【MMDAgent解説】MMDAgent1.6でのプラグインの作り方
不定期更新ですが活動してないわけではない熱伝導です。
今回も何故無いのかわからないシリーズ。
自分の忘備録を兼ねてMMDAgentのプラグインの作り方を画像付きでできるだけわかりやすく書いてみたいと思います。こういうの書くの初めてなので至らぬ点はご容赦ください。
環境
- MMDAgent 1.6
- windows 8.1
- VisualStudio2015
OS以外は最新環境だと思います。
MMDAgentのプロジェクト環境作りは説明しませんが公式mmdagent.jpのSourceページからダウンロードしたものの中にあるMMDAgent_vs2010.slnをVisualStudioで開くだけでいいはずです。
ビルドして動かしてみる時はReleaseフォルダにSampleの各種ファイルなどを入れておくのを忘れずに。
1. 準備
プラグインを作るにあたってまずは下記サイトから雛形プロジェクトをダウンロードしてください。
MMDAgent & Project-NAIP wiki > プラグイン作成
大半の人は拝見済み、もしくは既に挫折済みだと思いますが偉大な先駆者様のサイトです。
雛形プロジェクトも結構古いのですが、それでも1から作るよりは雛形プロジェクトを改修した方が早いので利用させていただきます。
ダウンロードして解凍したPlugin_Skeletonディレクトリとその中にあるPlugin_Skeleton.vcprojの名前を変更しておきます。他ファイル名はまだ変えないでください。
ここではPlugin_testCommandにリネームして進めます。
2.VisualStudioでプロジェクトを追加する
リネームしたPlugin_testCommandディレクトリをMMDAgentのソースディレクトリに移動させます。
移動後はVIsualStudioでMMDAgentのソリューションを開き、「ファイル」>「追加」>「既存のプロジェクト」から移動させたtestCommandディレクトリ内のPlugin_testCommand.vcxprojを追加します。
プロジェクトのアップデートを聞かれるのでチェックの入ったままOKで進めます。
追加されたプロジェクトは名前がPlugin_Skeltonになってるので先ほどと同じくPlugin_testCommandに変更します。この段階で各ファイル名も変更可能です。
3.依存プロジェクトを設定する
追加したプラグインのプロジェクトを右クリックして「ビルド依存関係」>「プロジェクトの依存関係」を選択します。
依存関係で
「Library_MMDAgent」
「Library_MMDFile」
をチェックしてOKを押します。
4.必要なライブラリを設定する
ここからはMMDAgent1.6用の設定です。
MMDAgent1.6ではフォント周りと正規表現のライブラリが追加されたらしく、この2つもビルド時に要求されるので設定する必要があります。
まずは必要なライブラリファイルがどのディレクトリにあるか設定します。
プラグインのプロジェクトを右クリックして「プロパティ」>「リンカー」>「全般」>「追加のライブラリディレクトリ」を選択します。
直接書き加えても、右側のリストから編集画面を使ってもいいのですが以下の2行を追加します。
..\Library_FreeType\lib
..\Library_RE2\lib
直接書き加えるときはセミコロンで区切ること。ピリオド2つは親ディレクトリって意味の相対パスです。親であるMMDAgentディレクトリ内の各libディレクトリをを見てくれってことですね。
ライブラリディレクトリの指定は終わりましたので次はどのファイルを使うか設定します。
同じくプロパティから「プロパティ」>「リンカー」>「入力」>「追加の依存ファイル」を選択します。
ライブラリディレクトリと同じように以下の2行を追加します。
FreeType.lib
RE2.lib
これでどこのどのファイルを使うという設定は完了しました。
最後にビルドしたdllファイルを書き出すディレクトリを設定します。
「プロパティ」>「構成プロパティ」>「全般」>「出力ディレクトリ」を下記のように書き換えます。これでMMDAgentのReleaseディレクトリ内のPluginsディレクトリに書き出されるようになります。
これでプロジェクトの設定は終了です。
私の環境では初期設定でなってましたが、場合によっては以下の作業も必要かもしれません。
・「プロパティ」>「全般」>「構成の種類」で「ダイナミックファイル(.dll)」を選択する
5.ソースコードを修正する
ソースが一部古い関数を使っているせいでエラーが出ていると思います。
エラー部分を修正してみましょう。
Plugin_Skeleton.cpp内にあるsendEventMassate関数は古いMMDAgentの関数です。
下記のように最新のものに書き換えます。
コピペ用コード:sendMessage(MMDAGENT_EVENT_PLUGINDISABLE,"%s", PLUGINSKELETON_NAME);
3箇所あるはずなので全て書き換えてしまいます。
これで修正作業はすべて完了です。ビルドして実際にdllファイルが生成されたか確認して見ましょう。
今回追加修正したプロジェクトのフォルダをコピーしておけば以後は名前を変更して既存プロジェクトから追加するだけで使えます。
6.実際に動くかテストしてみる。
ここでは既存のプラグインの中で一番簡単な仕組みのEXECUTEコマンドを真似して動作確認をしてみます。
EXCUTEコマンドの処理内容はwindowsAPIのShellExecuteA関数に引数を渡して実行するだけなので実処理は一行で済みます。
まずはPlugin_Skeleton.cpp内でコマンド名の宣言とwindows.hのインクルードを行います。includeは順番が影響しますのでとりあえず上に書いてください。
ここではコマンド名はS_EXCUTEとしています。これは実際にFSTファイルで使われる文字列と同じものです。
extProcCommand関数に追加して以下のように書き換えます。
ここまで書いたらもう一度ビルドしてみてください。
あとは実際にFSTファイルを適当に書いて動かして見ます。
ホームページは表示されたでしょうか?
もし動かないようならdllファイルがちゃんとPluginsディレクトリに書き出されているかなどを確認してみてください。
プラグインの作り方は以上です。
実際、大したことしてないのでバリバリ書いてる人は今更って内容かもしれませんが自分は毎度環境作りのトラブルでこけてます・・・。1.6の動作確認するまで何時間かかったか・・・
なので他の人がそんな無駄な時間を使わないで済めば幸いです。
雑記1
【バージョンアップ】EasyMMDAgentDIcWriter_v1.1.0
まずはじめにEasyMMDAgentDIcWriterをダウンロードしてくれた方にお礼申し上げます。
どれぐらい嬉しいかというとついカウンター導入してしまうぐらい。
何よりまだMMDAgentに興味のある方がいるという事実が嬉しいです。
バージョンアップソース
MMDAgent関連 ファイル公開用ページ @Netudendo
さて、初コメントの貴重な報告を受け、文字コード周りの修正版をアップしました。
追加したのは2つ
2.dicファイルの文字コード自動判別
3.(こっそりミスコード修正)
主要機能での変更はありませんので前バージョンで問題なく動作している方にはあまり関係ありません。
dicファイル読めなかった時にちゃんとエンターで終了できるぐらいなので気になったらダウンロードしてください。
改めて修正点説明
今回のバージョンアップのきっかけです。なのに暫定的な対策です・・・。
ソースの下記部分に表示したい文字コードを入力して保存してください。
PRINT_ENCODING = "" #空白で自動対応 指定時は"utf-8"などに変更する
実行時にインタプリタの日本語が化けるという報告を受けて調査したのですが残念ながら当方で再現できず・・・。一応python3は文字コードを自動で環境に合わせるはずなんだけどなぁ。ここらへんは正直知識不足です。
とにかく環境に依存する話だと思うので明示的に指定できる形にしました。
下記リンクに文字コードリストがありますので環境に合わせてお試しください。
7.8. codecs — codec レジストリと基底クラス — Python 2.7.x ドキュメント
2.dicファイルの文字コード自動判別
文字コード周りの調査中にふと思ったのが案の定。dicファイル書き出し時に文字コードを指定していなかったのでdicファイルの文字コードによっては文字化けを起こす不具合が判明したので修正しました。
shift-JIS、EUC-JP、utf-8、utf-16対応です。設定としてはiso2022やutf-7も対応してたりするんですが未検証・・・。動いたらラッキーぐらい。まあこのあたりはメモ帳すら対応してないので気にする必要はないかな。
utf-16のエンディアンは対応したので許して欲しい。こいつのためだけにバイトまで確認するハメになってしまった。
まあでも普通shift-jisかutf-8だよね・・・保険てことで。
【ツール配布】MMDAgentの辞書に単語登録するツール作ってみた
文句垂れるだけ垂れといてなんもしないのもあれなんで辞書登録の簡易ツールを勉強中のpython3で作ってみました。他に誰か作ってても良さそうなもんだけど自分は見つけられなかった・・・
将来的にはプラグイン化してリアルタイムで辞書登録可能も考えてるけどとりあえずはこの形でお茶を濁す。
ともあれ下記サイトよりダウンロードしてご利用ください。
MMDAgent関連 ファイル公開用ページ @Netudendo
python凄い。書くだけで動く。
単語と読み方と補正値を入力するとMMDAgent.dicファイルに書き込むだけのツールだけど音素列表とにらめっこしながらスペースとタブで細切れにする労力は節約できるかと思います。
pythonなのでデフォルトの設定の変更や改造したい時はファイルをテキストエディタで開いて直接書き換えるだけでOKです。自分好みにカスタマイズしてください。
現在第一、第三フィールドは<unk>決め打ちです。誰かこのパラメータの有用性を教えて下さい。
【準備】
1.python3を持ってない人は「python3 インストール」で検索。インストールするだけで大丈夫です。
2.ダウンロードしたEasyMMDAgentDIcWriter.pyをMMDAgent.dicと同じフォルダに入れる
3.EasyMMDAgentDIcWriter.pyをpython3で実行。python3がインストール済みならダブルクリックするだけでOKのはず
【使用方法】
指示通りに単語、読み方、補正値を入力してエンターを押すだけです。
書き込み対象のファイル名やフィールドの間隔、補正値はファイルを直接書き換えて変更してください。
サンプル画像