開発日誌
今月の写真:オオイヌノフグリ
このページについて
このページは 過去の日記 - 2005年3月 です。
最新の日記・他の月の日記
2005年3月2日(水)
VCLは便利ですな
 FLAC開発は休業中なのですが、DLLの呼び出し側をDelphiで作っています。OggVorbisやFLACの曲名などの情報はUTF8でエンコードされているので、ファイルから読み出した文字列をそのまま表示すると文字化けします。さてどうするかと…と思ったのですが、VCL(DelphiとC++Builder共通の関数群)には便利な関数があって、DecodeUTF8関数に文字列を渡すだけで終わりです。

 先月27日の日記の続きですが、最近はアドベンチャゲームを探すときにVectorでなく、個人のレビューサイトなどから探しています。こういったところを見ていると、商用ゲームと比較している事がしばしばあるのですが、自分は商用アドベンチャゲームに手を付けたのことがないので、その善し悪しはよく分かりません。「え〜フリー?(自分は商用しかやらんぞ)」みたいなことを言っているのが身の回りにいるので、今度試しにやらせてみて、反応を見ようかと企んでいます。

 最後に、普段アドベンチャゲームをプレイする時のフォントの話を。ほとんどの作品は(NScripterか吉里吉里が使われているからですが)フォントを変えることができます。標準だとMSゴシックになっていることが多いのですが、MSゴシックだと、Webページなどで使う大きさだと、読みやすくていいのですが、少しフォントサイズを上げると、やたら太くなり読みにくいような気がします。そこでお薦めなのがY.OzFontというフリーのフォントです。手書き文字が文章を引き立てます。
2005年3月4日(金)
ついに情報だけ
 FLACのファイル情報の取得に成功しました。
FLAC__seekable_stream_decoder_process
_until_end_of_metadata
を呼び出すと、何度か指定したコールバック関数が呼び出されてしまうようで、最初に呼び出された時のmetadataを
FLAC__metadata_object_clone
でコピーすればいいようです。後は再生なのですが、OggVorbisのように簡単ではないようで、もう少し時間が掛かりそうです。
2005年3月9日(水)
来たーっ!!

 日記を更新していませんね…。まずはその理由から書くことにします。先週の金曜日、突然携帯が鳴りました。電話を掛けて来たのは大学のサークルの先輩でした…。内容は翌日からバイトに来てくれないか?と言うことでした…。画像処理と言われたので、画像処理ができる同じサークルのメンバーに頼むといいのではないかと言ったのですが、もうすでに電話したが、電話に出なかったとのこと…。(←昼夜逆転してるから…。)3月に入ってからサークルで色々あり、鬱な状態だったので、色々と忙しい時期だったのですがOKしてしまいました。(サークルには今月に入ってから顔を出していません)

 バイト先で久々にExcelのVBA(丁度4年前にExcelのVBAでゲームを作り始めて、もう3年くらい触っていない)をやることになったのですが、ささっと簡単にプログラムを書いてみるものの、

i as Long

と変数を宣言して、エラーを出したり、行末に「;」を付けてしまったり…。あとOption Explicitを記述するのを忘れていて、スペルミスが変数になってしまったり…。CやDelphiに慣れてしまった証拠かなと…。

 さて、やっと今日のタイトルに関する内容ですが、ついにFLACの再生に成功しました。この前まで再生できていなかった原因は単純なミスでした。

 原因を突き止めるために、コンソールアプリケーションとしてコンパイルし直して、TurboDebuggerでデバックしていると

buffer[1][i]
buffer[2][i]

ん?FLACはコールバック関数にチャンネルごとの32bit符号付き整数の配列として、デコード後のデータが返されるのです。今回の場合はステレオなのでチャンネルは2つ。配列の要素は0から始まるのに…。このミスを修正して、コンパイルし、早速実行すると、イヤホンから凄く大きな音が出てきました。慌ててイヤホンを外しプログラムを停止。原因は、CD品質のPCMデータは16bit符号なし整数型だと勘違いしていて、デコードしたデータに2の15乗を足していたことでした…。

 これで上手く行ったかと思いきや、音楽の最初の数秒が削られてしまっている問題と、前データ再生終了後に無限ループに入ってしまう問題が残りました。前者はmetadata取得後にFLAC__seekable_stream_decoder_reset関数を呼び出していた事が原因で、後者はデコードのループ内に

FLAC__seekable_stream_decoder_get_state
で、
FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM

が返されるとループ内を抜ける処理を加えると上手く行きました。現在、即席呼び出し側プログラムがMU2000で録音したMIDIを再生しています。

 次はシーク処理に取りかかります。

2005年3月11日(金)
これを書かないわけにはいかない

 以前から各地で噂されていたV902Tが発表されました。従来の端末との違いは、3G(WCDMA、海外、テレビコール)に対応しているのはもちろん、Bluetoothや約200万画素のカメラを搭載していること…。ドコモのPシリーズにあったような、2軸回転のヒンジも搭載しています。いつもの事ですが、重心の移動が気になりますね。

 この日記の読者の方は分かっていると思いますが、私はJ-T03→J-T51と東芝端末を使ってきています。ハードはいつもシャープが一番手で、東芝が2番手(QVGAは1番手でしたが…あの頃は液晶はシャープよりよかった…)でした。しかし、ソフト面では、マルチタスクや「今すぐ読メール」のような機能が早くから搭載されていて、さらに細かい点での使い勝手という良さがあったはずです。

 ここで問題なのが、国際統一仕様のユーザーインターフェース。各メーカー各端末の操作方法を統一したため、国内では使いにくくなったという意見がありました。その影響か従来の東芝端末にあったMENUキーが無くなっています。(空いたボタンで、「元に戻す」などを実現できるようにして有効利用して欲しかった…。)V902Tのユーザーインターフェースは開発中(ケータイWatchの記事)だそうなので、今後に期待するとしよう。

 現在使用中のJ-T51の2本目の電池の寿命が近づいているようです。データフォルダも満杯で、外部にデータを送る手段もない…。そろそろ機種変更かというところですが、3Gにすると、ステーションを見ることもできず、新ユーザーインターフェースへの不安も…。V903Tの名前も出て来ているようですので、発売まではとりあえず様子見です。

 カラーはV603Tと違って格好いいといった感じですね。今はプラチナシルバーを使っていますが、マットブラックが良さそうです。全世界で発売されるからか、辞書機能が見あたりませんね。

リンク
ケータイWatch - ボーダフォン、AF機能付き192万画素カメラ搭載の「902T」

2005年3月14日(月)
LGA775とSocket939

 LGA775のマザーボードにカードを挿すとSocket939のCPUを使えるというマザーボードが展示されたようです。チップセットはSiS656とSiS756+SiS965だそうです。そういえば、SiS656と756が発表されてからもう1年経ちましたねぇ…。まだ販売されている製品は存在しないようですが…。

 1年といえば、この開発日誌を書き始めてから1年が経ちました。更新の時に間違えてローカルに置いてある2004年3月の日記をアップロードしてしまったりしています。(上書きしても同じ物ですから影響はないんですけど…)サイト開設1周年記念で、4月1日にはそれなりの更新を予定しているのでお楽しみに。(正確には3月XX日なのですが、広告免除を適応した日が4月1日なので…)

 土曜日に大学に行く用事があったので、TAM Music Factoryの新曲の「花時」をMU2000でレコーディングしてきました。しかし、変換結果はもう一つで、MidRadioPlayer内蔵音源(S-YG20相当)で再生した物のほうがいいかも…。MIDIファイル自体は一切編集していないので、MU2000の機能を使い切れていないのですが…。

 MIDI関連で時々思うことですが、未だに「MidiPlugで再生して下さい」と書いているHPがありますが、もうMidiPlugの配布は終了しているので、MidRadioPlayerに表記を改めた方がいいと思います。ただし従来のプラグインには対応していないので、一度曲をダウンロードする必要がありますが…。XG規格の曲を再生できることは変わりません。

リンク
CeBIT 2005会場レポート(PCWatch)

2005年3月20日(日)
V902Tが注目されている!?

 ここ数日V902T、V903Tをキーワードとしたアクセスが増えています。3G端末なので正しくはVodafone902Tと表現すべきなのですが…。(長いので…。)

 端末の機能やユーザーインターフェース(UI)の統一は微妙ですね。せっかく日本で今までに築いてきた物が大分無駄になってしまいますし…。携帯端末はPCと違って、ユーザーがソフトを組み込んだり、パーツを交換することができるわけではないので、国や地域によって、求める機能が違う物を、一つに統一しようとするのはかなり無理があるような気がします。それとも、ヨーロッパ地域の仕様はそんなに日本に合っているもしくは優れているのでしょうか…。

 国際ローミングを犠牲にしてでも、Vodafone802Nのように国内専用にして、従来の機能を引き継いだ方がいいような気がします。(国内限定販売にして、国際ローミング対応という方法もありますね)

2005年3月21日(月)
ついにDVDドライブを購入

写真(DVR-ABM16A) ハードディスクの残量が減っていて、データを外に書き出すためにDVDドライブを購入しました。買ったのはアイ・オー・データ機器のDVR-ABM16Aです。松下製寿電子工業製ドライブを使用していて、DVD±R DL、DVD-RAMに対応しているのがポイントです。(-R DLは後日対応予定)

 価格は地元のヨドバシで13800円(+ポイント還元)でした。もう少し待てば価格が落ちると思いますが(日立LGやNECのドライブを採用したアイオーの製品は1万円を切っていた)、大学から持ち帰ったCD-RWのデータを保存できない状態なので、価格改定を待たずの購入です。採用されているドライブ(SW-9585)のバルク品(ソフト付き)はもっと安い値段で販売されているようですが、ROM化互換機能の搭載の有無などが心配なので、アイオーの製品を選びました。

 CD-ROMドライブの取り外しは何度かやっていて、現在PCの蓋は外したままなので、交換はあっという間に終わりました。このPC(IBM Aptiva E Series 2197-4DM)はスリム型のケースなのですが、メモリーなどに干渉せず無事装着することができました。HDDに容量が無く、新しいPCを自作したら元のドライブに戻すので、余計なソフトは入れずDVD-RAMドライバーのみをインストールしました。そして早速買ってきたばかりのDVD-RAMディスクをフォーマット…。回転速度が速いからか、以前のドライブより騒がしいです。

 早速色々な物が入ったファイル(約1GB)をDVD-RAMに書き込んでみましたが、書き込みに要した時間は約7分でした。今までCD一枚に20〜30分掛けていたので、大満足です。HDDにコピーするのと同じように書き込めるので便利です。UltraSpeedのCD-RWにも期待していたので、後で試してみます。(もちろんFTP版のLinuxのインストールディスクを作るためです。)

2005年3月24日(木)
やはりVCLはいいですな

 またまたこんなタイトルですが、あぁ今度はαチャンネル対応PNGを使ってみたいとか曲のタグ情報を読み込んでみたいと思ったときに、ネットを探せばすぐにクラス(オブジェクト)が見つかるので、簡単に実装できます。もちろん自分で資料と睨めっこをしてプログラムしてもいいのですが、時間が限られているので全部を用意することはできませんし…。何かオリジナルのコンポーネントを作成したら、公開するつもりです。TFullScreenFormも使いやすいようにコンポーネント化したいです。フォーカスを失ったときにウインドウ状態に戻す処理を実装できそうなので、その辺も含めて…。

 相変わらずVodafone902T(以下長いのでV902T)関連のアクセスが増えて、カウンターもやや勢いよく回っています。Vodafone 3G といえば、ボーダフォン同士ならどんな大きなメールでも受信料無料と言うことを忘れてはいけませんね。J-T51(ムービー写メール対応第1世代)を使用しているのですが、ムービー写メールを利用したことがありません。写メールもほとんどが自分のPC宛…。自分の通信料は無料通話が余るくらいなので気にしなくてもいいのですが、相手方の通信料を考えないといけませんからね。その点相手がVodafone3G端末を持っていると知っていれば、気にせず送ることができます。あぁV902Tの発売が楽しみだ。(そんなUIになっていることやら…)

 話が変わりますが、天気が良かったので大学まで自転車で行くことにしました。普段の電車での通学時間はゆっくり歩いて約40分。自転車で行くのは初めてですが、自宅近くの道を真っ直ぐ行くだけなので、道に迷うことはありません。線路沿いの道なので、電車と競争することになります。ただ、流石に時速90km/hで走る各駅停車には直接は勝てませんが、途中にある4つの駅(7分停車する駅もある)で追い抜くことができるか…。

 結局掛かった時間は45分弱。電車通学とあまり時間が変わりませんでした。途中の道がもう少し走りやすいといいのですが…。(背中にノートPCを入れて走るのは危険そうです)帰りは途中で雨が降ってきて、家に着いた頃にはびしょびしょに…。今度の時の為に、走りやすそうな裏道を探しておかなければ…。

2005年3月31日(木)
長い間悩んでいた問題が解決した

 大分前からDelphiでコンポーネントを作成しているときにこんな問題が出て困っていました。

  • defaultで設定したのに、設計時にその値がオブジェクトインスペクタに反映されない。
  • 実行時にオブジェクトインスペクタで設定した値が代入されていない。

 今日も現在作成中のウインドウフルスクリーン化コンポーネントでこの現象が発生したので、最近参加したDelphi-MLの過去ログを調べていると、こんなことが分かりました。

  • defaultで設定するだけでは、実際に値がプロパティに代入されるわけではなく、初期値として代入したい値はコンストラクタで代入する必要がある
  • defaultで設定した値と同じ値がオブジェクトインスペクタで設定された場合、その値を保存しない。

 つまりコンストラクタで代入しないで、さらにオブジェクトインスペクタでdefaultで設定した値を設定すると、一度も代入しないことになってしまいます。ということで、無事問題解決です。Delphi-ML:46889の長町さんに感謝です。

 1周年で何かをやるという話は、思ったより作業に時間が掛かっているため、どうなるか分かりません。そういえば明日は窓の社(マドノヤシロ)の更新日ですな。

リンク
Delphi-ML:46889