patch.ps1

class Patch : IRemote {
    [System.Collections.ArrayList]$asio
    [System.Collections.ArrayList]$composite
    [System.Collections.ArrayList]$insert
    
    Patch ([Object]$remote) : base ($remote) {
        AddBoolMembers -PARAMS @('postFaderComposite', 'postFxInsert')
        
        $this.AddASIOOutMembers()
        
        $this.asio = @()
        for ($i = 0; $i -lt $remote.kind.asio_in; $i++) {
            $this.asio.Add([IntArrayMember]::new($i, 'asio', $this))
        }
        
        $this.composite = @()
        for ($i = 0; $i -lt $remote.kind.composite; $i++) {
            $this.composite.Add([IntArrayMember]::new($i, 'composite', $this))
        }
        
        $this.insert = @()
        for ($i = 0; $i -lt $remote.kind.insert; $i++) {
            $this.insert.Add([BoolArrayMember]::new($i, 'insert', $this))
        }
    }
    
    [string] identifier () {
        return 'Patch'
    }
    
    hidden [void] AddASIOOutMembers () {
        $num_A = $this.remote.kind.p_out
        if ($this.remote.kind.name -eq 'basic') {
            $num_A += $this.remote.kind.v_out
        }
        $asio_out  = $this.remote.kind.asio_out
        
        if ($asio_out -le 0) { return }
        
        for ($a = 2; $a -le $num_A; $a++) {
            [System.Collections.ArrayList]$members = @()
            for ($i = 0; $i -lt $asio_out; $i++) {
                $members.Add([IntArrayMember]::new($i, "OutA$a", $this))
            }
            Add-Member -InputObject $this -MemberType NoteProperty -Name "OutA$a" -Value $members -Force
        }
    }
}

function Make_Patch ([Object]$remote) {
    return [Patch]::new($remote)
}