Merge pull request #9 from pblivingston/patch-arraymembers

Patch and ArrayMember classes
This commit is contained in:
Onyx and Iris 2025-11-26 15:34:42 +00:00 committed by GitHub
commit 16dd73231e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 211 additions and 22 deletions

View File

@ -12,6 +12,8 @@ Before any major/minor/patch is released all test units will be run to verify th
### Added ### Added
- IRemote base class - IRemote base class
- ArrayMember classes for array-like properties
- Patch class
## [3.3.0] - 2024-06-29 ## [3.3.0] - 2024-06-29

View File

@ -417,6 +417,29 @@ $vmr.command.Load("path/to/filename.xml")
$vmr.command.RunMacrobuttons() $vmr.command.RunMacrobuttons()
``` ```
### Patch
The following Patch commands are available:
- postFaderComposite: bool
- postFxInsert: bool
The following Patch members have .Set($val) and .Get() available:
- asio[i]: int, from 0 to ASIO input channels
- OutA2[i]-OutA5[i]: int, from 0 to ASIO output channels
- composite[i]: int, from 0 to strip channels
- insert[i]: bool
for example:
```powershell
$vmr.patch.asio[3].set(2) # patches ASIO input channel 2 (2) to strip 2, channel 2 (3)
$vmr.patch.OutA3[0].set(24) # patches bus A3, channel 1 (0) to ASIO output channel 24
$vmr.patch.composite[5].set(0) # sets composite channel 6 (5) to default bus channel
$vmr.patch.insert[4].get()
```
### Recorder ### Recorder
The following commands are available: The following commands are available:

View File

@ -3,12 +3,14 @@
. $PSScriptRoot\base.ps1 . $PSScriptRoot\base.ps1
. $PSScriptRoot\kinds.ps1 . $PSScriptRoot\kinds.ps1
. $PSScriptRoot\iremote.ps1 . $PSScriptRoot\iremote.ps1
. $PSScriptRoot\arraymember.ps1
. $PSScriptRoot\strip.ps1 . $PSScriptRoot\strip.ps1
. $PSScriptRoot\bus.ps1 . $PSScriptRoot\bus.ps1
. $PSScriptRoot\macrobuttons.ps1 . $PSScriptRoot\macrobuttons.ps1
. $PSScriptRoot\vban.ps1 . $PSScriptRoot\vban.ps1
. $PSScriptRoot\command.ps1 . $PSScriptRoot\command.ps1
. $PSScriptRoot\recorder.ps1 . $PSScriptRoot\recorder.ps1
. $PSScriptRoot\patch.ps1
. $PSScriptRoot\profiles.ps1 . $PSScriptRoot\profiles.ps1
class Remote { class Remote {
@ -78,6 +80,7 @@ class RemoteBasic : Remote {
[System.Collections.ArrayList]$button [System.Collections.ArrayList]$button
[PSCustomObject]$vban [PSCustomObject]$vban
[Object]$command [Object]$command
[Object]$patch
RemoteBasic () : base ('basic') { RemoteBasic () : base ('basic') {
$this.strip = Make_Strips($this) $this.strip = Make_Strips($this)
@ -85,6 +88,7 @@ class RemoteBasic : Remote {
$this.button = Make_Buttons $this.button = Make_Buttons
$this.vban = Make_Vban($this) $this.vban = Make_Vban($this)
$this.command = Make_Command($this) $this.command = Make_Command($this)
$this.patch = Make_Patch($this)
} }
} }
@ -94,6 +98,7 @@ class RemoteBanana : Remote {
[System.Collections.ArrayList]$button [System.Collections.ArrayList]$button
[PSCustomObject]$vban [PSCustomObject]$vban
[Object]$command [Object]$command
[Object]$patch
[Object]$recorder [Object]$recorder
RemoteBanana () : base ('banana') { RemoteBanana () : base ('banana') {
@ -102,6 +107,7 @@ class RemoteBanana : Remote {
$this.button = Make_Buttons $this.button = Make_Buttons
$this.vban = Make_Vban($this) $this.vban = Make_Vban($this)
$this.command = Make_Command($this) $this.command = Make_Command($this)
$this.patch = Make_Patch($this)
$this.recorder = Make_Recorder($this) $this.recorder = Make_Recorder($this)
} }
} }
@ -112,6 +118,7 @@ class RemotePotato : Remote {
[System.Collections.ArrayList]$button [System.Collections.ArrayList]$button
[PSCustomObject]$vban [PSCustomObject]$vban
[Object]$command [Object]$command
[Object]$patch
[Object]$recorder [Object]$recorder
RemotePotato () : base ('potato') { RemotePotato () : base ('potato') {
@ -120,6 +127,7 @@ class RemotePotato : Remote {
$this.button = Make_Buttons $this.button = Make_Buttons
$this.vban = Make_Vban($this) $this.vban = Make_Vban($this)
$this.command = Make_Command($this) $this.command = Make_Command($this)
$this.patch = Make_Patch($this)
$this.recorder = Make_Recorder($this) $this.recorder = Make_Recorder($this)
} }
} }

64
lib/arraymember.ps1 Normal file
View File

@ -0,0 +1,64 @@
class ArrayMember : IRemote {
[string]$prefix
[Object]$parent
ArrayMember (
[int]$index, [string]$prefix, [Object]$parent
) : base ($index, $parent.remote) {
$this.prefix = $prefix
$this.parent = $parent
}
[string] identifier () {
$parentId = $this.parent.identifier()
return "{0}.{1}[{2}]" -f $parentId, $this.prefix, $this.index
}
[void] Set ($val) {
$this.Setter('', $val)
}
}
class BoolArrayMember : ArrayMember {
BoolArrayMember (
[int]$index, [string]$prefix, [Object]$parent
) : base ($index, $prefix, $parent) {}
[bool] Get () {
return [bool]$this.Getter('')
}
}
class IntArrayMember : ArrayMember {
IntArrayMember (
[int]$index, [string]$prefix, [Object]$parent
) : base ($index, $prefix, $parent) {}
[int] Get () {
return [int]$this.Getter('')
}
}
class FloatArrayMember : ArrayMember {
[int]$decimals
FloatArrayMember (
[int]$index, [string]$prefix, [Object]$parent, [int]$decimals = 1
) : base ($index, $prefix, $parent) {
$this.decimals = $decimals
}
[double] Get () {
return [math]::Round($this.Getter(''), $this.decimals)
}
}
class StringArrayMember : ArrayMember {
StringArrayMember (
[int]$index, [string]$prefix, [Object]$parent
) : base ($index, $prefix, $parent) {}
[string] Get () {
return [string]$this.Getter_String('')
}
}

View File

@ -1,30 +1,42 @@
$KindMap = @{ $KindMap = @{
'basic' = @{ 'basic' = @{
'name' = 'basic' 'name' = 'basic'
'p_in' = 2 'p_in' = 2
'v_in' = 1 'v_in' = 1
'p_out' = 1 'p_out' = 1
'v_out' = 1 'v_out' = 1
'vban_in' = 4 'asio_in' = 4
'vban_out' = 4 'asio_out' = 8
'composite' = 0
'insert' = 0
'vban_in' = 4
'vban_out' = 4
}; };
'banana' = @{ 'banana' = @{
'name' = 'banana' 'name' = 'banana'
'p_in' = 3 'p_in' = 3
'v_in' = 2 'v_in' = 2
'p_out' = 3 'p_out' = 3
'v_out' = 2 'v_out' = 2
'vban_in' = 8 'asio_in' = 6
'vban_out' = 8 'asio_out' = 8
'composite' = 8
'insert' = 22
'vban_in' = 8
'vban_out' = 8
}; };
'potato' = @{ 'potato' = @{
'name' = 'potato' 'name' = 'potato'
'p_in' = 5 'p_in' = 5
'v_in' = 3 'v_in' = 3
'p_out' = 5 'p_out' = 5
'v_out' = 3 'v_out' = 3
'vban_in' = 8 'asio_in' = 10
'vban_out' = 8 'asio_out' = 8
'composite' = 8
'insert' = 34
'vban_in' = 8
'vban_out' = 8
}; };
} }

52
lib/patch.ps1 Normal file
View File

@ -0,0 +1,52 @@
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)
}

View File

@ -110,6 +110,23 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
$vmr.command.lock = $value $vmr.command.lock = $value
} }
} }
Context 'Patch' {
It 'Should set and get Patch.insert[$insert]' -Skip:$ifBasic {
$vmr.patch.insert[$insert].set($value)
$vmr.patch.insert[$insert].get() | Should -Be $value
}
It 'Should set and get Patch.postfadercomposite' -Skip:$ifBasic {
$vmr.patch.postfadercomposite = $value
$vmr.patch.postfadercomposite | Should -Be $value
}
It 'Should set and get Patch.postfxinsert' -Skip:$ifBasic {
$vmr.patch.postfxinsert = $value
$vmr.patch.postfxinsert | Should -Be $value
}
}
} }
Describe 'Float Tests' { Describe 'Float Tests' {
@ -241,6 +258,15 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
} }
} }
} }
Context 'Patch' {
It 'Should set and get Patch.composite[$composite]' -Skip:$ifBasic -ForEach @(
@{ Value = 22 }, @{ Value = 6 }
) {
$vmr.patch.composite[$composite].set($value)
$vmr.patch.composite[$composite].get() | Should -Be $value
}
}
} }
Describe 'String Tests' { Describe 'String Tests' {

View File

@ -16,6 +16,8 @@ function main() {
$virt_out = $vmr.kind.p_out + $vmr.kind.v_out - 1 $virt_out = $vmr.kind.p_out + $vmr.kind.v_out - 1
$vban_in = $vmr.kind.vban_in - 1 $vban_in = $vmr.kind.vban_in - 1
$vban_out = $vmr.kind.vban_out - 1 $vban_out = $vmr.kind.vban_out - 1
$insert = $vmr.kind.insert - 1
$composite = $vmr.kind.composite - 1
# skip conditions by kind # skip conditions by kind
$ifBasic = $vmr.kind.name -eq 'basic' $ifBasic = $vmr.kind.name -eq 'basic'