UI 上で + ボタンとして表示されている Join ノードを廃止します。
現在の音声信号のルーティングは osc.0 -> join -> filter.0 となっていますが、これを osc.0 -> filter.0 のような直接接続に変更します。
このリファクタリングにより、ノードグラフの構造と、その背後にある音声処理の連鎖を簡潔化します。
JoinNodeを内部実装として維持:JoinNodeクラスはsrc/Node.hに残しますが、ユーザーが直接グラフに追加できるノードとしては扱わないようにします。これは、他のノードが複数の入力を受け付けるための内部的なミキサーとして利用します。
Parameters.hの更新:MAX_JOINS定数を削除します。NODE_KINDenum からJoinを削除します。NODE_KIND_NAMES配列から"join"を削除します。isValidIndexからcase Params::NODE_KIND::Joinを削除します。
Voice.hとVoice.cppの更新:PeachVoiceからjoinsベクターを削除します。PeachVoiceコンストラクタでのJoinNodeインスタンスの生成処理を削除します。updateGraphからcase Params::NODE_KIND::Joinを削除します。
JoinNodeやMAX_JOINSなどを参照している他の C++ ファイルの更新:- 残りの参照箇所を見つけるために、徹底的な検索を行う必要があります。
nodeInfoからjoinを削除:frontend/src/App.tsxのnodeInfoオブジェクトからjoinのエントリを削除します。
- コンテキストメニューから "Insert Join" を削除:
frontend/src/component/graph/Path.tsxのContextMenuから "Insert Join" の項目を削除します。
joinアイコンの削除:frontend/src/Icon.tsxのjoinアイコン定義を削除します。
- 「入力の追加」機能の汎用化:
- これまで
Joinノードが担っていた「新しい入力の追加」機能を、複数の入力を受け付けられるようになるすべてのノード(Filter,Pan,Destinationなど)で利用できるようにします。 frontend/src/App.tsxのnodeInfoを更新し、対象ノードのnumberOfInputsを1より大きい値(例:5)に設定します。これにより、frontend/src/component/graph/Node.tsxのコンテキストメニューに「入力の追加」が表示されるようになります。
- これまで
- "join" を参照している他のフロントエンドファイルを更新:
- すべての参照が削除されたことを確認するために、検索を行う必要があります。
このリファクタリングの核心は、これまで単一の入力しか受け付けなかったノード(FilterNode、PanNode、DestinationNodeなど)が、複数の入力を受け付けられるようにすることです。これは、各ノードの内部にJoinNodeインスタンスを保持し、入力信号のミキシングを委任することで実現します。
- 内部
JoinNodeの利用:FilterNodeなどの対象ノードは、std::shared_ptr<JoinNode>をメンバー変数として保持します。 addInputメソッドの移譲: 対象ノードのaddInputメソッドは、渡された入力を内部のJoinNodeのaddInputに渡します。これにより、単一入力の制約がなくなります。stepメソッドの連携: 対象ノードのstepメソッドは、まず内部のJoinNodeのstepを呼び出して入力信号をミックスし、そのJoinNodeの出力 (outメンバー) を自身の処理(フィルタリング、パンニング等)の入力として使用します。- 依存関係の管理:
_getDepsメソッドは、内部のJoinNodeを依存関係として返すようにします。
この変更は以下のノードに適用されます:
FilterNodePanNodeDestinationNodeAdsrNodeDelayNodeGainNode
このアプローチにより、各ノードは自身の主要な責務に集中でき、コードの再利用性を高めつつ、オーディオグラフを簡素化できます。