PetitModem
Last modified on Apr 03 2018.
任天堂3DS用ソフトプチコン3号、
もしくはPC上で動作する音波によるファイル送受信ソフトです。
概要
PCとプチコン3号の間で、
音波でファイルを転送するためのソフトウェアです。
PC間、プチコン間での転送も可能で、
特殊なケーブル等がなくても転送できるように作っています。
また、スクリーンショットによるプチコンからPCへのファイル転送を行うこともできます。
ケーブル無し、静かな環境で私が試行した際の転送速度は大体下記のようになります。
変調レート[bps] | simplex [byte/sec] | w/ARQ [byte/sec]
|
---|
300 | 26 | 20
|
600 | 55 | 42
|
1200 | 112 | 85
|
2400 | 225 | 172
Ver.1.3.0(2DS)における実効転送速度
|
動作イメージ
動作環境
- PetitModemPC
- .Net Framework 4
- 受信する場合は音声入力。最低でも11025Hz/16bit/1channelでサンプリングできること。
- 送信する場合は音声出力。最低でも11025Hz/16bit/1channelでサンプリングできること。
- PetitModem3DS
- 3DS/new3DS/2DS ※
- プチコン3号/SmileBasic
- 静かな環境
※Ver.1.3.0より3DS、2DSでも動作可能。
仕様
- PetitModemPC / PetitModem
- 300bps
- 1080+-100Hz FSK / 1750+-100Hz FSK (ITU-T V.21相当※)
- 600bps
- 1500+-200Hz FSK (ITU-T V.23相当※)
- 1200bps
- 1300+-400Hz FSK (ITU-T V.23相当※)
- 2400bps
- 1800Hz pi/4 DQPSK (ITU-T V.26bis相当※)
- half duplex / simplex
- 調歩同期(StartBit:1,StopBit:1)
- バイナリ転送プロトコル:オリジナル(YMODEM-like)
- simplex mode(投げっぱなし
- with ARQ(Automatic Repeat reQuest) mode
- To/From WAV file mode
- エラー検出: CRC16(Koopman)
- 文字コード: プチコン側でUCS-4/UTF-8変換
- スクリーンショットによるファイル転送
- 圧縮: LZSSLIB
- エラー検出: CRC16(Koopman)
- 2.5bit/pixel
- LZSS for PetitCom / LZSSLib
- 圧縮方式:LZSS
- 対応ファイルフォーマット:
- TXT PRG ⇔ PZT
- BMP PNG JPG ⇔ PZG
- DAT ⇔ PDA
※周波数とその精度、変調方式のみ準拠。その他は参考程度。
ダウンロード
- Ver. 1.4.1 SHA-1:a34066a84099a0b3a9ff733116bf574aadef269d NJEQK3A4
- Ver. 1.4.0 SHA-1:7cc0154ff0ebdaaa3892a42f45ab2bdba054b81b QKE3XX8X
- Ver. 1.3.1 SHA-1:0bb0c11701157e2c54ab7aee2cb4278eb157b50a 23DX324V
- Ver. 1.3.0 SHA-1:48162564910a45fe8d2981f1ec11e49d5fd68a1c 23DX324V
- Ver. 1.2.7 NKX3KE13
- Ver. 1.2.6 RSEE3D3
- Ver. 1.2.5 RSEE3D3
- Ver. 1.2.4 RSEE3D3
- Ver. 1.2.3 KD53G3
- Ver. 1.2.2 画像変換ソフト、LZSSライブラリ同梱版 R584E83E
- Ver. 1.2.1 画像変換ソフト、LZSSライブラリ同梱版
EK3XEWKV
- Ver. 1.2.1
EK38QDJM
- Ver. 1.2.0
4333DX43
- Ver. 1.1.0
Q3XDZE43
- Ver. 1.0.0
QK4DS323
- 右の文字列は対応するプチコン3号版の公開キー。古いキーは削除する/されている可能性があります。
- 同梱・併記されたバージョンのみ相互通信可能を確認しています。
- PC版にはプチコン3号版のコードも同梱しています。
ライセンス・利用料・寄付
ライセンス
このソフトは無料で利用して構いません。
今後有料化の予定もありません。
ご自由にお使いください。
2次配布、商用利用、改造、リバースエンジニアリングなどもご自由にどうぞ。
寄付
BitCoin、gumroad、PayPalによる寄付を受け付けております。
サーバー維持費、証明書取得・維持費、開発環境構築・維持費等に用います。
明細を公表する予定はありません。
必要を上回った場合は公益機関に寄付し、その旨をサイト内で報告します。
BitCoin
BitCoin アドレス:
16NMv1dX4hNpjvnqvRYgXS4neqHHpa6P3Y
PayPal(地域によっては使えません)
Vector内の下記のページからリンクをたどってください。
説明
キーボードは小さくて使いづらいし、
かといって外部キーボードは繋がらないし、
いちいち3DS落としてmicroSDとりだすのも大変だし…
というわけで、唯一外部と双方向通信が可能なマイク/スピーカーを用いて
ファイルを転送するためのプログラムを作成してみました。
折角なので懐かしのV.21モデム(300bps)で。
あまりに遅いので、転送楽にするために圧縮・伸長用のソフトとライブラリも付けました。
使い方
双方向通信の場合
- PCのマイクの音量を最大に。
- DSのスピーカーの音量を最大に。
- 送信したい側で転送速度を選び、「Send w/ ARQ」を押してファイルを選ぶ。
- 受信したい側で転送速度を選び、「Receive w/ ARQ」を押して…
- PCのマイクの近くにDSのスピーカーが、DSのマイクの近くにPCのスピーカーが来るようにうまく配置する。
- Eye DiagramやConstellation Diagramがきれいになるように調節する。場合によってはやり直す。
- 待つ。
単方向通信の場合
- マイクの音量は最大に。
- スピーカーの音量はなるべく大きく。
- 送信したい側で転送速度を選び、「Send Simplex」を押してファイルを選ぶ。
- 受信したい側で転送速度を選び、「Receive Simplex」を押す
- 受信側マイクの近くに送信側スピーカーを置く。
- 送信側で送信スタートを押す。
- Eye DiagramやConstellation Diagramがきれいになるように調節する。場合によってはやり直す。
- 待つ。
- 一回終わって全部送れていなかったらもう一回送信する。
- 全部転送が終わるまで何回か繰り返す
圧縮・伸長の仕方
「LZSS for PetitCom」を実行し、ファイルをドロップすると圧縮・伸長します。
画像ファイルはプチコン3号で表示可能な色数に減色して圧縮します。
圧縮・伸長後のファイルは元のファイルと同じフォルダに保存されます。
圧縮・伸長は拡張子を元に判断しています。
- 「.TXT」「.PRG」⇔「.PZT」
- 「.BMP」「.PNG」「.JPG」⇔「.PZG」
- 「.DAT」⇔「.PDA」
プチコン側でファイルを圧縮・伸長したい場合は同梱のLZSSLIBを用います。
スクリーンショットによるファイル転送
- PetitModemから「SCREENSHOT TRANSFER」を選び、転送したいファイルを選ぶ。
- 読込、圧縮後、画像に変換されるのでスクリーンショットを録る。
容量が多い場合は複数ページになるので、すべて保存する。
- SDカード管理ツールなどを用いてPCに画像をすべて送る。
- PetitModemPCの「File」->「Convert ScreenShot」から「Convert ...」ウィンドウを開く。
- ドラックドロップか、Openですべての画像ファイルを選ぶ。
- 保存したいフォルダを選択後、Convertを押す。
注意点
テキストファイルの転送はUTF-8で行っています。
プチコンからPCに送った場合、UTF-8のテキストファイルになります。
PCからプチコンに送る場合はUTF-8コーディングされたテキストファイルを用いてください。
また、プチコンは保存時にCR(0x0D)をLF(0x0A)に変更してしまうため、改行コードにCRLFを用いるとLFが二つ重なることになります。
プチコン側プログラムはファイルの拡張子でファイル種別を判定しています。
GRPリソースは".GRP"という拡張子を、
TXTリソースは".TXT"もしくは".PRG"という拡張子を付けて送る必要があります。
それ以外のファイルは全てDATリソースとして扱われます。
既知の問題と今後の改良予定
- 遅い。
-
遅いのはノスタルジーを感じる為の仕様です。
V.21にこだわらなければ2400bpsくらいは普通に出せそうなのでそのうち速くするかも。
Ver.1.2.0から1200bpsまであげましたが、自動再送モードでは50byte/secしか出ていません。
転送プロトコルを変えて100byte/sec程度まで早くする予定。
それ以上はケーブルが必要かなぁ。
Ver.1.3.0からケーブル無しで2400bpsまで出るようになりました。
3DS/2DSではプチコンの速度の限界でこれ以上は困難ですが、
高度サウンドユニットとnew3DSを使うとまだ余裕があります。
- GRPデータが読めない。書けない。
-
ファイル種別がよくわかってないのでまた今度。
っていうか500KByteのデータを300bpsでって5時間はかかるけど…
Ver.1.1.0からGRP転送に対応しましたが、300bpsでは実用に耐えません。
1200bpsでも1枚3時間…
- 音が不快。
-
はい。
- TTYが無い。
-
いつか。
- 画面がかっこ悪い。
-
やっつけなので。
懐かしい感じに仕上げたかったんですが資料が見つかりませんでした。
- ひらがな・カタカナ、記号や特殊文字が転送できない。
-
1文字を8bitで転送しているので、8ビットで表現できない文字列は転送できません。
ごめんなさい。
Ver.1.1.0よりUTF-8転送にしたので全ての文字を転送可能になりました。
- スクリーンショットによる転送で失敗する
-
スクリーンショットはそのまま登録してください。他のソフトで編集すると壊れます。
Twitter等への投稿でも壊れます。
JPEGの圧縮の都合上、極まれ(おそらく10^-5以下の割合)に転送できないことがあるかもしれません。
生成される画像は毎回違うので、もう一度スクリーンショットしてください。
- メモリリークがあるよ。
-
おむつを作るべき人に言ってください。
俺が漏らしてるんじゃねぇし。
よくある質問とよくある回答
- なにこれ?
-
プチコン3号、PCの間で音でファイルを転送するためのソフトです。
- なんで音を使うの?
-
プチコン3号にはそれしかないので。
- DSとPCを繋ぐケーブルはいらないの?
-
あった方がいいですが、音なので無線が可能です。
もちろん周りがうるさいとダメです。
- 音量の調節とかはどうすればいいの?
-
PC側のマイクの感度は最大で。スピーカーはまぁ耐えられる程度で。
DSのスピーカーは大き目で。
手元のノートPC(X200s、X240s)の場合、
キーボードの上にDSをモニターに向けて載せるとちょうどいい感じ。
PC側の出力はイヤホンをDSのマイクに近づけるのが最良でした。
ケーブルを用いる場合はどちらも音量小さめで。
ケーブルによってはPC側で大きな音を鳴らしながらDSにプラグを指さないとDS側で音声入力を検知できない場合があります。
大音量で音楽等を鳴らしている状態でDSに指し、その後音量を下げて通信するとうまくいくようです。
- 激しく遅いんだけど…
-
1200bpsも出るんだから我慢しようよ!
- Simplexで通信したら歯抜けになる。
-
Simplexは単方向通信なので、エラーが起きても送信側にはわかりません。
歯抜けになって受信が終わらない場合、
もう一度送信すれば転送に成功した部分を自動で埋めてくれます。
- w/ ARQってなに?
-
自動再送要求のことです。
これを指定すると転送がうまくいったかどうか確認しながら通信します。
双方向通信になるので、送信側、受信側共にマイクとスピーカーが必要です。
- 歯抜けが多い/再送が多い
-
FSKなので、受信側の感度が高めの方がうまくいきます。
通常のマイクで音割れが発生する程度の感度がよいようです。
破裂音は広帯域の音を出しますので、拍手や舌打ちは辞めておいた方がよいかと思います。
- モデムなの?音響カプラなの?
-
まぁ似たようなものです。
- 電話につなげられる?
-
ダメです。理論上は可能なはずですが、法律上は不可です。
3DSも本ソフトも電気通信事業法の適合認定を受けていません。
3DSは音響カプラでもモデムでもないので当たりまえですが。
- 他のV.21モデムと通信できるの?
-
周波数と変調方法と速度が同じというだけなのでそのままでは無理かと。
ダイヤルの問題とか音が途切れる問題とか音圧とかいろいろ細かい問題を解決して、TTYをつければ。
TTYはいつか実装する。(頑張れ俺
- うまく動きません
-
仕様です。連絡をくれれば直すかも。
技術的な質問と回答
- どうしてFSKなの?PSKとかASKはだめなの?
-
3DSによるできるだけ高速な無線通信を想定しているからです。
ASKは2値にしろ多値にしろ、音量の調整が必須です。
音が割れると正確に伝送できません。
PSKはFSKと本質的には大して変わりませんが、
多値にする際に位相検出の精度が必要になります。
FSKでは音割れがあっても問題なく(=音量調節がほぼ不要)、
多値にするのにキャリアを増やせばいいだけなので簡単です。
Ver.1.3.0から2400bpsのπ/4 DQPSKを追加しました。
- どうやって検出してるの?
-
FSKはベースバンドシフト+IIRのLPF+Gardner Symbol Recoveryです。
PSKも同様にベースバンドにシフト+root raised cosineフィルター+Gardner Symbol Recoveryです。
- フレーム抽出はどうしてるの?
-
シンプルに調歩同期によるキャラクタ検出とヘッダー検出で。
フレーム毎にCRCによるエラー検出があるので数回試行すればそれなりに検出できます。
- 転送プロトコルはなんでX/Y/ZMODEMじゃないの?
-
ファイル名・サイズを転送する必要があったのと、フレームサイズが小さいのとで、XMODEMは使えません。
ZMODEMはややこしいしウィンドウが実質意味をなさなくなるので却下。
結局オリジナルになりました。
フレームヘッダー: 1~6バイト(0xFF)
フレーム番号: 2バイト(ただし0x??FFは使わない)
データ: 53バイト(300bps),112バイト(600bps),229バイト(1200bps)
CRC: 2バイト
番号0のフレームはデータにファイル名とファイルサイズを入れています。
- どうして1フレーム54/112/229バイトなの?効率悪くない?
-
プチコン3号の仕様のせいです。
プチコン3号での音声出力には様々な制約があり、信号転送には工夫が必要です。
高度サウンドユニットを使えば制限が減ります。
- MMLになんで"@D-24"と入ってるの?
-
バグなのか仕様なのか、プチコンは周波数がずれてるので修正しているだけです。
- どうしてエラー訂正符号を使わないの?再送は勿体なくない?
-
エラー訂正符号の効果がほとんどないからです。
調歩同期なので、大抵のエラーはフレーミングエラーになり、
バーストエラーに強いタイプの符号でなければ効果がありません。
ですが、たかだか54バイトのフレームなので、バーストエラーが1/3を超えたりが普通です。
これを訂正するために符号をいれるとデータがほぼ無くなります。
- エラーチェックはどうやってるの?
-
KoopmanのCRC16を用いています。
これは16bitCRCとしては最良のものです。
- スクリーンショットによる転送はどうやってるの?
-
情報をYCbCr面上に分散して保存しています。
プチコンのスクリーンショットは422形式で、CbCrはx方向2pixel毎にしか存在しないため、
2pixel毎に埋め込みを行っています。
JPEGの情報現象による分散を考慮し、2pixelにつき32点の埋め込み、つまり1pixelにつき2.5bitの情報を埋め込んでいます。
更新履歴
- 2018/4/3 Ver. 1.4.1
- スクリーンショットによるファイル転送を2.25bit/pixelから2.5bit/pixelに変更。
- その他細かい点の修正
- 2018/3/30 Ver. 1.4.0
-
- 2017/11/28 Ver. 1.3.1
- PetitModemPCで、既定の入力先・出力先がシステムで列挙される最初のデバイスであった問題を修正。
- 入力、出力デバイスを選択する機能を追加。
- 2017/5/27 Ver. 1.3.0
- V.26bis相当の2400bps、π/4 DQPSKを追加。
- Symbol Rate RecoveryをStart/Stop bitによるdecisiton directedのみから、gardnerとstart/stop bit併用に変更。
ノイズに強くなったが、通信経路によっては問題があるかも。
- 速度を向上し、3DS/2DSを動作環境に追加。
- Eye Diagram、Constellation Daiagram、レベルメーターを表示する機能を追加。
- simplexモードで、複数回ファイルの情報を送るように変更。
- その他細かい点の変更
- 2015/10/11 Ver. 1.2.7
- PetitModemPCでプリアンブルが足りず、1200bpsSimplexで送信がうまくいっていなかった問題を修正。
- PMODEMでGRP受信すると終了しなかった問題を修正。
- 2015/10/6 Ver. 1.2.6
- LZSS for PetitComでαチャンネル画像を変換する際の閾値を設定できるように。
- LZSS for PetitComで圧縮がうまくいかない場合があったバグを修正。
- 2015/8/3 Ver. 1.2.5
- WAVファイルからの読み込みが正常にできていなかった問題を修正。
- プチコン版は変更なし。
- 2015/7/12 Ver. 1.2.4
- LZSSLIBでヘッダーが間違っていた問題を修正。
- LZSSLIBを高速化。
- パッケージに足りないファイルがあった問題を修正。
- 2015/7/12 Ver. 1.2.4
- LZSSLIBでヘッダーが間違っていた問題を修正。
- LZSSLIBを高速化。
- パッケージに足りないファイルがあった問題を修正。
- 2015/6/17 Ver. 1.2.3
- プチコン Ver3.2に対応。
- TXTリソースで、文字化けする問題、末尾に無駄文字がついてしまう問題を修正。
- ファイル名が長いときにうまくいかない問題を修正。14バイト制限をつけた。
- LZSS圧縮の名称変更。で拡張子の対応付け変更。
- その他細かい点の修正。
- 2015/4/17 Ver. 1.2.2
- LZSSライブラリでエラーになる場合がある不具合を修正。
- 2015/3/26 Ver. 1.2.1+
- 画像変換プログラムImageConverterを同梱。
- プチコン3号用のLZSSライブラリを追加。
- 2015/3/26 Ver. 1.2.1
- 転送プロトコルの改良。
- TXT,DATの判定を変更。
- その他細かい点の変更。
- 2015/2/17 Ver. 1.2.0
-
- 2015/2/2 Ver. 1.1.0
- UTF-8転送に変更。全ての文字が転送可能に。
- DAT/GRPリソースの転送に対応。
- 2015/1/31 Ver. 1.0.0
-
参考資料
PetitModemの使い方・紹介等
- KOYAMA Yoshiakiさんのブログ、2017/2/12のエントリ
-
PetitModemの使い方。チェスプログラムの紹介。
- ゆうぱぱさんのブログ、2016/12/10のエントリ
-
PetitModemの使い方。
- プチコン3号&BIGまとめWiki、投稿エリア、ペンコ改さんのPZGとPZT圧縮解凍くん
-
PetitModemの形式に対応した圧縮解凍ツール
- プチコン3号&BIGまとめWiki、投稿エリア、ペンコ改さんのPZGとPZT圧縮解凍くん
-
PetitModemの形式に対応した圧縮解凍ツール
- Vector内PetitModemの公開ページ
-
プチコン3号用の他の転送ソフト
- Petitcom 3 QPSK Modulator
-
OBONO氏作成。QPSK+ハミング符号。
- P/SEND2 / P/RECV2
-
myu314氏作成。
技術資料
- ITU-T V.21
-
V.21 Modemの勧告。
- ITU-T V.23
-
V.23 Modemの勧告。
- Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks
-
Philip Koopman, Tridib Chakravartyによる総当たりによる最適CRC多項式の導出。
- ITU-T V.26bis
-
V.26bis Modemの勧告。