chenpi
chenpi (陳皮) は、DS / 3DS 用キャプチャ機器の映像・音声を、公式ビューアやウィンドウキャプチャを使わずに
numpy / OpenCV の画像として直接取り込むための Windows 用ライブラリです。
cv2.VideoCapture と同じ read() で読めるので、OpenCV 前提のコードにそのまま渡せます。
cc3dsfs (MIT License) の処理を Python に移植しています。
| 機種 | 映像 | 音声 | 備考 |
|---|---|---|---|
| 新型 Loopy DS キャプチャ (USB Type-C 版) | 256x192 × 2 画面 / 60fps | あり | |
| Optimize 3DS キャプチャ (Old 3DS 用) | 400x240 + 320x240 / 60fps | あり | 公式ソフトのプロダクトキーが必要 |
Optimize の New 3DS 用 / 2DS 用、RGB888、3D 表示、Loopy 製 3DS キャプチャには未対応です。
準備
-
ドライバ: 各機器の公式ソフトに付属するドライバをそのまま使います (公式ソフトが動く環境なら導入済み)。
- Loopy DS: FTDI の D2XX ドライバ
- Optimize 3DS: 公式ドライバ (NSTDUSB3)
- Zadig などで WinUSB に差し替えると動きません。
-
インストール
uv add "chenpi[audio,virtualcam]" # 別のプロジェクトから使う場合 (pip install でも可。音声・仮想カメラが不要なら [] は省略) uv sync # このリポジトリで開発する場合
-
ファームウェアの取得: 基板に書き込むファームウェアは同梱していないので、cc3dsfs から取得します (理由はファームウェアについて)。ビューアは、無ければ取得してよいか尋ねます。
uv run scripts/fetch_firmware.py # %LOCALAPPDATA%\chenpi\firmware に保存
-
Optimize 3DS のプロダクトキー:
--keyか環境変数OPTIMIZE_3DS_KEYで渡します (カンマ区切りで複数可)。setx OPTIMIZE_3DS_KEY "XXXX-XXXX-XXXX-XXXX-XXXX" # VS Code / ターミナルを開き直すと有効
公式ソフトや cc3dsfs とは同時に使えません。先に閉じてください。
ビューアで試す
uv run chenpi-view --list # 接続されている機器の一覧
uv run chenpi-view # 見つかった機器を表示 (q で終了)
uv run chenpi-view --device 3ds --audio # 機種を指定し、音声も再生 (+ / - キーで音量)
uv run chenpi-view --layout horizontal --scale 3
| オプション | 内容 |
|---|---|
--device auto|ds|3ds |
機種 (既定 auto: DS → 3DS の順に探す) |
--key |
Optimize 3DS のプロダクトキー |
--layout vertical|horizontal|top|bottom |
画面の並べ方 |
--scale |
表示の拡大率 (既定 2) |
--audio / --volume / --audio-latency |
音声の再生 / 音量の倍率 / 出力バッファ (秒) |
ライブラリとして使う
OpenCV と同じように読む
from chenpi import open_capture
with open_capture("auto", layout="vertical") as cap: # "ds" / "3ds" も指定できる
ok, frame = cap.read() # BGR uint8。vertical なら DS は 256x384、3DS は 400x480 (下画面の左右は黒帯)
audio = cap.read_audio() # 前回以降の音声 int16 (N, 2) [L, R]
機種ごとのクラス (LoopyDSCapture / Optimize3DSCapture) を直接使うこともできます。
API の一覧・frame の大きさ・例外・注意点は src/chenpi/USAGE.md にまとめてあります。 このファイルはパッケージにも入るので、chenpi を使う別のプロジェクトでは、その CLAUDE.md などに次のように書いておくと、 コーディングエージェントが正しい使い方を参照できます。
- キャプチャには chenpi を使う。使い方は `.venv/Lib/site-packages/chenpi/USAGE.md` を読むこと。
機器の一覧から選んで開く (GUI 向け)
from chenpi import list_devices, open_device
infos = list_devices() # 機器には触らずに一覧だけ返す (ファーム書き込みなどはしない)
for info in infos:
print(info, info.available) # 例: "Optimize Old 3DS [使用中]" False
cap = open_device(infos[0], key=["XXXX-...", "YYYY-..."]) # 3DS は保存してあるキーを全部渡せば合うものを使う
print(cap.serial) # 3DS ならデバイス ID。キーとの対応を保存しておくとよい
info.statusはready/in_use(他のプログラムが使用中) /replug(公式ソフト使用後で USB の抜き差しが必要)。- Optimize 3DS のデバイス ID は開くまで分からないので、一覧では
info.idがNoneです。 挿した直後は「未初期化」と表示されます (Old 3DS 用 / New 3DS v2 用 / 2DS 用の区別は付きません)。 - Optimize を 2 台つないでいても、キーの合う空いている方が開きます。
- 同じ機器を 2 つのプログラムで同時に開くことはできません (cc3dsfs との間でも)。
- 使用中の Loopy DS は、ID (シリアル) が大文字で表示されます (Windows の記録による)。比べるときは大文字小文字を区別しないでください。
音声
- DS・3DS とも
SAMPLE_RATE(≒ 32728.5 Hz) のステレオ int16 です。 read_audio()は待たずに、溜まっている分を全部返します (読まれない分は約 2 秒で古い順に捨てます)。- 音量は
cap.volume(倍率、既定 1.0) で変えられ、read_audio()の結果にかかります。再生中に変えてもすぐ反映されます。 1.0 より大きくすると増幅し、int16 をはみ出す分は頭打ちになります。GUI のスライダーならcap.volume = value / 100のように使えます。
GUI に組み込むときの注意
-
ファームウェアが無いときは
FirmwareMissing(足りないファイル名はe.names) になります。 勝手にダウンロードせず、利用者に確認してから取得してください。from chenpi import FirmwareMissing, download_firmware, open_device try: cap = open_device(info, key=keys) except FirmwareMissing as e: if ask_user(f"{e.names} を cc3dsfs から取得しますか?"): download_firmware()
-
CPU 使用率: 毎フレーム OpenCV で拡大や表示をするなら、アプリの最初で
cv2.setNumThreads(1)を呼んでください。 OpenCV は小さな処理も複数スレッドに分け、その後スレッドが空回りするため、ビューアでは 1 コアの約 9 割 → 約 3 割に下がりました。 プロセス全体の設定なので、ライブラリ側では変えていません。 -
read()は新しいフレームが来るまで待つので、GUI のメインスレッドではなく別スレッドで回してください。 -
機器を切り替えるときは、先に
cap.release()を呼んでください。 -
受信中に USB が抜かれると、
read()が(False, None)を返し、cap.isOpened()が False になります (固まりません)。
仮想カメラ
OBS Studio (OBS Virtual Camera) が入っていれば、普通の Web カメラとして他のアプリから使えます。 OBS 側の「仮想カメラ開始」は止めておいてください (同時には使えません)。
uv run chenpi-virtualcam --device 3ds # --layout / --scale / --audio / --key もビューアと同じ
import cv2
cap = cv2.VideoCapture(3, cv2.CAP_DSHOW) # 番号は環境による (OBS Virtual Camera の番号)
仮想カメラには音声は乗りません (OBS Virtual Camera は映像のみ)。
機種ごとの注意
Optimize 3DS
- 公式ソフトを使った後は、USB を抜き差ししてから開いてください (公式ソフトが別のファームウェアを書き込むため)。
- 3DS 本体の「本体設定 → その他の設定 → サウンド」は ステレオ にしてください。 サラウンドのままだと、スピーカー用のサラウンド処理 (中音域を左右逆位相で混ぜる) がかかった音が届き、PC で聞くとこもって聞こえます。
- 本体の音量スライダーはキャプチャの音には効きません。
cap.volumeか PC 側で調整してください。
Loopy DS
- DS 本体の電源が切れていると、開くことはできますが映像が届きません (ビューアは「信号待ち」と表示します)。
ファームウェアについて
キャプチャ基板に毎回書き込むファームウェア (と Optimize のキー計算用テーブル) は、このライブラリに 同梱していません。 これらは cc3dsfs で公開されているファイルですが、cc3dsfs の MIT ライセンスの対象外で、著作権は各メーカーにあります (Loopy DS 用は Loopy 社提供、Optimize 用は non-standard)。利用者自身が cc3dsfs から取得してください。
- 取得元は動作確認した cc3dsfs のコミットに固定していて、SHA-256 が合わないファイルは保存しません。
- 探す場所は、引数
firmware_dir→ 環境変数CHENPI_FIRMWARE_DIR→./firmware→ このリポジトリのfirmware/→%LOCALAPPDATA%\chenpi\firmwareの順です。
開発
uv sync
uv run pytest # 実機不要。ファームウェアが無い環境では、それを読む数件のテストはスキップされる
GitHub Actions では、Windows 上でファームウェアを取得してからテストを回します (.github/workflows/test.yml)。
ライセンス
MIT License (LICENSE)。 cc3dsfs の処理を移植しているため、cc3dsfs のライセンス表示を LICENSES/cc3dsfs.txt に含めています。 ファームウェアは上記のとおり同梱していません。
Metadata
Release files for chenpi 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| chenpi-0.1.0.tar.gz | 37.6 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| chenpi-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 81.9 kB
Release files / chenpi-0.1.0.tar.gz
| Download URL | chenpi-0.1.0.tar.gz |
|---|---|
| Size | 37.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d5ec8e3818b8f685f902be891019a0267d7f918b1d9fabff23451a1bf7f3a356
|
|
BLAKE2b-256 checksum How to use checksums |
168aa79be71122700683eafd645c1c43774c3a507f1c6ca50d3754e296f580b7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.4 {"installer":{"name":"uv","version":"0.13.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / chenpi-0.1.0-py3-none-any.whl
| Download URL | chenpi-0.1.0-py3-none-any.whl |
|---|---|
| Size | 44.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d8e5f369d0d5d65f182b1bea0fd1b6cebf69c4247e550d4953cac483d7f40857
|
|
BLAKE2b-256 checksum How to use checksums |
d83b060a62bc03216d8372ad8e1a61e1d4405e3e906df753af7f94e7a8490e53
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.4 {"installer":{"name":"uv","version":"0.13.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for chenpi 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.