2015年5月30日土曜日

カツ丼どん




何かむしゃくしゃすると、


カツ丼をどーんと頼んでしまう。


そばなんか付いてたら最高!

2015年5月27日水曜日

Windows:マイクロ秒精度のタイマー

Dxlibに頼らないFM音源ドライバーになりそうだったので、Dxlibに頼ってた関数を
Windowsの標準APIに置き換え。ほとんどがファイル関連だった。最後に残った
マイクロ秒精度のタイマーは音楽関連では必須なので、これを自分用に変換。
ググったらあんまりいいのがなかったので自分で解決。

LONGLONG MyGetNowHiPerformanceCount(void){
LARGE_INTEGER liFreq;
LARGE_INTEGER liNowTime;
QueryPerformanceFrequency(&liFreq);
QueryPerformanceCounter(&liNowTime);
return ((liNowTime.QuadPart * 1000 * 1000) / liFreq.QuadPart) ;
}

これでマイクロ秒精度のタイマーが取得できる。

周波数はアプリの最初に一度だけ取ってきたら良いらしい。その時に0が返って
来たら、そのシステムがこの関数に対応してないそうなので、ミリ秒系のを使う
しかないらしい。timeGetTime()とかを1000倍してあげればいいのかしら。

Windows:ウィンドウアプリでもadpcmダメ

うまいこといったのでポポポンとZPDを読み込んでバラして一個づつ鳴らすのを
コピペ、ビルドを通して実行。

結果、DxLibの時と同じ鳴り方でした。最初の方だけチラっと鳴るだけ。
残念・・。

コンソールとウィンドウアプリではマルチメディアタイマの扱いが違うのか、
何か根本的に違うのか、今の僕では全然わからない!!

というわけで、一旦X68sound.dllでFMと一緒にadpcmを鳴らすのは保留とします!!

今後の新曲はWAVやOGGを鳴らす方を使えば実害は無いのでOKとします。

でも・・、adpcmを独自解析して鳴らすという方向性もまだ残されている・・。
どうしようかしら・・。

Windows:プリコンパイルヘッダの恐怖

adpcmがちゃんと鳴らない原因を探るため、DxLibを使わないWindowsアプリを
作成中。

コンソールアプリでは、ZPDを分解してadpcmが一つづつ鳴る事を確認!
やった!

次は、ウィンドウアプリだ、ということで、ウィザードに任せて空のアプリを作り、
そこにいつものx68sound.h sound_iocs.h x68sound_load.cpp sound_iocs.cpp
を加えてビルド。エラー出まくり。

プリコンパイルヘッダがなんだと色々文句(warning)が出てきてるし、エラーも
出てビルドできず。

色々やるもダメで、帰宅。

ウチにいる間に頭が冷却されたのか、今朝、もう一回やってみたら、うまくいった。

原因はプリコンパイルヘッダだった!

stdafx.h stdafx.cpp

これらは、コンパイルのスピードをアップするもので、何か規約的なものがあって
それに沿って作られていれば非常にありがたいものらしい。コンパイルの時間が
3倍になるとか!

http://www.geocities.co.jp/Hollywood/2358/mfc_7.html

でも、現代ではCPUのスピードもあがってビルドで待たされる事はほぼ無いよね。

なので、

<< C/C++→プリコンパイル済みヘッダー→プリコンパイル済みヘッダーファイルを使用 >>

これをオフにしてみた。そしたら動いた!

あ、あと一箇所、UNICODEをマルチバイトにする必要もある。

<<全般→文字セット→マルチバイト文字セットを使用する>>

これでDLLが読み込まれてた。

でもまだadpcmを鳴らすトコまでは行ってない。どうなるのか!?

2015年5月26日火曜日

Windows:FM音源はほぼ終了

怪しい所はあるにはあるが、FM音源周りに関しては以前のデータが同じ感じで
鳴るようになってきた。長かった・・。

■繰り返しの恐怖
|: |:cdefg:| gfedc:|
なんていう繰り返しのネストが可能だったのをだいぶ後に気づき、
ネスト対応にする為にえらく苦労した・・。ハマった。
・相対的に指定する
・ループエンドを見つけたら前にたぐってループスタートを見つける
この2点を思いついたら意外と少ないコードで実現できた。よかった。

■オクターブの恐怖
よくわかんないが、繰り返しの中でオクターブの上下をしても、
繰り返しから出たら元通りになるという仕様を発見。なんだこれ。
これも悩みに悩んだけど、繰り返し展開のスタート時にオクターブ
をセットするということを思いついて、なんとかなった。

■ポルタメントとLFO
ピッチ問題は後にひきまくって、数日かけてめちゃくちゃになって
しまった。ハマった。

そこで、
・オクターブと音階とKF
はOPMに寄り添わず、独自の方式で運用し、最後の最後に
独自方式からOPM対応方式に変換するという方法を思いつき、
作ってみたら意外とサックリいけた。

この方式を採用後、ピッチ関連のポルタメントとLFOが実現可能に。

ポルタメントは数日かけて悩みまくったがなんとか鳴るように。

LFOは耳コピ的に同じ数字を入れたらいい感じっぽくなるように。
sin()を使う所で結構ハマった。

sin((DX_PI / 120) * 経過時間 * 波の幅)

これでうにゅうにゅとLFOがかかるようになった。

とにかくピッチ関連はハマった。

■adpcm沼
半日くらいかけて検証してみたが、どうにもadpcmが鳴らない。

ZPDデータをバラして、一つ一つのPCMにしてファイルセーブ、
PCMをWAVに変換、WAVをOGGに変換、OGGをリストにして
読み込み、ノートデータから鳴らすということはできたので、
とりあえずめんどくさいが曲を鳴らす事は可能になった。

しかし、adpcmをそのまま鳴らしたい!という欲求が出て、
ひたすら検証をしてみた。

・普通に鳴らすと、ちょっとだけ鳴ってすぐに音が切れる。
・同じコードをコマンドラインでビルドして試した所、普通に鳴った。

そこで、DxLibが何かしてるのかと思いDxLibの息のかからない
所で鳴らしてみた。やっぱりダメ。

今の所、ウィンドウズアプリとしては僕の実力では鳴らせない。
コマンドラインのアプリだったらいけるのに。なんでだー!!

2015年5月18日月曜日

こればっかり



油断するとチャーハンを頼んでいる。


こればっかり!!

2015年5月16日土曜日

天丼運



最近、天丼運が良くなくて、


高いくせにパっとしないのが多かった気がする。


でもここのはおいしい!!ついに出会った!!


また来たい!