2010年9月25日土曜日

日記ちゃん


 赤い刀みたく敵弾が自機の周りをぐるぐるまわるようにしたら面白いかなと思って。
見た目のインパクトは結構あるんだけど、身動きが取れなくなるのでゲームとしては微妙に。
ボス戦が待機げーになってしまうので没。
あと弾変換でプチフリーズする、まあこれはいいか。
 

 無音……。
音ずれがひどくて、やむなく音カットで録画。30フレーム。
最初と最後に黒フェードいれてそれっぽくしたものの、
解像度の問題かフレームレートの問題でぱっとしない。

2010年9月24日金曜日

日記ちゃん


 同じバージョンのVC++2005を入れたはずなのに前回といろいろ違うw
まずエラー一覧ウィンドウ。存在すら知らなかったがこれは便利ね!
前からエラーと警告の見分けがつかないと思ってたんだ。
 コンパイルがF7じゃなくなった。つい習慣でF7押しても何も起こらないのが悲しい。
 
 デバッグ用にOutputDebugStringでなにやったか表示してるんだけど
配布用実行ファイルにこのデバッグ関係の文字が入っててキモイ! 
ってことでどうにか存在を消せないかと試行錯誤。
可変引数なOutputDebugStringを作って利用してたので、ここら辺をいじくる。

#ifdef _DEBUG
  #define outputDebugString(...) outputDebugStr(__VA_ARGS__)
#else
  #define outputDebugString(...) outputDebugStr( )
#endif

 というように引数をばっさり切り捨てて対応した。
最初は_Releaseのときに可変引数なOutputDebugStringの関数の中身をまっさらにしてみたがうまくいかなかった。
意味のない関数ってことで最適化で消されるかとおもったが、デバッグ用の文字はばっちり残ってた。

2010年9月23日木曜日

FMV-7140MGドライバ

大体のドライバは
 
FMWORLD(法人):FMV > ダウンロード > FMV-LIFEBOOK/FMVバリューライン 2003年10月-2004年3月モデル(2003年下期) : 富士通
http://www.fmworld.net/biz/fmv/support/download/2003_2/lifebook/
 
からとってくれば解決するがサウンドドライバがないのでとってくる必要がある。
 
ダウンロードRealtek AC'97 Audio 5.37 - UpdateStar.com
http://www.updatestar.com/ja/detail/realtek-ac-97-audio
 
 購入時のときよりバージョンがあがったのかユーティリティの項目が増えてたりしてすこしうれしい。

 
 
 不明なデバイスが二つあるが、よくわからん。
キーボードについているアプリケーションボタンに関係したユーティリティがあったような覚えがある、あきらめるしかないか。
 
 
 
/** 101207追記 */
 ディスプレイのドライバが古いのかしょっちゅう「ialmrrt5 が正常に動作しなくなりました」とかいって操作不能に陥るので最新を当ててみた。
 最新のIntelドライバはこちらから
インテル® ドライバー・アップデート・ユーティリティー
http://www.intel.com/jp/support/detect.htm?iid=dc_spotlight_home1

日記ちゃん

 OS再インストールにものっそい大失敗してすべてのデータが跡形もなくぶち飛んでいった。
これは本格的にもうだめかもわからんね。
あとLANのドライバとかDLし忘れてネットにもつなげないという。
ただ、入れたての状態はとても軽くて快適!
 
 
 
 DirectXを入れてないので自分のソフトも動かない。すごく新鮮だ。
最新のVerが何か知らないけど(d3dx9_40.dllかな?)
いままで作ったソフトはdxsdk_dec2005だったかを使ってるのでそのころ以降にバージョンアップをしてれば動く、はず。
ring^-27は問題なく動いた。DirectSoundはここら辺かなり甘めなのか。
 
 
 大体復帰した。
まるまる1日かかったわ。
アンチウィルスソフトをAVGからMicrosoft Security Essentialsに乗り換えた。
普段は軽めだけど、ときどきCPU100%もってく。
AVGはときどきメモリごっそり持ってくからどっちとるかみたいな感じ。
半日使ってみたら、Essentialsのほうが大変なメモリ食いだとわかった。
200Mとか使いすぎだろ。
殺す! HDDから殺す! 撃滅!
 
 ライティングソフトないなと思ってとりあえずimgBurnを使ってみた。
一応は書き込めてるっぽいがCompletedとか出ないしなにやらはっきりしない。Warningでてるしね。
直感的で使いやすくはある、表面上は。
よく読んでみれば「ディスクチェックしたいけど、トレイ自動で閉められないから自分で閉めてね>_<」みたいな感じだった。
とりあえず正常に焼けるっぽいからいいか。

2010年9月22日水曜日

日記ちゃんだるい


パッケージの読み込みエラー
というのがでて解決するのに「vs2005_beta_cleanup_tool.zip」が必要なんだけど
リンク死んでて入手不可。
アンインスコしても直らないし\(^o^)/
 
 いまのところコンパイルは可能。デバッグも可。
ただ設定が変えられないので実行ファイルにデバッグ情報が混じった現状をどうすることも出来ずに困ってる。
別のPCにプロジェクトを送って、設定変えてから返してもらう案とかで回避自体は可能か。
 
 
 
■以下メモ
 
●「vs2005_beta_cleanup_tool.zip」入手先
Summary: using the VS 2005 beta cleanup tool to prepare a machine to use VS 2005 beta 2 - Aaron Stebner's WebLog - Site Home - MSDN Blogs
http://blogs.msdn.com/b/astebner/archive/2005/04/25/411974.aspx
 
●手段
Raushia:Visual Studio 2005 Express Edition Beta 2 のエラー対策 - livedoor Blog(ブログ)
http://blog.livedoor.jp/raushia/archives/20292316.html
  
 
 
●今試してるのはこれ。
VS 2005 Express Editionインストールの問題(ベータ2→正式版) - Visual Studio 2005 - Visual Studio User Group
http://vsug.jp/tabid/63/forumid/42/postid/2464/view/topic/Default.aspx
 
 「vs2005_beta_cleanup_tool.zip」のかわりに「vs_uninst_betas.exe」を使って殺そう! という趣旨。
で、ためしたが結局解決せず。
ただ、devenv /resetskippkgsうんにゃらって表示から
VCExpress /resetskippkgsうんにゃらって表示に変わった。
devenvと名前が付くファイルは存在しなかったのでちょっと前進。
でもresetしても何も変わらず。

 
  
●だめだったらこれ試す
Readme: Microsoft Visual Studio 2005 のセットアップに関する問題
http://msdn.microsoft.com/ja-jp/vstudio/aa718687.aspx
 そもそも「_9160_RTL_x86_enu_WH_ED_AppDesigner.cab」がディスクにない。
 
 
 最終手段としてOSごと殺害。
これはこれで面倒くさい。

2010年9月21日火曜日

日記ちゃん


 ぐねぐね系のレーザーを実装。
グラⅤとかパルムのびりびりとか。
 1個新しいレーザーオブジェクトに角度をあわせて描画するとグネグネ系っぽくなる。
オブジェクトの管理方法次第では糞面倒くさい処理になりそうだけど、
今回はさっくり2行ぐらいの実装ですんでラッキーだった。
 
 夕立で布団がやられた。
ファッキン夕立。
 
 大学で食べたチープなカツ丼が懐かしくなって、自分で適当に作ってみた。
めんつゆ沸騰させて卵いれるだけ。
家にたまねぎがなかった。悲しい気持ちになった。

2010年9月18日土曜日

日記ちゃん

 Cドライブぶっとんでますよ!って怒られたからディスクチェックなう。

 一回チェックしてもまったく直ってないようだったからこりゃもうだめかなーとおもいつつ、
もう一回チェックしたら直った。よくわからんが。

2010年9月17日金曜日

日記ちゃん


 弾の進行方向上に自機が存在する場合、弾が変色する機能を実装。
処理食うかと思ったけどそんなでもなかった。atan2。
意外に役立つ感触はあるんだけど、弾に横からぶつかる場合なんかは何の役にも立たずに普通に死ぬ。
あと弾のグラフィック管理が超面倒くさいことに。
 
 いくらかためしてみたが
かなり強力で、壁みたいな弾でもひきつける前に回避可能でちょっとバランスクラッシャ。
弾を回避するどきどき感とかは大きく減少するもののアシスト機能としては優秀だから扱いに困る。

2010年9月16日木曜日

LMMS 0.4.8

最近LMMSを知ったのでちょっと使ってみた。
とりあえずSynth1 v107とaquestone0720、デフォで入ってたキックを使用。
ぱぱっと15分ぐらいで8小節分。
testLMMS.ogg (227KB)
 調べてもぜんぜん情報が出てこないからかなり適当にぺこぺことうちこんだ。
wav出力が1ボタンでできるので超簡単。
MusicStudioProducerを昔は使ってたけどこれが超落ちるし、出力よくわからんしだったが、
それにくらべれば使いやすい。
 設定が保存されないのでその場限りの一回こっきり。

シルバーガン


 加算合成してると何か新鮮だな!

2010年9月11日土曜日

日記ちゃん


 キーボードかった。
ノートPCのディスプレイが壊れてから、
CRTディスプレイは右、ノートPCは左においたところ誤字率が大幅アップ。
ディスプレイとキーボードは正面にあったほうがいいね。
 しかし買うお金ないなー、と思っていたところ
ひょんなことからamazonポイント4000円分を入手したので、えいやっ、と買うことにした。
ついでにイヤホンも断線してたので新調。方耳で曲作るとかあほなことしてたので。
 
Amazon.co.jp: ELECOM コンパクトメンブレン式フルキーボード TK-FCM005シリーズ: 家電・カメラ
http://www.amazon.co.jp/dp/B001QXCZ8U/
 キーボードはこれかった。ノートPCのとほとんど同じ仕様だけど、左CtrlとFnキーが逆になってる。
打ち心地は悪くないし、打ち間違いもあんまりない。
それでも、おっかなびっくり打ってるが。BackSpaceとかDelキーあたりは間違えそうで不安。
 
Amazon.co.jp: SONY インナーヘッドホン [MDR-E931SP] L: 家電・カメラ
http://www.amazon.co.jp/dp/B0000C90IO/
 音の聞こえがかなりストレートで低音を強調するでもなく高音を強調するでもない素直な感じ。
イヤホンを変えた新鮮さはないが、変に飾ったのよりはいいのかなあ。
ケーブルが太めで断線に強そう。
 
 注文してから2日で届いたので吃驚した。
やたら大きなダンボールに入ってて笑ったけど。



/** 2010-10-21追記 */
 一月ほどキーボードを使ってみたが、
メニュー表示キーの位置、delキーの位置が違うのに途中で気がついた。それほど影響はない。
Fnキーと左Ctrlが位置違いなのがかなりうざく、1ヶ月たった今でも押し間違える。
それから全体的に、どこを押しているのかよくわからなくなる。原因は不明だが気がつくと指がずれててびっくりする。
ついでにCキーのインクがすでにはがれつつある。
 といった具合。正直あまりいいものではないかなあ。
うち心地は結構いいんだけどねえ。numLkがFn+F11と押し間違えることがなくなったのはうれしい。

2010年9月10日金曜日

日記ちゃん

 パイナップルの缶詰をつかってケーキを作ったが、
こりゃフォークで切れないからダメね。
味はさっぱりしてて悪くないんだけど。
 みかんなんかはフォークでも切れるからわりと良い感じになる。
いちごは高いからダメ! 絶対!
 
 小麦粉を混ぜる段階で溶けなくて困ってたんだけど、
小麦粉を3回振るったところ、割とよく溶けた。かなり気合と根性。
 

2010年9月8日水曜日

ビット単位のコピー

 あると便利かなーと思って作ってみた。
1Byteづつチェックするため速度かなり遅い。
ビットレベルの操作を広範囲に行うことはあまりないと思うからまあいいかなと。


#include <cstdio>
typedef unsigned char BYTE;
 
/*
 * @param dest コピー先バッファ
 * @param destBitPos コピー開始ビット位置
 * @param src 参照バッファ
 * @param srcBitPos 参照開始ビット位置
 * @param copyBitSize コピーするビット数
 */
void bitCopy(
  void* dest, int destBitPos,
  void* src, int srcBitPos,
  int copyBitSize )
{
  BYTE* destBin = static_cast<BYTE*>( dest ) + destBitPos/8;
  BYTE* srcBin = static_cast<BYTE*>( src ) + srcBitPos/8;
  destBitPos &= 0x7;
  srcBitPos &= 0x7;
 
  while ( copyBitSize > 0 )
  {
    int size = copyBitSize > 8 ? 8 : copyBitSize;
    size = min( 8-destBitPos, size );
    size = min( 8-srcBitPos, size );
    BYTE destMask = static_cast<BYTE>(0xFF >> (8-size)) << destBitPos;
    // trans copy
    *destBin = ((*destBin ^ (((*srcBin)>>srcBitPos)<<destBitPos)) & destMask) ^ *destBin;
 
    copyBitSize -= size;
    destBitPos += size;
    if ( destBitPos >= 8 )
    {
      destBin++;
      destBitPos -= 8;
    }
 
    srcBitPos += size;
    if ( srcBitPos >= 8 )
    {
      srcBin++;
      srcBitPos -= 8;
    }
  }
}
 
int main()
{
  int dest, src;
  src = 0xFFFF0000;
 
  dest = 0;
  bitCopy( &dest, 8, &src, 16, 13 );
  std::printf("%08x\n", dest);
 
  dest = 0;
  bitCopy( &dest, 8, &src, 12, 13 );
  std::printf("%08x\n", dest);
 
  dest = 0;
  bitCopy( &dest, 8, &src, 9, 13 );
  std::printf("%08x\n", dest);
 
  dest = 0xFFFFFFFF;
  bitCopy( &dest, 8, &src, 16, 13 );
  std::printf("%08x\n", dest);
 
  dest = 0xFFFFFFFF;
  bitCopy( &dest, 8, &src, 12, 13 );
  std::printf("%08x\n", dest);
 
  dest = 0xFFFFFFFF;
  bitCopy( &dest, 8, &src, 9, 13 );
  std::printf("%08x\n", dest);
 
  return 0;
}

[20110412]&lt;と&gt;逆にしてたのを修正。
 
output:

001fff00
001ff000
001f8000
ffffffff
fffff0ff
ffff80ff

日記ちゃんマルチロック


 アンカー対象を複数にできるようにした。
・ボタン1を押すと武器変更。
・だれかしらにアンカー刺しとけばいつまでも倍率維持。
・エネルギーが切れたら全員から強攻撃される。
 といった感じ。
使い勝手はいままでのアンカーとあんまり変わらんのはいいのか悪いのか。
自機基底の仕変が堪える……。

2010年9月6日月曜日

80bit浮動小数点数?

 行き詰った。
テスト用のaiffファイルの80bit浮動小数点数データは
0x400EAC44000000000000
で、前半16bitに符号と仮数。後半64bitが指数になる。
 対して普通のdouble、つまり64bit浮動小数点数は
0x40E5888000000000
で、前半12bitに符号と仮数、残りが指数となる。 
ちなみにこの数値は44100。
 こねくり回しても同じ値にならなくてこまってる。
そもそも指数部は違うパラメータにならないと思うがいったいどういう。
 
 でも仮数部は同じ値なんだよね。
0x400E - 16383 = 15
0x40E - 1023 = 15
で。かえってややこしい。
 さらにいえば80bitの指数0xAC44は44100で正しいはずだけど、
64bitdoubleの指数部をバイナリそのまま覗くと上記の数値なんだよなあ。
なんか不思議な力が働いてるのか? うーん。
 2進でみると
0xAC44 = 1010110001000100
0x5888 = __101100010001000
で、二桁ずらせば一部一致する。すごく怪しい。
 
 だんだん面倒くさくなってきた。
サンプリングレートなんて44.1Kとか22.05Kとか11.025Kとか大体固定だろうから、
10Byteデータが一致するかどうかでチェックしたほうが早いかも。
 
/** 2011-04-11追記 */
浮動小数点演算ではまった話 - bkブログ
IEEE 754 の 32ビットと 64ビットの浮動小数点数には仮数部の前に暗黙の 1 (暗黙ビット) が置かれることになっていますが、80ビットの浮動小数点数には 歴史的事情により 暗黙ビットは存在しません。
 と、半年たって知った。この辺がカギになるんだろうが今のところ手を付けてない。
 
 64bitのほう、44.1Kを手で計算した。
(2)0100 0000 1110 0101 1000 1000 1000 0000 ...
となり、0x40E58880...と実際に得られるデータと一致。
 それから80bitのほうを手で計算。そのとき仮数部の先頭1をカットしない場合
(2)0100 0000 0000 1110 1010 1100 0100 0100 0000...
となり、0x400EAC440...となった。やった!
 
 というわけで80bit浮動小数点数を64bitにするとき、
仮数部先端の1を除去すれば変換可能のようだ。

2010年9月3日金曜日

日記ちゃん

 先日
D&Dで.aifを.wavにリネームしつつ同フォルダに吐き出してく
といったが、今更にこの要求をみたすソフトを発見した。
もともとは動画から音声を抜き出すツールを探してたんだけど,
wavからoggまでいけるというからためしにaiffもドロップしてみたら変換された。

えこでこツールの詳細情報 : Vector ソフトを探す!
http://www.vector.co.jp/soft/winnt/art/se445019.html


 何日か使ってみたがやたら落ちて使えないよ!
と思ったらサイトのほうに最新版があった。
えこでこツール Wiki - SourceForge.JP
http://sourceforge.jp/projects/ecodecotool/wiki/FrontPage
 最新が2009年なのに、Vector登録されてないという。
とりあえず1個変換したが落ちなかった。

 
 
 

日記ちゃん

 エンディアンの変更はとりたてて特殊なことはせず普通に上下ひっくり返した。
汎用的なのが1個あれば十分かなあ、データ部分での速度を考えると2Byte用があってもいいかもしれない。

void changeEndianness( void* dest, size_t size )
{
  BYTE* destByte = static_cast<BYTE*>( dest );
  const size_t n = size/2;
  for (size_t i=0; i<n; ++i)
  {
    BYTE tmp = destByte[i];
    destByte[i] = destByte[size-i-1];
    destByte[size-i-1] = tmp;
  }
}

 
 問題は80bit浮動小数点数のほうだけど、
まずbitを操作して正しく値がちゃんと取れるかどうか検証すべく、
floatをdoubleにするプログラムを試作。キャストでなしにね。げた脱がせたり履かせたり。
結果うまくうごいた。理屈の上では問題ないらしい。
長いので乗せないが凄く環境依存コードです……。まあいまさらだけど。
 あとは書くだけか。
 
 テストにしてもなんでdoubleをfloatにするプログラムにしなかったんだろう……。
逆じゃね普通。
 
 そんなわけでdoubleをfloatに落とすプログラムを書いてテストした。

#include <cstdio>
#include <cstring>
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;
 
void print16( void* data, int size )
{
  BYTE* bin = static_cast<BYTE*>( data );
  std::printf("0x");
  for (int i=size-1; i>=0; --i) std::printf("%02x", bin[i]);
  std::printf("\n");
}
 
 
float doubleToFloat( double val )
{
  float ret = 0;
  BYTE* fBin = reinterpret_cast<BYTE*>( &ret );
 
  BYTE bin[ sizeof(val) ];
  memcpy( bin, &val, sizeof(val) );
 
  // s
  fBin[3] = bin[7] & 0x80;
 
  // exp
  WORD exp = (static_cast<WORD>(bin[7]&0x7F) << 8) | static_cast<WORD>(bin[6]);
  exp >>= 4;
  BYTE newExp = static_cast<BYTE>(exp - 1023) + 127;
  fBin[3] |= (newExp >> 1);
  fBin[2] = (newExp << 7);
 
  // fraction
  DWORD frac = (static_cast<DWORD>(bin[6]&0x0F)<<24) |
    (static_cast<DWORD>(bin[5]) << 16) | 
    (static_cast<DWORD>(bin[4]) << 8) |
    static_cast<DWORD>(bin[3]);
  frac <<= 3;
  BYTE* fracBin = reinterpret_cast<BYTE*>( &frac );
  fBin[2] |= fracBin[3];
  fBin[1] = fracBin[2];
  fBin[0] = fracBin[1];
 
  return ret;
}
 
int main()
{
  double val = -44100;
  std::printf("double: %f\n", val);
  print16( &val, sizeof(val) );
  std::printf("\n");
 
  float fVal = doubleToFloat( val );
  std::printf("float: %f\n", fVal);
  print16( &fVal, sizeof(fVal) );
 
  return 0;
}

 
output:

double: -44100.000000
0xc0e5888000000000
 
float: -44100.000000
0xc72c4400

 かなり力技だけど、でもビットいじくって何とかできることはわかった。
ちなみに円周率3.141592653589793238でためすとこうなった。floatでもわりと表現範囲が広いのね。

double: 3.1415926535897931
0x400921fb54442d18
 
float: 3.1415925025939941
0x40490fda

 
 ざっとしらべてたら同じようなこと考えてる人がいた。さすがにコードがコンパクト。
2007/06/24 HSP で float 型っぽい変数
http://sprocket.babyblue.jp/html/hsp_koneta3.htm#tofloat
っていうかd3mの人だ!
 
 0x38000000ってなんじゃいと小一時間ほど弄繰り回したところ大まかに把握できた、様な気がする。
doubleの仮数が20bit~31bitに存在するのでこの数値を、
20bitシフト(>>20)し、げたを脱がせ(-1023)た後に再びげたを履かせる(+127)れば、float用の仮数を生成できる。
速度を考えるといちいち>>20なんてビットシフトしなくても(-1023<<20) + (127<<20)、
つまり(-896<<20)をすればいいじゃない、となる。
ビット操作なんだからunsignedがいいよね! ってわけで-(893<<20)のほうがよいか。
doubleの上位4Byte - (896<<20)を16進数にすれば
doubleの上位4Byte - 0x38000000 といった具合で謎だった数値が出てくる。

2010年9月2日木曜日

411号

411号
http://cid-8cd7cf5ea9fbca55.office.live.com/self.aspx/Public/music/no%20name^_411.ogg
size: 2.50MB
time: 2:28
 
ツール:ピストンコラージュ v0.9.1.4 + SoundEngineFree v4.51
デフォ音源
 
 気が付けば400 Over
ring4面用に作ったがボツ。
もりあげてからstringsだけにするのもありかなと試してみた。
MIXとかしてみてどれだけ他の曲に強引に移行できるか実験してみたいと思いつつ実行に移さない。
ReMixってレミXって読むととたんに謎の幼女吸血鬼Xになるなと思ったが、割とどうでもいい。