概要
TCNetDataPacketCUE.read() の cueStart が 50 に設定されているが、仕様書 (V3.5.1B) では CUE 1 の開始は byte 47。この3バイトのずれにより、CUE IN TIME / OUT TIME が常に0として読み取られる。
再現手順
- CDJで曲をロードし、CUEポイントが設定された楽曲を再生
requestData(CUEData, layer) でCUEデータを取得
- 全CUEエントリの
inTime / outTime が 0 になる
原因
// network.ts - TCNetDataPacketCUE.read()
const cueStart = 50; // 仕様書では byte 47
仕様書のCUEエントリレイアウト (22バイト/エントリ):
| Offset |
Size |
説明 |
| +0 |
1 |
CUE Type |
| +1 |
1 |
RESERVED |
| +2 |
4 |
CUE IN Time (UInt32LE) |
| +6 |
4 |
CUE OUT Time (UInt32LE) |
| +10 |
1 |
RESERVED |
| +11 |
3 |
CUE Color (R, G, B) |
| +14 |
8 |
RESERVED |
start=50 の場合、IN TIME 読み取り位置 (byte 52) は実データの3バイト後方のゼロ領域にあたる。
実機ダンプによる検証
BRIDGE64 + CDJ-3000 で取得したパケットダンプ:
header (24-50): 0c01...7203000000000033
entry[0] @50: 020000...00d5
entry[1] @72: 040000...00f8
start=47 基準で IN TIME (offset +2 = byte 49) を UInt32LE で読むと:
- byte 49-52:
33 02 00 00 → 563ms
- byte 71-74:
D5 04 00 00 → 1237ms
- byte 93-96:
F8 2E 00 00 → 12024ms
- byte 115-118:
1A 59 00 00 → 22810ms
- byte 137-140:
73 FE 01 00 → 130675ms (≈2:10)
いずれも楽曲のCUEポイント位置として妥当な値。
補足: TYPE フィールド
仕様上 byte 47 に CUE Type が存在するが、BRIDGE64 では常に 0 が送信される。
空エントリ判定を type === 0 から inTime === 0 && outTime === 0 に変更する必要がある。
修正方針
cueStart を 50 → 47 に変更
- 空エントリ判定を
type === 0 → inTime === 0 && outTime === 0 に変更
概要
TCNetDataPacketCUE.read()のcueStartが 50 に設定されているが、仕様書 (V3.5.1B) では CUE 1 の開始は byte 47。この3バイトのずれにより、CUE IN TIME / OUT TIME が常に0として読み取られる。再現手順
requestData(CUEData, layer)でCUEデータを取得inTime/outTimeが 0 になる原因
仕様書のCUEエントリレイアウト (22バイト/エントリ):
start=50 の場合、IN TIME 読み取り位置 (byte 52) は実データの3バイト後方のゼロ領域にあたる。
実機ダンプによる検証
BRIDGE64 + CDJ-3000 で取得したパケットダンプ:
start=47 基準で IN TIME (offset +2 = byte 49) を UInt32LE で読むと:
33 02 00 00→ 563msD5 04 00 00→ 1237msF8 2E 00 00→ 12024ms1A 59 00 00→ 22810ms73 FE 01 00→ 130675ms (≈2:10)いずれも楽曲のCUEポイント位置として妥当な値。
補足: TYPE フィールド
仕様上 byte 47 に CUE Type が存在するが、BRIDGE64 では常に 0 が送信される。
空エントリ判定を
type === 0からinTime === 0 && outTime === 0に変更する必要がある。修正方針
cueStartを 50 → 47 に変更type === 0→inTime === 0 && outTime === 0に変更