いかないのでありました。
しかし、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 件のコメント:
コメントを投稿