io.ps1

class IOControl : IRemote {
    IOControl ([int]$index, [Object]$remote) : base ($index, $remote) {
        AddBoolMembers -PARAMS @('mute')
        AddFloatMembers -PARAMS @('gain')
        AddStringMembers -PARAMS @('label')
    }

    [void] FadeTo ([single]$target, [int]$time) {
        $this.Setter('FadeTo', "($target, $time)")
    }

    [void] FadeBy ([single]$target, [int]$time) {
        $this.Setter('FadeBy', "($target, $time)")
    }
}

class IOLevels : IRemote {
    IOLevels ([int]$index, [Object]$remote) : base ($index, $remote) {
    }

    hidden [single] Convert([single]$val) {
        if ($val -gt 0) { 
            return [math]::Round(20 * [math]::Log10($val), 1) 
        } 
        else { 
            return -200.0 
        }
    }

    [System.Collections.ArrayList] Getter([int]$mode) {
        [System.Collections.ArrayList]$vals = @()
        $this.init..$($this.init + $this.offset - 1) | ForEach-Object {
            $vals.Add($this.Convert($(Get_Level -MODE $mode -INDEX $_)))
        }
        return $vals
    }
}

class IOEq : IRemote {
    [System.Collections.ArrayList]$channel
    [string]$kindOfEq
    
    IOEq ([int]$index, [Object]$remote, [string]$kindOfEq) : base ($index, $remote) {
        $this.kindOfEq = $kindOfEq

        AddBoolMembers -PARAMS @('on', 'ab')

        $this.channel = @()
        for ($ch = 0; $ch -lt $remote.kind.eq_ch[$this.kindOfEq]; $ch++) {
            $this.channel.Add([EqChannel]::new($ch, $remote, $this.identifier()))
        }
    }

    [void] Load ([string]$filename) {
        $param = 'Command.Load{0}Eq[{1}]' -f $this.kindOfEq, $this.index
        $this.remote.Setter($param, $filename)
    }

    [void] Save ([string]$filename) {
        $param = 'Command.Save{0}Eq[{1}]' -f $this.kindOfEq, $this.index
        $this.remote.Setter($param, $filename)
    }
}

class EqChannel : IRemote {
    [System.Collections.ArrayList]$cell
    [string]$eqId
    
    EqChannel ([int]$index, [Object]$remote, [string]$eqId) : base ($index, $remote) {
        $this.eqId = $eqId

        $this.cell = @()
        $cellCount = $this.remote.kind.cells
        for ($c = 0; $c -lt $cellCount; $c++) {
            $this.cell.Add([EqCell]::new($c, $remote, $this.identifier()))
        }
    }

    [string] identifier () {
        return '{0}.Channel[{1}]' -f $this.eqId, $this.index
    }
}

class EqCell : IRemote {
    [string]$channelId
    
    EqCell ([int]$index, [Object]$remote, [string]$channelId) : base ($index, $remote) {
        $this.channelId = $channelId

        AddBoolMembers -PARAMS @('on')
        AddIntMembers -PARAMS @('type')
        AddFloatMembers -PARAMS @('f', 'gain', 'q')
    }

    [string] identifier () {
        return '{0}.Cell[{1}]' -f $this.channelId, $this.index
    }
}

class IODevice : IRemote {
    IODevice ([int]$index, [Object]$remote) : base ($index, $remote) {
        AddStringMembers -WriteOnly -PARAMS @('wdm', 'ks', 'mme')
        AddStringMembers -ReadOnly -PARAMS @('name')
        AddIntMembers -ReadOnly -PARAMS @('sr')
    }
}