コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
カービィ★KIRBY ◆lWKKTX22SPNG
2018/10/15 20:19
質問
STREAM音源をきれいに鳴らしたい
製品版で実装するかどうかは未定ですが、キャラボイスや効果音を鳴らすのにPCMSTREAMを使おうとした場合、PCで作った音源をある程度きれいに鳴らすにはどういったコードを書けばいいのでしょう…?

現時点ではPMODEMで持ってきたSTREAMをそのままPCMSTREAMで鳴らしてますがAC版ぷよぷよみたいなザリザリした聞くに堪えない音質になってしまいます…

コメント

アバター
カービィ★KIRBY 2018/10/15 20:24 ◆lWKKTX22SPNG
アバター
はる 2018/10/15 20:39 ◆75Vh4SY8TdKS
自分はこんな風にやりました。
http://petitverse.hosiken.jp/community/petitcom/diary/?read=1391

これを色々改造すればできると思います。
アバター
カービィ★KIRBY 2018/10/15 20:59 ◆lWKKTX22SPNG
ヘッダを削る処理を省いたらこっちでも動きました。
さっきより音質も上がった気がします、ありがとうございました!
(テストに使ったのは20267Samples、8000Hz、16BitMonoのドンドンパフパフの効果音)
アバター
はる 2018/10/15 21:06 ◆75Vh4SY8TdKS
どういたしまして。
アバター
あまさとしおん 2018/10/16 15:24 ◆mzDKTVUAtwqE
説明が必要かどうかはわかりませんが、軽く解説しておきます。

音がおかしくなる理由は「1かたまりの大きさが違う」からです。

たとえば2サンプルの音データがあるとして(短すぎとか言わない)
本来は
PCM[0]=32768
PCM[1]=36768
になっていないといけないのに
パソコンから送った時点では
PCM[0]=-2147446880
になっています(※具体的な数は「エンディアン」によって違います)

ここで「なんで2サンプルなのに1要素なんだよ(バコッ」というツッコみをします。

最初に「1かたまりの大きさが違う」と言ったのがここで出てきますね。
プチコンの整数型変数は大きさが32bitですが音データは1サンプル16bitですよね。
32/16 = 2
「1要素に2サンプルはいるから詰め込んじゃえ」ということになっています。

ビット演算によって詰め込まれているので
32768<<16 OR 36768 = -2147446880
ということでパソコンから送ったデータの数の正体が分かりました。

つづく
アバター
あまさとしおん 2018/10/16 15:30 ◆mzDKTVUAtwqE
ですが、PCMSTREAM命令は1要素は1サンプルじゃないといけないのです。
だから、このデータをそのまま再生するとおかしな音が出るのです。

1要素を1サンプルに直すには…
話題に上がっていたはるさんのプログラムがヒントになります
(唐突に他人のプログラムを召喚してるのはツッコんではいけない)

ただし、トピックにZEXさんが書いているような誤りがあるので、若干の修正が必要ですね
アバター
あまさとしおん 2018/10/16 15:38 ◆mzDKTVUAtwqE
なお、パソコンから16bitのデータを送る場合は、wavファイルの「エンディアン」を間違えると本来の音質が得られないので、unsignedの8bitで送ることを私はおすすめしています
(サイズが減るメリットがあるので一石二鳥)
アバター
あまさとしおん 2018/10/16 15:44 ◆mzDKTVUAtwqE
これだけエンディアンを連呼してるので説明すると
「エンディアン」=「順番の約束」です。

たとえばプチコン→パソコンに&hAABBCCDDという1要素のデータを送ったとします。
そのとき、パソコンに保存されるデータは
AA BB CC DD または
DD CC BB AA
の2通りのいずれかになります。
※パソコンでは1バイト(= 16進数2桁 = 8bit)が基本的なかたまりです

片方を「リトルエンディアン」もう片方を「ビッグエンディアン」というのですが、
自信が無いのでどちらがどちらかは説明しません(そりゃないだろ)
アバター
はる 2018/10/16 15:51 ◆75Vh4SY8TdKS
AA BB CC DDがビッグエンディアン
DD CC BB AAがリトルエンディアン
アバター
あまさとしおん 2018/10/16 15:55 ◆mzDKTVUAtwqE
※この説明では大文字のAからFがあったら16進数を意味します

16bitデータを送る場合は、やっかいなことにエンディアンは「2回も襲ってきます」

1回目
パソコンの中で16bit→8bitに変換されます
つまりABCD ACBDという2サンプルは
AB CD AC BD または CD AB BD ACのどっちかでパソコンに保存されます。

2回目
プチコンに送るとき、8bit→32bitに変換されます
つまり
AB CD AC BDはABCDACBDまたはBDACCDABになります。
CD AB BD ACも同じように2種類のどっちかになります。


『unsignedの8bitで送ることを私はおすすめします』というのは8bitのデータなら1回目の変換が発生しないからです。
これにより、エンディアンはプチコンに送る際の変換さえ間違えなければよいことになり、ややこしさが半減します。
アバター
あまさとしおん 2018/10/16 16:02 ◆mzDKTVUAtwqE
<!--
いつのまにかはるさんが補足してた
どうもです
-->

ところでさっきの書き込みに語弊があったので言うと
『プチコンに送る際の変換さえ間違えなければよい』といいましたが、転送ツールにはエンディアンの指定が無いと思います。(たぶん)
なので、正確に言うと『プチコンで32bitから8または16bitに変換するときに間違えなければよい』ということです。
アバター
あまさとしおん 2018/10/16 16:05 ◆mzDKTVUAtwqE
そういえば、トピックで質問されるということはまたまだやり方が浸透していないということなんですね
ホームページなりブログなりにまとめたいなー
アバター
たんじぇ 2018/10/19 11:15 ◆WDmFkVwZ4yMl
プチコン自体本来は外部ファイルを想定されていなくて、WAVフォーマットがどうなっているとかは気にしなくて良くて、PCMSTREAMに渡す配列さえ気にしていれば良いのです。

音声通信でバイナリデータを持ってくる場合、プチコン側でWAVフォーマットを気にするより、PC側でWAVフォーマットをプチコン用PCMSTREAMフォーマットに変換して送るほうが本来のやりかたです、というか転送してる時点で本来のやりかたじゃないんだけど。

とはいえWAVフォーマット自体そこまで難しくなくてPCMSTREAM用に変換するのはそこまで難しくないし、サンプリングレートやbit数を気にすればプチコンのコードでも書けるし、なによりプチコン使う人はプチコンが一番慣れている言語だと思うのでプチコンで書いた方が楽であるのも。

そもそもPC側でサンプリングレート変更するためにツールを使っているはずなので、WAVtoPCMSTREAM変換のPCのツールを作るのが非公式としてきれいなやり方だとは思います。


※組み込み系とかの場合、そのフォーマットや条件でしか再生しないのでWAVファイルをそのまま持つんじゃなくて、PCMSTREAM形式のような感じに変換して持っておいたりしてます。

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -