背景
PR #86 (issue #75) で MixerData 型を TCNet 仕様上の全 47 フィールドに拡張した。フラット構造のままでは可読性・保守性に懸念があり、下流クライアント (tcnet-viewer) 側のレビューでも「論理グループにネスト化するか、コメントでグループ化するか」の選択が議論された。
下流プロジェクト tcnet-viewer では暫定対応としてセクションコメントでのグループ化を採用したが、より良い構造化の案としてネスト化が挙がっている。ただしネスト化は破壊的変更になるため、プロトコル提供元 (本リポジトリ) で先に方針を決定し、下流が追従する方が整合性が保てる。
現状
// src/types.ts
export type MixerData = {
mixerId: number;
mixerType: number;
mixerName: string;
masterAudioLevel: number;
masterFaderLevel: number;
masterFilter: number;
micEqHi: number;
micEqLow: number;
linkCueA: number;
linkCueB: number;
masterCueA: number;
masterCueB: number;
// ... 合計 47 フィールド (channels 除く)
channels: MixerChannel[];
};
ネスト化案
export type MixerData = {
id: { mixerId: number; mixerType: number; mixerName: string };
master: { audioLevel: number; faderLevel: number; filter: number; cueA: number; cueB: number };
mic: { eqHi: number; eqLow: number };
link: { cueA: number; cueB: number };
isolator: { on: boolean; hi: number; mid: number; low: number };
filter: { hpf: number; lpf: number; resonance: number };
sendFx: { effect: number; ext1: number; ext2: number; masterMix: number; sizeFeedback: number; time: number; hpf: number; level: number };
sendReturn3: { source: number; type: number; on: number; level: number };
crossFader: { curve: number; value: number; channelCurve: number };
beatFx: { on: boolean; levelDepth: number; channelSelect: number; select: number; freqHi: number; freqMid: number; freqLow: number };
headphones: { preEq: number; aLevel: number; aMix: number; bLevel: number; bMix: number };
booth: { level: number; eqHi: number; eqLow: number };
channels: MixerChannel[];
};
検討事項
1. ネスト化するメリット
- 47 フィールドの型定義がグループ単位で俯瞰しやすくなる
- ドメインモデル (Mic / Master / Send FX / Booth 等) が型で直接表現される
- 将来フィールドが増えた場合もグループ内で追加可能で拡張性が高い
- 下流クライアントで
mixer.sendFx.level のように階層アクセスできる
2. ネスト化するデメリット
- 破壊的変更: 全フィールドアクセスパスが変わる (tcnet-viewer で約 9 箇所の修正)
- プロトコル仕様 (TCNet 公式 spec) はフラットなバイトレイアウトで定義されており、ネスト化は SDK レイヤー独自の構造化
parse 処理のネストオブジェクト生成が若干のオーバーヘッド (無視できる程度)
- 既に下流に 47 フィールドフラット構造でリリース済み (v0.9.x)
3. フラット維持の正当性
- TCNet プロトコル仕様と 1:1 対応のままで、バイトオフセットとフィールド名の対応が追跡しやすい
- 破壊的変更を避けられる
- 下流側で必要ならラッパー層でネスト化できる
判断ポイント
- プロトコル SDK としての立ち位置: 「プロトコル仕様の忠実な移植」(フラット維持) vs 「TypeScript エコシステムで使いやすい形」(ネスト化)
- ユーザー数/ユースケース: 現状 tcnet-viewer 以外の利用者は?
- v1.0 リリース前後: v1.0 前なら破壊的変更のコストが低い
やること
参考
背景
PR #86 (issue #75) で
MixerData型を TCNet 仕様上の全 47 フィールドに拡張した。フラット構造のままでは可読性・保守性に懸念があり、下流クライアント (tcnet-viewer) 側のレビューでも「論理グループにネスト化するか、コメントでグループ化するか」の選択が議論された。下流プロジェクト tcnet-viewer では暫定対応としてセクションコメントでのグループ化を採用したが、より良い構造化の案としてネスト化が挙がっている。ただしネスト化は破壊的変更になるため、プロトコル提供元 (本リポジトリ) で先に方針を決定し、下流が追従する方が整合性が保てる。
現状
ネスト化案
検討事項
1. ネスト化するメリット
mixer.sendFx.levelのように階層アクセスできる2. ネスト化するデメリット
parse処理のネストオブジェクト生成が若干のオーバーヘッド (無視できる程度)3. フラット維持の正当性
判断ポイント
やること
src/types.tsのMixerData型を再設計src/network.tsのTCNetDataPacketMixer.read()を対応tests/のアサーション更新参考