graphName "builtin_speaker_out"

; macros
; Uncomment the fs definition below if you want to process the graph offline
;[def fs 48000] ; All products use 48kHz by default
[def numChansIn 2]
[def numChansOut 6] ; rdar://46105807; Mapping Ch 0 - Ch 5; Left woofer 1, left woofer 2, left tweeter, right woofer 1, right woofer 2, right tweeter as of 12/03/18
[def numRefChans 3]

; ports
in in
out out
out ref

; boxes 
box SplitMain split 1 2
box LeftGain dbgn 1 1
box RightGain dbgn 1 1
box LeftBalance dbgn 1 1
box RightBalance dbgn 1 1
box EQSplit split 1 2 
box ToneSplit split 1 6
box FreakSplitLF split 1 4
box FreakSplitHF split 1 2
box RefSplit split 1 6
box ToneJoin join 6 1
box EQJoinLF join 4 1
box EQJoinHF join 2 1
box FreakJoin join 6 1
box Join join 2 1
box RefSum sum 4 1
box RefSumL sum 2 1
box RefSumR sum 2 1
box RefGain dbgn 1 1
box refJoin join 3 1
box Dead dead 2 1
box NFP nfnp 1 1 ; Non Finite Protection 

box XTC (aufx axtc) 1 1
box SpeakerProtect (aufx atsp) 1 1
box Tone1 (aufx tmst) 1 1
box Norm (aufx ldnm) 1 1
box Comp (aufx mstk) 1 1
box Tone2 (aufx tmst) 1 1
box VirtBass (aufx vben) 1 1
box VarEQ (aufx vrq2) 1 1
box analytical (aufx tmst) 1 1
box Buzz (aufx buzk) 1 1
box Delay (aufx cdly) 1 1
box ControlFreakLF (aufx cfrk) 1 1
box ControlFreakHF (aufx cfrk) 1 1
box Ramp dbgn 1 1; For ramping at start/stop to avoid pop

; wires
wire in NFP ([fs] [numChansIn])
wire NFP Norm ([fs] [numChansIn])
wire Norm VirtBass ([fs] [numChansIn])
wire VirtBass Tone1 ([fs] [numChansIn])
wire Tone1 SplitMain ([fs] [numChansIn])

wire (SplitMain 0) LeftGain ([fs] 1)
wire (SplitMain 1) RightGain ([fs] 1)

wire LeftGain LeftBalance ([fs] 1)
wire RightGain RightBalance ([fs] 1)

wire LeftBalance (Join 0) ([fs] 1) 
wire RightBalance (Join 1) ([fs] 1) 

wire Join XTC	([fs] [numChansIn])
wire XTC Tone2 ([fs] [numChansIn])
wire Tone2 VarEQ ([fs] [numChansIn])
wire VarEQ Comp ([fs] [numChansIn])
wire Comp EQSplit ([fs] [numChansIn])

wire (EQSplit 0) (ToneJoin 0) ([fs] 1) ;left woofer 1
wire (EQSplit 0) (ToneJoin 1) ([fs] 1) ;left woofer 2
wire (EQSplit 0) (ToneJoin 2) ([fs] 1) ;left tweeter 
wire (EQSplit 1) (ToneJoin 3) ([fs] 1) ;right woofer 1
wire (EQSplit 1) (ToneJoin 4) ([fs] 1) ;right woofer 2
wire (EQSplit 1) (ToneJoin 5) ([fs] 1) ;right tweeter 

wire ToneJoin analytical ([fs] [numChansOut])
wire analytical ToneSplit ([fs] [numChansOut])

wire (ToneSplit 0) (EQJoinLF 0) ([fs] 1)
wire (ToneSplit 1) (EQJoinLF 1) ([fs] 1)
wire (ToneSplit 3) (EQJoinLF 2) ([fs] 1)
wire (ToneSplit 4) (EQJoinLF 3) ([fs] 1)
wire (ToneSplit 2) (EQJoinHF 0) ([fs] 1)
wire (ToneSplit 5) (EQJoinHF 1) ([fs] 1)

wire EQJoinLF Buzz ([fs] 4)
wire EQJoinHF Delay ([fs] 2)

wire Buzz ControlFreakLF ([fs] 4)
wire Delay ControlFreakHF ([fs] 2)

wire ControlFreakLF FreakSplitLF ([fs] 4)
wire ControlFreakHF FreakSplitHF ([fs] 2)

wire (FreakSplitLF 0) (FreakJoin 0) ([fs] 1) ;left woofer 1
wire (FreakSplitLF 1) (FreakJoin 1) ([fs] 1) ;left woofer 2
wire (FreakSplitHF 0) (FreakJoin 2) ([fs] 1) ;left tweeter 
wire (FreakSplitLF 2) (FreakJoin 3) ([fs] 1) ;right woofer 1
wire (FreakSplitLF 3) (FreakJoin 4) ([fs] 1) ;right woofer 2
wire (FreakSplitHF 1) (FreakJoin 5) ([fs] 1) ;right tweeter 

wire FreakJoin SpeakerProtect ([fs] [numChansOut])

wire SpeakerProtect Ramp ([fs] [numChansOut]) 
wire Ramp RefGain ([fs] [numChansOut])
wire RefGain RefSplit ([fs] [numChansOut])

; when reverting to 2ch ref, use left ch as those speakers are closer to the mics and are better as reference
wire (RefSplit 0) (RefSum 0) ([fs] 1) ; left woofer 1
wire (RefSplit 1) (Dead 0) ([fs] 1) ; left woofer 2
wire (RefSplit 2) (RefSum 1)  ([fs] 1) ; left tweeter
wire (RefSplit 3) (RefSum 2) ([fs] 1) ; right woofer 1
wire (RefSplit 4) (Dead 1) ([fs] 1) ; right woofer 2
wire (RefSplit 5) (RefSum 3) ([fs] 1) ; right tweeter

; New refs
wire (RefSplit 0) (RefSumL 0) ([fs] 1) ; left woofer 1
wire (RefSplit 2) (RefSumL 1)  ([fs] 1) ; left tweeter

wire (RefSplit 3) (RefSumR 0) ([fs] 1) ; right woofer 1
wire (RefSplit 5) (RefSumR 1) ([fs] 1) ; right tweeter

; Join refs
wire RefSum  (refJoin 0) ([fs] 1) ; existing ref
wire RefSumL (refJoin 1) ([fs] 1) ; new L ref
wire RefSumR (refJoin 2) ([fs] 1) ; new R ref

wire refJoin ref ([fs] [numRefChans])
wire Ramp out ([fs] [numChansOut])

; graph-level parameters
param mvsc 0
wireGraphParam mvsc (VarEQ 5) ; 5 = currentGain
param mvol 0
wireGraphParam mvol (LeftGain 0)
wireGraphParam mvol (RightGain 0)
param mmut 0
wireGraphParam mmut (LeftGain 1)
wireGraphParam mmut (RightGain 1)
param rpss 0
wireGraphParam rpss (Ramp 1)

param lbal 0
wireGraphParam lbal (LeftBalance 0)
param rbal 0
wireGraphParam rbal (RightBalance 0)
param refg -3
wireGraphParam refg (RefGain 0)


