最近、パソピアおよびパソピア7のカセットテープを多数入手しました。
PCに取り込んで動作確認してみましたが、ものの見事に全滅しまして(苦笑)
ということで、先の週末から波形の補正を試みています。
以前にも同様の記事を投稿していますが、今回はもう少し詳細を紹介してみます。
パソピアおよび7では、データを音声化する際にあたって、1200Hzの幅の広いパルスで1を、
2400Hzの幅の狭いパルスで0を表現します。
1バイトのデータは、スタートビットとして頭に0を、ストップビットとしてお尻に1を付けて、
間に最下位ビットから順にパルスを出力します。
例えば55hは、0101010101となりますので、以下のような波形が出力されます。
黄色の部分がスタートビット、水色の部分がストップビットです。
wave形式でサンプリングした波形を、C++で作成したツールで解析します。
まず、ボリュームが−側から+側に変化したところから、次に同様に変化するところまでを
1パルスとして、+側、−側のサンプル数をそれぞれ記録します。
48KHzで録音すると、幅の広いパルスは40サンプル、幅の狭いパルスは20サンプルとなります。
従って、例えば+側のサンプル数が20前後、パルス全体のサンプル数が40前後の場合は
幅の広いパルスとする、といった感じで判定しますが、実際にはノイズやテープの伸び縮み等の
影響で波形が乱れていますので、何かしらの補正が必要となります。
現在のツールでは、以下の補正をしています。
サンプル数が極端に短いパルスは、前後のパルスが半端に短かい場合は、そちらと結合して
1つの基準以内の長さのパルスとします。
(1つ前のパルスの−側か、1つ後のパルスの+側か、サンプル数が半端に短い方に結合します)
サンプル数が半端に長いパルスで、前後に半端に短いパルスがある場合、半端なサンプルを
そちらに移動することで、双方を基準以内の長さのパルスとします。
(+側の半端なサンプルについては、1つ前のパルスの−側が半端に短い場合に移動します。
同様に、−側の半端なサンプルは、1つ後の波形の+側に移動します)
ある1つのパルスで、+側のサンプル数、−側のサンプル数、全体のサンプル数のすべてが
基準以内の場合、そのパルスは完全なパルスと判定します。
そして、前後のパルスが完全な場合、間のパルスは通常より緩い基準で判定します。
補正後に、結果をテキストとして出力します。
長いパルスはw、短いパルスはNとします。
基準に収まらないパルスは、例えば(12345)[20,20|17,3|10,10]などと出力します。
()内の数字は、wavファイルで何サンプル目からのパルスかを示します。
[]内の数字は、前のパルス|このパルス|後のパルスの、+側,−側のサンプル数です。
ただし、前後のパルスのサンプル数については、完全なパルスの場合は、20,20または10,10と
理論サンプル数で出力します。
これは、典型的な波形の乱れを、テキストエディタ上で一括変換するときに便利だからです。
後は、基準に収まらなかったパルスを、テキストエディタ上でひたすら手動で修正していきます。
例えば、[20,20|25,15|20,20]のように、完全なパルスに挟まれており、そのパルス自体も、
基準のサンプル数に収まらなかっただけで、明らかに幅が広いパルスだろう、みたいなのは、
テキストエディタ上で一括変換して一気に修正してやります。
また、(1000)[20,20|21,8|2,9](1040)[21,8|2,9|20,20]のように、2つのパルスが
連続して基準に収まらなかったとします。
この場合、21,(8+2+9=19)という1つのパルスの−側の部分が、ノイズによって一瞬+側に
振れてしまって、2つのパルスに泣き別れになったと考えられます。
このような波形の乱れは、サンプル数だけを見れば、大体は判断が可能です。
(泣き別れたパルスが極端に短い場合は、先述の通り自動的に補正します)
短いパルスが多数連続して出現した場合は、サンプル数だけでは判断が困難です。
このような場合は、実際の波形を見て判断します。
そのパルスが、wave内の何番目のサンプルから始まるかは、()内の数字で判りますので、
VB6で作成したツールを使用して、Excel上で折れ線グラフとして波形を表示してやります。
まず、波形が乱れている部分が1バイトの表現のどの部分で、何個のパルスに相当するのかを、
前後の一連のデータから判断します。例えば、次のようなデータがあったとします。
NNwNwwNwwNNNwwNwwwNwNNNNNNwNNN(ここが乱れている)wNwNNNNNwNNw
前後の10バイト程度を見てやれば、スタートビット、ストップビットがどれか判りますので、
1バイトずつ改行していきます。
NNwNwwNww
NNNwwNwww
NwNNNNNNw
NNN???wNw
NNNNNwNNw
これで、波形が乱れている部分は3パルスに相当することが判りました。
後は波形と、乱れている部分の全体の長さから、失われたパルスを判断します。
経験的に、1つのパルスの波長はあまり壊れません。
ボリュームが極端に小さくなってしまって、+側のピーク値が+の値にならなかったり、
その逆になったりはしますが、山谷の形の痕跡は残っている場合が多いです。
パルスの幅が広いか狭いかの基準値は、非常にデリケートな調整が必要です。
必要に応じて、テープ毎にそれぞれ微調整しています。
基準を厳しくしすぎると、基準に収まらず、手動で修正する必要のあるパルスが増えます。
基準を緩くしすぎると、波形を誤判定してしまう可能性が高くなります。
一番困るのが、連続した2つの幅の狭いパルスを、1つの幅の広いパルスと判定したり、
その逆の判定をしたりして、1ビットが失われたり増えたりすることです。
1バイトは10パルスで表現されており、頭とお尻にNとwが必ず付きますので、エディタを
10の倍数桁(例えば80桁)にすると、スタートビット、ストップビットのところで、
縦にNとwがずらっと並ぶことになります。
これが途中でずれたりすると、そこで1ビットずれていることが判ります。
1ビット失われている、また増えている1バイトを特定したら、その前後の波形を確認します。
誤判定した場合、()で開始位置が表示されないため、近傍の基準外のパルスの開始位置から
波形を探す必要があります。この辺は改良の余地ありですね。
グラフをキャプチャして、ペイント上に貼り付けます。
明確に判断できるパルスを描き込んでいくと、怪しい部分が見えてきます。
黄色がスタートビット、水色がストップビットとして、白い部分の幅の広いパルスを、
2つの幅の狭いパルスだと誤判定していたことが判ります。
波形がかなり乱れていますが、山谷の形は残っていますので、本当は幅の広いパルスだったと
いうことはかろうじて確認できます。
(その1つ前のパルスも、自動補正のおかげで正しく判定されてはいますが、実際の波形では
−側の一部が+側に振れてしまっていますね)
こんな感じでちまちまと修正していって、全部修正できたら、テキストデータをwave形式なり、
私のエミュレータのテープイメージであるcas形式に変換します。
後はエミュレータ上でロードできれば良し。
エラーになった場合は、修正ミスやビットがずれないような誤判定なりがあったのでしょう。
その場合、エミュレータ上でどこまでテープイメージを読み込んだかを確認して、その周辺だけ
より厳しい条件で再変換して修正し直すことになるでしょうか。
ざっくり、1本のテープの修正に2〜3日くらい掛かりそうな感じです。
他の開発もありますし、まあ気長にぼちぼち進めます。
余談ですが、私の経験上、パソピアのカセットは、他の機種より波形の劣化が酷いようです。
他の機種に比べて、データレコーダ、または本体側の出力部分のアナログ回路の品質が
いまいちだったんじゃないかなあと思います。
マルチ8なんかだと、長いパルス×2、または短いパルス×4と、複数のパルスの組み合わせで
で1ビットを表現しますので、仮に波形の乱れがあっても補正が簡単なんですが。
そんなことしなくても、結構きれいな波形なんですよね(苦笑)