2016年10月21日金曜日

MDX解析で色々3:ADPCM

いよいよFM音源部分がある程度鳴るようになってきたので、ADPCMに手をつけないわけには
いかないのでありました。

しかし、ZMS用のドライバを作っている時には、一度挫折した経験のあるADPCM。
今回こそは!という気持ちで取り組みました。

PDXのフォーマットは超簡単で、こんな感じ。

[ポインタ]l + [$0000]w + [長さ]w ×96
[PCMデータ]

なので、ADPCMのデータは割とすぐに取ってこれる。それをそのままサウンドドライバに渡し
てもギャリギャリとノイズが鳴るだけ。

ググってもADPCMの資料は書いてある事が難しくて、更にX68用の資料はほぼ無いに等しい。

うーむ、これは困った・・。

そこで、誰かの作ったソースコードを探す事に。

しばらく探すと、一個だけあった!!

X68用のADPCMデータをWAVに変換して吐き出してくれるソースコード。

それを解析して、15600hzのWAVを作る事は何とかできた。
時間かかったけど。

そのまま44100hzのドライバに渡すとまあ当然のように短く高い音が鳴るだけで、想定通り
ではない。ではどうやって周波数をアップサンプリングするのか。

ググったらこんなの出てきた。

各サンプルの後に  個の0を追加するということである。

wikipediaの「サンプリング周波数変換」から引用しました。

これ読んでびっくり!!ええ!?引き延ばして間にゼロを入れるの!?

これは流石に自分の波形弄り人生でもすごい違和感を覚えたので、引き延ばした後は
直前のデータをそのまま入れるというアップサンプリング方法を考える。
でも具体的なコードが思い浮かばない。結構何日も考えたけど思いつかず。

そしたらある日、夢の中で突然思いつく!超シンプルな方法を!!

朝起きて急いでコーディングしてみたら、鳴った!!ある程度想定通りの音が!!
すごいね~夢作曲とかあるけど、夢コーディング。プログラマの皆さんだったらふつうの事
かしら?

その考え方がこれ。

2.826923076923077 = 44100 / 15600

15600hzのデータを取ってくる時に、この数字で割って、intでキャストすると。
わー、結果だけ書くと超簡単やないかい!!何か恥ずかしいくらい簡単!!

そうすると44キロのデータになるという流れでした。

でもこの方法で引き延ばすと、高域にすごい変なシャカシャカが出るので、ローパスフィルタ
を通して鳴らすと中々イイ感じの音になりました。

こうしてMDXはある程度鳴らす事ができるようになったのでした・・。

0 件のコメント:

コメントを投稿