はじめに
35年ほど前、PC-9801上の音楽アプリ 「CECILIA」 を使って、オリジナル曲を作っていました。
曲は5インチフロッピーディスクに保存したままになっていたが、現在のPCには当然5インチドライブはありません。
ディスク自体も経年劣化している可能性があり、
「いつか取り出したい」
と思いながら、長い時間が過ぎていました。
今回の目的は、次の二段階でした。
- 当時のCECILIAをPC-98エミュレーター上で起動し、楽譜と曲データを読める状態にします。
- 曲データを現在のDAWであるCubaseへ読み込めるMIDI/MusicXMLに変換します。
結果として、
- CECILIAの起動
- データディスクの読み込み
- 壊れていた楽譜表示の復元
- 独自形式の曲データからCubase用MIDIの作成
まで成功しました。
この記事では、成功した手順だけでなく、うまくいかなかった点や、切り分けで分かったことも含めて記録します。
同じように古いPC-98のフロッピーを救出したい人の参考になればうれしく思います。
注意
古い磁気媒体は状態が一枚ずつ異なります。
この記事の設定や方法が、すべてのディスクにそのまま適用できるとは限りません。
オリジナル媒体への書き込みは避け、まず読み取り専用で複数回吸い出し、元データを必ず保存しておくことをお勧めします。
事前に用意したもの
今回の作業を始める前に、次の機材を用意しました。
- KryoFlux本体(ヨーロッパから購入)
- NEC FD1155D 5インチフロッピーディスクドライブ(中古)
- 34ピン接続ケーブル
- FDD用電源
- Windows PC
- PC-98エミュレーター Neko Project II(NP2W)
FD1155Dは、そのまま接続するだけではなく、ドライブ選択用ジャンパーピンの設定変更が必要でした。
最終的にはKryoFluxでドライブ0として扱えるよう、
DS0 / Drive 0
側に設定しました。
ジャンパーやケーブルを変更するときは、必ずKryoFluxとFDDの電源を切ります。
34ピンケーブルの赤線と1番ピンの向きも、両端で確認しました。
対象となったフロッピーディスク
ディスクは次の4枚でした。
- Cecilia:アプリ本体と起動環境
- data
- orgsongdata
- songdata
KryoFluxで各トラックの磁気変化をRAWストリームとして保存しました。
ここで重要なのは、最初からセクタイメージだけを作るのではなく、KryoFluxのRAWを保存しておくことです。
通常のディスクイメージでは、CRCエラーのセクタが欠落してしまいます。
一方、RAWストリームには読み取り時の磁気変化が残るため、
- 後からPLL条件を変える
- 複数回転を比較する
といった解析ができます。
今回の復元では、このRAWを残していたことが決定的に重要でした。
RAWからNP2W用HDMを作る
対象ディスクはPC-98の2HD形式でした。
基本形は次の構成になります。
- 77シリンダ
- 2ヘッド
- 1トラック8セクタ
- 1セクタ1,024バイト
- 合計1,261,568バイト
KryoFlux RAWをGreaseweazleのPC-98形式定義
pc98.2hd
で解析し、NP2Wが直接読めるヘッダーなしHDMへ変換しました。
CECILIAディスクは、1,232セクタ中1,230セクタを回収できました。
欠落は、
- トラック0・面0に1セクタ
- トラック9・面0に1セクタ
でした。
一方、曲データ用のディスクは、正常CRCで回収できたセクタが少ないものもありました。
ただし、
- FAT
- ディレクトリエントリ
- 必要なファイルのクラスタ
が残っていれば、ディスク全体が完全でなくても目的のファイルだけ救出できる場合があります。
最初の壁
「システムディスクを入れ再起動してください」
作成したHDMをNP2WのFDD1に入れてリセットすると、CECILIAは起動しませんでした。
画面には次のようなメッセージが出ました。
セシリア:システムディスクを入れ再起動してくださいただし、その下にはDOSのプロンプトである
A>
が表示され、DIRを実行すると CECILIA.EXE を含むファイル一覧が読めました。
つまり、
DOSもファイルシステムも動いています。
問題は「起動ディスクでない」のではなく、CECILIA自身が実ディスク固有の情報を確認して終了している可能性が高いと考えられました。
補助プログラムのKCGやVBIOSも調べ、
- CPUクロック
- GDCクロック
も変更しましたが、このメッセージ自体は変わりませんでした。
そこでCodexに CECILIA.EXE の16ビットコードを解析してもらいました。
低レベルディスク確認を行う処理が複数見つかり、エミュレーター向けにその確認部分を回避する修正版を作成しました。
この修正版HDMで、CECILIAはNP2W上から自動起動するようになりました。
ここでの教訓は、
「DOSのプロンプトが出る=単純な起動失敗」とは限らない
ということです。
アプリ自身がディスクチェックを行い、エラーを表示してDOSへ戻っているケースがあります。
データは読めたが、SCORE画面が黒いノイズになる
CECILIAは起動し、FDD2に曲データのHDMを入れると、曲も読み込めました。
ところがSCORE表示へ切り替えると、画面下部が黒いノイズ状になり、楽譜を正常に表示できませんでした。
メニューなど画面上部は正常でした。
最初はPC-98のグラフィック設定を疑いました。
- CPUクロックを約4.9MHzまで下げる
- GDCクロックを2.5MHzにする
- EGC/GRCG関連設定を試す
- VBIOSの常駐状態を確認する
しかし、どの設定でも症状は変わりませんでした。
Codexがディスクイメージ内のファイル配置を解析したところ、原因候補が見つかりました。
フォントデータ
FONT.DAT
が使っている物理セクタの一つが、まさにトラック9・面0のCRC不良セクタでした。
変換時、その1,024バイトには次のような代替文字列が繰り返し入っていました。
-=[BAD SECTOR]=-SCORE画面が必要とするフォントデータの一部が壊れていたため、黒いノイズとして表示されていた可能性が高いと分かりました。
再吸い出しを試みるが、インデックス信号が来ない
実ディスクから問題のトラックだけ再度読み取ろうとしました。
KryoFlux本体はWindowsから認識され、
- FDDのアクセスランプも点灯
- ディスクも回転
しました。
ヘッド最大移動位置を確認する次の校正も成功しました。
.\dtc.exe -c2結果は次のとおりでした。
CM: maxtrack=83しかし、回転数を測る-c3や通常のRAW取得では、インデックス信号が得られませんでした。
missing index - no disk in drive別のFDでも同じだったため、媒体ではなく、
- ドライブのインデックスセンサー
- 34ピンケーブルの8番線
- 接触部分
の問題と判断しました。
-c2はヘッド移動を確認するだけなので、インデックス信号がなくても成功します。
一方、-c3やRAW取得には、1回転の境界を示すインデックス信号が必要になります。
この違いは、切り分けの大きな手掛かりになりました。
すぐに機器を交換するのは難しかったため、新規吸い出しはいったん断念し、過去に保存していたRAWを探すことにしました。
過去RAWから15回分の不良セクタを回収する
過去の保存フォルダから、CECILIAディスクの異なる吸い出し結果が3組見つかりました。
各RAWには1トラックあたり5回転分が入っていたため、問題のセクタについて合計15回分の読み取り候補を取り出せた。
通常のPC-98形式デコードでは、15回ともトラック9・面0・セクタ2がCRC不良でした。
ただしGreaseweazleの低レベルデコーダーは、CRCが不正でも読み取れた1,024バイト本体を保持していました。
15候補を比較すると、次のことが分かりました。
- 15候補はすべて異なる
- 8,192ビット中8,070ビットは全15回で一致
- 読み取りごとに揺れていたのは122ビット
- ディスク上に記録されたCRC値は、全15回で
FE54と一致
つまり、セクタ全体が消失していたのではありません。
ごく一部の弱くなった磁気部分が、読み取りごとに0または1へ揺れていました。
まず15回の多数決で各ビットの候補を作りました。
しかし、そのままではCRCが一致しませんでした。
そこで、揺れている122ビットについて、
15回中何回0/1として読まれたか
を信頼度として利用しました。
そのうえで、記録CRC
FE54
を満たす組み合わせを探索しました。
最終的に、多数決結果から修正が必要だったのは、
8,192ビット中わずか4ビット
でした。
補正後の1,024バイトから計算したCRCは、ディスクに記録されていたFE54と一致しました。
このセクタを起動可能なHDMへ戻したところ、CECILIAのSCORE画面は正常に表示されました。
設定の問題に見えていた黒いノイズは、実際には、
フォントファイル内の4ビットの復元問題
だったのです。
曲データを画像ではなくVMCから取り出す
次の目的は、CECILIAの曲をCubaseへ移すことでした。
当初はSCORE画面を画像として保存し、画像から楽譜認識する予定でした。
実際、曲ごと・トラックごとに楽譜画像をキャプチャしました。
しかしディスクイメージをさらに調べると、songdataディスク内に曲ファイルのディレクトリエントリが残っていました。
例えば次のようなファイルが見つかりました。
CLASIC.VMCCLA(NEW).VMC
songdataディスクのブートセクタは壊れていたため、通常のFATツールではディレクトリを表示できませんでした。
それでも、同じセットの正常なディスクからPC-98 2HDのFAT12構成を推定できました。
- 1セクタ1,024バイト
- 予約領域1セクタ
- FAT 2個
- 1 FATあたり2セクタ
- ルートディレクトリ192エントリ
ディレクトリエントリから開始クラスタとファイルサイズを読み取り、FAT12のクラスタチェーンをたどってVMCを抽出しました。
ディスク全体を完全に修復できなくても、
- 目的ファイルのディレクトリエントリ
- FATチェーン
- 使用クラスタ
が生きていれば、個別ファイルを救出できる好例でした。
VMC形式を解析してMIDIへ変換
CECILIAのVMCは一般的なMIDIファイルではありません。
ただし内部を調べると、イベントは規則的な8バイト単位で保存されていました。
概念的には次の情報を持っています。
イベント種別
MIDIノート番号
ゲートタイム
次イベントまでの時間
ベロシティ
表示用フラグイベント種別には次の値が使われていました。
90:音符または休符イベントFD:小節位置FE:トラック終端
時間分解能は48 PPQで、4/4拍子の1小節は192 ticksでした。
各トラックについて小節ごとの合計を計算すると、すべて正確に192になり、キャプチャした楽譜画像とも一致しました。
VMC内の音高はMIDIノート番号としてそのまま利用できました。
ゲートタイム、ステップタイム、ベロシティも保持されていたため、画像から音符を読み直すより正確な変換が可能になりました。
作成したCubase用ファイルは次の形式です。
- Standard MIDI File Type 1
- 5独立トラック
- 480 PPQへ変換
- 4/4拍子
- 90 BPM
- 元のゲートタイムとベロシティを保持
- 楽譜編集用MusicXMLも同時生成
CLASICは、
- 36小節
- 合計996音
CLA(NEW)は、
- 83小節
- 合計2,255音
として変換できました。
Cubaseでは、通常のMIDIファイルとして読み込める。
ファイル → 読み込み → MIDIファイル変換ファイルでは各トラックに汎用ピアノ音色を設定し、Cubase上で好みのVST音源へ差し替えられるようにしました。
Codexが担当したこと
今回の作業は、Codexと対話しながら進めました。
Codexは単に手順を説明するだけでなく、こちらのPC上にあるファイルを調査し、
- コマンドの実行
- 解析スクリプトの作成
- イメージの生成
- 検証
まで行いました。
主に次の作業を担当しています。
- KryoFlux RAWの構成確認
- GreaseweazleによるPC-98セクタ解析
- NP2W用HDMの作成
- CECILIA.EXEの16ビットコード解析
- エミュレーター向けディスクチェック回避版の作成
- FAT12とファイル配置の解析
FONT.DATの欠損セクタ特定- 15回転分のCRC不良データ抽出
- ビット多数決とCRC制約による1,024バイト復元
- VMCファイルの個別抽出
- VMCイベント形式の解析
- Cubase用MIDI/MusicXMLの生成
- 生成ファイルの構造検証
作業中、こちらは、
- NP2Wの画面表示
- FDDのランプや回転状態
- 実際に音が出たか
といった、**「現物でしか分からない結果」**を伝えました。
Codexはその結果をもとに、次の調査や修正版を作りました。
このような古い環境の復元では、一度の指示で完成するというより、
人間が実機やエミュレーターの状態を確認し、AIが大量のバイナリやログを解析する共同作業
が向いていると感じました。
特に今回のようなケースでは、一般的な検索結果だけでは解決できません。
手元にしか存在しない35年前のファイルを、その場で解析して、
仮説を立て、検証し、修正する
必要があります。
Codexのファイル操作とコード実行機能が活きた部分でした。
同じ作業をする人へのヒント
1. 最初にRAWを保存する
セクタイメージだけでなく、KryoFlux RAWを保存します。
できれば同じディスクを複数回吸い出し、別フォルダへ残します。
今回、3組×5回転の過去RAWがなければ、4ビットの復元はできませんでした。
2. オリジナル媒体には書き込まない
変換、修正、パッチはすべてコピー側で行う。
オリジナルRAWと実FDは保存します。
3. エラーを一種類だと思わない
今回だけでも、次の異なる問題がありました。
- アプリ固有のディスクチェック
- ファイル内のCRC不良セクタ
- エミュレーターの設定と似た画面症状
- FDDのインデックス信号不良
- ブートセクタ破損によるFAT認識失敗
一つの設定変更ですべて直るわけではありません。
どの層まで正常かを順番に切り分けることが重要でした。
4. 「ディスクが読めない」と「ファイルが救えない」は別
ブートセクタや一部セクタが壊れていても、
- FAT
- ディレクトリエントリ
- 対象クラスタ
が残っていれば、ファイル単位で救出できる可能性があります。
5. CRC不良でもRAW本体を捨てない
CRC不良は、「全データが不明」という意味ではありません。
大部分が一致し、ごく一部だけが揺れていることもある。
- 複数読み取り
- ビット多数決
- 記録CRC
の組み合わせで復元できる場合があります。
6. ハッシュ値と作業ログを残す
どのRAWから、どの条件で、どのイメージを作ったかを記録します。
完成ファイルのSHA-256も残しておくと、後から破損や取り違えを確認できます。
7. 最終結果は必ず実際のアプリで確認する
CRCやファイル構造が正しくても、実際の表示や再生が期待どおりとは限りません。
今回は、
- SCORE画面が正常になったこと
- Cubase用データの小節数
- 音符数
- トラック構造
まで検証しました。
今回の成果
最終的に、次の状態まで到達しました。
- CECILIAがNP2W上で起動する
- 当時の曲データを読み込める
- SCORE画面が正常表示される
CLASIC.VMCとCLA(NEW).VMCをディスクイメージから抽出できる- 5トラックを維持したCubase用MIDIを生成できる
- 楽譜編集用MusicXMLも生成できる
35年前の曲が、当時の画面で再び表示され、現在のDAWへ移せる形になりました。
単なるファイル変換ではなく、
- 古い機材
- 磁気媒体
- PC-98固有形式
- アプリ独自形式
- エミュレーター
- 現在のMIDI環境
をつなぐ作業でした。
おわりに
古いフロッピーディスクの復元は、機材さえそろえれば終わる作業ではありませんでした。
- 読めないセクタ
- 実機固有のチェック
- 壊れたブート情報
- 独自ファイル形式
など、時代の異なる問題が何層にも重なっていました。
それでも、
RAWを残していたこと。
複数回の読み取りがあったこと。
そしてCodexと一つずつ切り分けられたこと。
それによって、最初は黒いノイズだった楽譜を正常に戻し、曲をCubaseへ渡すところまで進められました。
古いデータは、
「開けない」だけで、まだ中に残っていることがあります。
もし同じように昔の作品を眠らせている人がいたら、媒体が完全に読めなくなる前に、まずRAWとして保存することをお勧めしたいと思います。
そして一般的な変換で失敗しても、すぐに諦めず、
どの層まで情報が残っているか
を確認してみてください。
今回の記録が、誰かの古い作品を未来へつなぐヒントになれば幸いです。