12 Commits

Author SHA1 Message Date
f480b637eb pester test script added to launch.json
CHANGELOG, README updated
2023-08-14 23:01:38 +01:00
09078d382b make examples and tests runnable if dot sourced 2023-08-14 22:44:09 +01:00
598e0dd647 add launch scripts 2023-08-14 21:45:18 +01:00
72b5ac02d3 adds missing Recorder parameters 2023-08-14 21:43:51 +01:00
a031d25a41 fix range checks 2023-08-14 21:30:32 +01:00
4e9ff66640 rework getters, setters in higher classes 2023-08-12 03:09:23 +01:00
bee52b6541 rename some of the internal classes
RecorderMode class added to Recorder

RunMacrobuttons() and CloseMacrobuttons() added to Special (Command)
2023-08-12 01:40:29 +01:00
5bda43131b upd changelog 2023-08-09 14:44:47 +01:00
1c9c400f12 VBVMR_GetLevel binding added
Get_Level implemented in base.ps1

strip.{PreFader,PostFader,PostMute} methods added

bus.{All} added
2023-08-09 14:16:27 +01:00
aee3430962 fix strip[i].device.name bug
patch bump
2022-12-19 23:19:20 +00:00
47fb880b91 remove tasklist from unreleased 2022-12-19 00:45:13 +00:00
acc078632d add strip.eq/bus.eq example to readme 2022-12-18 18:52:22 +00:00
15 changed files with 713 additions and 311 deletions

63
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,63 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "PowerShell: Launch CLI Example",
"type": "PowerShell",
"request": "launch",
"cwd": "${workspaceRoot}/examples/cli",
"script": "${workspaceFolder}/examples/cli/CLI.ps1",
"args": [
"-s",
"\"strip[0].mute\",",
"\"!strip[0].mute\",",
"\"strip[0].mute\",",
"\"bus[2].eq.on=1\",",
"\"command.lock=1\""
],
"createTemporaryIntegratedConsole": true
},
{
"name": "PowerShell: Launch NextBus Example",
"type": "PowerShell",
"request": "launch",
"cwd": "${workspaceRoot}/examples/nextbus",
"script": "${workspaceFolder}/examples/nextbus/GoTo-NextBus.ps1",
"args": [],
"createTemporaryIntegratedConsole": true
},
{
"name": "PowerShell: Launch OBS Example",
"type": "PowerShell",
"request": "launch",
"cwd": "${workspaceRoot}/examples/obs",
"script": "${workspaceFolder}/examples/obs/Vm-Obs-Sync.ps1",
"args": [],
"createTemporaryIntegratedConsole": true
},
{
"name": "PowerShell: Run Pester Tests",
"type": "PowerShell",
"request": "launch",
"cwd": "${workspaceRoot}",
"script": "${workspaceFolder}/tests/pre-commit.ps1",
"args": [],
"createTemporaryIntegratedConsole": true
},
{
"name": "PowerShell: Launch Quick Test",
"type": "PowerShell",
"request": "launch",
"cwd": "${workspaceRoot}",
"script": "${workspaceFolder}/quick.ps1",
"args": [
"-Verbose",
"-Debug"
],
"createTemporaryIntegratedConsole": true
}
]
}

View File

@@ -9,224 +9,222 @@ Before any major/minor/patch is released all test units will be run to verify th
## [Unreleased] These changes have not been added to PSGallery yet ## [Unreleased] These changes have not been added to PSGallery yet
- [x] Implement command.load - [x] Level methods for Strip,Bus classes implemented.
- [x] Implement comp/gate parameters introduced in v3.0.2.8 of the api. - [x] More Recorder commands implemented.
- [x] Add unit tests for new classes.
- [x] Update README with changes to Strip/Bus classes.
## [3.0.0] ## [3.0.0]
v3 introduces some breaking changes. They are as follows: v3 introduces some breaking changes. They are as follows:
- Strip[i].comp now references [Comp] class. (see README for details on settings strip.comp parameters) - Strip[i].comp now references [Comp] class. (see README for details on settings strip.comp parameters)
- Strip[i].gate now references [Gate] class. (see README for details on settings strip.gate parameters) - Strip[i].gate now references [Gate] class. (see README for details on settings strip.gate parameters)
- Strip[i].eq now references [Eq] class. (see README for details on settings strip.eq parameters) - Strip[i].eq now references [Eq] class. (see README for details on settings strip.eq parameters)
- Strip[i].device now references [Device] class. (see README for details on settings strip.device parameters) - Strip[i].device now references [Device] class. (see README for details on settings strip.device parameters)
- Bus[i].eq now references [Eq] class. (see README for details on settings bus.eq parameters) - Bus[i].eq now references [Eq] class. (see README for details on settings bus.eq parameters)
- Bus[i].mode now implemented as its own class [Mode]. (see README for details on settings bus.mode parameters) - Bus[i].mode now implemented as its own class [Mode]. (see README for details on settings bus.mode parameters)
There are other changes but they should not be breaking. There are other changes but they should not be breaking.
### Changed ### Changed
- meta functions refactored, they now use identifier() functions. - meta functions refactored, they now use identifier() functions.
- OBS example reworked, now using obs-powershell module. - OBS example reworked, now using obs-powershell module.
- Rethrow LoginError for unknown kind exceptions, let the consumer handle it from there. - Rethrow LoginError for unknown kind exceptions, let the consumer handle it from there.
### Added ### Added
- Entry/exit points Connect-Voicemeeter, Disconnect-Voicemeeter added to module. - Entry/exit points Connect-Voicemeeter, Disconnect-Voicemeeter added to module.
- Comp, Gate, Denoiser and Eq classes added to PhysicalStrip - Comp, Gate, Denoiser and Eq classes added to PhysicalStrip
- Device class added to PhysicalStrip/PhysicalBus - Device class added to PhysicalStrip/PhysicalBus
- AppGain(), AppMute() methods added to VirtualStrip - AppGain(), AppMute() methods added to VirtualStrip
- eq added to Bus - eq added to Bus
- interface classes IBus, IStrip and IVban added. getters/setters moved into interface classes. - interface classes IBus, IStrip and IVban added. getters/setters moved into interface classes.
- RemoteBasic, RemoteBanana and RemotePotato subclasses added. - RemoteBasic, RemoteBanana and RemotePotato subclasses added.
### Fixed ### Fixed
- Button getters return boolean values. - Button getters return boolean values.
### Removed ### Removed
- Bus[i].mode\_{param} members removed. Replaced with Bus[i].mode.{param} - Bus[i].mode\_{param} members removed. Replaced with Bus[i].mode.{param}
## [2.5.0] - 2022-10-27 ## [2.5.0] - 2022-10-27
### Added ### Added
- xy parameters added to strip/bus - xy parameters added to strip/bus
- fx parameters added to strip/bus - fx parameters added to strip/bus
- GetType, GetVersion added to Remote class. - GetType, GetVersion added to Remote class.
- SendText implemented (set parameters by script), added to Remote class. - SendText implemented (set parameters by script), added to Remote class.
- CLI example added - CLI example added
- README and CHANGELOG updated to reflect latest changes. - README and CHANGELOG updated to reflect latest changes.
### Changed ### Changed
- pester tests now support all kinds. - pester tests now support all kinds.
- GoToNextBus example refactored - GoToNextBus example refactored
- Previous console output now written to Debug stream. - Previous console output now written to Debug stream.
### Removed ### Removed
- setmulti, setandget and special examples. - setmulti, setandget and special examples.
## [2.4.0] - 2022-06-25 ## [2.4.0] - 2022-06-25
### Added ### Added
- fadeto, fadeby methods for strips/buses - fadeto, fadeby methods for strips/buses
- README and CHANGELOG updated to reflect latest changes. - README and CHANGELOG updated to reflect latest changes.
- Version 2.4 added to PSGAllery - Version 2.4 added to PSGAllery
### Changed ### Changed
- Move kinds, profiles into their own modules. - Move kinds, profiles into their own modules.
- remove global variable layout. added GetKind() to kinds. - remove global variable layout. added GetKind() to kinds.
- link to official documentation in readme now points to SDK repo. - link to official documentation in readme now points to SDK repo.
### Fixed ### Fixed
- number of macrobuttons - number of macrobuttons
## [2.3.0] - 2022-03-08 ## [2.3.0] - 2022-03-08
### Added ### Added
- mc, k properties added to virtual strips. - mc, k properties added to virtual strips.
- gainlayer properties added to all strips - gainlayer properties added to all strips
- busmode and eq_ab properties added to all buses. - busmode and eq_ab properties added to all buses.
- Added ability to load custom profiles in psd1 format. - Added ability to load custom profiles in psd1 format.
- Added hide command to Command class - Added hide command to Command class
- Added recorder module - Added recorder module
- Added recorder tests to higher.tests - Added recorder tests to higher.tests
- README and CHANGELOG updated to reflect latest changes. - README and CHANGELOG updated to reflect latest changes.
- Version 2.3 added to PSGAllery - Version 2.3 added to PSGAllery
### Changed ### Changed
- Pester tests refactored - Pester tests refactored
### Fixed ### Fixed
- eq, eq_ab getters now return boolean values - eq, eq_ab getters now return boolean values
- fixed bug with command action props - fixed bug with command action props
## [2.2.0] - 2022-01-19 ## [2.2.0] - 2022-01-19
### Added ### Added
- Add VMRemoteErrors class and subclass other error classes. - Add VMRemoteErrors class and subclass other error classes.
- Expose lower level setters and getters as well as polling parameters through Remote class. - Expose lower level setters and getters as well as polling parameters through Remote class.
- README and CHANGELOG updated to reflect latest changes. - README and CHANGELOG updated to reflect latest changes.
- Version 2.2 added to PSGAllery - Version 2.2 added to PSGAllery
### Changed ### Changed
- Rework set many parameters so class properties are set through the wrapper instead by VBVMR_SetParameters - Rework set many parameters so class properties are set through the wrapper instead by VBVMR_SetParameters
- Rework meta module. Separate functions for each member type. - Rework meta module. Separate functions for each member type.
- Update pester tests to reflect latest changes - Update pester tests to reflect latest changes
- Add throw LoginError if multiple login attempts are made. In testing the session was still crashing, however. - Add throw LoginError if multiple login attempts are made. In testing the session was still crashing, however.
## [2.1.0] - 2022-01-11 ## [2.1.0] - 2022-01-11
### Added ### Added
- Special command lock - Special command lock
- Special command showvbanchat - Special command showvbanchat
- vban.enable command added (toggle vban) - vban.enable command added (toggle vban)
- README and CHANGELOG updated to reflect latest changes. - README and CHANGELOG updated to reflect latest changes.
- Version 2.1 added to PSGAllery - Version 2.1 added to PSGAllery
### Changed ### Changed
- Subclass strip and bus classes into physical/virtual buses. - Subclass strip and bus classes into physical/virtual buses.
### Fixed ### Fixed
- Special command showvbanchat now accepts boolean - Special command showvbanchat now accepts boolean
## [2.0.0] - 2022-01-06 ## [2.0.0] - 2022-01-06
### Added ### Added
- README and CHANGELOG updated to reflect latest changes. - README and CHANGELOG updated to reflect latest changes.
- Version 2.0 added to PSGAllery - Version 2.0 added to PSGAllery
### Changed ### Changed
- Moved meta functions into own module - Moved meta functions into own module
- Vban class now custom object comprising of two arrays of subclasses for each stream type - Vban class now custom object comprising of two arrays of subclasses for each stream type
- Major version bumped due to changes to vban class - Major version bumped due to changes to vban class
- Pester tests updated to reflect changes. - Pester tests updated to reflect changes.
### Fixed ### Fixed
- Special commands now throw write only error on read attempt. - Special commands now throw write only error on read attempt.
## [1.8.0] - 2021-08-23 ## [1.8.0] - 2021-08-23
### Added ### Added
- Added special commands - Added special commands
### Changed ### Changed
- Add special section to README - Add special section to README
### Fixed ### Fixed
- Removed unneeded console output - Removed unneeded console output
## [1.6.0] - 2021-06-06 ## [1.6.0] - 2021-06-06
### Added ### Added
- Add vban commands - Add vban commands
- Added meta functions for bus/strip attrs - Added meta functions for bus/strip attrs
### Changed ### Changed
- Update tests to reflect changes - Update tests to reflect changes
- Add vban section to README - Add vban section to README
### Fixed ### Fixed
- Run 64bit exe for potato version if on 64bit OS - Run 64bit exe for potato version if on 64bit OS
## [1.5.0] - 2021-05-11 ## [1.5.0] - 2021-05-11
### Added ### Added
- Fetch dll path through registry (support for 32 and 64 bit) - Fetch dll path through registry (support for 32 and 64 bit)
- Add strip/bus commands section to README - Add strip/bus commands section to README
- Add label name command to Strips - Add label name command to Strips
## [1.4.0] - 2021-05-03 ## [1.4.0] - 2021-05-03
### Added ### Added
- Add gain, comp, limit to Strips - Add gain, comp, limit to Strips
- Update tests to reflect changes - Update tests to reflect changes
- Add logging + summary for tests - Add logging + summary for tests
- Add info to README about powershellget, nuget and psgallery - Add info to README about powershellget, nuget and psgallery
- Support other types of params in multi_set - Support other types of params in multi_set
### Changed ### Changed
- Multi_Set now accepts nested hash - Multi_Set now accepts nested hash
## [1.3.0] - 2021-04-30 ## [1.3.0] - 2021-04-30
### Added ### Added
- Updated README to include Installation instructions. - Updated README to include Installation instructions.
- Added FROM_SOURCE.md to explain alternative loading of scripts if directly - Added FROM_SOURCE.md to explain alternative loading of scripts if directly
downloaded. downloaded.
- Set_Multi command for setting many parameters at once. - Set_Multi command for setting many parameters at once.
## [1.0.0] - 2021-04-29 ## [1.0.0] - 2021-04-29
- Added module to PSGAllery - Added module to PSGAllery

343
README.md
View File

@@ -8,14 +8,14 @@ For past/future changes to this project refer to: [CHANGELOG](CHANGELOG.md)
## Tested against ## Tested against
- Basic 1.0.8.8 - Basic 1.0.8.8
- Banana 2.0.6.8 - Banana 2.0.6.8
- Potato 3.0.2.8 - Potato 3.0.2.8
## Requirements ## Requirements
- [Voicemeeter](https://voicemeeter.com/) - [Voicemeeter](https://voicemeeter.com/)
- Powershell 5.1+ or Powershell 7.2+ - Powershell 5.1+ or Powershell 7.2+
## Installation ## Installation
@@ -35,9 +35,9 @@ When prompted you will need to accept PSGallery as a trusted repository.
More Info: More Info:
- [PowerShellGet](https://docs.microsoft.com/en-us/powershell/scripting/gallery/installing-psget?view=powershell-7.1) - [PowerShellGet](https://docs.microsoft.com/en-us/powershell/scripting/gallery/installing-psget?view=powershell-7.1)
- [NuGet](https://www.powershellgallery.com/packages/NuGet/1.3.3) - [NuGet](https://www.powershellgallery.com/packages/NuGet/1.3.3)
- [PSGallery](https://docs.microsoft.com/en-gb/powershell/scripting/gallery/overview?view=powershell-7.1) - [PSGallery](https://docs.microsoft.com/en-gb/powershell/scripting/gallery/overview?view=powershell-7.1)
#### Direct download: #### Direct download:
@@ -75,14 +75,14 @@ finally { $vmr.Logout() }
Voicemeeter factory function can be: Voicemeeter factory function can be:
- Get-RemoteBasic - Get-RemoteBasic
- Get-RemoteBanana - Get-RemoteBanana
- Get-RemotePotato - Get-RemotePotato
Added in v3 you may also use the following entry/exit points: Added in `v3` you may also use the following entry/exit points:
- Connect-Voicemeeter - Connect-Voicemeeter
- Disconnect-Voicemeeter - Disconnect-Voicemeeter
`Connect-Voicemeeter` takes a single parameter `Kind`. `Connect-Voicemeeter` takes a single parameter `Kind`.
@@ -90,6 +90,8 @@ for example:
```powershell ```powershell
$vmr = Connect-Voicemeeter -Kind "potato" $vmr = Connect-Voicemeeter -Kind "potato"
...
Disconnect-Voicemeeter
``` ```
#### `Through the Shell` #### `Through the Shell`
@@ -113,31 +115,31 @@ $vmr.Logout()
The following strip commands are available: The following strip commands are available:
- mute: boolean - mute: boolean
- mono: boolean - mono: boolean
- mc: boolean - mc: boolean
- k: int, from 0 to 4 - k: int, from 0 to 4
- solo: boolean - solo: boolean
- A1-A5: boolean - A1-A5: boolean
- B1-B3: boolean - B1-B3: boolean
- limit: int, from -40 to 12 - limit: int, from -40 to 12
- gain: float, from -60.0 to 12.0 - gain: float, from -60.0 to 12.0
- label: string - label: string
- reverb: float, from 0.0 to 10.0 - reverb: float, from 0.0 to 10.0
- delay: float, from 0.0 to 10.0 - delay: float, from 0.0 to 10.0
- fx1: float, from 0.0 to 10.0 - fx1: float, from 0.0 to 10.0
- fx2: float, from 0.0 to 10.0 - fx2: float, from 0.0 to 10.0
- pan_x: float, from -0.5 to 0.5 - pan_x: float, from -0.5 to 0.5
- pan_y: float, from 0.0 to 1.0 - pan_y: float, from 0.0 to 1.0
- color_x: float, from -0.5 to 0.5 - color_x: float, from -0.5 to 0.5
- color_y: float, from 0.0 to 1.0 - color_y: float, from 0.0 to 1.0
- fx_x: float, from -0.5 to 0.5 - fx_x: float, from -0.5 to 0.5
- fx_y: float, from 0.0 to 1.0 - fx_y: float, from 0.0 to 1.0
- postreverb: boolean - postreverb: boolean
- postdelay: boolean - postdelay: boolean
- postfx1: boolean - postfx1: boolean
- postfx2: boolean - postfx2: boolean
- gainlayer0-gainlayer7: float - gainlayer0-gainlayer7: float
for example: for example:
@@ -155,15 +157,15 @@ mc, k for virtual strips only.
The following strip.comp commands are available: The following strip.comp commands are available:
- knob: float, from 0.0 to 10.0 - knob: float, from 0.0 to 10.0
- gainin: float, from -24.0 to 24.0 - gainin: float, from -24.0 to 24.0
- ratio: float, from 1.0 to 8.0 - ratio: float, from 1.0 to 8.0
- threshold: float, from -40.0 to -3.0 - threshold: float, from -40.0 to -3.0
- attack: float, from 0.0 to 200.0 - attack: float, from 0.0 to 200.0
- release: float, from 0.0 to 5000.0 - release: float, from 0.0 to 5000.0
- knee: float, 0.0 to 1.0 - knee: float, 0.0 to 1.0
- gainout: float, from -24.0 to 24.0 - gainout: float, from -24.0 to 24.0
- makeup: boolean - makeup: boolean
for example: for example:
@@ -175,13 +177,13 @@ $vmr.strip[3].comp.attack = 8.5
The following strip.gate commands are available: The following strip.gate commands are available:
- knob: float, from 0.0 to 10.0 - knob: float, from 0.0 to 10.0
- threshold: float, from -60.0 to -10.0 - threshold: float, from -60.0 to -10.0
- damping: float, from -60.0 to -10.0 - damping: float, from -60.0 to -10.0
- bpsidechain: int, from 100 to 4000 - bpsidechain: int, from 100 to 4000
- attack: float, from 0.0 to 1000.0 - attack: float, from 0.0 to 1000.0
- hold: float, from 0.0 to 5000.0 - hold: float, from 0.0 to 5000.0
- release: float, from 0.0 to 5000.0 - release: float, from 0.0 to 5000.0
for example: for example:
@@ -193,7 +195,7 @@ $vmr.strip[3].gate.threshold = -40.5
The following strip.denoiser commands are available: The following strip.denoiser commands are available:
- knob: float, from 0.0 to 10.0 - knob: float, from 0.0 to 10.0
for example: for example:
@@ -203,8 +205,8 @@ $vmr.strip[3].denoiser.knob = 5
#### AppGain | AppMute #### AppGain | AppMute
- `AppGain(amount, gain)` : string, float - `AppGain(amount, gain)` : string, float
- `AppMute(amount, mutestate)` : string, boolean - `AppMute(amount, mutestate)` : string, boolean
for example: for example:
@@ -213,19 +215,33 @@ $vmr.strip[5].AppGain("Spotify", 0.5)
$vmr.strip[5].AppMute("Spotify", $true) $vmr.strip[5].AppMute("Spotify", $true)
``` ```
#### levels
The following strip.level commands are available:
- PreFader()
- PostFader()
- PostMute()
for example:
```powershell
$vmr.strip[2].levels.PreFader() -Join ', ' | Write-Host
```
### Bus ### Bus
The following bus commands are available: The following bus commands are available:
- mute: bool - mute: bool
- mono: bool - mono: bool
- limit: int, from -40 to 12 - limit: int, from -40 to 12
- gain: float, from -60.0 to 12.0 - gain: float, from -60.0 to 12.0
- label: string - label: string
- returnreverb: float, from 0.0 to 10.0 - returnreverb: float, from 0.0 to 10.0
- returndelay: float, from 0.0 to 10.0 - returndelay: float, from 0.0 to 10.0
- returnfx1: float, from 0.0 to 10.0 - returnfx1: float, from 0.0 to 10.0
- returnfx2: float, from 0.0 to 10.0 - returnfx2: float, from 0.0 to 10.0
for example: for example:
@@ -237,22 +253,22 @@ $vmr.bus[3].returnreverb = 5.7
The following bus.mode members are available: The following bus.mode members are available:
- normal: boolean - normal: boolean
- amix: boolean - amix: boolean
- bmix: boolean - bmix: boolean
- repeat: boolean - repeat: boolean
- composite: boolean - composite: boolean
- tvmix: boolean - tvmix: boolean
- upmix21: boolean - upmix21: boolean
- upmix41: boolean - upmix41: boolean
- upmix61: boolean - upmix61: boolean
- centeronly: boolean - centeronly: boolean
- lfeonly: boolean - lfeonly: boolean
- rearonly: boolean - rearonly: boolean
The following bus.mode commands are available: The following bus.mode commands are available:
- Get(): returns the current bus mode. - Get(): returns the current bus mode.
for example: for example:
@@ -262,18 +278,30 @@ $vmr.bus[0].mode.centeronly = $true
$vmr.bus[0].mode.Get() $vmr.bus[0].mode.Get()
``` ```
#### levels
The following strip.level commands are available:
- All()
for example:
```powershell
$vmr.bus[2].levels.All() -Join ', ' | Write-Host
```
### Strip|Bus ### Strip|Bus
#### device #### device
The following strip.device | bus.device commands are available: The following strip.device | bus.device commands are available:
- name: string - name: string
- sr: int - sr: int
- wdm: string - wdm: string
- ks: string - ks: string
- mme: string - mme: string
- asio: string - asio: string
for example: for example:
@@ -289,13 +317,20 @@ wdm, ks, mme, asio are defined as write only.
The following strip.eq | bus.eq commands are available: The following strip.eq | bus.eq commands are available:
- on: boolean - on: boolean
- ab: boolean - ab: boolean
for example:
```powershell
$vmr.strip[0].eq.on = $true
$vmr.bus[0].eq.ab = $false
```
#### FadeTo | FadeBy #### FadeTo | FadeBy
- `FadeTo(amount, time)` : float, int - `FadeTo(amount, time)` : float, int
- `FadeBy(amount, time)` : float, int - `FadeBy(amount, time)` : float, int
Modify gain to or by the selected amount in db over a time interval in ms. Modify gain to or by the selected amount in db over a time interval in ms.
@@ -310,9 +345,9 @@ $vmr.bus[0].FadeBy(-10, 500)
Three modes defined: state, stateonly and trigger. Three modes defined: state, stateonly and trigger.
- State runs associated scripts - State runs associated scripts
- Stateonly does not run associated scripts - Stateonly does not run associated scripts
- Index range (0, 69) - Index range (0, 69)
```powershell ```powershell
$vmr.button[3].state = $true $vmr.button[3].state = $true
@@ -324,19 +359,19 @@ $vmr.button[5].trigger = $true
### VBAN ### VBAN
- vmr.vban.enable: Toggle VBAN on or off. Accepts a boolean value. - vmr.vban.enable: Toggle VBAN on or off. Accepts a boolean value.
For each vban in/out stream the following parameters are defined: For each vban in/out stream the following parameters are defined:
- on: boolean - on: boolean
- name: string - name: string
- ip: string - ip: string
- port: int from 1024 - 65535 - port: int from 1024 - 65535
- sr: int (11025, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000) - sr: int (11025, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000)
- channel: int from 1 to 8 - channel: int from 1 to 8
- bit: int 16 or 24 - bit: int 16 or 24
- quality: int from 0 to 4 - quality: int from 0 to 4
- route: int from 0 to 8 - route: int from 0 to 8
SR, channel and bit are defined as readonly for instreams. Attempting to write SR, channel and bit are defined as readonly for instreams. Attempting to write
to those parameters will throw an error. They are read and write for outstreams. to those parameters will throw an error. They are read and write for outstreams.
@@ -355,18 +390,18 @@ $vmr.vban.outstream[3].bit = 16
Certain 'special' commands are defined by the API as performing actions rather than setting values. Certain 'special' commands are defined by the API as performing actions rather than setting values.
The following commands are available:
- show
- hide
- restart
- shutdown
- showvbanchat: boolean (write only)
- lock: boolean (write only)
The following methods are available: The following methods are available:
- show - Load($filepath): string
- hide
- restart
- shutdown
- Load(filepath)
The following properties are write only and accept boolean values:
- showvbanchat
- lock
example: example:
@@ -380,27 +415,61 @@ $vmr.command.Load("path/to/filename.xml")
### Recorder ### Recorder
The following commands are available:
- play
- stop
- pause
- record
- ff
- rew
- A1 - A5: boolean
- B1 - B3: boolean
- samplerate: int (22050, 24000, 32000, 44100, 48000, 88200, 96000, 176400, 192000)
- bitresolution: int (8, 16, 24, 32)
- channel: int from 1 to 8
- kbps: int (32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320)
The following methods are available: The following methods are available:
- play - Load($filepath): string
- stop - GoTo($timestring): string, must match the format 'hh:mm:ss'
- pause - FileType($format): string, ('wav', 'aiff', 'bwf', 'mp3')
- record
- ff
- rew
The following properties accept boolean values.
- loop
- A1 - A5
- B1 - B3
example: example:
```powershell ```powershell
$vmr.recorder.play $vmr.recorder.play
$vmr.recorder.A1 = $true
$vmr.recorder.loop = $true $vmr.recorder.GoTo("00:01:15") # go to 1min 15sec into track
```
#### Mode
The following commands are available:
- recbus
- playonload
- loop
- multitrack
example:
```powershell
$vmr.recorder.mode.loop = $true
```
#### ArmStrip[i]|ArmBus[i]
The following method is available:
- Set($val): boolean
example:
```powershell
$vmr.recorder.armstrip[0].Set($true)
``` ```
### Multiple parameters ### Multiple parameters
@@ -451,9 +520,9 @@ will load a config file at profiles/banana/config.psd1 for Voicemeeter Banana.
Access to lower level Getters and Setters are provided with these functions: Access to lower level Getters and Setters are provided with these functions:
- `$vmr.Getter(param)`: For getting the value of a parameter expected to return a value other than string. - `$vmr.Getter(param)`: For getting the value of a parameter expected to return a value other than string.
- `$vmr.Getter_String(param)`: For getting the value of any parameter expected to return a string. - `$vmr.Getter_String(param)`: For getting the value of any parameter expected to return a string.
- `$vmr.Setter(param, value)`: For setting the value of any parameter. - `$vmr.Setter(param, value)`: For setting the value of any parameter.
```powershell ```powershell
$vmr.Getter('Strip[2].Mute') $vmr.Getter('Strip[2].Mute')
@@ -462,7 +531,7 @@ $vmr.Setter('Strip[4].Label', 'stripname')
$vmr.Setter('Strip[0].Gain', -3.6) $vmr.Setter('Strip[0].Gain', -3.6)
``` ```
- `$vmr.SendText`: Set parameters by script - `$vmr.SendText`: Set parameters by script
```powershell ```powershell
$vmr.SendText("strip[0].mute=1;strip[2].gain=3.8;bus[1].eq.On=1") $vmr.SendText("strip[0].mute=1;strip[2].gain=3.8;bus[1].eq.On=1")
@@ -470,17 +539,17 @@ $vmr.Setter('Strip[0].Gain', -3.6)
Access to lower level polling functions are provided with these functions: Access to lower level polling functions are provided with these functions:
- `$vmr.PDirty`: Returns true if a parameter has been updated. - `$vmr.PDirty`: Returns true if a parameter has been updated.
- `$vmr.MDirty`: Returns true if a macrobutton has been updated. - `$vmr.MDirty`: Returns true if a macrobutton has been updated.
### Run tests ### Run tests
Run tests using .\tests\pre-commit.ps1 which accepts the following parameters: Run tests using .\tests\pre-commit.ps1 which accepts the following parameters:
- `kind`: Run tests of this kind - `kind`: Run tests of this kind
- `tag`: Run tests tagged with this marker (currently `higher` or `lower`) - `tag`: Run tests tagged with this marker (currently `higher` or `lower`)
- `num`: Run this number of tests - `num`: Run this number of tests
- `log`: Write summary log file - `log`: Write summary log file
Run tests from repository root in a subshell and write logs, like so: Run tests from repository root in a subshell and write logs, like so:
@@ -488,4 +557,4 @@ Run tests from repository root in a subshell and write logs, like so:
### Official Documentation ### Official Documentation
- [Voicemeeter Remote C API](https://github.com/onyx-and-iris/Voicemeeter-SDK/blob/update-docs/VoicemeeterRemoteAPI.pdf) - [Voicemeeter Remote C API](https://github.com/onyx-and-iris/Voicemeeter-SDK/blob/update-docs/VoicemeeterRemoteAPI.pdf)

View File

@@ -63,4 +63,4 @@ function main {
finally { Disconnect-Voicemeeter } finally { Disconnect-Voicemeeter }
} }
if ($MyInvocation.InvocationName -ne '.') { main } main

View File

@@ -68,4 +68,4 @@ function main {
} }
} }
if ($MyInvocation.InvocationName -ne '.') { main } main

View File

@@ -75,7 +75,7 @@ class RemoteBasic : Remote {
$this.bus = Make_Buses($this) $this.bus = Make_Buses($this)
$this.button = Make_Buttons $this.button = Make_Buttons
$this.vban = Make_Vban($this) $this.vban = Make_Vban($this)
$this.command = Make_Command $this.command = Make_Command($this)
} }
} }
@@ -92,7 +92,7 @@ class RemoteBanana : Remote {
$this.bus = Make_Buses($this) $this.bus = Make_Buses($this)
$this.button = Make_Buttons $this.button = Make_Buttons
$this.vban = Make_Vban($this) $this.vban = Make_Vban($this)
$this.command = Make_Command $this.command = Make_Command($this)
$this.recorder = Make_Recorder($this) $this.recorder = Make_Recorder($this)
} }
} }
@@ -110,7 +110,7 @@ class RemotePotato : Remote {
$this.bus = Make_Buses($this) $this.bus = Make_Buses($this)
$this.button = Make_Buttons $this.button = Make_Buttons
$this.vban = Make_Vban($this) $this.vban = Make_Vban($this)
$this.command = Make_Command $this.command = Make_Command($this)
$this.recorder = Make_Recorder($this) $this.recorder = Make_Recorder($this)
} }
} }

View File

@@ -23,7 +23,7 @@ function Login {
New-Variable -Name vmExe -Value 0 New-Variable -Name vmExe -Value 0
if ( $kindId -eq "basic" ) { $vmExe = 1 } if ( $kindId -eq "basic" ) { $vmExe = 1 }
elseif ( $kindId -eq "banana" ) { $vmExe = 2 } elseif ( $kindId -eq "banana" ) { $vmExe = 2 }
elseif ( $kindId -eq "potato" ) { elseif ( $kindId -eq "potato" ) {
$vmExe = $(if ([Environment]::Is64BitOperatingSystem) { 6 } else { 3 }) $vmExe = $(if ([Environment]::Is64BitOperatingSystem) { 6 } else { 3 })
} }
@@ -203,3 +203,18 @@ function Set_By_Script {
Write-Warning $_.Exception.ErrorMessage() Write-Warning $_.Exception.ErrorMessage()
} }
} }
function Get_Level {
param(
[int64]$MODE, [int64]$INDEX
)
New-Variable -Name ptr -Value 0.0
try {
$retval = [int][Voicemeeter.Remote]::VBVMR_GetLevel($MODE, $INDEX, [ref]$ptr)
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
}
catch [CAPIError] {
Write-Warning $_.Exception.ErrorMessage()
}
[float]$ptr
}

View File

@@ -1,6 +1,6 @@
function Setup_DLL { function Setup_DLL {
try { try {
$vb_path = Get_VBPath $vb_path = Get_VMPath
if ([string]::IsNullOrWhiteSpace($vb_path)) { if ([string]::IsNullOrWhiteSpace($vb_path)) {
throw [VMRemoteError]::new("couldn't get Voicemeeter path") throw [VMRemoteError]::new("couldn't get Voicemeeter path")
@@ -47,6 +47,9 @@ function Setup_DLL {
[DllImport(@"$dll")] [DllImport(@"$dll")]
public static extern int VBVMR_SetParameters(String param); public static extern int VBVMR_SetParameters(String param);
[DllImport(@"$dll")]
public static extern int VBVMR_GetLevel(Int64 mode, Int64 index, ref float ptr);
"@ "@
Add-Type -MemberDefinition $Signature -Name Remote -Namespace Voicemeeter -PassThru | Out-Null Add-Type -MemberDefinition $Signature -Name Remote -Namespace Voicemeeter -PassThru | Out-Null

View File

@@ -18,29 +18,31 @@ class IBus {
} }
[single] Getter ($param) { [single] Getter ($param) {
return Param_Get -PARAM "$($this.identifier()).$param" -IS_STRING $false return $this.remote.Getter("$($this.identifier()).$param")
} }
[string] Getter_String ($param) { [string] Getter_String ($param) {
return Param_Get -PARAM "$($this.identifier()).$param" -IS_STRING $true return $this.remote.Getter_String("$($this.identifier()).$param")
} }
[void] Setter ($param, $set) { [void] Setter ($param, $val) {
Param_Set -PARAM "$($this.identifier()).$param" -Value $set $this.remote.Setter("$($this.identifier()).$param", $val)
} }
} }
class Bus : IBus { class Bus : IBus {
[Object]$mode [Object]$mode
[Object]$eq [Object]$eq
[Object]$levels
Bus ([int]$index, [Object]$remote) : base ($index, $remote) { Bus ([int]$index, [Object]$remote) : base ($index, $remote) {
AddBoolMembers -PARAMS @('mono', 'mute') AddBoolMembers -PARAMS @('mono', 'mute')
AddStringMembers -PARAMS @('label') AddStringMembers -PARAMS @('label')
AddFloatMembers -PARAMS @('gain', 'returnreverb', 'returndelay', 'returnfx1', 'returnfx2') AddFloatMembers -PARAMS @('gain', 'returnreverb', 'returndelay', 'returnfx1', 'returnfx2')
$this.mode = [Mode]::new($index, $remote) $this.mode = [BusMode]::new($index, $remote)
$this.eq = [Eq]::new($index, $remote) $this.eq = [BusEq]::new($index, $remote)
$this.levels = [BusLevels]::new($index, $remote)
} }
[void] FadeTo ([single]$target, [int]$time) { [void] FadeTo ([single]$target, [int]$time) {
@@ -52,10 +54,41 @@ class Bus : IBus {
} }
} }
class Mode : IBus { class BusLevels : IBus {
[int]$init
[int]$offset
BusLevels ([int]$index, [Object]$remote) : base ($index, $remote) {
$this.init = $index * 8
$this.offset = 8
}
[float] Convert([float]$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
}
[System.Collections.ArrayList] All() {
return $this.Getter(3)
}
}
class BusMode : IBus {
[System.Collections.ArrayList]$modes [System.Collections.ArrayList]$modes
Mode ([int]$index, [Object]$remote) : base ($index, $remote) { BusMode ([int]$index, [Object]$remote) : base ($index, $remote) {
$this.modes = @( $this.modes = @(
'normal', 'amix', 'bmix', 'repeat', 'composite', 'tvmix', 'upmix21', 'upmix41', 'upmix61', 'normal', 'amix', 'bmix', 'repeat', 'composite', 'tvmix', 'upmix21', 'upmix41', 'upmix61',
'centeronly', 'lfeonly', 'rearonly' 'centeronly', 'lfeonly', 'rearonly'
@@ -78,8 +111,8 @@ class Mode : IBus {
} }
} }
class Eq : IBus { class BusEq : IBus {
Eq ([int]$index, [Object]$remote) : base ($index, $remote) { BusEq ([int]$index, [Object]$remote) : base ($index, $remote) {
AddBoolMembers -PARAMS @('on', 'ab') AddBoolMembers -PARAMS @('on', 'ab')
} }
@@ -92,12 +125,12 @@ class PhysicalBus : Bus {
[Object]$device [Object]$device
PhysicalBus ([int]$index, [Object]$remote) : base ($index, $remote) { PhysicalBus ([int]$index, [Object]$remote) : base ($index, $remote) {
$this.device = [Device]::new($index, $remote) $this.device = [BusDevice]::new($index, $remote)
} }
} }
class Device : IBus { class BusDevice : IBus {
Device ([int]$index, [Object]$remote) : base ($index, $remote) { BusDevice ([int]$index, [Object]$remote) : base ($index, $remote) {
} }
[string] identifier () { [string] identifier () {

View File

@@ -1,8 +1,13 @@
. $PSScriptRoot\meta.ps1 . $PSScriptRoot\meta.ps1
. $PSScriptRoot\inst.ps1
class Special { class Special {
Special () { [Object]$remote
Special ([Object]$remote) {
AddActionMembers -PARAMS @('restart', 'shutdown', 'show') AddActionMembers -PARAMS @('restart', 'shutdown', 'show')
$this.remote = $remote
} }
[string] identifier () { [string] identifier () {
@@ -14,18 +19,26 @@ class Special {
} }
[single] Getter ($param) { [single] Getter ($param) {
return Param_Get -PARAM "$($this.identifier()).$param" -IS_STRING $false return $this.remote.Getter("$($this.identifier()).$param")
} }
[void] Setter ($param, $val) { [void] Setter ($param, $val) {
if ($val -is [Boolean]) { if ($val -is [Boolean]) {
Param_Set -PARAM "$($this.identifier()).$param" -Value $(if ($val) { 1 } else { 0 }) $this.remote.Setter("$($this.identifier()).$param", $(if ($val) { 1 } else { 0 }))
} }
else { else {
Param_Set -PARAM "$($this.identifier()).$param" -Value $val $this.remote.Setter("$($this.identifier()).$param", $val)
} }
} }
[void] RunMacrobuttons() {
Start-Process -FilePath $(Join-Path -Path $(Get_VMPath) -ChildPath "VoicemeeterMacroButtons.exe")
}
[void] CloseMacrobuttons() {
Stop-Process -Name "VoicemeeterMacroButtons"
}
hidden $_hide = $($this | Add-Member ScriptProperty 'hide' ` hidden $_hide = $($this | Add-Member ScriptProperty 'hide' `
{ {
$this._hide = $this.Setter('show', $false) $this._hide = $this.Setter('show', $false)
@@ -58,6 +71,6 @@ class Special {
} }
} }
function Make_Command { function Make_Command([Object]$remote) {
return [Special]::new() return [Special]::new($remote)
} }

View File

@@ -1,4 +1,4 @@
function Get_VBPath { function Get_VMPath {
$reg_path = "Registry::HKEY_LOCAL_MACHINE\Software" + ` $reg_path = "Registry::HKEY_LOCAL_MACHINE\Software" + `
(& { if ([Environment]::Is64BitOperatingSystem) { "\WOW6432Node" } else { "" } }) + ` (& { if ([Environment]::Is64BitOperatingSystem) { "\WOW6432Node" } else { "" } }) + `
"\Microsoft\Windows\CurrentVersion\Uninstall" "\Microsoft\Windows\CurrentVersion\Uninstall"

View File

@@ -1,12 +1,54 @@
. $PSScriptRoot\meta.ps1 . $PSScriptRoot\meta.ps1
class Recorder { class IRecorder {
[Object]$remote [Object]$remote
Recorder ([Object]$remote) { IRecorder ([Object]$remote) {
$this.remote = $remote $this.remote = $remote
}
[single] Getter ($param) {
$this.Cmd($param) | Write-Debug
return $this.remote.Getter($this.Cmd($param))
}
[void] Setter ($param, $val) {
"$($this.Cmd($param))=$val" | Write-Debug
if ($val -is [Boolean]) {
$this.remote.Setter($this.Cmd($param), $(if ($val) { 1 } else { 0 }))
}
else {
$this.remote.Setter($this.Cmd($param), $val)
}
}
[string] Cmd ($param) {
if ([string]::IsNullOrEmpty($param)) {
return $this.identifier()
}
return "$($this.identifier()).$param"
}
}
class Recorder : IRecorder {
[Object]$remote
[Object]$mode
[System.Collections.ArrayList]$armstrip
[System.Collections.ArrayList]$armbus
Recorder ([Object]$remote) : base ($remote) {
$this.mode = [RecorderMode]::new($remote)
$this.armstrip = @()
0..($remote.kind.p_in + $remote.kind.v_in - 1) | ForEach-Object {
$this.armstrip.Add([RecorderArmStrip]::new($_, $remote))
}
$this.armbus = @()
0..($remote.kind.p_out + $remote.kind.v_out - 1) | ForEach-Object {
$this.armbus.Add([RecorderArmBus]::new($_, $remote))
}
AddActionMembers -PARAMS @('play', 'stop', 'pause', 'replay', 'record', 'ff', 'rew') AddActionMembers -PARAMS @('play', 'stop', 'pause', 'replay', 'record', 'ff', 'rew')
AddFloatMembers -PARAMS @('gain')
AddChannelMembers AddChannelMembers
} }
@@ -18,32 +60,146 @@ class Recorder {
return $this.GetType().Name return $this.GetType().Name
} }
[single] Getter ($param) {
return Param_Get -PARAM "$($this.identifier()).$param" -IS_STRING $false
}
[void] Setter ($param, $val) {
if ($val -is [Boolean]) {
Param_Set -PARAM "$($this.identifier()).$param" -Value $(if ($val) { 1 } else { 0 })
}
else {
Param_Set -PARAM "$($this.identifier()).$param" -Value $val
}
}
hidden $_loop = $($this | Add-Member ScriptProperty 'loop' ` hidden $_loop = $($this | Add-Member ScriptProperty 'loop' `
{ {
return Write-Warning ("ERROR: $($this.identifier()).mode.loop is write only") [bool]$this.mode.loop
} ` } `
{ {
param([bool]$arg) param($arg)
$this._loop = $this.Setter('mode.loop', $arg) $this.mode.loop = $arg
}
)
hidden $_samplerate = $($this | Add-Member ScriptProperty 'samplerate' `
{
$this.Getter('samplerate')
} `
{
param([int]$arg)
$opts = @(22050, 24000, 32000, 44100, 48000, 88200, 96000, 176400, 192000)
if ($opts.Contains($arg)) {
$this._samplerate = $this.Setter('samplerate', $arg)
}
else {
"samplerate got: $arg, expected one of $opts" | Write-Warning
}
}
)
hidden $_bitresolution = $($this | Add-Member ScriptProperty 'bitresolution' `
{
$this.Getter('bitresolution')
} `
{
param([int]$arg)
$opts = @(8, 16, 24, 32)
if ($opts.Contains($arg)) {
$this._bitresolution = $this.Setter('bitresolution', $arg)
}
else {
"bitresolution got: $arg, expected one of $opts" | Write-Warning
}
}
)
hidden $_channel = $($this | Add-Member ScriptProperty 'channel' `
{
$this.Getter('channel')
} `
{
param([int]$arg)
if ($arg -ge 1 -and $arg -le 8) {
$this._channel = $this.Setter('channel', $arg)
}
else {
"channel got: $arg, expected value from 1 to 8" | Write-Warning
}
}
)
hidden $_kbps = $($this | Add-Member ScriptProperty 'kbps' `
{
$this.Getter('kbps')
} `
{
param([int]$arg)
$opts = @(32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320)
if ($opts.Contains($arg)) {
$this._kbps = $this.Setter('kbps', $arg)
}
else {
"kbps got: $arg, expected one of $opts" | Write-Warning
}
} }
) )
[void] Load ([string]$filename) { [void] Load ([string]$filename) {
$this.Setter('load', $filename) $this.Setter('load', $filename)
} }
[void] GoTo ([string]$timestring) {
try {
if ([datetime]::ParseExact($timestring, "HH:mm:ss", $null)) {
$timespan = [timespan]::Parse($timestring)
$this.Setter("GoTo", $timespan.TotalSeconds)
}
}
catch [FormatException] {
"Time string $timestring does not match the required format 'hh:mm:ss'" | Write-Warning
}
}
[void] FileType($format) {
[int]$val = 0
switch ($format) {
"wav" { $val = 1 }
"aiff" { $val = 2 }
"bwf" { $val = 3 }
"mp3" { $val = 100 }
default { "Filetype() got: $format, expected one of 'wav', 'aiff', 'bwf', 'mp3'" }
}
$this.Setter("filetype", $val)
}
}
class RecorderMode : IRecorder {
RecorderMode ([Object]$remote) : base ($remote) {
AddBoolMembers -PARAMS @('recbus', 'playonload', 'loop', 'multitrack')
}
[string] identifier () {
return "Recorder.Mode"
}
}
class RecorderArm : IRecorder {
[int]$index
RecorderArm ([int]$index, [Object]$remote) : base ($remote) {
$this.index = $index
}
Set ([bool]$val) {
$this.Setter("", $(if ($val) { 1 } else { 0 }))
}
}
class RecorderArmStrip : RecorderArm {
RecorderArmStrip ([int]$index, [Object]$remote) : base ($index, $remote) {
}
[string] identifier () {
return "Recorder.ArmStrip[$($this.index)]"
}
}
class RecorderArmBus : RecorderArm {
RecorderArmBus ([int]$index, [Object]$remote) : base ($index, $remote) {
}
[string] identifier () {
return "Recorder.ArmBus[$($this.index)]"
}
} }
function Make_Recorder ([Object]$remote) { function Make_Recorder ([Object]$remote) {

View File

@@ -14,19 +14,21 @@ class IStrip {
} }
[single] Getter ($param) { [single] Getter ($param) {
return Param_Get -PARAM "$($this.identifier()).$param" -IS_STRING $false return $this.remote.Getter("$($this.identifier()).$param")
} }
[string] Getter_String ($param) { [string] Getter_String ($param) {
return Param_Get -PARAM "$($this.identifier()).$param" -IS_STRING $true return $this.remote.Getter_String("$($this.identifier()).$param")
} }
[void] Setter ($param, $val) { [void] Setter ($param, $val) {
Param_Set -PARAM "$($this.identifier()).$param" -Value $val $this.remote.Setter("$($this.identifier()).$param", $val)
} }
} }
class Strip : IStrip { class Strip : IStrip {
[Object]$levels
Strip ([int]$index, [Object]$remote) : base ($index, $remote) { Strip ([int]$index, [Object]$remote) : base ($index, $remote) {
AddBoolMembers -PARAMS @('mono', 'solo', 'mute') AddBoolMembers -PARAMS @('mono', 'solo', 'mute')
AddIntMembers -PARAMS @('limit') AddIntMembers -PARAMS @('limit')
@@ -35,6 +37,8 @@ class Strip : IStrip {
AddChannelMembers AddChannelMembers
AddGainlayerMembers AddGainlayerMembers
$this.levels = [StripLevels]::new($index, $remote)
} }
[string] ToString() { [string] ToString() {
@@ -50,6 +54,52 @@ class Strip : IStrip {
} }
} }
class StripLevels : IStrip {
[int]$init
[int]$offset
StripLevels ([int]$index, [Object]$remote) : base ($index, $remote) {
$p_in = $remote.kind.p_in
if ($index -lt $p_in) {
$this.init = $index * 2
$this.offset = 2
}
else {
$this.init = ($p_in * 2) + (($index - $p_in) * 8)
$this.offset = 8
}
}
[float] Convert([float]$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
}
[System.Collections.ArrayList] PreFader() {
return $this.Getter(0)
}
[System.Collections.ArrayList] PostFader() {
return $this.Getter(1)
}
[System.Collections.ArrayList] PostMute() {
return $this.Getter(2)
}
}
class PhysicalStrip : Strip { class PhysicalStrip : Strip {
[Object]$comp [Object]$comp
[Object]$gate [Object]$gate
@@ -62,16 +112,16 @@ class PhysicalStrip : Strip {
AddFloatMembers -PARAMS @('reverb', 'delay', 'fx1', 'fx2') AddFloatMembers -PARAMS @('reverb', 'delay', 'fx1', 'fx2')
AddBoolMembers -PARAMS @('postreverb', 'postdelay', 'postfx1', 'postfx2') AddBoolMembers -PARAMS @('postreverb', 'postdelay', 'postfx1', 'postfx2')
$this.comp = [Comp]::new($index, $remote) $this.comp = [StripComp]::new($index, $remote)
$this.gate = [Gate]::new($index, $remote) $this.gate = [StripGate]::new($index, $remote)
$this.denoiser = [Denoiser]::new($index, $remote) $this.denoiser = [StripDenoiser]::new($index, $remote)
$this.eq = [Eq]::new($index, $remote) $this.eq = [StripEq]::new($index, $remote)
$this.device = [Device]::new($index, $remote) $this.device = [StripDevice]::new($index, $remote)
} }
} }
class Comp : IStrip { class StripComp : IStrip {
Comp ([int]$index, [Object]$remote) : base ($index, $remote) { StripComp ([int]$index, [Object]$remote) : base ($index, $remote) {
AddFloatMembers -PARAMS @('gainin', 'ratio', 'threshold', 'attack', 'release', 'knee', 'gainout') AddFloatMembers -PARAMS @('gainin', 'ratio', 'threshold', 'attack', 'release', 'knee', 'gainout')
AddBoolMembers -PARAMS @('makeup') AddBoolMembers -PARAMS @('makeup')
} }
@@ -91,8 +141,8 @@ class Comp : IStrip {
) )
} }
class Gate : IStrip { class StripGate : IStrip {
Gate ([int]$index, [Object]$remote) : base ($index, $remote) { StripGate ([int]$index, [Object]$remote) : base ($index, $remote) {
AddFloatMembers -PARAMS @('threshold', 'damping', 'bpsidechain', 'attack', 'hold', 'release') AddFloatMembers -PARAMS @('threshold', 'damping', 'bpsidechain', 'attack', 'hold', 'release')
} }
@@ -111,8 +161,8 @@ class Gate : IStrip {
) )
} }
class Denoiser : IStrip { class StripDenoiser : IStrip {
Denoiser ([int]$index, [Object]$remote) : base ($index, $remote) { StripDenoiser ([int]$index, [Object]$remote) : base ($index, $remote) {
} }
[string] identifier () { [string] identifier () {
@@ -130,8 +180,8 @@ class Denoiser : IStrip {
) )
} }
class Eq : IStrip { class StripEq : IStrip {
Eq ([int]$index, [Object]$remote) : base ($index, $remote) { StripEq ([int]$index, [Object]$remote) : base ($index, $remote) {
AddBoolMembers -PARAMS @('on', 'ab') AddBoolMembers -PARAMS @('on', 'ab')
} }
@@ -140,15 +190,15 @@ class Eq : IStrip {
} }
} }
class Device : IStrip { class StripDevice : IStrip {
Device ([int]$index, [Object]$remote) : base ($index, $remote) { StripDevice ([int]$index, [Object]$remote) : base ($index, $remote) {
} }
[string] identifier () { [string] identifier () {
return "Strip[" + $this.index + "].Device" return "Strip[" + $this.index + "].Device"
} }
hidden $_device = $($this | Add-Member ScriptProperty 'device' ` hidden $_name = $($this | Add-Member ScriptProperty 'name' `
{ {
$this.Getter_String('name') $this.Getter_String('name')
} ` } `

View File

@@ -1,9 +1,11 @@
class IVban { class IVban {
[int32]$index [int32]$index
[Object]$remote
[string]$direction [string]$direction
IVban ([int]$index, [string]$direction) { IVban ([int]$index, [Object]$remote, [string]$direction) {
$this.index = $index $this.index = $index
$this.remote = $remote
$this.direction = $direction $this.direction = $direction
} }
@@ -16,20 +18,20 @@ class IVban {
} }
[single] Getter ($param) { [single] Getter ($param) {
return Param_Get -PARAM "$($this.identifier()).$param" -IS_STRING $false return $this.remote.Getter("$($this.identifier()).$param")
} }
[string] Getter_String ($param) { [string] Getter_String ($param) {
return Param_Get -PARAM "$($this.identifier()).$param" -IS_STRING $true return $this.remote.Getter_String("$($this.identifier()).$param")
} }
[void] Setter ($param, $val) { [void] Setter ($param, $val) {
Param_Set -PARAM "$($this.identifier()).$param" -Value $val $this.remote.Setter("$($this.identifier()).$param", $val)
} }
} }
class Vban : IVban { class Vban : IVban {
Vban ([int]$index, [string]$direction) : base ($index, $direction) { Vban ([int]$index, [Object]$remote, [string]$direction) : base ($index, $remote, $direction) {
} }
hidden $_on = $($this | Add-Member ScriptProperty 'on' ` hidden $_on = $($this | Add-Member ScriptProperty 'on' `
@@ -68,7 +70,7 @@ class Vban : IVban {
} ` } `
{ {
param([string]$arg) param([string]$arg)
if ($arg -in 1024..65535) { if ($arg -ge 1024 -and $arg -le 65535) {
$this._port = $this.Setter('port', $arg) $this._port = $this.Setter('port', $arg)
} }
else { else {
@@ -104,7 +106,7 @@ class Vban : IVban {
param([int]$arg) param([int]$arg)
if ($this.direction -eq "in") { Write-Warning ('Error, read only value') } if ($this.direction -eq "in") { Write-Warning ('Error, read only value') }
else { else {
if ($arg -in 1..8) { if ($arg -ge 1 -and $arg -le 8) {
$this._channel = $this.Setter('channel', $arg) $this._channel = $this.Setter('channel', $arg)
} }
else { else {
@@ -142,7 +144,7 @@ class Vban : IVban {
param([int]$arg) param([int]$arg)
if ($this.direction -eq "in") { Write-Warning ('Error, read only value') } if ($this.direction -eq "in") { Write-Warning ('Error, read only value') }
else { else {
if ($arg -in 0..4) { if ($arg -ge 0 -and $arg -le 4) {
$this._quality = $this.Setter('quality', $arg) $this._quality = $this.Setter('quality', $arg)
} }
else { else {
@@ -160,7 +162,7 @@ class Vban : IVban {
param([int]$arg) param([int]$arg)
if ($this.direction -eq "in") { Write-Warning ('Error, read only value') } if ($this.direction -eq "in") { Write-Warning ('Error, read only value') }
else { else {
if ($arg -in 0..8) { if ($arg -ge 0 -and $arg -le 8) {
$this._route = $this.Setter('route', $arg) $this._route = $this.Setter('route', $arg)
} }
else { else {
@@ -173,13 +175,13 @@ class Vban : IVban {
class VbanInstream : Vban { class VbanInstream : Vban {
VbanInstream ([int]$index, [string]$direction) : base ($index, $direction) { VbanInstream ([int]$index, [Object]$remote, [string]$direction) : base ($index, $remote, $direction) {
} }
} }
class VbanOutstream : Vban { class VbanOutstream : Vban {
VbanOutstream ([int]$index, [string]$direction) : base ($index, $direction) { VbanOutstream ([int]$index, [Object]$remote, [string]$direction) : base ($index, $remote, $direction) {
} }
} }
@@ -189,10 +191,10 @@ function Make_Vban ([Object]$remote) {
[System.Collections.ArrayList]$outstream = @() [System.Collections.ArrayList]$outstream = @()
0..$($remote.kind.vban_in - 1) | ForEach-Object { 0..$($remote.kind.vban_in - 1) | ForEach-Object {
[void]$instream.Add([VbanInstream]::new($_, "in")) [void]$instream.Add([VbanInstream]::new($_, $remote, "in"))
} }
0..$($remote.kind.vban_out - 1) | ForEach-Object { 0..$($remote.kind.vban_out - 1) | ForEach-Object {
[void]$outstream.Add([VbanOutstream]::new($_, "out")) [void]$outstream.Add([VbanOutstream]::new($_, $remote, "out"))
} }
$CustomObject = [pscustomobject]@{ $CustomObject = [pscustomobject]@{

View File

@@ -34,6 +34,7 @@ Function ParseLog {
function main() { function main() {
try { try {
$vmr = Connect-Voicemeeter -Kind $kind $vmr = Connect-Voicemeeter -Kind $kind
$vmr.command.RunMacrobuttons() # ensure macrobuttons is running before we begin
Write-Host "Running tests for $vmr" Write-Host "Running tests for $vmr"
# test boundaries by kind # test boundaries by kind
@@ -72,5 +73,4 @@ function main() {
} }
main
if ($MyInvocation.InvocationName -ne '.') { main }