「NeoMupl」に関する日記(9)

<前 次>

自動車運転免許取れましたー

はいよー。技能試験は今月1日に終わっていたのですが、なんだかんだで延ばし延ばしになってやっと今日学科試験が受けられました。
なんだか一発では受からなさそーな気分でしたが結果は95点で合格でした。

今日こそNeoMuplを更新しようと思っていたのですが、ファイルの切り替えがうまくいかず、別のリストを開くと後から読み込もうとしたほうのリストが破壊されるという問題が発生したので公開はまたしばらく見送りとなりました。
そのかわり、たまたまバージョンアップしたのに公開されていなかったCharaBox3が残っていたのでそちらをアップして今回の更新としました。

ネコブラ:
大きく発達した耳で周りの状況を判断する。
尻尾を震わすとニャーという威嚇音が発せられ獲物はうっとりと縮み上がる

1185375294.png

真のランダムセレクト?

今日公開するつもりでNeoMuplの足りない部分を作ってました。
まあ、見ての通り公開できなかったのですけど、一応色々できました。
まず、何も再生していないときにストップすると例外が出る問題を修正しました。
次に、設定ダイアログを実装しました。
ふにゃさんのときなどと同じく、フレーム(.NETではGroupBox)コントロールを列挙して自動的にカテゴリーを表示するようにしています。
とは言ってもカテゴリーは、そして設定項目も、一つしかないのですが。
で、その一つというのが、タイトル付け規則です。
タイトル付け規則というのは、ファイルをリストに追加したときに自動的にタイトルをつけるときの規則をテキスト形式で表したもので、特別な文字列を埋め込むとその部分がファイル名の一部と置き換わります。
そして、もう一つできたのが、ランダム再生のアルゴリズムの改良。
前々からスキップ率がうまく機能していないのが気になっていたので、この前プログラミングコーナーに書いたランダムセレクトの方法を使ってみたところ、面白いように再生される確率が変わるようになりました。
最後に、今日できなかったのが、音源リセット。
これも前々から気になっていたところで、極まれにMIDIの音が鳴りっぱなしになることがあったので、その部分を修正したいと思っていたのですが、リセット後の設定の復帰が、元々復帰を想定していないプログラムだったために難しく、結局今日中には終わりませんでした。

リストから削除しますか?

NeoMuplのスキップ率の挙動がどうにもおかしいような気がしたのでちょっとプログラムをいじってました。
どうにもプログラムを見た限りでは何の問題もなさそうだったので実際に動かそうと思ったのですが、今現在デバッグ用に入れてあるデータは無効なデータが多い状態だったので、スキップ率のことはとりあえず置いておいて、無効なデータを消しやすいようなエラー処理の拡張をしました。

Bomber丸Worldのほうは、アニメーションデータの要素の一つとして、アニメーションの動きがどの範囲で変動するかというデータが必要だったのでそれに対応するデータを追加しました。

TEPOLとZTB

デジカメは見つけたんですが使い方がわからず分子模型の写真は取れませんでした。
有機化学のセットだったので金属結晶はほとんど作れないようでした。

今日はNeoMuplのランダム演奏時のスキップ率を実装しました。
それ以外で実装するかどうかは未定です。
もしかしたらオプションで決めるようにするかもしれません。

Luaのほうはというと、変数への代入も案外あっさりできて、ついでにテーブルの新規作成とかも作ってしまって、ガベージコレクションの様子を確認したりもしました。
基本的にLuaでは細かいプログラムをたくさん同時並列的に動かすのでガベージコレクションは何も設定しなくても事実上分散して行われます。
5.1の意味があまりないです。

昨日は仮免受かったのだ

NeoMupl、MIDI再生中はMIDIポートを変更させないようにしました。
MIDI再生中にポートを変更すると前のポートでの音が鳴ったまま次のポートへ続きからMIDIメッセージが送られるので、前のポートで最後に鳴っていた音が鳴りっぱなしになりつつ次のポートでの演奏は情報不足のためどんな音がなるかわからないという状態になっていました。
それと、削除の高速化もしました。
.NETのListBoxは項目を上書きしようとしたとき、項目の内容が同じだった場合は上書きはしないという仕様だったらしく、できるだけ項目の上書きが少なくなるように削除する場所を調整したら劇的に速くなりました。
以前のアルゴリズムだと削除した項目より後を全部変更していたので最初のほうの項目を削除するとかなり表示に時間がかかっていました。

TGBBSは、スレッド表示ができたので、返信フォームと返信処理を作成中です。

再生速度変更に伴う不具合などについて

今日はNeoMuplで再生速度を変えると曲の終了位置を間違えてしまうバグが急に気になりだして、直そうとしてました。
再生速度を2倍にすると半分のところで曲が終わってしまうので、曲の長さか再生位置のどちらか一方が再生速度の影響を受けているのだと思いますが、そのあたりを修正して今聞いているのですがどうにもやっぱり半分で切れるようです。
もう一つ、DirectMusicでボリュームが変わらない問題も気になったのですが、従来のMIDIポートとやらではどうしようもないみたいです。
MIDIって結構曲や作曲者によって音量バランスが極端なのでこういうのにこそ個別のボリューム調整がほしかったのですが。
あと、そろそろ設定ダイアログの実装も始めようかと思っています。

SMFだから

NeoMupl、DirectMusicで再生するときMIDIリセットを入れないと具合が悪いので入れてみたら別のところでまたまずかったのでSetStandardMidiFileを使ってみたのですが、これもこれでまずいことがあるようでした。
どうすればいいんでしょうね。

TGBBS、過去の日記を見ればどういう風に開発してるのかわかるじゃないかと思って調べてみたら、うまくタグ付けできてなくて思うように検索できませんでした。
残念。

RAID1

新しいハードディスクを買ってきました。
別に今のハードディスクの容量が不足しているというわけではなかったのですが、内蔵されているハードディスクが壊れるのが怖くて、しかしDVD-Rにバックアップするには内容が多すぎて、そしてそもそもバックアップする作業が面倒で、自動でバックアップされるRAID1に対応したハードディスクドライブにしました。

NeoMuplは、エラー時の挙動を改善して、エラー表示中に次の曲の演奏を始めたりしないようにしたり、設定ダイアログがダイアログらしからぬ位置に出現するのを直したり、ファイル名からタイトルを生成するアルゴリズムを実装したりしました。
タイトル生成に関しては、設定項目がプログラム上で編集できないので、INIファイルをいじって変更する必要がありますが、たぶん個人的に便利になったと思います。

気のせいかもしれません

NeoMuplのMIDIポートの保存が出来上がりました。
本当は保存・読み込みはできていたのですが、保存すべきデータをセットしたり、読み込んだデータを反映したりするのを忘れていたため、今まで動いていませんでした。
デフォルトではあまりうまく再生できないMicrosoft Synthesizerになっていることが多いと思うので、ぜひとも変更しておくべきだと思うのです。

スクリプト言語の件、色々考えてみました。
関数については、if文などと同じように普通に解析して、解析時についでにその場所へのポインタを保持しておくということにしておけばうまくいきそうな気がします。
気のせいかもしれません。
配列については、値型ではなく参照型ということにしてしまえばなんとかなるかも、という気がします。
やはり気のせいかもしれません。

頓挫しそうだ

いやあ、久々の更新なのにネガティブな内容でごめんなさい。
とにかく値をどう扱うか、クラスとして扱うならクラスをdeleteするのはいつなのか、特に配列型というのは値でありながら内部に変数をも含んでいるわけですから厄介なのです。
もう、最悪の場合配列型は廃止することも考えなくてはいけなくなるかもしれません。
関数については、全部の処理を関数の中に入れているならあまり問題なかったのですが、普通のコードと混ぜて書かれた場合、普通のコードを解析しながら一方で新しい関数の出現を疑わなければならないので厄介なのです。

今日はNeoMuplを使ってVisualC#2005での発行の実験をしてました。
まあ、つまり、発行という機能を使ったことがなかったので、どんなものか見てみようと思ったわけです。
とりあえず現状のところ、使うことはあまりないかなー。と思っています。

VB版を読み込んだ!

スクリプト講座、書けるものならどんどん続きを書いていきたいんですが、どうにもこうにもゆきづまり気味です。
ん~・・・でも止まったら止まったでちゃんと止まったことを告げておくべきかなぁ・・・。

NeoMuplのVB版データのインポートができました。
文字コードの関係でリスト読み込みのところでのC#版データとVB版データの共存はできませんでしたが、リストに追加するだけならC#版データを考慮する必要がないので簡単でした。

VB版を読み込もう

NeoMuplのVB版データの読み込みを作ってました。
VB版とC#版ではデータ形式が異なるので、別々の読み込みアルゴリズムを組んでやる必要があるのです。
とはいえ、=で区切るかタブで区切る海外に大きな違いもないので、ある程度は前のプログラムを流用できそうです。
ただ、ディレクトリの短縮表記がちょっと厄介ではありますが。

そうそう、卒研の配属が決まりました。
どうにも電子デバイス講座らしいです。
強誘電体デバイスを作ってるようです。

メテオンキャプチャ

NeoMupl、DirectMusicでの再生を実装しました。
これによりDirectShowでの再生で起こるMIDI終端のブツ切れがなくなったほか、音源が複数あれば切り替えもできるようになりました。
また、それに加えてDirectShow、DirectMusic双方でテンポチェンジができるようになりました。
そして、今更ながら項目の削除も出来ました。

そういえばメテオスオンライン。
なにやらランキング大会とやらでいろんなルールで楽しくやっていて、それには試合終了した瞬間の画面写真を証拠写真として提出することが推奨されているらしく、毎回試合するたびに画面写真を取り捲るのは面倒なので、キャプチャ用のソフトを作ってみることにしました。
とりあえず試合終了は、「生存」「GameSet」「TimeUp」の3つかな。
「滅亡」のあとには確か必ず「GameSet」が来たはず。

SetStretchBltMode

ふにゃさんの全体像画面、出来上がりました。
画面をはみ出すほど大きいステージだと縮小表示されるのですが、その縮小結果が最初やたらと黒々としたものになっていたので、どうなってるのかと思い、調べてみたら、SetStretchBltModeで縮小方法が変更できて、これの初期値が黒優先となっていたために暗い色ばかりになってしまっていたようでした。
それなりの画質で高速なものとか、高画質で低速なものなどがありましたが、通常チップは最初にマップチップそのものを高画質のStretchBltで縮小し、その結果をBitBltでどんどん使っていくという方式で速度を確保し、キャラチップのほうはその都度それなり画質のStretchBltで表示するようにしました。
なお、全体像では背景色は手抜きのため黒となっておりますのであしからず。
でっかいステージも9割方できてきました。

ところで、この高画質StretchBlt、実はTokioGLと縮小結果がほぼ同じなんですよね。
それでいてこのスピード、素人が練習で作った描画アルゴリズムとは根本的に違うのか、あるいはハードウェアで対応しているんでしょうかね。

NeoMuplは、プレイヤークラスをDirectShow、DirectMusic、普通は使わない無音の3タイプを作って、それらを一箇所で扱えるようにしていました。
DirectMusicは今のところ実装していないんですけどね。
あと、項目のプロパティの画面を作ったりしてました。
一応編集機能が、今実装できるものに関しては全部作り終わって、後はその変更結果を実際のデータに反映するところに来ています。

1173711171.png

ソーティングとDirectMusic

こないだの限界突破したLineConstructorとByteEdit、今日アップしました。

NeoMuplのDirectMusicをどのように使うか決めるため調べものしてました。
MIDIの再生にはDirectShowよりもDirectMusicのほうが、読み込みが速かったり演奏が正確だったりして適しているのですよ。
で、DirectMusicですが、DirectX 7 for Visual Basicが、機能面や手軽さからよさそうだったので使うことにしました。
そうそう、自動ソート機能も実装しました。
ファイル名順、タイトル順、再生日時順の3つを、昇順と降順の2種類用意したので、合計で6種類のパターンから選べます。
曲を追加したときに並べ替えられるのはもちろんのこと、再生日時順のときだけ、再生するたびに並べ替えが実行されます。

NeoMuol

Frieve Editor、使い始めてみました。
コンセプト的にはうちにあるメモちらしと似たようなもの、というか、ああいうのを作ろうと思っていて撃沈したのが今のメモちらしだったりするのですが。
というわけで、実に使いやすいです。
機能がいいくせにメモちらしより起動も動作も軽快と来たもんだ。
まだまだ使いこなすには程遠いようですが、テキトーにカードを散らかして遊ぶのもなかなか良いです。
こんなところでまでメモちらし負けてるよぅ…。

NeoMuplはリストと設定の読み書きまで。
識別子として「NeoMupl015」と書くべきところを間違えて「NeoMuol015」にしてしまったせいで読み込めなかったりもしましたが、もう大丈夫です。
読み書きの処理自体は今のところ問題はないようです。

ふにゃさんの裏話を一つ更新しました。
とげとげの話です。
…が、どうやら次のバージョンでまた何かあるようです。

1173192669.png

広いだけじゃないのだ

NeoMuplのファイル読み書きを作り始めました。
VB版とは互換性を持たせない方向で。
う~ん、もしかすると読み込みだけなら旧バージョンのものも可能かもしれませんが…。

ふにゃさんの広いステージ、7割ぐらいできてきました。
いやー。のってくると楽しいもんですね。
部分部分で一つのステージとして成り立つほどのボリュームがありながら、更に他の部分での行動を受けて変化してゆき、取れなかったアイテムが取れるようになったりアクセスが楽になったり。
さすがに滅茶苦茶時間のかかるステージなのであっさり死んでしまうような嫌な仕掛けは少ないですが、それでもところどころに失敗するとそれで終わりという場所、特に順番を考えるべき場所は数箇所設けています。

基本的な再生機能

NeoMuplの再生がちゃんとできるのを確認できたので、再生終了後の処理なども実装して、途中バージョンをまたアップしておきました。
ダブルクリックした場合はループ再生になります。
ファイルメニューなんかは全体的に未実装なのでご注意くださいませ。

自動車免許

自動車学校行ってきました。
いい加減免許を取ろうとね。

NeoMuplは、再生用クラスを用意して、再生メニューもとりあえず実装して、一応鳴るようにはなったはず…。

なんて広いステージ!

ふにゃさんの追加用極悪ステージを作っています。
なんというか、もう、めげそうです。
ふにゃさんのスペックの限界まで広いステージを作ってるんですが、やっと今下から2割ほど使い切ったところです。
空間を広く使うとどうしても大きな空白ができてしまうのですが、その部分にまで意味のあるコースを作ってしまうといくらなんでも探すのが大変すぎるということで、その部分にはわざわざ来てくれた人のために何かブロックで絵でも描いておこうかと思っています。

NeoMuplは、DirectShowだけでなくMIDIに関してはDirectMusicも使えるように方法を思案中です。
やっぱりMIDIのループ再生にはDirectMusicが一番向いていると思うのですよ。

<前 次>