Skip to content

Instantly share code, notes, and snippets.

@jinjor
Last active July 13, 2025 02:17
Show Gist options
  • Save jinjor/2f2721183fb118da8fc498f6736776a4 to your computer and use it in GitHub Desktop.
Save jinjor/2f2721183fb118da8fc498f6736776a4 to your computer and use it in GitHub Desktop.
リファクタリング計画書 by Gemini

リファクタリング計画書

目標

UI 上で + ボタンとして表示されている Join ノードを廃止します。 現在の音声信号のルーティングは osc.0 -> join -> filter.0 となっていますが、これを osc.0 -> filter.0 のような直接接続に変更します。

このリファクタリングにより、ノードグラフの構造と、その背後にある音声処理の連鎖を簡潔化します。

計画

バックエンド (C++)

  1. JoinNode を内部実装として維持:
    • JoinNode クラスは src/Node.h に残しますが、ユーザーが直接グラフに追加できるノードとしては扱わないようにします。これは、他のノードが複数の入力を受け付けるための内部的なミキサーとして利用します。
  2. Parameters.h の更新:
    • MAX_JOINS 定数を削除します。
    • NODE_KIND enum から Join を削除します。
    • NODE_KIND_NAMES 配列から "join" を削除します。
    • isValidIndex から case Params::NODE_KIND::Join を削除します。
  3. Voice.hVoice.cpp の更新:
    • PeachVoice から joins ベクターを削除します。
    • PeachVoice コンストラクタでの JoinNode インスタンスの生成処理を削除します。
    • updateGraph から case Params::NODE_KIND::Join を削除します。
  4. JoinNodeMAX_JOINS などを参照している他の C++ ファイルの更新:
    • 残りの参照箇所を見つけるために、徹底的な検索を行う必要があります。

フロントエンド (TypeScript/React)

  1. nodeInfo から join を削除:
    • frontend/src/App.tsxnodeInfo オブジェクトから join のエントリを削除します。
  2. コンテキストメニューから "Insert Join" を削除:
    • frontend/src/component/graph/Path.tsxContextMenu から "Insert Join" の項目を削除します。
  3. join アイコンの削除:
    • frontend/src/Icon.tsxjoin アイコン定義を削除します。
  4. 「入力の追加」機能の汎用化:
    • これまでJoinノードが担っていた「新しい入力の追加」機能を、複数の入力を受け付けられるようになるすべてのノード(Filter, Pan, Destinationなど)で利用できるようにします。
    • frontend/src/App.tsxnodeInfo を更新し、対象ノードの numberOfInputs1 より大きい値(例: 5)に設定します。これにより、frontend/src/component/graph/Node.tsx のコンテキストメニューに「入力の追加」が表示されるようになります。
  5. "join" を参照している他のフロントエンドファイルを更新:
    • すべての参照が削除されたことを確認するために、検索を行う必要があります。

リファクタリング戦略

このリファクタリングの核心は、これまで単一の入力しか受け付けなかったノード(FilterNodePanNodeDestinationNodeなど)が、複数の入力を受け付けられるようにすることです。これは、各ノードの内部にJoinNodeインスタンスを保持し、入力信号のミキシングを委任することで実現します。

  • 内部JoinNodeの利用: FilterNodeなどの対象ノードは、std::shared_ptr<JoinNode> をメンバー変数として保持します。
  • addInput メソッドの移譲: 対象ノードの addInput メソッドは、渡された入力を内部の JoinNodeaddInput に渡します。これにより、単一入力の制約がなくなります。
  • step メソッドの連携: 対象ノードの step メソッドは、まず内部の JoinNodestep を呼び出して入力信号をミックスし、その JoinNode の出力 (out メンバー) を自身の処理(フィルタリング、パンニング等)の入力として使用します。
  • 依存関係の管理: _getDeps メソッドは、内部の JoinNode を依存関係として返すようにします。

この変更は以下のノードに適用されます:

  • FilterNode
  • PanNode
  • DestinationNode
  • AdsrNode
  • DelayNode
  • GainNode

このアプローチにより、各ノードは自身の主要な責務に集中でき、コードの再利用性を高めつつ、オーディオグラフを簡素化できます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment