import { DspGraph } from '@webpd/compiler'; import { PdJson } from '@webpd/pd-parser'; /** Partial info for node translation from PdJson.Node to DspGraph.Node */ export interface PartialNode { inlets: DspGraph.Node['inlets']; outlets: DspGraph.Node['outlets']; isPullingSignal?: DspGraph.Node['isPullingSignal']; isPushingMessages?: DspGraph.Node['isPushingMessages']; } export interface MessageToSignalConfig { initialSignalValue?: number; reroutedMessageInletId?: DspGraph.PortletId; } export interface NodeBuilder { /** * Translate Pd node arguments into node arguments for DspGraph. * @returns A structured map of arguments for the node, * where arguments are all type-checked and are always assigned a * default value. */ translateArgs: (pdNode: PdJson.Node, patch: PdJson.Patch, pd: PdJson.Pd) => NodeArgsType; /** * Builds a partial node from DspGraph node arguments. * Most importantly this allows to declare node's `inlets` and `outlets`, */ build: (nodeArgs: NodeArgsType) => PartialNode; /** * In Pd, messages can be connected to signal inlets. We forbid this in the dsp-graph, * therefore this hook is provided to reroute incoming message connections to a node * to a different inlet. */ configureMessageToSignalConnection?: (inletId: DspGraph.PortletId, nodeArgs: NodeArgsType) => MessageToSignalConfig | undefined; skipDollarArgsResolution?: true; aliasTo?: undefined; isNoop?: undefined; } export interface NodeBuilderAlias { isNoop?: undefined; /** Declares that this node builder is just an alias for another node builder. */ aliasTo: PdJson.NodeType; } export interface NodeBuilderNoop { aliasTo?: undefined; /** Declares that this node type is a noop and should be removed from the graph. */ isNoop: true; } export interface NodeBuilders { [nodeType: PdJson.NodeType]: NodeBuilder | NodeBuilderAlias | NodeBuilderNoop; }