公開日 2007/04/26(Thu)
最終更新日 2007/11/11(Sun)

サウンドロップ の解析

続 サウンドロップの解析 へ 2007/07/06(Fri) 公開
サウンドロップの解析 番外編 へ 2007/07/13(Fri) 公開

サウンドロップの改造 へ (別ページ) 2007/11/11(Sun) 新規追加
 注意 サウンドロップの解析について、追加・訂正事項があります。
 整理しなおすのも面倒なので本ページはそのままになっていますが
 本ページの内容と異なる場合、向こうが優先です。


■はじめに

 フィギュアが主だった「ガシャポン」 (自分は ガチャガチャ と呼んだほうが なじみがあるが)に音声を出すものが登場し、電子おもちゃとして興味はあったものの 「萌えセリフ」のを買うのはちょっと恥ずかしく〜と思っていたらいつのまにかいろんな シリーズが登場していたようで、サウンドロップ(c)BANDAI の「涼宮ハルヒの音声」と「ナムコクラッシクス」を1個ずつ 購入しました。

分解する直前にネットで検索してみたら、既に先行者がいて、
複数の音声が記録されていて、基板ジャンパの切換で別の音声も出せる
という、オイシイ情報が。 情報どおりふたつとも音声切換えが可能でした。
    ハルヒ C基板 「眼鏡属性って何?」<-> 3人の「大好き」
    ナムコ B基板 「マッピー」 <-> 「ファミスタ」
      左側が改造前の設定 右側がもう一種の音声
で、終わるのも能がないので、オシロを使ってもっと突っ込んで調べてみました。

クリックで拡大
サウンドロップ基板説明

「電池3V」と各「音声選択ジャンパ」(4つ)の内、
どれかをショートさせると発音開始です。
(本来は1箇所だけハンダブリッジされていて、
基板中央のスイッチを押すと通電する。)


■音声出力方式

 結論からいうと、入手したサウンドロップはふたつとも
  再生周波数 f 128kHz、分解能 5bit(内、1bitは符号bit)の  PWM
で発音していました。

下はサウンドロップのスピーカー(圧電式?)出力端子をオシロで観測した波形です。 音声出力中はスピーカー端子のどちらか一方に 約7.8μs毎(逆数を取ると 128kHz)に  3V程度のパルスが発生します。 このパルスの幅がいろいろ変化しますが、観測した範囲では全て 0.5μsの倍数と見れば いい様です(0.1μsほど短いことも多いですが)。
パルスなしが幅ゼロ(0)とし、順に 0.5μs(1)、1.0μs(2)…、7.5μs(15)と数値化 できます(2進数ならキリ番で、4bitで表現可)。
また、振幅が正ならスピーカー端子Aにパルスを、負なら端子Bにパルスを出力するルールと すれば、実測と合致します。これをスピーカー自身がローパスフィルタの役目も果たして いると考えれば、音声の波形信号を再現できている訳です。

尚、5bit(符号も含めて)量子化では荒いのと、128kHzなんて音源は普通存在しないように 思われるので、データ化の際の真のサンプリング周波数 fs は 128kHzの整数分の1である可能性が高いです。

音声波形
サウンドロップ スピーカー端子出力波形

1ch 2ch ともスピーカー端子 - GND間の測定です。
画面右の「デルタ」は2パルス分の時間間隔
ですから1パルス分なら倍の128kHzになります。

測定風景
上記波形の測定状態

ミノムシクリップについている抵抗のリード線で
ジャンパ用ランドをつついて発音させています。


■再生周波数について

 サウンドロップの基板にはチップ抵抗が1個載っていて Vcc(3V)にプルアップされています。 2個とも 「334」、つまり 330kΩでしたが、これが再生周波数を決定するようです。  ここに並列に 200kΩを接触させると、パルス発生周波数がだいたい倍の 248kHz に変化して再生音もピッチが高くなりました(早回し)。
抵抗値を変更すれば周波数(≒音質)を下げる代わりに記録時間を長くしたりできる訳です。
(実際そうした品種が存在するのかどうかは知りませんが)

ところで、入手したハルヒシリーズ方の「大好き」の3人の内2人はどのキャラが 喋っているか十分識別できるのですが、一人だけ変に声が高くて分かりませんでした (消去法でいくと”ハルヒ”の筈ですが)。
これって、データ化の際に間違えたか、メモリーが足りなかったのでサンプリング 周波数を落として記録・製品化している可能性はないでしょうか?(で他と同じ 周波数で再生するので早回しになっている)

■ちょっと考察

 さて、基板上の黒い封止樹脂の中に入っている半導体の ROM容量はどのくらいでしょう?
音声データは思いっきり単純に計算すると、128kHz * 5bit = 640kbps のデータレートになります。 さすがに無駄が過ぎるので実際は(128の約数である)16kHzで原音をサンプリング した 8bit量子化データを符号1bit + 7bit(0-127)として、後者をあるルールに従って  8回に分けて出しているのかな? こう考えるとデータレートは 16kHz * 8bit = 128kbpsになります。
別種の音声もあわせて最大6秒記録できるとすると、ざっと 768kbit。 まだ勿体ない使い方なので、更に DPCM や ADPCMで圧縮記録して容量を低く抑えている 可能性が高いです(この項目の数字はあくまで推測です)。

■今後

 パルスの周期と幅の時間単位から、最低でも 4.096MHz(128kHz * 16 * 2) で記録できる 2chロジアナでスピーカー端子の信号を取り込んで、分かっている ルールで規格化(整形)すれば、サウンドロップの出力データ(デジタル!!)が ロス無く入手できる訳です。
これをまたデジタル処理のローパスフィルタを通せば、 PCでかなり忠実に再生できる のではないでしょうか。
まあ、サウンドロップ用にデータ変換した時点で相当劣化しているので音質的には 意義は薄いですが、ハルヒの音声の違和感の件は周波数を下げて再生して、推測が 合ってるか調査したいです(マイクがあれば録音した方がよほど手っ取り早いが)。
という訳で、まずやるべきはロジアナの製作ですね。

外部から別の音声データで上書きできればベストなんですが、さすがに マスクROM化されてて無理だろうなあ… それにしてもこれを 200円で販売して 利益出してるんだから凄いですね。ボタン電池も二つついてくるし。


2007/07/06(Fri) 公開

 続 サウンドロップの解析

■結論 Ver. Up版

音声出力方式と音声データ周波数
 ロジアナを自作、データ解析した結果、サウンドロップの音声出力方式を、より正確に表すと
128kHz動作の5bit符号付 PWM-DAC と併用した「ΔΣD/Aコンバータ」らしい
と分かりました。
またΔΣDAC(私は「デルタ シグマ ダック」または「デルタ シグマ DAコンバータ」と読んでいます」)の 動作周波数(128kHz)は変えずに、DACに入力する音声データの再生(サンプリング)周波数を 変更して使っています。
そちらの周波数は PWM-DACの出力値の変化周期から推測が可能で、 サウンドロップによっていろいろな数値〜 手持ちの中では 最高で 21.3kHz、最低で 7.53kHz 〜  が見つかりました(取りうる値は 128/整数 kHz )。
音声データを記録している ROM容量は一定(どのサウンドロップも同じ)で、これに 収まるように再生時間との兼ね合いで適時調整していると思われます。

任意データ上書きの可能性
 シリーズごとに基板を変えている(見た目の変化は Pxx の文字くらいですが)、 更に同シリーズ内でも3〜8種( A,B,C,...H) 基板に 分かれている、極めつけは ジャンパで出力音声が変わる なんて使い方を している以上、論理的に考えれば夫々異なるマスクROMで生産している訳で、 上書きはまず不可能 でしょう。
もし、上書きできるのなら一種類の基板だけ生産して後から一種類のデータ だけ書き込んでおけばいいのですから。
同様に、ワンタイム(1回だけ書き込み可能)の可能性も非常に薄いです。

以下、詳細

■端子名 追加
 「機動戦士ガンダム 赤い彗星編」(これで3つ目)を購入して分解した所、基板に シルク文字が追加されており、初校(4/26)で「機能不明」だったジャンパ(ランド)は  REST(リセット?) になっていました。
ただ、  ハルヒもの の実験ではここをいじっても音声出力が停止したり、「大好き」3人分の順番が リセットされたりはしません。  赤い彗星 自身は、実験する前に、うっかり音が出ないところまで分解してしまいました。
もしかすると リセット ではなく、スペルどおり "REST(余り)" なのでしょうか?

また、スピーカー端子ですが、後述のデータ解析により、極性があることが分かりました。
但し、あくまで数値処理上の区別であり、実際にスピーカー自身に極性があるという意味では ありません。

赤い彗星 基板
赤い彗星編の基板 台詞は「冗談ではない!」(ジャンパ変更で 歩行音)


■ロジアナを作る
 以前からオプティマイズさんの カメレオンUSB+ロジアナ基板キット を所有していましたが、これは記録メモリが 4Mbit(512KB)です。 サウンドロップの音声データを約3秒間連続記録するとなると、最低でも 2ch x 4MHz x 3/ 8 ≒ 3MB の メモリーが必要になるので不足します。

そこで、ミミックUSB FX2 の USBアナライザを ベースにして、長時間記録可能なロジアナを製作しました。
こちらは FPGA内に 72Kbit分(使っているのは 64Kbit分)しかメモリがありませんが、 測定データを随時ホストPCに送る方式なので、USB2.0のスピードで転送が間に合う 限りでなら、記録時間をかなり延ばせます。
但し、「480Mbpsだから 60MB/s だ」 なんてのは考えが甘すぎで、USB2.0 の HighSpeed通信は (瞬間最大じゃなくて)30MB/s出せればグレート!! なくらいの実力しかありません。

ロジアナ仕様
サンプリング周波数
Max 48MHz Min 11.7kHz(48/1〜4095の整数 MHz)
 (サウンドロップ測定では 8MHz を使用(4.096MHzは作れないので))
チャンネル数
1〜8 但し、FPGA内回路では 16CH分用意済 (同 2CH)
測定信号
3.3Vレベルまで (同 3V信号
トリガ
レベルトリガ および エッジトリガ (同 レベルトリガ使用)
波形表示
なし! 現状、測定データのバイナリファイル出力のみ
 (同 別途解析プログラムで PWMデータとして数値化

ロジアナとしては肝心の波形グラフィック表示を作っておらず、実用の域に達して いないと判断し、公開はしません。

■解析
 スピーカー端子各chのパルス長さと前回パルスからの相対位置を調査した結果
  1. CH- とした方にだけ 1/128kHz(約7.8μs)を超える長いパルスが存在する。 これは PWM値 '-16' が連続していると見なせばよい(CH+ 側に '+16' 相当のパルスは存在しない)。

  2. CH+ と CH- 同時にパルス発生開始はない。必ず CH+ と CH- のどちらか一方にだけ パルス出力するか 0値(±どちらもパルスなし)になる。

    結局、PWM値は -16〜-1(CH- にパルス)、 0(パルスなし)、+1〜+15(CH+ にパルス) の 32段階 符号付5bit と見なせる。

  3. パルス幅の度数分布(※1)より、PWM値をきれいに分離できると分かった。

  4. 現在のPWM値と次の時間の PWM値の2次元分布(※2)をとって見ると、 現在値と同じか、±1の値の登場確率が高い → 再生方式に関係

 以下の 16進ダンプリストは ハルヒ-「眼鏡属性って〜」 の観測データを変換した 5bit符号付 PWM値のバイナリデータ(一部抜粋)です。 8bitPCM WAVEファイル変換のために 8倍して 符号付8bitデータにしています。
    WAVEファイルにするためにはヘッダを追加して、更に、MSBを反転し無符号8bitデータに直す 必要あります。出来上がったファイルはサンプリング周波数 128kHz でも(私の PCでは)拒否せず 再生してくれました。平均化処理して周波数下げたほうが高音ノイズが消えて私の好みです。
 08 08 08 08 08 08 08 08
 00 00 00 00 00 00 00 00
 F8 F8 F8 00 F8 F8 F8 00
 F0 F0 F0 F8 F0 F0 F0 F8
 E8 E8 E8 F0 E8 E8 E8 F0
 E8 E8 E8 F0 E8 E8 E8 F0
 E0 E0 E0 E8 E0 E0 E0 E8
 D8 D8 D8 E0 D8 D8 D8 E0
 D0 D0 D0 D8 D0 D0 D0 D8
 D0 D0 D0 D8 D0 D0 D0 D8
 C8 C8 C8 D0 C8 C8 C8 D0
 C0 C0 C0 C8 C0 C0 C0 C8
 C0 C0 C0 C8 C0 C0 C0 C8

これを眺めると、一種類のPWM値か、隣接する(±1しか違わない)2つの PWM値のくり返しが  8回(かその倍数)続くケースが多いです。これは 参考文献1ΔΣDAC の動作と合致します。 8回ごとに使用値が切り替わっていることから、サンプリング周波数16kHz、 符号付8bit(-128〜+127)の元(入力)PCMデータを、128kHz周期の PWM値を 8回使って 平均表現していると考えると辻褄が合います(キリのいい周波数だし、 PWM 5bit + log2 8 = 8bit を表現可能)。

これより、ΔΣ変調方式の DACで音声出力している と判断しました。
但し、世間でよく耳にする 1bitΔΣではなく、いわば、 5bit(PWM-DAC)ΔΣ です。

5bitPWM DAC + ΔΣのやっていること(簡易説明)
 PWMの 符号付5bitを 8倍して扱うと、 -128, -120〜-8, 0, +8〜+112,+120 の 8刻み 32段階 の振幅が出力(表現)可能で、左記に存在する丁度の振幅値を出力したい場合は説明不要。

ここで、中間の振幅値、例えば +61 を出力したい場合は、前後の振幅値 +60 と +68を 使って、+60 +60 +60 +68 +60 +60 +60 +60 とすればよい(8回のうち、1回だけ +68 なので平均すれば (60x7 + 68)/8 = 61 )。 同様に、+67 ならば +60を1回、+68を7回出力すればよい。
出力値の決定方法は簡単なプログラム(または回路)で実現できます(参考文献1/2)。

符号付8bit は -128〜-1, 0, +1〜+127 なので上記の方法では +121〜+127 の7通りが 表現不可能です。PWM DAC が -128から +128(or +127)までの等間隔32段階出力とすると みなして動作させればいいのですが、その場合 今度は振幅0丁度 を表現する出力が ないことになり、代わりに 正(x>0)の最小値と 負(x<0)の最大値 が交互に 現れることで平均値 0とすることになります(実際、1bitΔΣDACでは 振幅±0 (つまり無音)で '01010101…' 出力となります。初めて 1bitアンプの説明を読んだ ときは騙されている気分になりました)。

しかし、サウンドロップの変換データを見るとそうしたデータ列は少なく、0(パルスなし) が続くデータの方が多い(また、そこまでキッチリ追求するなら、出力パルス幅を 想定した振幅値に正確に合わせる、つまりパルスなしのデータがない筈)ので、 やっぱり、PWMの振幅表現範囲は-128〜+120 8刻みで済ませて、+120以上は +120で飽和 扱いにしていると思われます。 まあ、サウンドロップは音質を追求するものではないのでメーカーの中の人も 目をつぶっているのでしょう。

元データへの変換方法
 8回ごとに入力データが切り替わる(= 128k/8 = 16kHz)場合、これはもう簡単で、 8倍する前の PWM値を単純に 8個ずつ足していけばOKです。これで -128〜+120範囲の 振幅値が得られます。
理想的には加算する 8個の振幅値は高々2種類になる筈ですが、自作の変換ソフトの バグで為に境界がずれて3〜4種類になることがあります。
境界がずれるのは PWM値'0'(8倍バイナリでは 00h/パルスなし) と'-16'(同80h/ 信号が Hになりっぱなし)が連続して発生するときにパルス数(1/128kHz換算での) 計算が不正確なためです(観測したパルス周期が理想値 62.5から 1ずれてるだけ でも 1/128kHz x 60数発続いたらパルス一つ分丸々の誤差が出る)。
'0'と '-16'以外の振幅値は必ず 1/128kHz 7.8μs以内のパルスになるのでカウントミスは 発生しません。

16kHz以外のデータの存在と、本当の音声データの再生周波数
 上記のように全ての音声データが 再生周波数=16kHzだと判断して一旦本htmlを編集したのですが、 最終確認で各音声データのバイナリデータを眺めていると、切り替わり周期が 8になっていないものが 見つかりました。
     というか、実は例題以外は全部 8以外でした
8以外でも、とにかくΔΣDAC は駆動周波数(128kHz)は固定のまま、 出力(平均)値が入力された振幅値に合うように動作し続けます(あまりに入力値の 切り替わり周期が早いと〜極端な話1だと〜、DACとしての分解能が 5bit(PWMのそれ)に 下がってしまいますが、周期が長い分には問題はない)。
この、DACへの入力の切り替わり周期が本当の音声データの再生(サンプリング)周波数になります。

そこで、統計処理で切り替わり周期を求めるプログラム(PWM出力振幅値が現在値より '±2' 以上(8倍バイナリでは 10h以上)変化したら、そこは確実に境界 と分かる)を新たに作って、 手持ちのサウンドロップ 3つを(ジャンパ切り替え も使用)を全部調べ直しました。
 追試の為、7/5(木)に ルパンシリーズをゲットして来て、合計4個になりました。

音声データの諸元
データ名
"シリーズ名"-"セリフ"
変換データサイズ
(128kHz PWM用)
切替わり
周期
入力周波数実サンプル数個体内
合計
ハルヒ-眼鏡属性〜273,733816.00kHz3421752490
(38672)
ハルヒ-大好き(みくる)71,5761111.64kHz6507
ハルヒ-大好き(長門)73,0131111.64kHz6638
ハルヒ-大好き(ハルヒ?)56,4071111.64kHz5128
ナムコ-マッピー231,035168.00kHz1440037726
ナムコ-ファミスタ?396,536177.53kHz23326
赤い彗星-冗談ではない!193,7981210.67kHz1615027528+α
赤い彗星-歩行音
(モノアイ音含まず)
113,7841012.80kHz11378
ルパン-五エ門
(一種類のみ)
270,250621.33kHz4504245042
(37644)
ハルヒ-禁則事項です143,199158.53kHz954740166
(38263)
上位3つ削除
ハルヒ-いわゆるひとつ〜244,904168.00kHz15307
ハルヒ-ふわわわ168,4311111.64kHz15312
ウルトラマン-バルタン星人370,643177.53kHz2180237156
ウルトラマン-ゼットン253,668168.00kHz15354

    入力周波数
    音声データの本当の再生周波数(サンプリング周波数) = 128kHz / 切替わり周期
     = ΔΣDACへの入力データ更新頻度 (DACの出力データは常に 128kHzの PWM駆動)
    実サンプル数
    変換データサイズ / 切替わり周期
    個体内合計
    ひとつのサウンドロップの 実サンプル数合計。( )内は後述の無音部補正

    変換データサイズは '-16' と '0' のカウントミスのせいで数%誤差があります。

    2007/11/11(Sun) 追記 表に サウンドロップ二つ分のデータ追加

 まとめると、初校(4/26)「再生周波数について」において、再生周波数はチップ抵抗値で 変更すると推測しましたが、そうではありませんでした。
恐らく全てのサウンドロップでチップ抵抗の抵抗値は 330kΩ、DACの動作は 128kHz 固定であり、各音声データの実再生周波数に応じて、切り替わり周期を調整しています。

抵抗を別の値のものと交換する改造を行うと、再生される音の高さは変わりますが、これは DACの動作周波数が変わるとともに、入力データの切り替わりの 時間周期 が変わるからです。但しこれは「何μsか」という意味の周期で、これまで説明してきた 「PWMパルス何発分か」という意味での切り替わり周期(整数)は変化しません(してない はずです)。

表を眺めると、ルパンシリーズ-五エ門(の名セリフ「またつまらぬものを斬ってしまった」) の音声が一番再生周波数が高く、スペック上は一番高音質と言えます。 引き換えに、このサウンドロップには一種類の音声しか入っていないので、改造する面白み には欠けます。
切り替わり周期が 8や 16以外だと再生周波数が半端なものになるのが個人的には 気持ち悪いのですが、ちゃんとデータ作成の際に周波数変換しているのでしょう。
    以上、音声データの周波数についての調査は、サウンドロップが固定レートである (1種類のセリフ・曲の途中で周波数を変更するような複雑なデータ形式を採用していない)前提で 展開しています。

■音声データROM容量について
 ところで、(解析に使った) ナムコ の奴はジャンパ切り替えで再生できる  2データ共が音楽データで、かつ、他と比較して再生時間が長めな代わりに 実 再生周波数は一番低くなっています。
サウンドロップの半導体の基本設計・ROM容量はどれも同じでしょうから、これだけ周波数が低いのは ROMに収める為にやむをえない処置なのでしょう。とすれば、逆にここから ROMの容量が推理できそうです。

 単純に 1サンプル 8bitデータが無圧縮で記録されていると仮定すると、2データの 実サンプル数の和が 37726(表中「個体内合計」項目)なので 302kbit相当、DPCM/ADPCM等で 1/2圧縮しているとすれば 151kbit相当になります。
    実際の DAC出力をちゃんと統計処理して確認はしていませんが、入力信号には 8bit分の 256(249)段階を全部使ってるのではないようなのでもう少し割り引いても いい筈です。
    また ルパン のは 切り替わり周期6 なので最大でも 5 + log2 6 = 7.58bit 分 の表現能力しかありません。
キリのいい数字で考えると ROM容量は 256kbit(32KB)か 128kbit(16KB)程度なのでしょうか?

尚、赤い彗星 は「歩行音」にある、タイミングよく押すと鳴るというオマケ音を 含んでいません。この部分のデータを取る前に音が出なくなるまで分解した(壊したとも言う) ので ROM容量を推測できません。表中の "+α" とはそういうことです。

一方、 ハルヒ は合計 4種の音声が記録されていて実サンプル数の合計は  ナムコ より大きくなっています。
しかし、「眼鏡属性って何?」のセリフを波形を表計算ソフトでグラフ化してみると一目 瞭然なのですが、セリフの間(あいだ)に ふたつの長い無音部(振幅 0が続く) があり、ソフトで間(ま)を取ってデータ量を削減している可能性があります。 この期間のサンプル数を差っ引くと、表の カッコ内数値 になって ナムコの数値に近くなりました。「大好き」のセリフ中にも振幅 0 が続く期間が 存在し、この分も全部引いてしまうと 35241 になってしまって下がりすぎなのが難点ですが。
    本ページ下に掲載した「大好き」波形を見れば私の言う無音部の存在が分かります。
ルパン も同様に、セリフ内に 無音期間が 3つ存在し、その分を引いたカッコ 内の数字がこれまた 近い数字になりました。

以上より、 などの工夫を凝らしてあることが見えてきました。
無音部分は ソフトで作る以外に、データ構造がランレングス圧縮機能を持ち 0の連続を 圧縮しているのかもしれません(実装方法はいろいろある)。

■ハルヒ音声の件
 「大好き」x3 の内、一人だけ変な声に感じた件、周波数の間違いかと思っていたので、 解析・変換プログラムで WAVEファイル化する際に、再生周波数を 128kHzから変更して半音 ずつずらしたものをいくつか作って聴き比べました。

が、いずれも '涼宮ハルヒ' の声に聞こえませんでした。
喋り方の時点でキャラ(演じ方)が違うのかな? いくらなんでも違う声優さんの声って事は ないだろうし…。それとも、ネタ元は [孤島前編」の罰ゲーム(王様ゲーム)と思うのだけど、 こんな早口での台詞じゃなかったから違和感があるのかな?

■最後に
 だいたい予定していた事はやってしまったので、これ以上の進展は多分ないでしょう (最初から音声データの書き換えを諦めているので 志が低い)。
ミミックUSB FX2 にサウンドロップのスピーカーを繋げて サウンド ロップエミュ をやるのも勉強になりそうだけど、サイズでは絶対負けるし…

変換ミスでおかしいところもありますが、データの作成方法がもろにデジタルなので、
期待している人がいたとしたら申し訳ないですが、
サウンドロップ のWAVE変換データは公開しません。

代わりに、参考として「大好き」×3種類の波形を示しておきます。

全データが 8周期の切り替えだと思っていた時に、8サンプル平均処理したデータなので 「16kHz変換」とありますが、本当は11サンプル平均すべきデータです。 データに境界ずれがあるのと、作り直しが面倒なのでこのままにします。
X軸の時間長は上から順にだいたい 0.56秒、0.57秒、0.44秒です。 同じ台詞でも全く違って見えるのが面白いです。

途中ピタッとゼロに張り付くのは前述の通り、データ量削減のために、違和感が 出ない範囲で無音(微音)期間を加工していると思われます(普通なら無音に聴こ えても微小に振動する波形が残るはず)。

大好き-みくる

大好き-長門

大好き-ハルヒ?


参考文献

1「トランジスタ技術SPECIAL No.21 ディジタル・オーディオ技術の基礎と応用」CQ出版 1990年
 の 第4章 「ΔΣ変調方式 D-Aコンバータの基礎」 鈴木雅臣 (絶版)
2「APPLICATION NOTE XAPP154.pdf〜 VirtexTM Synthesizable Delta-Sigma DAC」 XILINX



    ※1 パルス幅関連の度数分布
    元データは ナムコ-マッピー より
    パルス幅/
    相対位置
    パルス カウント数
    次パルス
    までの差
    パルス幅
    CH+
    パルス幅
    CH-
    CH1/2
    開始位置差
    0 0 0 0 0
    1 0 0 0 0
    2 0 0 0 0
    3 0 3451 332 0
    4 0 21896 22443 0
    5 0 0 17 0
    6 0 0 0 0
    7 0 5215 1674 0
    8 0 18233 13300 0
    9 0 0 2 0
    10 0 0 0 0
    11 0 4085 2460 0
    12 0 9783 9404 0
    13 0 0 0 0
    14 0 0 0 0
    15 0 4674 2233 0
    16 0 7610 5599 0
    17 0 0 0 0
    18 0 0 0 0
    19 0 3378 2599 0
    20 0 4046 4341 0
    21 0 0 0 0
    22 0 0 0 0
    23 0 3103 3068 0
    24 0 2825 3576 0
    25 0 0 0 0
    26 0 0 0 0
    27 0 3649 2770 0
    28 0 2447 2370 0
    29 0 0 0 0
    30 0 0 0 0
    31 0 2677 3172 0
    32 0 1355 1808 0
    33 0 0 0 0
    34 0 0 0 0
    35 0 2400 3216 0
    36 0 944 1176 0
    37 0 0 0 0
    38 0 0 0 0
    39 0 1981 2612 0
    40 0 563 572 0
    41 0 0 0 0
    42 0 0 0 0
    43 0 1154 1900 0
    44 0 222 220 0
    45 0 0 0 0
    46 0 0 15 0
    47 0 845 1188 0
    48 0 115 13 0
    49 0 0 0 0
    50 0 0 78 0
    51 0 296 650 0
    52 0 24 0 0
    53 0 0 0 0
    54 0 2 105 0
    55 0 202 523 0
    56 0 4 0 0
    57 0 0 0 0
    58 0 13 84 0
    59 0 275 216 0
    60 8 0 0 0
    61 42 0 0 0
    62 66154 0 0 1154
    63122135 0 0 1624
    64 48 0 0 0
    65 0 0 0 0
    125 8520 0 0 1890
    126 1529 0 0 472
    187 0 0 0 591
    188 0 0 0 2212
    189 0 0 0 75
    250 1430 0 0 1607
    251 576 0 0 1234
    252 0 0 0 21
    255 811 0 51190374

 一番左の桁はロジアナ上でのパルス長さなどを表し、255以上のデータは 全て 255の行にカウントした。  また、65以上の項は 4種のデータがオールゼロの場合表示省略。

128kHz=周期 7.8μs 、ロジアナは 8MHzサンプリングしているので、 1周期は 62.5サンプリング相当。表より次のパルスの開始位置やCH+/- の開始位置差は 約62の倍数が多いことが分かる。
また、255以上の長いパルス長は CH- にしか現れず、CH+ は最大でも59である。
62以下のパルス長 は、CH+/-共、くっきり分布が分かれていて簡単に 1〜15 に量子化できる。


2次元分布
※2 PWM振幅値の2次元分布
これも元データは ナムコ-マッピー より

縦方向は現在の PWM振幅値、横は(次の)新しい PWM振幅値で各々 '-16' 〜 '+15' まである。
細かい数値は重要じゃないので縮小表示しているが、逆に眼を細めて見れば、左上→右下 への対角上とその左右に集中していることが分かる('0'の縦横ラインの十字は錯覚でなく、 実際に強調表示で目立たせている)。



2007/07/13(Fri) 公開

サウンドロップの解析 番外編

 「進展はない」と言いながら、自分の好きな音声データを入れたサウンドロップを作るなら どうするか を検討してみました。
  1. サウンドロップ内の半導体にデータ上書き →上記の通り まず無理
  2. サウンドロップの筐体(ケース)に自作基板を収める
     部品の入手性・自分の工作スキルだと難しい
 まあ、2で、入らないにしても、とにかくできるだけ小さく作るものとする。
案1
部品箱で 5年ほど寝かせた DIP-20ピン AT90S2313(AVR) + 先日入手した  8ピン 2MbitFLASH MEMORY(Nintendo DS のデータセーブ用)なら サウンドロップ組み込みは無理でも、ともかく作れそう。
メモリ容量が大きいので、ボタン二つにして片方で再生、もう一方で切替 か。

秋月電子通商 の Webページを見にいく。
案2
音声録音再生専用IC APR9600 発見。但し DIP-28ピン品で 37x15.2mm と大きい。
案3
案1と同じ AVRだが、 最近の品種? ATmega64L なら名前の通り64KBも あるので外付けメモリ不要。配線には困るが 14x14mm と小さくかつ薄いので頑張れば入りそう。
 ところで、夜中に布団の中で仕様を反芻していたら、
    なんかこれ(仕様)と同じものを以前見た覚えがあるぞ…  で、思い出したのがこれ
似たもの同士
サウンドロップ と ポケットステーション
見て分かるとおり、サイズもほぼ同じ

ポケットステーション(以下、ポケステ)は  1999年1月23日発売( Wikipedia 調査 )で、今では新品入手は困難だけど、 そこそこ出回った筈。

そして、ソフトの方はこちら

電撃PSD37 表紙
メディアワークスのゲーム雑誌
「電撃プレイステーション」の CD-ROM付き増刊号
電撃プレイステーションD37」 2000年10月発売

この付録 CD-ROM に収録された
アニメチックストーリーゲーム(1) カードキャプターさくら」 (c)アリカ
の ”ポケットステーション体験データ” をポケステにダウンロードすると(PSか PS2が必要)、 ボタン操作で主人公のセリフが聴けます。  体験データでの収録セリフは4種類で
    ・「プレイステーション用ソフト アニメチックストーリーゲーム1 カードキャプターさくら」
    ・「さくらと一緒なら、絶対大丈夫だよ」
    ・「恋もカード集めも、さくらにお任せ」
    ・「わくわくしちゃうなあ」
 製品版では、ポケステ連動オマケとして、本編のゲームの進行に応じて解禁された セリフ音声を任意に選択して、ポケステに転送・再生できる様になっていたそうです。
当然、1999年8月発売の製品版にも同じソフトが入っているはず。
尚、1999年9月発売の 「電撃プレイステーションD23」 にも全く同じ 体験データ 収録。  また、同じ アリカ 製のPS用ソフト 「カードキャプターさくら クロウカードマジック」 にも同様のポケステ音声オマケ機能がある模様。

これがあるってことは(DAコンバーターをどうしているかは分からないが)好きな 音声のものが作れる筈。非公式でポケステ用自作プログラムを作っていた凄い人達がいたし、 メモリ容量は一応 128KB分もあるので 長い音声もバッチリ。

というか、面倒なので
 この体験データを改造して、自分の好きな音声再生ができるようにしました。

調査
 拙作の MCRWwin.EXE を使って、ポケステに入れた 体験データ(15ブロック)を PCに取り込み → バイナリエディタで眺めると 符号付8bit PCM みたい → サウンドロップ解析で作ったプログラムで WAVEファイルに変換して みたらビンゴ、先頭のノイズ(非音声データ)の後は普通に聴こえる。  但し、サンプリング周波数は 7800〜8000Hz 程度とかなり低かった。
なのが簡単な実験で分かりました。ゲーム用セーブデータによくあるチェックサム も 無い様です。

データ改造
  1. サンプリング周波数を 8kHzに落とした 符号付8bitPCMデータを 4種用意する(WAVE ファイルのヘッダは不要なので削除するか ゼロ埋め)。
      2007/11/11(Sun) 追記
      先に述べたように、Windowsの WAVEファイルは(16bitPCM は符号付だが)8bitPCMの場合は 何故か無符号 タイプです。ここで用意しなければならないのは 符号付なので、 一般の周波数変換ソフトでは(対応するオプションがあれば別だが)変換できません。 符号タイプを合わせないとマトモな音にはなりません。
      サウンドロップの改造 のページにある、wavinfo.exe のオマケ機能(-n オプション)を使用することで、符号付 8bitPCMデータ(データ部のみで ヘッダもなし)に変換できます。

  2. 各データサイズをメモったら、体験データのべたイメージファイル (例えば PS.MEM) を先頭から 0x6000だけ切り出したものを先頭にして連結、(不足があればつめものをして) 全体のファイルサイズを 0x20000 にする。
  3. 0x2400 にあるサイズテーブルを 2で連結した順に書き換え (16進 リトルエンディアン)。
  4. 出来上がったべたイメージファイルを MCRWwin.EXE でポケステに書き戻し。
尚、ポケステがプログラム実行状態だと書き込めないので、実行を停止して 時計画面に戻しておく必要があります(ポケステの取説参照)。

これで無事、以下の音声が鳴る サウンドロップ IN ポケステ 「サウンドロッポケステ(仮称)」 の作成に成功しました。
ついでに、上の写真のように ポケステ用モノクロアイコンを さくら の顔 から変更 しています(その他、操作途中で出てくる ARIKA のロゴや さくら の顔絵、 電池が切れて来たときに使うらしい絵はそのまま)。
    上ボタン:「眼鏡属性って何」
    下ボタン:「大好き(M) 大好き(N) 大好き(H)」
    左ボタン:マッピー
    右ボタン:「またつまらぬものを斬ってしまった」

 実験音声はサウンドロップのデータを流用しました(おかげで新しく周波数変換 プログラムを作る必要がなかった)。 サンプリング周波数が低いので、これだけいれても全体で実効ファイルサイズは  0x1505C にしかなりません。フルに使うとトータルで 13.3秒分 記録できる 計算です。

操作方法 〜電撃PSD37の説明より〜
ポケステのタイトル画面から「決定ボタン」を2回押す。「no.」と表示されたら、 上下左右のボタンを押せば、対応したボイスが聞ける。

サウンドロップと比較
 ほぼ欠点なのですが、本物のサウンドロップと比較して 音量が小さい です。
耳をポケステのスピーカーに近づけないと、(特に小声の長門の声が)聴きにくいです。 あと、常時時計が動いてるので電池寿命も短かそう。
前向きに考えれば、音量とボタンが硬いおかげで、自爆して恥ずかしい思いを するのは避けられそうですが。

再生周波数の変更やボリュームアップが出来ればいいのですが、とりあえずここまでの 実験成功で私は満足してしまいました。

2007/11/11(Sun) 追記
 予告より遅れましたが、ポケステプログラム部分のダウンロードは(著作権への配慮により) 終了しました。

以上。