mirror of
https://github.com/onyx-and-iris/voicemeeter-api-powershell.git
synced 2026-04-20 14:33:32 +00:00
Compare commits
84 Commits
add-comp-g
...
abdf2dbf5d
| Author | SHA1 | Date | |
|---|---|---|---|
| abdf2dbf5d | |||
|
|
02bc174746 | ||
|
|
8038fc24ce | ||
|
|
d13b08eff4 | ||
|
|
dedb4201be | ||
|
|
60d97a89b4 | ||
|
|
6154af7ad7 | ||
| 07028478cc | |||
|
|
3f7bef56c1 | ||
|
|
820b897e84 | ||
|
|
1e4a2da821 | ||
|
|
ee85d5ffd8 | ||
| b20f62f17c | |||
|
|
1587b2ea6a | ||
|
|
88468d4e52 | ||
|
|
a69902ec49 | ||
|
|
10c85cead5 | ||
|
|
d81cd32392 | ||
|
|
e887e15168 | ||
|
|
c5a8813e9a | ||
| 16dd73231e | |||
|
|
15a977834d | ||
|
|
f3ed1de557 | ||
|
|
54319924d0 | ||
| 4d54e0a15f | |||
|
|
dce6f37bf1 | ||
|
|
5fc5680c75 | ||
|
|
80869d4306 | ||
|
|
e0b01288ff | ||
|
|
3a5c7286f6 | ||
|
|
c086f58ade | ||
|
|
e5137b842b | ||
|
|
78f7fc80d4 | ||
|
|
62d9e89b5f | ||
|
|
a6f7d8efe0 | ||
|
|
b372cf8087 | ||
|
|
eeb30925fa | ||
|
|
09d8bd48eb | ||
|
|
b0a6bf7b63 | ||
|
|
9a2529c617 | ||
|
|
2404bfb50f | ||
| bd0779add2 | |||
| a0a2c72634 | |||
| 0f68a2373d | |||
| 2d6437d37b | |||
| f199fa587f | |||
| b6c9c65390 | |||
| 436b47a5db | |||
| 0cdd71600f | |||
| 41529c0d58 | |||
| b1a6ac68c1 | |||
| fbfab5b4aa | |||
| 4d371a7582 | |||
| 15b3b375bd | |||
| c8abc6964a | |||
| 907ee3e63b | |||
| f3ed9c28c7 | |||
| d305a4048d | |||
| 108731b4cf | |||
| e7c648f1d0 | |||
| b21a71471b | |||
| 43367525c5 | |||
| d0fbd6deef | |||
| 1df92afcfe | |||
| 2ad8118f2c | |||
| bc6162cf16 | |||
| 9b3d9f2250 | |||
| 844eaeabaa | |||
| a78cdf9a99 | |||
| a40adf27be | |||
| 1397c14522 | |||
| ff1bd5e6cc | |||
| f480b637eb | |||
| 09078d382b | |||
| 598e0dd647 | |||
| 72b5ac02d3 | |||
| a031d25a41 | |||
| 4e9ff66640 | |||
| bee52b6541 | |||
| 5bda43131b | |||
| 1c9c400f12 | |||
| aee3430962 | |||
| 47fb880b91 | |||
| acc078632d |
5
.gitignore
vendored
5
.gitignore
vendored
@@ -1,7 +1,6 @@
|
|||||||
# quick test
|
|
||||||
quick.ps1
|
|
||||||
|
|
||||||
lib/*.psd1
|
lib/*.psd1
|
||||||
**/*.log
|
**/*.log
|
||||||
|
|
||||||
config.psd1
|
config.psd1
|
||||||
|
|
||||||
|
test-*.ps1
|
||||||
59
.vscode/launch.json
vendored
Normal file
59
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
{
|
||||||
|
// 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\"",
|
||||||
|
"-Verbose",
|
||||||
|
"-Debug"
|
||||||
|
],
|
||||||
|
"createTemporaryIntegratedConsole": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PowerShell: Launch NextBus Example",
|
||||||
|
"type": "PowerShell",
|
||||||
|
"request": "launch",
|
||||||
|
"cwd": "${workspaceRoot}/examples/nextbus",
|
||||||
|
"script": "${workspaceFolder}/examples/nextbus/GoTo-NextBus.ps1",
|
||||||
|
"args": [
|
||||||
|
"-Verbose",
|
||||||
|
"-Debug"
|
||||||
|
],
|
||||||
|
"createTemporaryIntegratedConsole": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PowerShell: Launch OBS Example",
|
||||||
|
"type": "PowerShell",
|
||||||
|
"request": "launch",
|
||||||
|
"cwd": "${workspaceRoot}/examples/obs",
|
||||||
|
"script": "${workspaceFolder}/examples/obs/Vm-Obs-Sync.ps1",
|
||||||
|
"args": [
|
||||||
|
"-Verbose",
|
||||||
|
"-Debug"
|
||||||
|
],
|
||||||
|
"createTemporaryIntegratedConsole": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "PowerShell: Run Pester Tests",
|
||||||
|
"type": "PowerShell",
|
||||||
|
"request": "launch",
|
||||||
|
"cwd": "${workspaceRoot}",
|
||||||
|
"script": "${workspaceFolder}/tests/run.ps1",
|
||||||
|
"args": [],
|
||||||
|
"createTemporaryIntegratedConsole": true
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
230
CHANGELOG.md
230
CHANGELOG.md
@@ -9,224 +9,262 @@ 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
|
### Added
|
||||||
- [x] Implement comp/gate parameters introduced in v3.0.2.8 of the api.
|
|
||||||
- [x] Add unit tests for new classes.
|
|
||||||
- [x] Update README with changes to Strip/Bus classes.
|
|
||||||
|
|
||||||
## [3.0.0]
|
- IRemote base class
|
||||||
|
- ArrayMember classes for array-like properties
|
||||||
|
- Patch class
|
||||||
|
- Option class
|
||||||
|
- Device classes
|
||||||
|
- EQ class
|
||||||
|
|
||||||
|
## [3.3.0] - 2024-06-29
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Add a timeout (2s) to the login function. If timeout exceeded a VMRemoteError is thrown.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Launch x64 bit GUIs for all kinds if on 64 bit system.
|
||||||
|
|
||||||
|
## [3.2.0] - 2023-08-17
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Debug statements added to Getters, Setters in higher classes.
|
||||||
|
- RunVoicemeeter function added to base.ps1. Accepts kind name as parameter.
|
||||||
|
- Errors section to README.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- All CAPIErrors are now exposed to the consumer.
|
||||||
|
- The function name and error code can be retrieved using [CAPIError].function and [CAPIError].code
|
||||||
|
- Set_By_Script now throws [VMRemoteError] if script length exceeds 48kB.
|
||||||
|
- parameter range checks in Vban class.
|
||||||
|
|
||||||
|
## [3.1.0] - 2023-08-15
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Level methods for Strip class implemented. See Strip.levels section in README.
|
||||||
|
- Level methods for Bus class implemented. See Bus.levels section in README.
|
||||||
|
- More Recorder commands implemented. See Recorder section in README.
|
||||||
|
- RunMacrobuttons, CloseMacrobuttons added to Special class
|
||||||
|
|
||||||
|
## [3.0.0] - 2023-08-09
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
445
README.md
445
README.md
@@ -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.1.1.1
|
||||||
- Banana 2.0.6.8
|
- Banana 2.1.1.1
|
||||||
- Potato 3.0.2.8
|
- Potato 3.1.1.1
|
||||||
|
|
||||||
## 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: bool
|
||||||
- mono: boolean
|
- mono: bool
|
||||||
- mc: boolean
|
- mc: bool
|
||||||
- k: int, from 0 to 4
|
- k: int, from 0 to 4
|
||||||
- solo: boolean
|
- solo: bool
|
||||||
- A1-A5: boolean
|
- A1-A5: bool
|
||||||
- B1-B3: boolean
|
- B1-B3: 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
|
||||||
- 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: bool
|
||||||
- postdelay: boolean
|
- postdelay: bool
|
||||||
- postfx1: boolean
|
- postfx1: bool
|
||||||
- postfx2: boolean
|
- postfx2: bool
|
||||||
- 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: bool
|
||||||
|
|
||||||
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, bool
|
||||||
|
|
||||||
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: bool
|
||||||
- amix: boolean
|
- amix: bool
|
||||||
- bmix: boolean
|
- bmix: bool
|
||||||
- repeat: boolean
|
- repeat: bool
|
||||||
- composite: boolean
|
- composite: bool
|
||||||
- tvmix: boolean
|
- tvmix: bool
|
||||||
- upmix21: boolean
|
- upmix21: bool
|
||||||
- upmix41: boolean
|
- upmix41: bool
|
||||||
- upmix61: boolean
|
- upmix61: bool
|
||||||
- centeronly: boolean
|
- centeronly: bool
|
||||||
- lfeonly: boolean
|
- lfeonly: bool
|
||||||
- rearonly: boolean
|
- rearonly: bool
|
||||||
|
|
||||||
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:
|
||||||
|
|
||||||
@@ -284,18 +312,48 @@ $vmr.bus[0].device.name
|
|||||||
|
|
||||||
name, sr are defined as read only.
|
name, sr are defined as read only.
|
||||||
wdm, ks, mme, asio are defined as write only.
|
wdm, ks, mme, asio are defined as write only.
|
||||||
|
asio only defined for Bus[0].Device
|
||||||
|
|
||||||
#### eq
|
#### eq
|
||||||
|
|
||||||
The following strip.eq | bus.eq commands are available:
|
The following strip.eq | bus.eq commands are available:
|
||||||
|
|
||||||
- on: boolean
|
- on: bool
|
||||||
- ab: boolean
|
- ab: bool
|
||||||
|
|
||||||
|
The following strip.eq | bus.eq methods are available:
|
||||||
|
|
||||||
|
- Load($filepath) : string
|
||||||
|
- Save($filepath) : string
|
||||||
|
|
||||||
|
for example:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$vmr.strip[0].eq.on = $true
|
||||||
|
$vmr.bus[0].eq.ab = $false
|
||||||
|
```
|
||||||
|
|
||||||
|
##### channel.cell
|
||||||
|
|
||||||
|
The following eq.channel.cell commands are available:
|
||||||
|
|
||||||
|
- on: bool
|
||||||
|
- type: int, from 0 to 6
|
||||||
|
- f: float, from 20.0 to 20000.0
|
||||||
|
- gain: float, from -12.0 to 12.0
|
||||||
|
- q: float, from 0.3 to 100.0
|
||||||
|
|
||||||
|
for example:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$vmr.strip[2].eq.channel[1].cell[4].type = 1
|
||||||
|
$vmr.bus[5].eq.channel[6].cell[3].on = $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 +368,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 +382,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 bool 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: bool
|
||||||
- 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: in, (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 +413,20 @@ $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: bool, (write only)
|
||||||
|
- lock: bool, (write only)
|
||||||
|
|
||||||
The following methods are available:
|
The following methods are available:
|
||||||
|
|
||||||
- show
|
- Load($filepath): string
|
||||||
- hide
|
- RunMacrobuttons(): Launches the macrobuttons app
|
||||||
- restart
|
- CloseMacrobuttons(): Closes the macrobuttons app
|
||||||
- shutdown
|
|
||||||
- Load(filepath)
|
|
||||||
|
|
||||||
The following properties are write only and accept boolean values:
|
|
||||||
|
|
||||||
- showvbanchat
|
|
||||||
- lock
|
|
||||||
|
|
||||||
example:
|
example:
|
||||||
|
|
||||||
@@ -376,31 +436,127 @@ $vmr.command.show
|
|||||||
$vmr.command.lock = $true
|
$vmr.command.lock = $true
|
||||||
|
|
||||||
$vmr.command.Load("path/to/filename.xml")
|
$vmr.command.Load("path/to/filename.xml")
|
||||||
|
|
||||||
|
$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()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Option
|
||||||
|
|
||||||
|
The following Option commands are available:
|
||||||
|
|
||||||
|
- sr: int, (32000, 44100, 48000, 88200, 96000, 176400, 192000)
|
||||||
|
- asiosr: bool
|
||||||
|
- monitorOnSel: bool
|
||||||
|
- sliderMode: bool
|
||||||
|
|
||||||
|
The following Option.delay[i] methods are available:
|
||||||
|
|
||||||
|
- Set($val): float, from 0.00 to 500.00
|
||||||
|
- Get()
|
||||||
|
|
||||||
|
for example:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$vmr.Option.delay[2].set(30.26) # sets the delay for the third (2) bus
|
||||||
|
$vmr.Option.sliderMode = $false # sets slider mode to absolute
|
||||||
|
```
|
||||||
|
|
||||||
|
#### buffers
|
||||||
|
|
||||||
|
The following Option.buffer commands are available:
|
||||||
|
|
||||||
|
- mme: int, (441, 480, 512, 576, 640, 704, 768, 896, 1024, 1536, 2048)
|
||||||
|
- wdm: int, (128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 441, 448, 480, 512, 576, 640, 704, 768, 1024, 1536, 2048)
|
||||||
|
- ks: int, (128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 441, 448, 480, 512, 576, 640, 704, 768, 1024, 1536, 2048)
|
||||||
|
- asio: int, (0, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 441, 448, 480, 512, 576, 640, 704, 768, 1024)
|
||||||
|
|
||||||
|
for example:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$vmr.Option.buffer.wdm = 512
|
||||||
|
$vmr.Option.buffer.asio = 0 # to use default buffer size
|
||||||
```
|
```
|
||||||
|
|
||||||
### Recorder
|
### Recorder
|
||||||
|
|
||||||
|
The following commands are available:
|
||||||
|
|
||||||
|
- play
|
||||||
|
- stop
|
||||||
|
- pause
|
||||||
|
- record
|
||||||
|
- ff
|
||||||
|
- rew
|
||||||
|
- A1 - A5: bool
|
||||||
|
- B1 - B3: bool
|
||||||
|
- 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): bool
|
||||||
|
|
||||||
|
example:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$vmr.recorder.armstrip[0].Set($true)
|
||||||
```
|
```
|
||||||
|
|
||||||
### Multiple parameters
|
### Multiple parameters
|
||||||
@@ -451,9 +607,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 +618,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,22 +626,31 @@ $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.
|
||||||
|
|
||||||
|
### Errors
|
||||||
|
|
||||||
|
- `VMRemoteError`: Base custom error class.
|
||||||
|
- `LoginError`: Raised when a login error occurs.
|
||||||
|
- `CAPIError`: Raised when a C-API function returns an error code.
|
||||||
|
- The following class properties are available:
|
||||||
|
- `function`: The name of the C-API function that returned the error code.
|
||||||
|
- `code`: The error code.
|
||||||
|
|
||||||
### Run tests
|
### Run tests
|
||||||
|
|
||||||
Run tests using .\tests\pre-commit.ps1 which accepts the following parameters:
|
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
|
|
||||||
- `log`: Write summary log file
|
|
||||||
|
|
||||||
Run tests from repository root in a subshell and write logs, like so:
|
*with Task*
|
||||||
|
|
||||||
`powershell .\tests\pre-commit.ps1 -k "potato" -t "higher" -log`
|
```console
|
||||||
|
task test -- -t "higher" -k "banana"
|
||||||
|
```
|
||||||
|
|
||||||
### 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/main/VoicemeeterRemoteAPI.pdf)
|
||||||
|
|||||||
11
Taskfile.yaml
Normal file
11
Taskfile.yaml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
version: '3'
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
test:
|
||||||
|
desc: 'Run tests'
|
||||||
|
preconditions:
|
||||||
|
- sh: 'pwsh -c "if ([System.Version](Get-InstalledModule Pester).Version.ToString() -gt [System.Version]"5.7.0") { exit 0 } else { exit 1 }"'
|
||||||
|
msg: 'Pester version must be greater than 5.7.0'
|
||||||
|
cmds:
|
||||||
|
- echo "Running tests..."
|
||||||
|
- pwsh -c "tests\run.ps1 {{.CLI_ARGS}}"
|
||||||
@@ -1,14 +1,12 @@
|
|||||||
|
[cmdletbinding()]
|
||||||
param(
|
param(
|
||||||
[switch]$interactive,
|
[switch]$interactive,
|
||||||
[switch]$output,
|
[String]$kind = 'banana',
|
||||||
[String]$kind = "banana",
|
|
||||||
[String[]]$script = @()
|
[String[]]$script = @()
|
||||||
)
|
)
|
||||||
|
|
||||||
Import-Module ..\..\lib\Voicemeeter.psm1
|
Import-Module ..\..\lib\Voicemeeter.psm1
|
||||||
|
|
||||||
$VerbosePreference = "Continue"
|
|
||||||
|
|
||||||
function get-value {
|
function get-value {
|
||||||
param([object]$vmr, [string]$line)
|
param([object]$vmr, [string]$line)
|
||||||
try {
|
try {
|
||||||
@@ -22,20 +20,20 @@ function get-value {
|
|||||||
|
|
||||||
function msgHandler {
|
function msgHandler {
|
||||||
param([object]$vmr, [string]$line)
|
param([object]$vmr, [string]$line)
|
||||||
$line + " passed to handler" | Write-Debug
|
$line + ' passed to handler' | Write-Debug
|
||||||
if ($line[0] -eq "!") {
|
if ($line[0] -eq '!') {
|
||||||
if ($output) { "Toggling " + $line.substring(1) | Write-Host }
|
'Toggling ' + $line.substring(1) | Write-Debug
|
||||||
$retval = get-value -vmr $vmr -line $line.substring(1)
|
$retval = get-value -vmr $vmr -line $line.substring(1)
|
||||||
$vmr.Setter($line.substring(1), 1 - $retval)
|
$vmr.Setter($line.substring(1), 1 - $retval)
|
||||||
}
|
}
|
||||||
elseif ($line.Contains("=")) {
|
elseif ($line.Contains('=')) {
|
||||||
if ($output) { "Setting $line" | Write-Host }
|
"Setting $line" | Write-Debug
|
||||||
$vmr.SendText($line)
|
$vmr.SendText($line)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if ($output) { "Getting $line" | Write-Host }
|
"Getting $line" | Write-Debug
|
||||||
$retval = get-value -vmr $vmr -line $line
|
$retval = get-value -vmr $vmr -line $line
|
||||||
$line + " = " + $retval | Write-Host
|
$line + ' = ' + $retval | Write-Host
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,7 +50,7 @@ function main {
|
|||||||
$vmr = Connect-Voicemeeter -Kind $kind
|
$vmr = Connect-Voicemeeter -Kind $kind
|
||||||
|
|
||||||
if ($interactive) {
|
if ($interactive) {
|
||||||
"Press <Enter> to exit" | Write-Host
|
'Press <Enter> to exit' | Write-Host
|
||||||
read-hostuntilempty -vmr $vmr
|
read-hostuntilempty -vmr $vmr
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -63,4 +61,4 @@ function main {
|
|||||||
finally { Disconnect-Voicemeeter }
|
finally { Disconnect-Voicemeeter }
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($MyInvocation.InvocationName -ne '.') { main }
|
main
|
||||||
|
|||||||
@@ -7,27 +7,30 @@
|
|||||||
Credits go to @bobsupercow
|
Credits go to @bobsupercow
|
||||||
#>
|
#>
|
||||||
|
|
||||||
|
[cmdletbinding()]
|
||||||
|
param()
|
||||||
|
|
||||||
Import-Module ..\..\lib\Voicemeeter.psm1
|
Import-Module ..\..\lib\Voicemeeter.psm1
|
||||||
|
|
||||||
$VerbosePreference = "Continue"
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$vmr = Connect-Voicemeeter -Kind "potato"
|
$vmr = Connect-Voicemeeter -Kind 'potato'
|
||||||
|
|
||||||
$buses = @($vmr.bus[1], $vmr.bus[2], $vmr.bus[4], $vmr.bus[6])
|
$buses = @($vmr.bus[1], $vmr.bus[2], $vmr.bus[4], $vmr.bus[6])
|
||||||
|
"Buses in selection: $($buses)"
|
||||||
$unmutedIndex = $null
|
$unmutedIndex = $null
|
||||||
|
|
||||||
# 1)
|
# 1)
|
||||||
|
'Cycling through bus selection to check for first unmuted Bus...' | Write-Host
|
||||||
foreach ($bus in $buses) {
|
foreach ($bus in $buses) {
|
||||||
# 2)
|
# 2)
|
||||||
if (-not $bus.mute) {
|
if (-not $bus.mute) {
|
||||||
"bus $($bus.index) is unmuted... muting it" | Write-Host
|
"Bus $($bus.index) is unmuted... muting it" | Write-Host
|
||||||
$unmutedIndex = $buses.IndexOf($bus)
|
$unmutedIndex = $buses.IndexOf($bus)
|
||||||
$bus.mute = $true
|
$bus.mute = $true
|
||||||
|
|
||||||
# 3)
|
# 3)
|
||||||
if ($buses[++$unmutedIndex]) {
|
if ($buses[++$unmutedIndex]) {
|
||||||
"unmuting bus $($buses[$unmutedIndex].index)" | Write-Host
|
"Unmuting Bus $($buses[$unmutedIndex].index)" | Write-Host
|
||||||
$buses[$unmutedIndex].mute = $false
|
$buses[$unmutedIndex].mute = $false
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -37,7 +40,7 @@ try {
|
|||||||
# 4)
|
# 4)
|
||||||
if ($null -eq $unmutedIndex) {
|
if ($null -eq $unmutedIndex) {
|
||||||
$buses[0].mute = $false
|
$buses[0].mute = $false
|
||||||
"unmuting bus $($buses[0].index)" | Write-Host
|
"Unmuting Bus $($buses[0].index)" | Write-Host
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,36 +1,33 @@
|
|||||||
|
[cmdletbinding()]
|
||||||
|
param()
|
||||||
|
|
||||||
Import-Module ..\..\lib\Voicemeeter.psm1
|
Import-Module ..\..\lib\Voicemeeter.psm1
|
||||||
Import-Module obs-powershell
|
Import-Module obs-powershell
|
||||||
|
|
||||||
$VerbosePreference = "Continue"
|
|
||||||
|
|
||||||
function CurrentProgramSceneChanged {
|
function CurrentProgramSceneChanged {
|
||||||
param([System.Object]$data)
|
param([System.Object]$data)
|
||||||
Write-Host "Switched to scene", $data.sceneName
|
Write-Host 'Switched to scene', $data.sceneName
|
||||||
|
|
||||||
switch ($data.sceneName) {
|
switch ($data.sceneName) {
|
||||||
"START" {
|
'START' {
|
||||||
$vmr.strip[0].mute = !$vmr.strip[0].mute
|
$vmr.strip[0].mute = !$vmr.strip[0].mute
|
||||||
"Toggling Strip 0 mute"
|
|
||||||
}
|
}
|
||||||
"BRB" {
|
'BRB' {
|
||||||
$vmr.strip[0].gain = -8.3
|
$vmr.strip[0].gain = -8.3
|
||||||
"Setting Strip 0 gain to -8.3"
|
|
||||||
}
|
}
|
||||||
"END" {
|
'END' {
|
||||||
$vmr.strip[0].mono = $true
|
$vmr.strip[0].mono = $true
|
||||||
"Setting Strip 0 mono to `$true"
|
|
||||||
}
|
}
|
||||||
"LIVE" {
|
'LIVE' {
|
||||||
$vmr.strip[0].color_x = 0.3
|
$vmr.strip[0].color_x = 0.3
|
||||||
"Setting Strip 0 color_x to 0.3"
|
|
||||||
}
|
}
|
||||||
default { "Expected START, BRB, END or LIVE scene" | Write-Warning; return }
|
default { 'Expected START, BRB, END or LIVE scene' | Write-Warning; return }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function ExitStarted {
|
function ExitStarted {
|
||||||
param([System.Object]$data)
|
param([System.Object]$data)
|
||||||
"OBS shutdown has begun!" | Write-Host
|
'OBS shutdown has begun!' | Write-Host
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,12 +38,12 @@ function eventHandler($data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function ConnFromFile {
|
function ConnFromFile {
|
||||||
$configpath = Join-Path $PSScriptRoot "config.psd1"
|
$configpath = Join-Path $PSScriptRoot 'config.psd1'
|
||||||
return Import-PowerShellDataFile -Path $configpath
|
return Import-PowerShellDataFile -Path $configpath
|
||||||
}
|
}
|
||||||
|
|
||||||
function main {
|
function main {
|
||||||
$vmr = Connect-Voicemeeter -Kind "basic"
|
$vmr = Connect-Voicemeeter -Kind 'basic'
|
||||||
|
|
||||||
$conn = ConnFromFile
|
$conn = ConnFromFile
|
||||||
$job = Watch-OBS -WebSocketURI "ws://$($conn.host):$($conn.port)" -WebSocketToken $conn.password
|
$job = Watch-OBS -WebSocketURI "ws://$($conn.host):$($conn.port)" -WebSocketToken $conn.password
|
||||||
@@ -68,4 +65,4 @@ function main {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($MyInvocation.InvocationName -ne '.') { main }
|
main
|
||||||
|
|||||||
125
examples/streamdeck/README.md
Normal file
125
examples/streamdeck/README.md
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
# About
|
||||||
|
|
||||||
|
Thanks to the guys at [Start Automating](https://startautomating.com/) it's possible to use this module straight from your Stream Deck.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
### ScriptDeck
|
||||||
|
|
||||||
|
*Windows Powershell*
|
||||||
|
|
||||||
|
- [Windows ScriptDeck](https://marketplace.elgato.com/product/windows-scriptdeck-857f01dd-8fd4-44d5-8ec7-67ac850b21d3)
|
||||||
|
|
||||||
|
*Powershell core*
|
||||||
|
|
||||||
|
- [ScriptDeck](https://marketplace.elgato.com/product/scriptdeck-927e59aa-b42d-4da7-84cc-8c78f4dd7e18)
|
||||||
|
|
||||||
|
Note, even though one of them is named Windows they both work on Windows for different powershell versions, see [this issue](https://github.com/StartAutomating/ScriptDeck/issues/120)
|
||||||
|
|
||||||
|
### Voicemeeter API Powershell
|
||||||
|
|
||||||
|
- Install it as a module, see [Installation](https://github.com/onyx-and-iris/voicemeeter-api-powershell?tab=readme-ov-file#installation)
|
||||||
|
|
||||||
|
## How
|
||||||
|
|
||||||
|
Once ScriptDeck is installed create a button using *Powershell Script*, then:
|
||||||
|
|
||||||
|
### On one button
|
||||||
|
|
||||||
|
Due to the design of Voicemeeter's API you may only login/logout once per session so in order to program multiple buttons you must do the following for just ONE button (it can be any button).
|
||||||
|
|
||||||
|
#### Button 1
|
||||||
|
|
||||||
|
*When Loaded*
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$global:vmr = Connect-Voicemeeter -Kind "banana"
|
||||||
|
```
|
||||||
|
|
||||||
|
*When Unloaded*
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Disconnect-Voicemeeter
|
||||||
|
```
|
||||||
|
|
||||||
|
*When Pressed*
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
if ($vmr.strip[0].mute) {
|
||||||
|
$vmr.bus[0].mute=1
|
||||||
|
$vmr.bus[1].mute=1
|
||||||
|
} else {
|
||||||
|
$vmr.bus[0].mute=0
|
||||||
|
$vmr.bus[1].mute=0
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Other buttons
|
||||||
|
|
||||||
|
Then your other buttons can have any scripts using the `$vmr` object:
|
||||||
|
|
||||||
|
#### Button 2
|
||||||
|
|
||||||
|
*When Pressed*
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$vmr.strip[1].mute=1
|
||||||
|
$vmr.strip[2].mute=1
|
||||||
|
|
||||||
|
if (-not $vmr.strip[0].mute) {
|
||||||
|
$vmr.strip[0].mute=1
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Button 3
|
||||||
|
|
||||||
|
*When Pressed*
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$vmr.strip[0].mute=$(-not $vmr.strip[0].mute)
|
||||||
|
$vmr.strip[1].mute=$(-not $vmr.strip[1].mute)
|
||||||
|
$vmr.strip[2].mute=$(-not $vmr.strip[2].mute)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Then let's say you have zillions of buttons you want to program, for each Stream Deck window configure ONE button as described above and the other buttons of the same window as described above.
|
||||||
|
|
||||||
|
If this explanation is unclear or you'd like me to add some screenshots just ask.
|
||||||
|
|
||||||
|
## Leveraging Powershell
|
||||||
|
|
||||||
|
Since we're now working with Powershell we can do some useful things, for example, lets create a button that interacts with Voicemeeter and OBS:
|
||||||
|
|
||||||
|
First make sure you've installed [obs-powershell](https://github.com/StartAutomating/obs-powershell).
|
||||||
|
|
||||||
|
Now let's create a button that only toggles some strip mutes if the current OBS scene is "LIVE".
|
||||||
|
|
||||||
|
#### Button
|
||||||
|
|
||||||
|
*When Loaded*
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$global:vmr = Connect-Voicemeeter -Kind "banana"
|
||||||
|
|
||||||
|
Connect-OBS -WebSocketToken <websocket token>
|
||||||
|
```
|
||||||
|
|
||||||
|
*When Unloaded*
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Disconnect-Voicemeeter
|
||||||
|
Disconnect-OBS
|
||||||
|
```
|
||||||
|
|
||||||
|
*When Pressed*
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$currentScene = $(Get-OBSCurrentProgramScene | Select-Object -ExpandProperty currentProgramSceneName)
|
||||||
|
|
||||||
|
if ($currentScene -eq "LIVE") {
|
||||||
|
$vmr.strip[0].mute=$(-not $vmr.strip[0].mute)
|
||||||
|
$vmr.strip[1].mute=$(-not $vmr.strip[1].mute)
|
||||||
|
$vmr.strip[2].mute=$(-not $vmr.strip[2].mute)
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -1,20 +1,34 @@
|
|||||||
. $PSScriptRoot\kinds.ps1
|
. $PSScriptRoot\errors.ps1
|
||||||
|
. $PSScriptRoot\meta.ps1
|
||||||
. $PSScriptRoot\base.ps1
|
. $PSScriptRoot\base.ps1
|
||||||
|
. $PSScriptRoot\kinds.ps1
|
||||||
|
. $PSScriptRoot\iremote.ps1
|
||||||
|
. $PSScriptRoot\arraymember.ps1
|
||||||
|
. $PSScriptRoot\device.ps1
|
||||||
|
. $PSScriptRoot\eq.ps1
|
||||||
|
. $PSScriptRoot\strip.ps1
|
||||||
|
. $PSScriptRoot\bus.ps1
|
||||||
|
. $PSScriptRoot\macrobuttons.ps1
|
||||||
|
. $PSScriptRoot\vban.ps1
|
||||||
|
. $PSScriptRoot\command.ps1
|
||||||
|
. $PSScriptRoot\recorder.ps1
|
||||||
|
. $PSScriptRoot\patch.ps1
|
||||||
|
. $PSScriptRoot\option.ps1
|
||||||
|
. $PSScriptRoot\profiles.ps1
|
||||||
|
|
||||||
class Remote {
|
class Remote {
|
||||||
|
[String]$vmpath
|
||||||
[Hashtable]$kind
|
[Hashtable]$kind
|
||||||
[Object]$profiles
|
[Object]$profiles
|
||||||
|
|
||||||
Remote ([String]$kindId) {
|
Remote ([String]$kindId) {
|
||||||
if (!(Setup_DLL)) {
|
$this.vmpath = Setup_DLL
|
||||||
Exit -1
|
|
||||||
}
|
|
||||||
$this.kind = GetKind($kindId)
|
$this.kind = GetKind($kindId)
|
||||||
$this.profiles = Get_Profiles($this.kind.name)
|
$this.profiles = Get_Profiles($this.kind.name)
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] ToString() {
|
[string] ToString() {
|
||||||
return "Voicemeeter " + $this.kind.name.substring(0, 1).toupper() + $this.kind.name.substring(1)
|
return 'Voicemeeter ' + $this.kind.name.substring(0, 1).toupper() + $this.kind.name.substring(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
[Remote] Login() {
|
[Remote] Login() {
|
||||||
@@ -31,7 +45,7 @@ class Remote {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[String] GetVersion() {
|
[String] GetVersion() {
|
||||||
return Version
|
return VmVersion
|
||||||
}
|
}
|
||||||
|
|
||||||
[void] Set_Profile([String]$config) {
|
[void] Set_Profile([String]$config) {
|
||||||
@@ -69,13 +83,17 @@ class RemoteBasic : Remote {
|
|||||||
[System.Collections.ArrayList]$button
|
[System.Collections.ArrayList]$button
|
||||||
[PSCustomObject]$vban
|
[PSCustomObject]$vban
|
||||||
[Object]$command
|
[Object]$command
|
||||||
|
[Object]$patch
|
||||||
|
[Object]$option
|
||||||
|
|
||||||
RemoteBasic () : base ('basic') {
|
RemoteBasic () : base ('basic') {
|
||||||
$this.strip = Make_Strips($this)
|
$this.strip = Make_Strips($this)
|
||||||
$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.patch = Make_Patch($this)
|
||||||
|
$this.option = Make_Option($this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,6 +103,8 @@ class RemoteBanana : Remote {
|
|||||||
[System.Collections.ArrayList]$button
|
[System.Collections.ArrayList]$button
|
||||||
[PSCustomObject]$vban
|
[PSCustomObject]$vban
|
||||||
[Object]$command
|
[Object]$command
|
||||||
|
[Object]$patch
|
||||||
|
[Object]$option
|
||||||
[Object]$recorder
|
[Object]$recorder
|
||||||
|
|
||||||
RemoteBanana () : base ('banana') {
|
RemoteBanana () : base ('banana') {
|
||||||
@@ -92,7 +112,9 @@ 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.patch = Make_Patch($this)
|
||||||
|
$this.option = Make_Option($this)
|
||||||
$this.recorder = Make_Recorder($this)
|
$this.recorder = Make_Recorder($this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -103,6 +125,8 @@ class RemotePotato : Remote {
|
|||||||
[System.Collections.ArrayList]$button
|
[System.Collections.ArrayList]$button
|
||||||
[PSCustomObject]$vban
|
[PSCustomObject]$vban
|
||||||
[Object]$command
|
[Object]$command
|
||||||
|
[Object]$patch
|
||||||
|
[Object]$option
|
||||||
[Object]$recorder
|
[Object]$recorder
|
||||||
|
|
||||||
RemotePotato () : base ('potato') {
|
RemotePotato () : base ('potato') {
|
||||||
@@ -110,7 +134,9 @@ 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.patch = Make_Patch($this)
|
||||||
|
$this.option = Make_Option($this)
|
||||||
$this.recorder = Make_Recorder($this)
|
$this.recorder = Make_Recorder($this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -129,24 +155,20 @@ Function Get-RemotePotato {
|
|||||||
|
|
||||||
Function Connect-Voicemeeter {
|
Function Connect-Voicemeeter {
|
||||||
param([String]$Kind)
|
param([String]$Kind)
|
||||||
try {
|
switch ($Kind) {
|
||||||
switch ($Kind) {
|
'basic' {
|
||||||
"basic" {
|
return Get-RemoteBasic
|
||||||
return Get-RemoteBasic
|
}
|
||||||
}
|
'banana' {
|
||||||
"banana" {
|
return Get-RemoteBanana
|
||||||
return Get-RemoteBanana
|
}
|
||||||
}
|
'potato' {
|
||||||
"potato" {
|
return Get-RemotePotato
|
||||||
return Get-RemotePotato
|
}
|
||||||
}
|
default {
|
||||||
default { throw [LoginError]::new("Unknown Voicemeeter kind `"$Kind`"") }
|
throw [LoginError]::new("Unknown Voicemeeter kind `"$Kind`"")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch [LoginError], [CAPIError] {
|
|
||||||
Write-Warning $_.Exception.ErrorMessage()
|
|
||||||
throw
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Function Disconnect-Voicemeeter {
|
Function Disconnect-Voicemeeter {
|
||||||
|
|||||||
64
lib/arraymember.ps1
Normal file
64
lib/arraymember.ps1
Normal 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('')
|
||||||
|
}
|
||||||
|
}
|
||||||
205
lib/base.ps1
205
lib/base.ps1
@@ -1,85 +1,108 @@
|
|||||||
. $PSScriptRoot\errors.ps1
|
. $PSScriptRoot\errors.ps1
|
||||||
. $PSScriptRoot\binding.ps1
|
. $PSScriptRoot\binding.ps1
|
||||||
. $PSScriptRoot\profiles.ps1
|
|
||||||
. $PSScriptRoot\inst.ps1
|
|
||||||
. $PSScriptRoot\strip.ps1
|
|
||||||
. $PSScriptRoot\bus.ps1
|
|
||||||
. $PSScriptRoot\macrobuttons.ps1
|
|
||||||
. $PSScriptRoot\vban.ps1
|
|
||||||
. $PSScriptRoot\command.ps1
|
|
||||||
. $PSScriptRoot\recorder.ps1
|
|
||||||
|
|
||||||
function Login {
|
function Login {
|
||||||
param(
|
param(
|
||||||
[string]$kindId
|
[string]$kindId
|
||||||
)
|
)
|
||||||
try {
|
$retval = [int][Voicemeeter.Remote]::VBVMR_Login()
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_Login()
|
if ($retval -notin @(0, 1, -2)) {
|
||||||
if (-not $retval) {
|
throw [CAPIError]::new($retval, 'VBVMR_Login')
|
||||||
"LOGGED IN" | Write-Verbose
|
|
||||||
}
|
|
||||||
elseif ($retval -eq 1) {
|
|
||||||
"VM NOT RUNNING" | Write-Verbose
|
|
||||||
New-Variable -Name vmExe -Value 0
|
|
||||||
|
|
||||||
if ( $kindId -eq "basic" ) { $vmExe = 1 }
|
|
||||||
elseif ( $kindId -eq "banana" ) { $vmExe = 2 }
|
|
||||||
elseif ( $kindId -eq "potato" ) {
|
|
||||||
$vmExe = $(if ([Environment]::Is64BitOperatingSystem) { 6 } else { 3 })
|
|
||||||
}
|
|
||||||
|
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_RunVoicemeeter([int64]$vmExe)
|
|
||||||
if (-not $retval) {
|
|
||||||
"STARTING VOICEMEETER" | Write-Verbose
|
|
||||||
Start-Sleep -s 1
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw [CAPIError]::new($retval, $MyInvocation.MyCommand)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
elseif ($retval -eq -2) {
|
|
||||||
throw [LoginError]::new('login may only be called once per session')
|
|
||||||
}
|
|
||||||
else { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
|
||||||
}
|
}
|
||||||
catch [LoginError] {
|
|
||||||
Write-Warning "$($_.Exception.ErrorMessage()). Fatal error, exiting..."
|
switch ($retval) {
|
||||||
exit -2
|
1 {
|
||||||
|
'Voicemeeter Engine running but GUI not launched. Launching GUI now.' | Write-Verbose
|
||||||
|
RunVoicemeeter -kindId $kindId
|
||||||
|
}
|
||||||
|
-2 {
|
||||||
|
throw [LoginError]::new('Login may only be called once per session.')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$timeout = New-TimeSpan -Seconds 2
|
||||||
|
$sw = [diagnostics.stopwatch]::StartNew()
|
||||||
|
$exception = $null
|
||||||
|
do {
|
||||||
|
Start-Sleep -m 100
|
||||||
|
try {
|
||||||
|
'Successfully logged into Voicemeeter [' + $(VmType).ToUpper() + '] Version ' + $(VmVersion) | Write-Verbose
|
||||||
|
$exception = $null
|
||||||
|
break
|
||||||
|
}
|
||||||
|
catch [CAPIError] {
|
||||||
|
$exception = $_
|
||||||
|
$exception | Write-Debug
|
||||||
|
}
|
||||||
|
} while ($sw.elapsed -lt $timeout)
|
||||||
|
|
||||||
|
if ($null -ne $exception) {
|
||||||
|
throw [VMRemoteError]::new('Timeout logging into the API.')
|
||||||
}
|
}
|
||||||
|
|
||||||
while (P_Dirty -or M_Dirty) { Start-Sleep -m 1 }
|
while (P_Dirty -or M_Dirty) { Start-Sleep -m 1 }
|
||||||
"VERSION:[" + $(VmType).ToUpper() + "]" | Write-Verbose
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function Logout {
|
function Logout {
|
||||||
Start-Sleep -m 20
|
Start-Sleep -m 100
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_Logout()
|
$retval = [int][Voicemeeter.Remote]::VBVMR_Logout()
|
||||||
if (-not $retval) { "LOGGED OUT" | Write-Verbose }
|
if ($retval -notin @(0)) {
|
||||||
|
throw [CAPIError]::new($retval, 'VBVMR_Logout')
|
||||||
|
}
|
||||||
|
if ($retval -eq 0) { 'Sucessfully logged out' | Write-Verbose }
|
||||||
|
}
|
||||||
|
|
||||||
|
function RunVoicemeeter {
|
||||||
|
param(
|
||||||
|
[string]$kindId
|
||||||
|
)
|
||||||
|
$kinds = @{
|
||||||
|
'basic' = $(if ([Environment]::Is64BitOperatingSystem) { 4 } else { 1 })
|
||||||
|
'banana' = $(if ([Environment]::Is64BitOperatingSystem) { 5 } else { 2 })
|
||||||
|
'potato' = $(if ([Environment]::Is64BitOperatingSystem) { 6 } else { 3 })
|
||||||
|
}
|
||||||
|
|
||||||
|
$retval = [int][Voicemeeter.Remote]::VBVMR_RunVoicemeeter([int64]$kinds[$kindId])
|
||||||
|
if ($retval -notin @(0)) {
|
||||||
|
throw [CAPIError]::new($retval, 'VBVMR_RunVoicemeeter')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function P_Dirty {
|
function P_Dirty {
|
||||||
[bool][Voicemeeter.Remote]::VBVMR_IsParametersDirty()
|
$retval = [Voicemeeter.Remote]::VBVMR_IsParametersDirty()
|
||||||
|
if ($retval -notin @(0, 1)) {
|
||||||
|
throw [CAPIError]::new($retval, 'VBVMR_IsParametersDirty')
|
||||||
|
}
|
||||||
|
[bool]$retval
|
||||||
}
|
}
|
||||||
|
|
||||||
function M_Dirty {
|
function M_Dirty {
|
||||||
[bool][Voicemeeter.Remote]::VBVMR_MacroButton_IsDirty()
|
$retval = [Voicemeeter.Remote]::VBVMR_MacroButton_IsDirty()
|
||||||
|
if ($retval -notin @(0, 1)) {
|
||||||
|
throw [CAPIError]::new($retval, 'VBVMR_MacroButton_IsDirty')
|
||||||
|
}
|
||||||
|
[bool]$retval
|
||||||
}
|
}
|
||||||
|
|
||||||
function VmType {
|
function VmType {
|
||||||
New-Variable -Name ptr -Value 0
|
New-Variable -Name ptr -Value 0
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_GetVoicemeeterType([ref]$ptr)
|
$retval = [int][Voicemeeter.Remote]::VBVMR_GetVoicemeeterType([ref]$ptr)
|
||||||
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
if ($retval -notin @(0)) {
|
||||||
|
throw [CAPIError]::new($retval, 'VBVMR_GetVoicemeeterType')
|
||||||
|
}
|
||||||
switch ($ptr) {
|
switch ($ptr) {
|
||||||
1 { return "basic" }
|
1 { return 'basic' }
|
||||||
2 { return "banana" }
|
2 { return 'banana' }
|
||||||
3 { return "potato" }
|
3 { return 'potato' }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function Version {
|
function VmVersion {
|
||||||
New-Variable -Name ptr -Value 0
|
New-Variable -Name ptr -Value 0
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_GetVoicemeeterVersion([ref]$ptr)
|
$retval = [int][Voicemeeter.Remote]::VBVMR_GetVoicemeeterVersion([ref]$ptr)
|
||||||
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
if ($retval -notin @(0)) {
|
||||||
|
throw [CAPIError]::new($retval, 'VBVMR_GetVoicemeeterVersion')
|
||||||
|
}
|
||||||
$v1 = ($ptr -band 0xFF000000) -shr 24
|
$v1 = ($ptr -band 0xFF000000) -shr 24
|
||||||
$v2 = ($ptr -band 0x00FF0000) -shr 16
|
$v2 = ($ptr -band 0x00FF0000) -shr 16
|
||||||
$v3 = ($ptr -band 0x0000FF00) -shr 8
|
$v3 = ($ptr -band 0x0000FF00) -shr 8
|
||||||
@@ -92,28 +115,22 @@ function Param_Get {
|
|||||||
param(
|
param(
|
||||||
[string]$PARAM, [bool]$IS_STRING = $false
|
[string]$PARAM, [bool]$IS_STRING = $false
|
||||||
)
|
)
|
||||||
Start-Sleep -m 50
|
Start-Sleep -m 30
|
||||||
while (P_Dirty) { Start-Sleep -m 1 }
|
while (P_Dirty) { Start-Sleep -m 1 }
|
||||||
|
|
||||||
if ($IS_STRING) {
|
if ($IS_STRING) {
|
||||||
$BYTES = [System.Byte[]]::new(512)
|
$BYTES = [System.Byte[]]::new(512)
|
||||||
try {
|
$retval = [int][Voicemeeter.Remote]::VBVMR_GetParameterStringA($PARAM, $BYTES)
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_GetParameterStringA($PARAM, $BYTES)
|
if ($retval -notin @(0)) {
|
||||||
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
throw [CAPIError]::new($retval, 'VBVMR_GetParameterStringA')
|
||||||
}
|
|
||||||
catch [CAPIError] {
|
|
||||||
Write-Warning $_.Exception.ErrorMessage()
|
|
||||||
}
|
}
|
||||||
[System.Text.Encoding]::ASCII.GetString($BYTES).Trim([char]0)
|
[System.Text.Encoding]::ASCII.GetString($BYTES).Trim([char]0)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
New-Variable -Name ptr -Value 0.0
|
New-Variable -Name ptr -Value 0.0
|
||||||
try {
|
$retval = [int][Voicemeeter.Remote]::VBVMR_GetParameterFloat($PARAM, [ref]$ptr)
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_GetParameterFloat($PARAM, [ref]$ptr)
|
if ($retval -notin @(0)) {
|
||||||
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
throw [CAPIError]::new($retval, 'VBVMR_GetParameterFloat')
|
||||||
}
|
|
||||||
catch [CAPIError] {
|
|
||||||
Write-Warning $_.Exception.ErrorMessage()
|
|
||||||
}
|
}
|
||||||
[single]$ptr
|
[single]$ptr
|
||||||
}
|
}
|
||||||
@@ -123,17 +140,17 @@ function Param_Set {
|
|||||||
param(
|
param(
|
||||||
[string]$PARAM, [Object]$VALUE
|
[string]$PARAM, [Object]$VALUE
|
||||||
)
|
)
|
||||||
try {
|
if ($VALUE -is [string]) {
|
||||||
if ($VALUE -is [string]) {
|
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameterStringA($PARAM, $VALUE)
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameterStringA($PARAM, $VALUE)
|
if ($retval -notin @(0)) {
|
||||||
|
throw [CAPIError]::new($retval, 'VBVMR_SetParameterStringA')
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameterFloat($PARAM, $VALUE)
|
|
||||||
}
|
|
||||||
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
|
||||||
}
|
}
|
||||||
catch [CAPIError] {
|
else {
|
||||||
Write-Warning $_.Exception.ErrorMessage()
|
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameterFloat($PARAM, $VALUE)
|
||||||
|
if ($retval -notin @(0)) {
|
||||||
|
throw [CAPIError]::new($retval, 'VBVMR_SetParameterFloat')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,12 +158,9 @@ function MB_Set {
|
|||||||
param(
|
param(
|
||||||
[int64]$ID, [single]$SET, [int64]$MODE
|
[int64]$ID, [single]$SET, [int64]$MODE
|
||||||
)
|
)
|
||||||
try {
|
$retval = [int][Voicemeeter.Remote]::VBVMR_MacroButton_SetStatus($ID, $SET, $MODE)
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_MacroButton_SetStatus($ID, $SET, $MODE)
|
if ($retval -notin @(0)) {
|
||||||
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
throw [CAPIError]::new($retval, 'VBVMR_MacroButton_SetStatus')
|
||||||
}
|
|
||||||
catch [CAPIError] {
|
|
||||||
Write-Warning $_.Exception.ErrorMessage()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,12 +172,9 @@ function MB_Get {
|
|||||||
while (M_Dirty) { Start-Sleep -m 1 }
|
while (M_Dirty) { Start-Sleep -m 1 }
|
||||||
|
|
||||||
New-Variable -Name ptr -Value 0.0
|
New-Variable -Name ptr -Value 0.0
|
||||||
try {
|
$retval = [int][Voicemeeter.Remote]::VBVMR_MacroButton_GetStatus($ID, [ref]$ptr, $MODE)
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_MacroButton_GetStatus($ID, [ref]$ptr, $MODE)
|
if ($retval -notin @(0)) {
|
||||||
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
throw [CAPIError]::new($retval, 'VBVMR_MacroButton_GetStatus')
|
||||||
}
|
|
||||||
catch [CAPIError] {
|
|
||||||
Write-Warning $_.Exception.ErrorMessage()
|
|
||||||
}
|
}
|
||||||
[int]$ptr
|
[int]$ptr
|
||||||
}
|
}
|
||||||
@@ -173,8 +184,8 @@ function Param_Set_Multi {
|
|||||||
[hashtable]$HASH
|
[hashtable]$HASH
|
||||||
)
|
)
|
||||||
foreach ($key in $HASH.keys) {
|
foreach ($key in $HASH.keys) {
|
||||||
$classobj, $m2, $m3 = $key.Split("_")
|
$classobj, $m2, $m3 = $key.Split('_')
|
||||||
if ($m2 -match "^\d+$") { $index = [int]$m2 } else { $index = [int]$m3 }
|
if ($m2 -match '^\d+$') { $index = [int]$m2 } else { $index = [int]$m3 }
|
||||||
|
|
||||||
foreach ($h in $HASH[$key].GetEnumerator()) {
|
foreach ($h in $HASH[$key].GetEnumerator()) {
|
||||||
$property = $h.Name
|
$property = $h.Name
|
||||||
@@ -195,11 +206,23 @@ function Set_By_Script {
|
|||||||
param(
|
param(
|
||||||
[string]$script
|
[string]$script
|
||||||
)
|
)
|
||||||
try {
|
if ($script.Length -gt 48000) {
|
||||||
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameters($script)
|
throw [VMRemoteError]::new('Script size cannot be larger than 48kB')
|
||||||
if ($retval) { throw [CAPIError]::new($retval, $MyInvocation.MyCommand) }
|
|
||||||
}
|
}
|
||||||
catch [CAPIError] {
|
$retval = [int][Voicemeeter.Remote]::VBVMR_SetParameters($script)
|
||||||
Write-Warning $_.Exception.ErrorMessage()
|
if ($retval -notin @(0)) {
|
||||||
|
throw [CAPIError]::new($retval, 'VBVMR_SetParameters')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function Get_Level {
|
||||||
|
param(
|
||||||
|
[int64]$MODE, [int64]$INDEX
|
||||||
|
)
|
||||||
|
New-Variable -Name ptr -Value 0.0
|
||||||
|
$retval = [int][Voicemeeter.Remote]::VBVMR_GetLevel($MODE, $INDEX, [ref]$ptr)
|
||||||
|
if ($retval -notin @(0)) {
|
||||||
|
throw [CAPIError]::new($retval, 'VBVMR_GetLevel')
|
||||||
|
}
|
||||||
|
[float]$ptr
|
||||||
|
}
|
||||||
@@ -1,18 +1,11 @@
|
|||||||
function Setup_DLL {
|
. $PSScriptRoot\inst.ps1
|
||||||
try {
|
|
||||||
$vb_path = Get_VBPath
|
|
||||||
|
|
||||||
if ([string]::IsNullOrWhiteSpace($vb_path)) {
|
function Setup_DLL {
|
||||||
throw [VMRemoteError]::new("couldn't get Voicemeeter path")
|
$VMPATH = Get_VMPath
|
||||||
}
|
|
||||||
$dll = Join-Path -Path $vb_path -ChildPath ("VoicemeeterRemote" + `
|
$dll = Join-Path -Path $VMPATH -ChildPath ('VoicemeeterRemote' + `
|
||||||
(& { if ([Environment]::Is64BitOperatingSystem) { "64" } else { "" } }) + `
|
(& { if ([Environment]::Is64BitOperatingSystem) { '64' } else { '' } }) + `
|
||||||
".dll")
|
'.dll')
|
||||||
}
|
|
||||||
catch [VMRemoteError] {
|
|
||||||
Write-Warning $_.Exception.ErrorMessage()
|
|
||||||
return $false
|
|
||||||
}
|
|
||||||
|
|
||||||
$Signature = @"
|
$Signature = @"
|
||||||
[DllImport(@"$dll")]
|
[DllImport(@"$dll")]
|
||||||
@@ -47,8 +40,11 @@ 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
|
||||||
return $true
|
return $VMPATH
|
||||||
}
|
}
|
||||||
|
|||||||
184
lib/bus.ps1
184
lib/bus.ps1
@@ -1,46 +1,20 @@
|
|||||||
. $PSScriptRoot\meta.ps1
|
class Bus : IRemote {
|
||||||
|
|
||||||
class IBus {
|
|
||||||
[int]$index
|
|
||||||
[Object]$remote
|
|
||||||
|
|
||||||
IBus ([int]$index, [Object]$remote) {
|
|
||||||
$this.index = $index
|
|
||||||
$this.remote = $remote
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] identifier () {
|
|
||||||
return "Bus[" + $this.index + "]"
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] ToString() {
|
|
||||||
return $this.GetType().Name + $this.index
|
|
||||||
}
|
|
||||||
|
|
||||||
[single] Getter ($param) {
|
|
||||||
return Param_Get -PARAM "$($this.identifier()).$param" -IS_STRING $false
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] Getter_String ($param) {
|
|
||||||
return Param_Get -PARAM "$($this.identifier()).$param" -IS_STRING $true
|
|
||||||
}
|
|
||||||
|
|
||||||
[void] Setter ($param, $set) {
|
|
||||||
Param_Set -PARAM "$($this.identifier()).$param" -Value $set
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
||||||
|
}
|
||||||
|
|
||||||
|
[string] identifier () {
|
||||||
|
return 'Bus[' + $this.index + ']'
|
||||||
}
|
}
|
||||||
|
|
||||||
[void] FadeTo ([single]$target, [int]$time) {
|
[void] FadeTo ([single]$target, [int]$time) {
|
||||||
@@ -52,10 +26,41 @@ class Bus : IBus {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Mode : IBus {
|
class BusLevels : IRemote {
|
||||||
|
[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 : IRemote {
|
||||||
[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'
|
||||||
@@ -65,7 +70,7 @@ class Mode : IBus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Bus[" + $this.index + "].mode"
|
return 'Bus[' + $this.index + '].mode'
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] Get () {
|
[string] Get () {
|
||||||
@@ -78,13 +83,12 @@ class Mode : IBus {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Eq : IBus {
|
class BusEq : Eq {
|
||||||
Eq ([int]$index, [Object]$remote) : base ($index, $remote) {
|
BusEq ([int]$index, [Object]$remote) : base ($index, $remote, 'Bus') {
|
||||||
AddBoolMembers -PARAMS @('on', 'ab')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Bus[" + $this.index + "].EQ"
|
return 'Bus[' + $this.index + '].EQ'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,79 +96,39 @@ 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 {
|
|
||||||
Device ([int]$index, [Object]$remote) : base ($index, $remote) {
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] identifier () {
|
|
||||||
return "Bus[" + $this.index + "].Device"
|
|
||||||
}
|
|
||||||
|
|
||||||
hidden $_name = $($this | Add-Member ScriptProperty 'name' `
|
|
||||||
{
|
|
||||||
$this.Getter_String('name')
|
|
||||||
} `
|
|
||||||
{
|
|
||||||
return Write-Warning ("ERROR: $($this.identifier()).name is read only")
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
hidden $_sr = $($this | Add-Member ScriptProperty 'sr' `
|
|
||||||
{
|
|
||||||
$this.Getter('sr')
|
|
||||||
} `
|
|
||||||
{
|
|
||||||
return Write-Warning ("ERROR: $($this.identifier()).sr is read only")
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
hidden $_wdm = $($this | Add-Member ScriptProperty 'wdm' `
|
|
||||||
{
|
|
||||||
return Write-Warning ("ERROR: $($this.identifier()).wdm is write only")
|
|
||||||
} `
|
|
||||||
{
|
|
||||||
param($arg)
|
|
||||||
return $this.Setter('wdm', $arg)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
hidden $_ks = $($this | Add-Member ScriptProperty 'ks' `
|
|
||||||
{
|
|
||||||
return Write-Warning ("ERROR: $($this.identifier()).ks is write only")
|
|
||||||
} `
|
|
||||||
{
|
|
||||||
param($arg)
|
|
||||||
return $this.Setter('ks', $arg)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
hidden $_mme = $($this | Add-Member ScriptProperty 'mme' `
|
|
||||||
{
|
|
||||||
return Write-Warning ("ERROR: $($this.identifier()).mme is write only")
|
|
||||||
} `
|
|
||||||
{
|
|
||||||
param($arg)
|
|
||||||
return $this.Setter('mme', $arg)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
hidden $_asio = $($this | Add-Member ScriptProperty 'asio' `
|
|
||||||
{
|
|
||||||
return Write-Warning ("ERROR: $($this.identifier()).asio is write only")
|
|
||||||
} `
|
|
||||||
{
|
|
||||||
param($arg)
|
|
||||||
return $this.Setter('asio', $arg)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
class VirtualBus : Bus {
|
class VirtualBus : Bus {
|
||||||
|
[Object]$device
|
||||||
|
|
||||||
VirtualBus ([int]$index, [Object]$remote) : base ($index, $remote) {
|
VirtualBus ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||||
|
if ($this.remote.kind.name -eq 'basic') {
|
||||||
|
$this.device = [BusDevice]::new($index, $remote)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class BusDevice : Device {
|
||||||
|
BusDevice ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||||
|
if ($this.index -eq 0) {
|
||||||
|
$this.AddASIO()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[string] identifier () {
|
||||||
|
return 'Bus[' + $this.index + '].Device'
|
||||||
|
}
|
||||||
|
|
||||||
|
hidden [void] AddASIO () {
|
||||||
|
Add-Member -InputObject $this -MemberType ScriptProperty -Name 'asio' `
|
||||||
|
-Value {
|
||||||
|
return Write-Warning ("ERROR: $($this.identifier()).asio is write only")
|
||||||
|
} -SecondValue {
|
||||||
|
param($arg)
|
||||||
|
return $this.Setter('asio', $arg)
|
||||||
|
} -Force
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +1,20 @@
|
|||||||
. $PSScriptRoot\meta.ps1
|
class Special : IRemote {
|
||||||
|
Special ([Object]$remote) : base ($remote) {
|
||||||
class Special {
|
|
||||||
Special () {
|
|
||||||
AddActionMembers -PARAMS @('restart', 'shutdown', 'show')
|
AddActionMembers -PARAMS @('restart', 'shutdown', 'show')
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Command"
|
return 'Command'
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] ToString() {
|
[void] RunMacrobuttons() {
|
||||||
return $this.GetType().Name
|
'Launching the MacroButtons app' | Write-Verbose
|
||||||
|
Start-Process -FilePath $(Join-Path -Path $this.remote.vmpath -ChildPath 'VoicemeeterMacroButtons.exe')
|
||||||
}
|
}
|
||||||
|
|
||||||
[single] Getter ($param) {
|
[void] CloseMacrobuttons() {
|
||||||
return Param_Get -PARAM "$($this.identifier()).$param" -IS_STRING $false
|
'Closing the MacroButtons app' | Write-Verbose
|
||||||
}
|
Stop-Process -Name 'VoicemeeterMacroButtons'
|
||||||
|
|
||||||
[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 $_hide = $($this | Add-Member ScriptProperty 'hide' `
|
hidden $_hide = $($this | Add-Member ScriptProperty 'hide' `
|
||||||
@@ -58,6 +49,6 @@ class Special {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function Make_Command {
|
function Make_Command([Object]$remote) {
|
||||||
return [Special]::new()
|
return [Special]::new($remote)
|
||||||
}
|
}
|
||||||
|
|||||||
52
lib/device.ps1
Normal file
52
lib/device.ps1
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
class Device : IRemote {
|
||||||
|
Device ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||||
|
}
|
||||||
|
|
||||||
|
hidden $_name = $($this | Add-Member ScriptProperty 'name' `
|
||||||
|
{
|
||||||
|
$this.Getter_String('name')
|
||||||
|
} `
|
||||||
|
{
|
||||||
|
return Write-Warning ("ERROR: $($this.identifier()).name is read only")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
hidden $_sr = $($this | Add-Member ScriptProperty 'sr' `
|
||||||
|
{
|
||||||
|
[int]$this.Getter('sr')
|
||||||
|
} `
|
||||||
|
{
|
||||||
|
return Write-Warning ("ERROR: $($this.identifier()).sr is read only")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
hidden $_wdm = $($this | Add-Member ScriptProperty 'wdm' `
|
||||||
|
{
|
||||||
|
return Write-Warning ("ERROR: $($this.identifier()).wdm is write only")
|
||||||
|
} `
|
||||||
|
{
|
||||||
|
param($arg)
|
||||||
|
return $this.Setter('wdm', $arg)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
hidden $_ks = $($this | Add-Member ScriptProperty 'ks' `
|
||||||
|
{
|
||||||
|
return Write-Warning ("ERROR: $($this.identifier()).ks is write only")
|
||||||
|
} `
|
||||||
|
{
|
||||||
|
param($arg)
|
||||||
|
return $this.Setter('ks', $arg)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
hidden $_mme = $($this | Add-Member ScriptProperty 'mme' `
|
||||||
|
{
|
||||||
|
return Write-Warning ("ERROR: $($this.identifier()).mme is write only")
|
||||||
|
} `
|
||||||
|
{
|
||||||
|
param($arg)
|
||||||
|
return $this.Setter('mme', $arg)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
60
lib/eq.ps1
Normal file
60
lib/eq.ps1
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
class Eq : IRemote {
|
||||||
|
[System.Collections.ArrayList]$channel
|
||||||
|
[string]$kindOfEq
|
||||||
|
|
||||||
|
Eq ([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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,30 +1,19 @@
|
|||||||
class VMRemoteError : Exception {
|
class VMRemoteError : Exception {
|
||||||
[string]$msg
|
VMRemoteError ([string]$msg) : base ($msg) {
|
||||||
|
|
||||||
VMRemoteError ([string]$msg) {
|
|
||||||
$this.msg = $msg
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] ErrorMessage () {
|
|
||||||
return $this.msg
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class LoginError : VMRemoteError {
|
class LoginError : VMRemoteError {
|
||||||
LoginError ([string]$msg) : base ([string]$msg) {
|
LoginError ([string]$msg) : base ($msg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class CAPIError : VMRemoteError {
|
class CAPIError : VMRemoteError {
|
||||||
[int]$retval
|
[int]$code
|
||||||
[string]$caller
|
[string]$function
|
||||||
|
|
||||||
CAPIError ([int]$retval, [string]$caller) {
|
CAPIError ([int]$code, [string]$function) : base ("$function returned $code") {
|
||||||
$this.retval = $retval
|
$this.code = $code
|
||||||
$this.caller = $caller
|
$this.function = $function
|
||||||
}
|
}
|
||||||
|
}
|
||||||
[string] ErrorMessage () {
|
|
||||||
return "CAPI return value: {0} in {1}" -f $this.retval, $this.caller
|
|
||||||
}
|
|
||||||
}
|
|
||||||
23
lib/inst.ps1
23
lib/inst.ps1
@@ -1,8 +1,19 @@
|
|||||||
function Get_VBPath {
|
function Get_VMPath {
|
||||||
$reg_path = "Registry::HKEY_LOCAL_MACHINE\Software" + `
|
$REG_KEY = @(
|
||||||
(& { if ([Environment]::Is64BitOperatingSystem) { "\WOW6432Node" } else { "" } }) + `
|
'Registry::HKEY_LOCAL_MACHINE',
|
||||||
"\Microsoft\Windows\CurrentVersion\Uninstall"
|
'Software',
|
||||||
$vm_key = "\VB:Voicemeeter {17359A74-1236-5467}\"
|
(& { if ([Environment]::Is64BitOperatingSystem) { 'WOW6432Node' } else { '' } }),
|
||||||
|
'Microsoft',
|
||||||
|
'Windows',
|
||||||
|
'CurrentVersion',
|
||||||
|
'Uninstall'
|
||||||
|
).Where({ $_ -ne '' }) -Join '\'
|
||||||
|
$VM_KEY = 'VB:Voicemeeter {17359A74-1236-5467}'
|
||||||
|
|
||||||
return $(Get-ItemPropertyValue -Path ($reg_path + $vm_key) -Name UninstallString | Split-Path -Parent)
|
try {
|
||||||
|
return $(Get-ItemPropertyValue -Path (@($REG_KEY, $VM_KEY) -Join '\') -Name UninstallString | Split-Path -Parent)
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
throw [VMRemoteError]::new('Unable to fetch Voicemeeter path from the Registry.')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
52
lib/iremote.ps1
Normal file
52
lib/iremote.ps1
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
class IRemote {
|
||||||
|
[Nullable[int]]$index
|
||||||
|
[Object]$remote
|
||||||
|
|
||||||
|
IRemote ([Object]$remote) {
|
||||||
|
$this.remote = $remote
|
||||||
|
}
|
||||||
|
|
||||||
|
IRemote ([int]$index, [Object]$remote) {
|
||||||
|
$this.index = $index
|
||||||
|
$this.remote = $remote
|
||||||
|
}
|
||||||
|
|
||||||
|
[single] Getter ($param) {
|
||||||
|
$this.ToString() + " Getter: $($this.Cmd($param))" | Write-Debug
|
||||||
|
return $this.remote.Getter($this.Cmd($param))
|
||||||
|
}
|
||||||
|
|
||||||
|
[string] Getter_String ($param) {
|
||||||
|
$this.ToString() + " Getter_String: $($this.Cmd($param))" | Write-Debug
|
||||||
|
return $this.remote.Getter_String($this.Cmd($param))
|
||||||
|
}
|
||||||
|
|
||||||
|
[void] Setter ($param, $val) {
|
||||||
|
$this.ToString() + " Setter: $($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"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Must be overridden by derived classes
|
||||||
|
[string] identifier () {
|
||||||
|
throw [System.NotImplementedException]::new("$($this.GetType().Name) must override identifier()")
|
||||||
|
}
|
||||||
|
|
||||||
|
[string] ToString() {
|
||||||
|
if ($null -ne $this.index) {
|
||||||
|
return $this.GetType().Name + $this.index
|
||||||
|
}
|
||||||
|
return $this.GetType().Name
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,33 +1,51 @@
|
|||||||
$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
|
||||||
|
'eq_ch' = @{ 'strip' = 0; 'bus' = 0 }
|
||||||
|
'cells' = 0
|
||||||
};
|
};
|
||||||
"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
|
||||||
|
'eq_ch' = @{ 'strip' = 0; 'bus' = 8 }
|
||||||
|
'cells' = 6
|
||||||
};
|
};
|
||||||
"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
|
||||||
|
'eq_ch' = @{ 'strip' = 2; 'bus' = 8 }
|
||||||
|
'cells' = 6
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function GetKind ([string]$kindId) {
|
function GetKind ([string]$kindId) {
|
||||||
$KindMap[$kindId]
|
$KindMap[$kindId]
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,9 @@
|
|||||||
|
enum ButtonTypes {
|
||||||
|
State = 1
|
||||||
|
StateOnly = 2
|
||||||
|
Trigger = 3
|
||||||
|
}
|
||||||
|
|
||||||
class MacroButton {
|
class MacroButton {
|
||||||
[int32]$index
|
[int32]$index
|
||||||
|
|
||||||
@@ -10,40 +16,42 @@ class MacroButton {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[int] Getter ($mode) {
|
[int] Getter ($mode) {
|
||||||
|
"Button[$($this.index)].$([ButtonTypes].GetEnumName($mode))" | Write-Debug
|
||||||
return MB_Get -Id $this.index -Mode $mode
|
return MB_Get -Id $this.index -Mode $mode
|
||||||
}
|
}
|
||||||
|
|
||||||
[void] Setter ($set, $mode) {
|
[void] Setter ($val, $mode) {
|
||||||
MB_Set -Id $this.index -SET $set -Mode $mode
|
"Button[$($this.index)].$([ButtonTypes].GetEnumName($mode))=$val" | Write-Debug
|
||||||
|
MB_Set -Id $this.index -SET $val -Mode $mode
|
||||||
}
|
}
|
||||||
|
|
||||||
hidden $_state = $($this | Add-Member ScriptProperty 'state' `
|
hidden $_state = $($this | Add-Member ScriptProperty 'state' `
|
||||||
{
|
{
|
||||||
[bool]$this.Getter(1)
|
[bool]$this.Getter([ButtonTypes]::State)
|
||||||
} `
|
} `
|
||||||
{
|
{
|
||||||
param($arg)
|
param($arg)
|
||||||
$this._state = $this.Setter($arg, 1)
|
$this._state = $this.Setter($arg, [ButtonTypes]::State)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
hidden $_stateonly = $($this | Add-Member ScriptProperty 'stateonly' `
|
hidden $_stateonly = $($this | Add-Member ScriptProperty 'stateonly' `
|
||||||
{
|
{
|
||||||
[bool]$this.Getter(2)
|
[bool]$this.Getter([ButtonTypes]::StateOnly)
|
||||||
} `
|
} `
|
||||||
{
|
{
|
||||||
param($arg)
|
param($arg)
|
||||||
$this._stateonly = $this.Setter($arg, 2)
|
$this._stateonly = $this.Setter($arg, [ButtonTypes]::StateOnly)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
hidden $_trigger = $($this | Add-Member ScriptProperty 'trigger' `
|
hidden $_trigger = $($this | Add-Member ScriptProperty 'trigger' `
|
||||||
{
|
{
|
||||||
[bool]$this.Getter(3)
|
[bool]$this.Getter([ButtonTypes]::Trigger)
|
||||||
} `
|
} `
|
||||||
{
|
{
|
||||||
param($arg)
|
param($arg)
|
||||||
$this._trigger = $this.Setter($arg, 3)
|
$this._trigger = $this.Setter($arg, [ButtonTypes]::Trigger)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
32
lib/meta.ps1
32
lib/meta.ps1
@@ -5,9 +5,9 @@ function AddBoolMembers () {
|
|||||||
[hashtable]$Signatures = @{}
|
[hashtable]$Signatures = @{}
|
||||||
foreach ($param in $PARAMS) {
|
foreach ($param in $PARAMS) {
|
||||||
# Define getter
|
# Define getter
|
||||||
$Signatures["Getter"] = "[bool]`$this.Getter('{0}')" -f $param
|
$Signatures['Getter'] = "[bool]`$this.Getter('{0}')" -f $param
|
||||||
# Define setter
|
# Define setter
|
||||||
$Signatures["Setter"] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
|
$Signatures['Setter'] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
|
||||||
-f $param
|
-f $param
|
||||||
|
|
||||||
Addmember
|
Addmember
|
||||||
@@ -21,9 +21,9 @@ function AddFloatMembers () {
|
|||||||
[hashtable]$Signatures = @{}
|
[hashtable]$Signatures = @{}
|
||||||
foreach ($param in $PARAMS) {
|
foreach ($param in $PARAMS) {
|
||||||
# Define getter
|
# Define getter
|
||||||
$Signatures["Getter"] = "[math]::Round(`$this.Getter('{0}'), 1)" -f $param
|
$Signatures['Getter'] = "[math]::Round(`$this.Getter('{0}'), 1)" -f $param
|
||||||
# Define setter
|
# Define setter
|
||||||
$Signatures["Setter"] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
|
$Signatures['Setter'] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
|
||||||
-f $param
|
-f $param
|
||||||
|
|
||||||
Addmember
|
Addmember
|
||||||
@@ -37,9 +37,9 @@ function AddIntMembers () {
|
|||||||
[hashtable]$Signatures = @{}
|
[hashtable]$Signatures = @{}
|
||||||
foreach ($param in $PARAMS) {
|
foreach ($param in $PARAMS) {
|
||||||
# Define getter
|
# Define getter
|
||||||
$Signatures["Getter"] = "[Int]`$this.Getter('{0}')" -f $param
|
$Signatures['Getter'] = "[Int]`$this.Getter('{0}')" -f $param
|
||||||
# Define setter
|
# Define setter
|
||||||
$Signatures["Setter"] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
|
$Signatures['Setter'] = "param ( [Single]`$arg )`n`$this.Setter('{0}', `$arg)" `
|
||||||
-f $param
|
-f $param
|
||||||
|
|
||||||
Addmember
|
Addmember
|
||||||
@@ -53,9 +53,9 @@ function AddStringMembers () {
|
|||||||
[hashtable]$Signatures = @{}
|
[hashtable]$Signatures = @{}
|
||||||
foreach ($param in $PARAMS) {
|
foreach ($param in $PARAMS) {
|
||||||
# Define getter
|
# Define getter
|
||||||
$Signatures["Getter"] = "[String]`$this.Getter_String('{0}')" -f $param
|
$Signatures['Getter'] = "[String]`$this.Getter_String('{0}')" -f $param
|
||||||
# Define setter
|
# Define setter
|
||||||
$Signatures["Setter"] = "param ( [String]`$arg )`n`$this.Setter('{0}', `$arg)" `
|
$Signatures['Setter'] = "param ( [String]`$arg )`n`$this.Setter('{0}', `$arg)" `
|
||||||
-f $param
|
-f $param
|
||||||
|
|
||||||
Addmember
|
Addmember
|
||||||
@@ -69,9 +69,9 @@ function AddActionMembers () {
|
|||||||
[hashtable]$Signatures = @{}
|
[hashtable]$Signatures = @{}
|
||||||
foreach ($param in $PARAMS) {
|
foreach ($param in $PARAMS) {
|
||||||
# Define getter
|
# Define getter
|
||||||
$Signatures["Getter"] = "`$this.Setter('{0}', `$true)" -f $param
|
$Signatures['Getter'] = "`$this.Setter('{0}', `$true)" -f $param
|
||||||
# Define setter
|
# Define setter
|
||||||
$Signatures["Setter"] = ""
|
$Signatures['Setter'] = ''
|
||||||
|
|
||||||
Addmember
|
Addmember
|
||||||
}
|
}
|
||||||
@@ -83,7 +83,7 @@ function AddChannelMembers () {
|
|||||||
|
|
||||||
[System.Collections.ArrayList]$channels = @()
|
[System.Collections.ArrayList]$channels = @()
|
||||||
1..$($num_A + $num_B) | ForEach-Object {
|
1..$($num_A + $num_B) | ForEach-Object {
|
||||||
if ($_ -le $num_A) { $channels.Add("A{0}" -f $_) } else { $channels.Add("B{0}" -f $($_ - $num_A)) }
|
if ($_ -le $num_A) { $channels.Add('A{0}' -f $_) } else { $channels.Add('B{0}' -f $($_ - $num_A)) }
|
||||||
}
|
}
|
||||||
|
|
||||||
AddBoolMembers -PARAMS $channels
|
AddBoolMembers -PARAMS $channels
|
||||||
@@ -93,11 +93,11 @@ function AddGainlayerMembers () {
|
|||||||
[hashtable]$Signatures = @{}
|
[hashtable]$Signatures = @{}
|
||||||
0..7 | ForEach-Object {
|
0..7 | ForEach-Object {
|
||||||
# Define getter
|
# Define getter
|
||||||
$Signatures["Getter"] = "`$this.Getter('gainlayer[{0}]')" -f $_
|
$Signatures['Getter'] = "`$this.Getter('gainlayer[{0}]')" -f $_
|
||||||
# Define setter
|
# Define setter
|
||||||
$Signatures["Setter"] = "param ( [Single]`$arg )`n`$this.Setter('gainlayer[{0}]', `$arg)" `
|
$Signatures['Setter'] = "param ( [Single]`$arg )`n`$this.Setter('gainlayer[{0}]', `$arg)" `
|
||||||
-f $_
|
-f $_
|
||||||
$param = "gainlayer{0}" -f $_
|
$param = 'gainlayer{0}' -f $_
|
||||||
$null = $param
|
$null = $param
|
||||||
|
|
||||||
Addmember
|
Addmember
|
||||||
@@ -108,8 +108,8 @@ function Addmember {
|
|||||||
$AddMemberParams = @{
|
$AddMemberParams = @{
|
||||||
Name = $param
|
Name = $param
|
||||||
MemberType = 'ScriptProperty'
|
MemberType = 'ScriptProperty'
|
||||||
Value = [scriptblock]::Create($Signatures["Getter"])
|
Value = [scriptblock]::Create($Signatures['Getter'])
|
||||||
SecondValue = [scriptblock]::Create($Signatures["Setter"])
|
SecondValue = [scriptblock]::Create($Signatures['Setter'])
|
||||||
}
|
}
|
||||||
$this | Add-Member @AddMemberParams
|
$this | Add-Member @AddMemberParams
|
||||||
}
|
}
|
||||||
|
|||||||
116
lib/option.ps1
Normal file
116
lib/option.ps1
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
class Option : IRemote {
|
||||||
|
[System.Collections.ArrayList]$delay
|
||||||
|
[Object]$buffer
|
||||||
|
|
||||||
|
Option ([Object]$remote) : base ($remote) {
|
||||||
|
AddBoolMembers -PARAMS @('asiosr', 'monitorOnSel', 'sliderMode')
|
||||||
|
|
||||||
|
$this.buffer = [OptionBuffer]::new($remote)
|
||||||
|
|
||||||
|
$num_A = $this.remote.kind.p_out
|
||||||
|
if ($this.remote.kind.name -eq 'basic') {
|
||||||
|
$num_A += $this.remote.kind.v_out
|
||||||
|
}
|
||||||
|
|
||||||
|
$this.delay = @()
|
||||||
|
for ($i = 0; $i -lt $num_A; $i++) {
|
||||||
|
$this.delay.Add([FloatArrayMember]::new($i, 'delay', $this, 2))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[string] identifier () {
|
||||||
|
return 'Option'
|
||||||
|
}
|
||||||
|
|
||||||
|
hidden $_sr = $($this | Add-Member ScriptProperty 'sr' `
|
||||||
|
{
|
||||||
|
$this.Getter('sr')
|
||||||
|
} `
|
||||||
|
{
|
||||||
|
param([int]$arg)
|
||||||
|
$opts = @(32000, 44100, 48000, 88200, 96000, 176400, 192000)
|
||||||
|
if ($opts.Contains($arg)) {
|
||||||
|
$this._sr = $this.Setter('sr', $arg)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Warning ('Expected one of', $opts)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
class OptionBuffer : IRemote {
|
||||||
|
OptionBuffer ([Object]$remote) : base ($remote) {}
|
||||||
|
|
||||||
|
[string] identifier () {
|
||||||
|
return 'Option.Buffer'
|
||||||
|
}
|
||||||
|
|
||||||
|
hidden $_mme = $($this | Add-Member ScriptProperty 'mme' `
|
||||||
|
{
|
||||||
|
$this.Getter('mme')
|
||||||
|
} `
|
||||||
|
{
|
||||||
|
param([int]$arg)
|
||||||
|
$opts = @(441, 480, 512, 576, 640, 704, 768, 896, 1024, 1536, 2048)
|
||||||
|
if ($opts.Contains($arg)) {
|
||||||
|
$this._mme = $this.Setter('mme', $arg)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Warning ('Expected one of', $opts)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
hidden $_wdm = $($this | Add-Member ScriptProperty 'wdm' `
|
||||||
|
{
|
||||||
|
$this.Getter('wdm')
|
||||||
|
} `
|
||||||
|
{
|
||||||
|
param([int]$arg)
|
||||||
|
$opts = @(128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 441, 448, 480, 512, 576, 640, 704, 768, 1024, 1536, 2048)
|
||||||
|
if ($opts.Contains($arg)) {
|
||||||
|
$this._wdm = $this.Setter('wdm', $arg)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Warning ('Expected one of', $opts)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
hidden $_ks = $($this | Add-Member ScriptProperty 'ks' `
|
||||||
|
{
|
||||||
|
$this.Getter('ks')
|
||||||
|
} `
|
||||||
|
{
|
||||||
|
param([int]$arg)
|
||||||
|
$opts = @(128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 441, 448, 480, 512, 576, 640, 704, 768, 1024, 1536, 2048)
|
||||||
|
if ($opts.Contains($arg)) {
|
||||||
|
$this._ks = $this.Setter('ks', $arg)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Warning ('Expected one of', $opts)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
hidden $_asio = $($this | Add-Member ScriptProperty 'asio' `
|
||||||
|
{
|
||||||
|
$this.Getter('asio')
|
||||||
|
} `
|
||||||
|
{
|
||||||
|
param([int]$arg)
|
||||||
|
$opts = @(0, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 441, 448, 480, 512, 576, 640, 704, 768, 1024)
|
||||||
|
if ($opts.Contains($arg)) {
|
||||||
|
$this._asio = $this.Setter('asio', $arg)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Warning ('Expected one of', $opts)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function Make_Option ([Object]$remote) {
|
||||||
|
return [Option]::new($remote)
|
||||||
|
}
|
||||||
52
lib/patch.ps1
Normal file
52
lib/patch.ps1
Normal 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)
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
function Get_Profiles ([string]$kind_id) {
|
function Get_Profiles ([string]$kind_id) {
|
||||||
$basepath = Join-Path -Path $(Split-Path -Path $PSScriptRoot) -ChildPath "profiles"
|
$basepath = Join-Path -Path $(Split-Path -Path $PSScriptRoot) -ChildPath 'profiles'
|
||||||
if (Test-Path $basepath) {
|
if (Test-Path $basepath) {
|
||||||
$fullpath = Join-Path -Path $basepath -ChildPath $kind_id
|
$fullpath = Join-Path -Path $basepath -ChildPath $kind_id
|
||||||
}
|
}
|
||||||
@@ -11,7 +11,7 @@ function Get_Profiles ([string]$kind_id) {
|
|||||||
$filenames | ForEach-Object {
|
$filenames | ForEach-Object {
|
||||||
(Join-Path -Path $fullpath -ChildPath $_) | ForEach-Object {
|
(Join-Path -Path $fullpath -ChildPath $_) | ForEach-Object {
|
||||||
$filename = [System.IO.Path]::GetFileNameWithoutExtension($_)
|
$filename = [System.IO.Path]::GetFileNameWithoutExtension($_)
|
||||||
Write-Host ("Importing profile " + $kind_id + "/" + $filename)
|
Write-Host ('Importing profile ' + $kind_id + '/' + $filename)
|
||||||
$data[$filename] = Import-PowerShellDataFile -Path $_
|
$data[$filename] = Import-PowerShellDataFile -Path $_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -24,14 +24,9 @@ function Set_Profile {
|
|||||||
param(
|
param(
|
||||||
[Object]$DATA, [string]$CONF
|
[Object]$DATA, [string]$CONF
|
||||||
)
|
)
|
||||||
try {
|
if ($null -eq $DATA -or -not $DATA.$CONF) {
|
||||||
if ($null -eq $DATA -or -not $DATA.$CONF) {
|
throw [VMRemoteErrors]::new("No profile named '$CONF' has been loaded into memory.")
|
||||||
throw [VMRemoteErrors]::new("No profile named $CONF was loaded")
|
|
||||||
}
|
|
||||||
Param_Set_Multi -HASH $DATA.$CONF
|
|
||||||
Start-Sleep -m 1
|
|
||||||
}
|
|
||||||
catch [VMRemoteErrors] {
|
|
||||||
Write-Warning $_.Exception.ErrorMessage()
|
|
||||||
}
|
}
|
||||||
|
Param_Set_Multi -HASH $DATA.$CONF
|
||||||
|
Start-Sleep -m 1
|
||||||
}
|
}
|
||||||
|
|||||||
170
lib/recorder.ps1
170
lib/recorder.ps1
@@ -1,49 +1,165 @@
|
|||||||
. $PSScriptRoot\meta.ps1
|
class Recorder : IRemote {
|
||||||
|
[Object]$mode
|
||||||
|
[System.Collections.ArrayList]$armstrip
|
||||||
|
[System.Collections.ArrayList]$armbus
|
||||||
|
|
||||||
class Recorder {
|
Recorder ([Object]$remote) : base ($remote) {
|
||||||
[Object]$remote
|
$this.mode = [RecorderMode]::new($remote)
|
||||||
|
$this.armstrip = @()
|
||||||
Recorder ([Object]$remote) {
|
0..($remote.kind.p_in + $remote.kind.v_in - 1) | ForEach-Object {
|
||||||
$this.remote = $remote
|
$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
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Recorder"
|
return 'Recorder'
|
||||||
}
|
|
||||||
|
|
||||||
[string] ToString() {
|
|
||||||
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 : IRemote {
|
||||||
|
RecorderMode ([Object]$remote) : base ($remote) {
|
||||||
|
AddBoolMembers -PARAMS @('recbus', 'playonload', 'loop', 'multitrack')
|
||||||
|
}
|
||||||
|
|
||||||
|
[string] identifier () {
|
||||||
|
return 'Recorder.Mode'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class RecorderArm : IRemote {
|
||||||
|
RecorderArm ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
|
|||||||
181
lib/strip.ps1
181
lib/strip.ps1
@@ -1,32 +1,6 @@
|
|||||||
. $PSScriptRoot\meta.ps1
|
class Strip : IRemote {
|
||||||
|
[Object]$levels
|
||||||
|
|
||||||
class IStrip {
|
|
||||||
[int]$index
|
|
||||||
[Object]$remote
|
|
||||||
|
|
||||||
IStrip ([int]$index, [Object]$remote) {
|
|
||||||
$this.index = $index
|
|
||||||
$this.remote = $remote
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] identifier () {
|
|
||||||
return "Strip[" + $this.index + "]"
|
|
||||||
}
|
|
||||||
|
|
||||||
[single] Getter ($param) {
|
|
||||||
return Param_Get -PARAM "$($this.identifier()).$param" -IS_STRING $false
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] Getter_String ($param) {
|
|
||||||
return Param_Get -PARAM "$($this.identifier()).$param" -IS_STRING $true
|
|
||||||
}
|
|
||||||
|
|
||||||
[void] Setter ($param, $val) {
|
|
||||||
Param_Set -PARAM "$($this.identifier()).$param" -Value $val
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Strip : IStrip {
|
|
||||||
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,10 +9,12 @@ class Strip : IStrip {
|
|||||||
|
|
||||||
AddChannelMembers
|
AddChannelMembers
|
||||||
AddGainlayerMembers
|
AddGainlayerMembers
|
||||||
|
|
||||||
|
$this.levels = [StripLevels]::new($index, $remote)
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] ToString() {
|
[string] identifier () {
|
||||||
return $this.GetType().Name + $this.index
|
return 'Strip[' + $this.index + ']'
|
||||||
}
|
}
|
||||||
|
|
||||||
[void] FadeTo ([single]$target, [int]$time) {
|
[void] FadeTo ([single]$target, [int]$time) {
|
||||||
@@ -50,6 +26,52 @@ class Strip : IStrip {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class StripLevels : IRemote {
|
||||||
|
[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,22 +84,22 @@ 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 : IRemote {
|
||||||
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')
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Strip[" + $this.index + "].Comp"
|
return 'Strip[' + $this.index + '].Comp'
|
||||||
}
|
}
|
||||||
|
|
||||||
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
|
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
|
||||||
@@ -91,13 +113,13 @@ class Comp : IStrip {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
class Gate : IStrip {
|
class StripGate : IRemote {
|
||||||
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')
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Strip[" + $this.index + "].Gate"
|
return 'Strip[' + $this.index + '].Gate'
|
||||||
}
|
}
|
||||||
|
|
||||||
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
|
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
|
||||||
@@ -111,12 +133,12 @@ class Gate : IStrip {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
class Denoiser : IStrip {
|
class StripDenoiser : IRemote {
|
||||||
Denoiser ([int]$index, [Object]$remote) : base ($index, $remote) {
|
StripDenoiser ([int]$index, [Object]$remote) : base ($index, $remote) {
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Strip[" + $this.index + "].Denoiser"
|
return 'Strip[' + $this.index + '].Denoiser'
|
||||||
}
|
}
|
||||||
|
|
||||||
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
|
hidden $_knob = $($this | Add-Member ScriptProperty 'knob' `
|
||||||
@@ -130,81 +152,22 @@ class Denoiser : IStrip {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
class Eq : IStrip {
|
class StripEq : Eq {
|
||||||
Eq ([int]$index, [Object]$remote) : base ($index, $remote) {
|
StripEq ([int]$index, [Object]$remote) : base ($index, $remote, 'Strip') {
|
||||||
AddBoolMembers -PARAMS @('on', 'ab')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "Strip[" + $this.index + "].EQ"
|
return 'Strip[' + $this.index + '].EQ'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Device : IStrip {
|
class StripDevice : Device {
|
||||||
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' `
|
|
||||||
{
|
|
||||||
$this.Getter_String('name')
|
|
||||||
} `
|
|
||||||
{
|
|
||||||
return Write-Warning ("ERROR: $($this.identifier()).name is read only")
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
hidden $_sr = $($this | Add-Member ScriptProperty 'sr' `
|
|
||||||
{
|
|
||||||
$this.Getter('sr')
|
|
||||||
} `
|
|
||||||
{
|
|
||||||
return Write-Warning ("ERROR: $($this.identifier()).sr is read only")
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
hidden $_wdm = $($this | Add-Member ScriptProperty 'wdm' `
|
|
||||||
{
|
|
||||||
return Write-Warning ("ERROR: $($this.identifier()).wdm is write only")
|
|
||||||
} `
|
|
||||||
{
|
|
||||||
param($arg)
|
|
||||||
return $this.Setter('wdm', $arg)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
hidden $_ks = $($this | Add-Member ScriptProperty 'ks' `
|
|
||||||
{
|
|
||||||
return Write-Warning ("ERROR: $($this.identifier()).ks is write only")
|
|
||||||
} `
|
|
||||||
{
|
|
||||||
param($arg)
|
|
||||||
return $this.Setter('ks', $arg)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
hidden $_mme = $($this | Add-Member ScriptProperty 'mme' `
|
|
||||||
{
|
|
||||||
return Write-Warning ("ERROR: $($this.identifier()).mme is write only")
|
|
||||||
} `
|
|
||||||
{
|
|
||||||
param($arg)
|
|
||||||
return $this.Setter('mme', $arg)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
hidden $_asio = $($this | Add-Member ScriptProperty 'asio' `
|
|
||||||
{
|
|
||||||
return Write-Warning ("ERROR: $($this.identifier()).asio is write only")
|
|
||||||
} `
|
|
||||||
{
|
|
||||||
param($arg)
|
|
||||||
return $this.Setter('asio', $arg)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class VirtualStrip : Strip {
|
class VirtualStrip : Strip {
|
||||||
|
|||||||
59
lib/vban.ps1
59
lib/vban.ps1
@@ -1,35 +1,12 @@
|
|||||||
class IVban {
|
class Vban : IRemote {
|
||||||
[int32]$index
|
|
||||||
[string]$direction
|
[string]$direction
|
||||||
|
|
||||||
IVban ([int]$index, [string]$direction) {
|
Vban ([int]$index, [Object]$remote, [string]$direction) : base ($index, $remote) {
|
||||||
$this.index = $index
|
|
||||||
$this.direction = $direction
|
$this.direction = $direction
|
||||||
}
|
}
|
||||||
|
|
||||||
[string] identifier () {
|
[string] identifier () {
|
||||||
return "vban." + $this.direction + "stream[" + $this.index + "]"
|
return 'vban.' + $this.direction + 'stream[' + $this.index + ']'
|
||||||
}
|
|
||||||
|
|
||||||
[string] ToString() {
|
|
||||||
return $this.GetType().Name + $this.index
|
|
||||||
}
|
|
||||||
|
|
||||||
[single] Getter ($param) {
|
|
||||||
return Param_Get -PARAM "$($this.identifier()).$param" -IS_STRING $false
|
|
||||||
}
|
|
||||||
|
|
||||||
[string] Getter_String ($param) {
|
|
||||||
return Param_Get -PARAM "$($this.identifier()).$param" -IS_STRING $true
|
|
||||||
}
|
|
||||||
|
|
||||||
[void] Setter ($param, $val) {
|
|
||||||
Param_Set -PARAM "$($this.identifier()).$param" -Value $val
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Vban : IVban {
|
|
||||||
Vban ([int]$index, [string]$direction) : base ($index, $direction) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hidden $_on = $($this | Add-Member ScriptProperty 'on' `
|
hidden $_on = $($this | Add-Member ScriptProperty 'on' `
|
||||||
@@ -68,7 +45,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 {
|
||||||
@@ -83,7 +60,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 {
|
||||||
$opts = @(11025, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000)
|
$opts = @(11025, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000)
|
||||||
if ($opts.Contains($arg)) {
|
if ($opts.Contains($arg)) {
|
||||||
@@ -102,9 +79,9 @@ 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 {
|
||||||
@@ -121,7 +98,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 (@(16, 24).Contains($arg)) {
|
if (@(16, 24).Contains($arg)) {
|
||||||
$val = if ($arg -eq 16) { 1 } else { 2 }
|
$val = if ($arg -eq 16) { 1 } else { 2 }
|
||||||
@@ -140,9 +117,9 @@ 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 {
|
||||||
@@ -158,9 +135,9 @@ 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 +150,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 +166,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]@{
|
||||||
@@ -202,7 +179,7 @@ function Make_Vban ([Object]$remote) {
|
|||||||
|
|
||||||
$CustomObject | Add-Member ScriptProperty 'enable' `
|
$CustomObject | Add-Member ScriptProperty 'enable' `
|
||||||
{
|
{
|
||||||
return Write-Warning ("ERROR: vban.enable is write only")
|
return Write-Warning ('ERROR: vban.enable is write only')
|
||||||
} `
|
} `
|
||||||
{
|
{
|
||||||
param([bool]$arg)
|
param([bool]$arg)
|
||||||
|
|||||||
@@ -2,10 +2,10 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
|||||||
Describe 'Bool tests' -ForEach @(
|
Describe 'Bool tests' -ForEach @(
|
||||||
@{ Value = $true; Expected = $true }
|
@{ Value = $true; Expected = $true }
|
||||||
@{ Value = $false; Expected = $false }
|
@{ Value = $false; Expected = $false }
|
||||||
){
|
) {
|
||||||
Context 'Strip, one physical one virtual' -ForEach @(
|
Context 'Strip, one physical one virtual' -ForEach @(
|
||||||
@{ Index = $phys_in }, @{ Index = $virt_in }
|
@{ Index = $phys_in }, @{ Index = $virt_in }
|
||||||
){
|
) {
|
||||||
It "Should set and get Strip[$index].Mute" {
|
It "Should set and get Strip[$index].Mute" {
|
||||||
$vmr.strip[$index].mute = $value
|
$vmr.strip[$index].mute = $value
|
||||||
$vmr.strip[$index].mute | Should -Be $expected
|
$vmr.strip[$index].mute | Should -Be $expected
|
||||||
@@ -27,25 +27,32 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Context 'physical only' -ForEach @(
|
Context 'Strip, physical only' -ForEach @(
|
||||||
@{ Index = $phys_in }
|
@{ Index = $phys_in }
|
||||||
){
|
) {
|
||||||
Context 'eq.{param}' -Skip:$ifNotPotato {
|
Context 'Eq' -Skip:$ifNotPotato -ForEach @(
|
||||||
|
@{ Eq = $vmr.strip[$index].eq }
|
||||||
|
) {
|
||||||
It "Should set Strip[$index].EQ.On to $value" {
|
It "Should set Strip[$index].EQ.On to $value" {
|
||||||
$vmr.strip[$index].eq.on = $value
|
$eq.on = $value
|
||||||
$vmr.strip[$index].eq.on | Should -Be $expected
|
$eq.on | Should -Be $value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
It "Should set Strip[$index].EQ.AB to $value" {
|
||||||
|
$eq.ab = $value
|
||||||
|
$eq.ab | Should -Be $value
|
||||||
|
}
|
||||||
|
|
||||||
|
It "Should set Strip[$index].EQ.Channel[$strip_ch].Cell[$cells].On to $value" {
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].on = $value
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].on | Should -Be $value
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Context 'Bus, one physical one virtual' -ForEach @(
|
Context 'Bus, one physical one virtual' -ForEach @(
|
||||||
@{ Index = $phys_out }, @{ Index = $virt_out }
|
@{ Index = $phys_out }, @{ Index = $virt_out }
|
||||||
){
|
) {
|
||||||
It "Should set and get Bus[$index].Eq.On" -Skip:$ifBasic {
|
|
||||||
$vmr.bus[$index].eq.on = $value
|
|
||||||
$vmr.bus[$index].eq.on | Should -Be $expected
|
|
||||||
}
|
|
||||||
|
|
||||||
It "Should set and get Bus[$index].Mono" {
|
It "Should set and get Bus[$index].Mono" {
|
||||||
$vmr.bus[$index].mono = $value
|
$vmr.bus[$index].mono = $value
|
||||||
$vmr.bus[$index].mono | Should -Be $expected
|
$vmr.bus[$index].mono | Should -Be $expected
|
||||||
@@ -60,11 +67,30 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
|||||||
$vmr.bus[$index].mode.centeronly = $value
|
$vmr.bus[$index].mode.centeronly = $value
|
||||||
$vmr.bus[$index].mode.centeronly | Should -Be $expected
|
$vmr.bus[$index].mode.centeronly | Should -Be $expected
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Context 'Eq' -Skip:$ifBasic -ForEach @(
|
||||||
|
@{ Eq = $vmr.bus[$index].eq }
|
||||||
|
) {
|
||||||
|
It "Should set Bus[$index].EQ.On to $value" {
|
||||||
|
$eq.on = $value
|
||||||
|
$eq.on | Should -Be $value
|
||||||
|
}
|
||||||
|
|
||||||
|
It "Should set Bus[$index].EQ.AB to $value" {
|
||||||
|
$eq.ab = $value
|
||||||
|
$eq.ab | Should -Be $value
|
||||||
|
}
|
||||||
|
|
||||||
|
It "Should set Bus[$index].EQ.Channel[$bus_ch].Cell[$cells].On to $value" {
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].on = $value
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].on | Should -Be $value
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Context 'Macrobutton' -ForEach @(
|
Context 'Macrobutton' -ForEach @(
|
||||||
@{ Index = 0 }, @{ Index = 69 }
|
@{ Index = 0 }, @{ Index = 69 }
|
||||||
){
|
) {
|
||||||
It "Should set and get macrobutton[$index] State" {
|
It "Should set and get macrobutton[$index] State" {
|
||||||
$vmr.button[$index].state = $value
|
$vmr.button[$index].state = $value
|
||||||
$vmr.button[$index].state | Should -Be $expected
|
$vmr.button[$index].state | Should -Be $expected
|
||||||
@@ -73,7 +99,7 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
|||||||
|
|
||||||
Context 'Vban instream' -ForEach @(
|
Context 'Vban instream' -ForEach @(
|
||||||
@{ Index = $vban_in }
|
@{ Index = $vban_in }
|
||||||
){
|
) {
|
||||||
It "Should set vban.instream[$index].on" {
|
It "Should set vban.instream[$index].on" {
|
||||||
$vmr.vban.instream[$index].on = $value
|
$vmr.vban.instream[$index].on = $value
|
||||||
$vmr.vban.instream[$index].on | Should -Be $expected
|
$vmr.vban.instream[$index].on | Should -Be $expected
|
||||||
@@ -82,7 +108,7 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
|||||||
|
|
||||||
Context 'Vban outstream' -ForEach @(
|
Context 'Vban outstream' -ForEach @(
|
||||||
@{ Index = $vban_out }
|
@{ Index = $vban_out }
|
||||||
){
|
) {
|
||||||
It "Should set vban.outstream[$index].on" {
|
It "Should set vban.outstream[$index].on" {
|
||||||
$vmr.vban.outstream[$index].on = $value
|
$vmr.vban.outstream[$index].on = $value
|
||||||
$vmr.vban.outstream[$index].on | Should -Be $expected
|
$vmr.vban.outstream[$index].on | Should -Be $expected
|
||||||
@@ -90,17 +116,17 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Context 'Recorder' -Skip:$ifBasic {
|
Context 'Recorder' -Skip:$ifBasic {
|
||||||
It "Should set and get Recorder.A3" {
|
It 'Should set and get Recorder.A3' {
|
||||||
$vmr.recorder.A3 = $value
|
$vmr.recorder.A3 = $value
|
||||||
$vmr.recorder.A3 | Should -Be $expected
|
$vmr.recorder.A3 | Should -Be $expected
|
||||||
}
|
}
|
||||||
|
|
||||||
It "Should set and get Recorder.B1" {
|
It 'Should set and get Recorder.B1' {
|
||||||
$vmr.recorder.B1 = $value
|
$vmr.recorder.B1 = $value
|
||||||
$vmr.recorder.B1 | Should -Be $expected
|
$vmr.recorder.B1 | Should -Be $expected
|
||||||
}
|
}
|
||||||
|
|
||||||
It "Should set and get Recorder.loop" {
|
It 'Should set and get Recorder.loop' {
|
||||||
$vmr.recorder.loop = $value
|
$vmr.recorder.loop = $value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -110,171 +136,508 @@ 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Context 'Option' {
|
||||||
|
It 'Should set and get Option.monitoronsel' -Skip:$ifNotPotato {
|
||||||
|
$vmr.option.monitoronsel = $value
|
||||||
|
$vmr.command.restart
|
||||||
|
Start-Sleep -Milliseconds 500
|
||||||
|
$vmr.option.monitoronsel | Should -Be $value
|
||||||
|
}
|
||||||
|
|
||||||
|
It 'Should set and get Option.slidermode' -Skip:$ifNotPotato {
|
||||||
|
$vmr.option.slidermode = $value
|
||||||
|
$vmr.command.restart
|
||||||
|
Start-Sleep -Milliseconds 500
|
||||||
|
$vmr.option.slidermode | Should -Be $value
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Describe 'Float Tests' {
|
Describe 'Float Tests' {
|
||||||
Describe 'Strip tests' {
|
Context 'Strip, one physical one virtual' -ForEach @(
|
||||||
Context 'one physical, one virtual' -ForEach @(
|
@{ Index = $phys_in }, @{ Index = $virt_in }
|
||||||
@{ Index = $phys_in }, @{ Index = $virt_in }
|
) {
|
||||||
){
|
It "Should set Strip[$index].Gain to $value" -ForEach @(
|
||||||
Context 'gain' -ForEach @(
|
@{ Value = 3.6; Expected = 3.6 }, @{ Value = -8.2; Expected = -8.2 }
|
||||||
@{ Value = 3.6; Expected = 3.6 }, @{ Value = -8.2; Expected = -8.2 }
|
) {
|
||||||
){
|
$vmr.strip[$index].gain = $value
|
||||||
It "Should set Strip[$index].Gain to $value" {
|
$vmr.strip[$index].gain | Should -Be $expected
|
||||||
$vmr.strip[$index].gain = $value
|
}
|
||||||
$vmr.strip[$index].gain | Should -Be $expected
|
}
|
||||||
}
|
|
||||||
|
Context 'Strip, physical only' -Skip:$ifBasic -ForEach @(
|
||||||
|
@{ Index = $phys_in }
|
||||||
|
) {
|
||||||
|
Context 'Knobs' -Skip:$ifBasic -ForEach @(
|
||||||
|
@{ Value = 8.3; Expected = 8.3 }, @{ Value = 5.1; Expected = 5.1 }
|
||||||
|
) {
|
||||||
|
It "Should set Strip[$index].Comp to $value" {
|
||||||
|
$vmr.strip[$index].comp.knob = $value
|
||||||
|
$vmr.strip[$index].comp.knob | Should -Be $expected
|
||||||
|
}
|
||||||
|
|
||||||
|
It "Should set Strip[$index].Gate to $value" {
|
||||||
|
$vmr.strip[$index].gate.knob = $value
|
||||||
|
$vmr.strip[$index].gate.knob | Should -Be $expected
|
||||||
|
}
|
||||||
|
|
||||||
|
It "Should set Strip[$index].Denoiser to $value" -Skip:$ifNotPotato {
|
||||||
|
$vmr.strip[$index].denoiser.knob = $value
|
||||||
|
$vmr.strip[$index].denoiser.knob | Should -Be $expected
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Context 'physical only' -Skip:$ifBasic -ForEach @(
|
Context 'Comp' -Skip:$ifNotPotato {
|
||||||
@{ Index = $phys_in }
|
It "Should set Strip[$index].Comp.Attack" -ForEach @(
|
||||||
){
|
|
||||||
Context 'comp, gate' -ForEach @(
|
|
||||||
@{ Value = 8.3; Expected = 8.3 }, @{ Value = 5.1; Expected = 5.1 }
|
@{ Value = 8.3; Expected = 8.3 }, @{ Value = 5.1; Expected = 5.1 }
|
||||||
){
|
) {
|
||||||
It "Should set Strip[$index].Comp to $value" {
|
$vmr.strip[$index].comp.attack = $value
|
||||||
$vmr.strip[$index].comp.knob = $value
|
$vmr.strip[$index].comp.attack | Should -Be $expected
|
||||||
$vmr.strip[$index].comp.knob | Should -Be $expected
|
|
||||||
}
|
|
||||||
|
|
||||||
It "Should set Strip[$index].Gate to $value" {
|
|
||||||
$vmr.strip[$index].gate.knob = $value
|
|
||||||
$vmr.strip[$index].gate.knob | Should -Be $expected
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Context 'denoiser' -Skip:$ifNotPotato -ForEach @(
|
It "Should set Strip[$index].Comp.Knee" -ForEach @(
|
||||||
@{ Value = 8.3; Expected = 8.3 }, @{ Value = 5.1; Expected = 5.1 }
|
|
||||||
){
|
|
||||||
It "Should set Strip[$index].Denoiser to $value" {
|
|
||||||
$vmr.strip[$index].denoiser.knob = $value
|
|
||||||
$vmr.strip[$index].denoiser.knob | Should -Be $expected
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Context 'comp.{param}' -Skip:$ifNotPotato -ForEach @(
|
|
||||||
@{ Value = 8.3; Expected = 8.3 }, @{ Value = 5.1; Expected = 5.1 }
|
|
||||||
){
|
|
||||||
It "Should set Strip[$index].Comp.Attack to $value" {
|
|
||||||
$vmr.strip[$index].comp.attack = $value
|
|
||||||
$vmr.strip[$index].comp.attack | Should -Be $expected
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Context 'comp.{param}' -Skip:$ifNotPotato -ForEach @(
|
|
||||||
@{ Value = 0.3; Expected = 0.3 }, @{ Value = 0.8; Expected = 0.8 }
|
@{ Value = 0.3; Expected = 0.3 }, @{ Value = 0.8; Expected = 0.8 }
|
||||||
){
|
) {
|
||||||
It "Should set Strip[$index].Comp.Knee to $value" {
|
$vmr.strip[$index].comp.knee = $value
|
||||||
$vmr.strip[$index].comp.knee = $value
|
$vmr.strip[$index].comp.knee | Should -Be $expected
|
||||||
$vmr.strip[$index].comp.knee | Should -Be $expected
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Context 'Gate' -Skip:$ifNotPotato {
|
||||||
|
It "Should set Strip[$index].Gate.BPSidechain" -ForEach @(
|
||||||
|
@{ Value = 103.1; Expected = 103.1 }, @{ Value = 3800; Expected = 3800 }
|
||||||
|
) {
|
||||||
|
$vmr.strip[$index].gate.bpsidechain = $value
|
||||||
|
$vmr.strip[$index].gate.bpsidechain | Should -Be $expected
|
||||||
}
|
}
|
||||||
|
|
||||||
Context 'gate.{param}' -Skip:$ifNotPotato -ForEach @(
|
It "Should set Strip[$index].Gate.Hold" -ForEach @(
|
||||||
@{ Value = 103; Expected = 103 }, @{ Value = 3800; Expected = 3800 }
|
|
||||||
){
|
|
||||||
It "Should set Strip[$index].Gate.BPSidechain to $value" {
|
|
||||||
$vmr.strip[$index].gate.bpsidechain = $value
|
|
||||||
$vmr.strip[$index].gate.bpsidechain | Should -Be $expected
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Context 'gate.{param}' -Skip:$ifNotPotato -ForEach @(
|
|
||||||
@{ Value = 0.3; Expected = 0.3 }, @{ Value = 5000; Expected = 5000 }
|
@{ Value = 0.3; Expected = 0.3 }, @{ Value = 5000; Expected = 5000 }
|
||||||
){
|
) {
|
||||||
It "Should set Strip[$index].Gate.Hold to $value" {
|
$vmr.strip[$index].gate.hold = $value
|
||||||
$vmr.strip[$index].gate.hold = $value
|
$vmr.strip[$index].gate.hold | Should -Be $expected
|
||||||
$vmr.strip[$index].gate.hold | Should -Be $expected
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Context 'EQ' -Skip:$ifNotPotato -ForEach @(
|
||||||
|
@{ Eq = $vmr.strip[$index].eq }
|
||||||
|
) {
|
||||||
|
It "Should set Strip[$index].EQ.Channel[$strip_ch].Cell[$cells].F" -ForEach @(
|
||||||
|
@{ Value = 1234.6; Expected = 1234.6 }, @{ Value = 7500; Expected = 7500 }
|
||||||
|
) {
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].f = $value
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].f | Should -Be $expected
|
||||||
|
}
|
||||||
|
|
||||||
|
It "Should set Strip[$index].EQ.Channel[$strip_ch].Cell[$cells].Gain" -ForEach @(
|
||||||
|
@{ Value = 4.2; Expected = 4.2 }, @{ Value = -7.3; Expected = -7.3 }
|
||||||
|
) {
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].gain = $value
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].gain | Should -Be $expected
|
||||||
|
}
|
||||||
|
|
||||||
|
It "Should set Strip[$index].EQ.Channel[$strip_ch].Cell[$cells].Q" -ForEach @(
|
||||||
|
@{ Value = 1.2; Expected = 1.2 }, @{ Value = 5.6; Expected = 5.6 }
|
||||||
|
) {
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].q = $value
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].q | Should -Be $expected
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Describe 'Bus tests' {
|
Context 'Bus, one physical one virtual' -ForEach @(
|
||||||
Context 'one physical, one virtual' -ForEach @(
|
@{ Index = $phys_out }, @{ Index = $virt_out }
|
||||||
@{ Index = $phys_out }, @{ Index = $virt_out }
|
) {
|
||||||
){
|
It "Should set Bus[$index].Gain" -ForEach @(
|
||||||
Context 'gain' -ForEach @(
|
@{ Value = 5.2; Expected = 5.2 }, @{ Value = -38.2; Expected = -38.2 }
|
||||||
@{ Value = 5.2; Expected = 5.2 }, @{ Value = -38.2; Expected = -38.2 }
|
) {
|
||||||
){
|
$vmr.bus[$index].gain = $value
|
||||||
It "Should set Bus[$index].Gain to $value" {
|
$vmr.bus[$index].gain | Should -Be $expected
|
||||||
$vmr.bus[$index].gain = $value
|
}
|
||||||
$vmr.bus[$index].gain | Should -Be $expected
|
|
||||||
}
|
Context 'EQ' -Skip:$ifBasic -ForEach @(
|
||||||
|
@{ Eq = $vmr.bus[$index].eq }
|
||||||
|
) {
|
||||||
|
It "Should set Bus[$index].EQ.Channel[$bus_ch].Cell[$cells].F" -ForEach @(
|
||||||
|
@{ Value = 1234.6; Expected = 1234.6 }, @{ Value = 7500; Expected = 7500 }
|
||||||
|
) {
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].f = $value
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].f | Should -Be $expected
|
||||||
}
|
}
|
||||||
|
|
||||||
|
It "Should set Bus[$index].EQ.Channel[$bus_ch].Cell[$cells].Gain" -ForEach @(
|
||||||
|
@{ Value = 4.2; Expected = 4.2 }, @{ Value = -7.3; Expected = -7.3 }
|
||||||
|
) {
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].gain = $value
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].gain | Should -Be $expected
|
||||||
|
}
|
||||||
|
|
||||||
|
It "Should set Bus[$index].EQ.Channel[$bus_ch].Cell[$cells].Q" -ForEach @(
|
||||||
|
@{ Value = 1.2; Expected = 1.2 }, @{ Value = 5.6; Expected = 5.6 }
|
||||||
|
) {
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].q = $value
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].q | Should -Be $expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Context 'Option' {
|
||||||
|
It "Should set and get Option.delay[$phys_out]" -ForEach @(
|
||||||
|
@{ Value = 486.57 }, @{ Value = 26.41 }
|
||||||
|
) {
|
||||||
|
$vmr.option.delay[$phys_out].set($value)
|
||||||
|
$vmr.command.restart
|
||||||
|
Start-Sleep -Milliseconds 500
|
||||||
|
$vmr.option.delay[$phys_out].get() | Should -Be $value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Describe 'Int Tests' -ForEach @(
|
Describe 'Int Tests' {
|
||||||
@{ Index = $phys_in }, @{ Index = $virt_in }
|
Context 'Strip, one physical, one virtual' -ForEach @(
|
||||||
){
|
@{ Index = $phys_in }, @{ Index = $virt_in }
|
||||||
Context 'Strip, one physical, one virtual' -Skip:$ifBasic -ForEach @(
|
) {
|
||||||
@{ Value = 3; Expected = 3 }
|
It "Should set and get Strip[$index].Limit" -Skip:$ifBasic -ForEach @(
|
||||||
@{ Value = -6; Expected = -6 }
|
@{ Value = 3; Expected = 3 }
|
||||||
){
|
@{ Value = -6; Expected = -6 }
|
||||||
It "Should set Strip[$index].Limit to 3" {
|
) {
|
||||||
$vmr.strip[$index].limit = $value
|
$vmr.strip[$index].limit = $value
|
||||||
$vmr.strip[$index].limit | Should -Be $expected
|
$vmr.strip[$index].limit | Should -Be $expected
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Context 'Vban outstream' {
|
Context 'Strip, physical only' -ForEach @(
|
||||||
Context 'sr' -ForEach @(
|
@{ Index = $phys_in }
|
||||||
@{ Value = 44100; Expected = 44100 }
|
) {
|
||||||
@{ Value = 48000; Expected = 48000 }
|
Context 'Device' {
|
||||||
){
|
It "Should get Strip[$index].Device.sr" {
|
||||||
It "Should set vban.outstream[$index].sr to $value" {
|
$vmr.strip[$index].device.sr | Should -BeOfType [int]
|
||||||
$vmr.vban.outstream[$index].sr = $value
|
|
||||||
$vmr.vban.outstream[$index].sr | Should -Be $expected
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Context 'channel' -ForEach @(
|
Context 'Eq' -Skip:$ifNotPotato -ForEach @(
|
||||||
|
@{ Eq = $vmr.strip[$index].eq }
|
||||||
|
) {
|
||||||
|
It "Should set Strip[$index].EQ.Channel[$strip_ch].Cell[$cells].Type" -ForEach @(
|
||||||
|
@{ Value = 0; Expected = 0 }, @{ Value = 6; Expected = 6 }
|
||||||
|
) {
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].type = $value
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].type | Should -Be $expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Context 'Bus, one physical one virtual' -ForEach @(
|
||||||
|
@{ Index = $phys_out }, @{ Index = $virt_out }
|
||||||
|
) {
|
||||||
|
Context 'Eq' -Skip:$ifBasic -ForEach @(
|
||||||
|
@{ Eq = $vmr.bus[$index].eq }
|
||||||
|
) {
|
||||||
|
It "Should set Bus[$index].EQ.Channel[$bus_ch].Cell[$cells].Type" -ForEach @(
|
||||||
|
@{ Value = 0; Expected = 0 }, @{ Value = 6; Expected = 6 }
|
||||||
|
) {
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].type = $value
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].type | Should -Be $expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Context 'Bus, physical only' -ForEach @(
|
||||||
|
@{ Index = $phys_out }
|
||||||
|
) {
|
||||||
|
Context 'Device' {
|
||||||
|
It "Should get Bus[$index].Device.sr" {
|
||||||
|
$vmr.bus[$index].device.sr | Should -BeOfType [int]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Context 'Bus, virtual only' -ForEach @(
|
||||||
|
@{ Index = $virt_out }
|
||||||
|
) {
|
||||||
|
Context 'Device' -Skip:$ifNotBasic {
|
||||||
|
It "Should get Bus[$index].Device.sr" {
|
||||||
|
$vmr.bus[$index].device.sr | Should -BeOfType [int]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Context 'Vban outstream' -ForEach @(
|
||||||
|
@{ Index = $vban_out }
|
||||||
|
) {
|
||||||
|
It "Should set vban.outstream[$index].sr to $value" -ForEach @(
|
||||||
|
@{ Value = 44100; Expected = 44100 }
|
||||||
|
@{ Value = 48000; Expected = 48000 }
|
||||||
|
) {
|
||||||
|
$vmr.vban.outstream[$index].sr = $value
|
||||||
|
$vmr.vban.outstream[$index].sr | Should -Be $expected
|
||||||
|
}
|
||||||
|
|
||||||
|
It 'Should set vban.outstream[0].channel to 1' -ForEach @(
|
||||||
@{ Value = 1; Expected = 1 }
|
@{ Value = 1; Expected = 1 }
|
||||||
@{ Value = 2; Expected = 2 }
|
@{ Value = 2; Expected = 2 }
|
||||||
){
|
) {
|
||||||
It 'Should set vban.outstream[0].channel to 1' {
|
$vmr.vban.outstream[$index].channel = $value
|
||||||
$vmr.vban.outstream[$index].channel = $value
|
$vmr.vban.outstream[$index].channel | Should -Be $expected
|
||||||
$vmr.vban.outstream[$index].channel | Should -Be $expected
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Context 'Option' {
|
||||||
|
It 'Should set and get Option.sr' -ForEach @(
|
||||||
|
@{ Value = 44100 }, @{ Value = 48000 }
|
||||||
|
) {
|
||||||
|
$vmr.option.sr = $value
|
||||||
|
Start-Sleep -Milliseconds 500
|
||||||
|
$vmr.option.sr | Should -Be $value
|
||||||
|
}
|
||||||
|
|
||||||
|
Context 'Option.buffer' -ForEach @(
|
||||||
|
@{ Value = 1024 }, @{ Value = 512 }
|
||||||
|
) {
|
||||||
|
It 'Should set and get mme buffer' {
|
||||||
|
$vmr.option.buffer.mme = $value
|
||||||
|
Start-Sleep -Milliseconds 500
|
||||||
|
$vmr.option.buffer.mme | Should -Be $value
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
It 'Should set and get wdm buffer' {
|
||||||
|
$vmr.option.buffer.wdm = $value
|
||||||
|
Start-Sleep -Milliseconds 500
|
||||||
|
$vmr.option.buffer.wdm | Should -Be $value
|
||||||
|
}
|
||||||
|
|
||||||
|
It 'Should set and get ks buffer' {
|
||||||
|
$vmr.option.buffer.ks = $value
|
||||||
|
Start-Sleep -Milliseconds 500
|
||||||
|
$vmr.option.buffer.ks | Should -Be $value
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Describe 'String Tests' {
|
Describe 'String Tests' {
|
||||||
Context 'Strip, one physical, one virtual' -ForEach @(
|
Context 'Strip, one physical, one virtual' -ForEach @(
|
||||||
@{ Index = $phys_in }, @{ Index = $virt_in }
|
@{ Index = $phys_in }, @{ Index = $virt_in }
|
||||||
){
|
) {
|
||||||
It "Should set Strip[$index].Label" -ForEach @(
|
It "Should set Strip[$index].Label" -ForEach @(
|
||||||
@{ Value = "test0"; Expected = "test0" }
|
@{ Value = 'test0'; Expected = 'test0' }
|
||||||
@{ Value = "test1"; Expected = "test1" }
|
@{ Value = 'test1'; Expected = 'test1' }
|
||||||
){
|
) {
|
||||||
$vmr.strip[$index].label = $value
|
$vmr.strip[$index].label = $value
|
||||||
$vmr.strip[$index].label | Should -Be $expected
|
$vmr.strip[$index].label | Should -Be $expected
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Context 'Strip, physical only' -ForEach @(
|
||||||
|
@{ Index = $phys_in }
|
||||||
|
) {
|
||||||
|
Context 'Device' -ForEach @(
|
||||||
|
@{ Value = 'testInput' }, @{ Value = '' }
|
||||||
|
) {
|
||||||
|
It "Should set Strip[$index].Device.wdm" {
|
||||||
|
$vmr.strip[$index].device.wdm = $value
|
||||||
|
Start-Sleep -Milliseconds 800
|
||||||
|
$vmr.strip[$index].device.name | Should -Be $value
|
||||||
|
}
|
||||||
|
|
||||||
|
It "Should set Strip[$index].Device.ks" {
|
||||||
|
$vmr.strip[$index].device.ks = $value
|
||||||
|
Start-Sleep -Milliseconds 800
|
||||||
|
$vmr.strip[$index].device.name | Should -Be $value
|
||||||
|
}
|
||||||
|
|
||||||
|
It "Should set Strip[$index].Device.mme" {
|
||||||
|
$vmr.strip[$index].device.mme = $value
|
||||||
|
Start-Sleep -Milliseconds 800
|
||||||
|
$vmr.strip[$index].device.name | Should -Be $value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Context 'EQ' -Skip:$ifNotPotato -ForEach @(
|
||||||
|
@{ Eq = $vmr.strip[$index].eq }
|
||||||
|
) {
|
||||||
|
It "Should save then load Strip[$index].EQ" -ForEach @(
|
||||||
|
@{ Fq = 1234.5; Gain = 4.2; Ql = 56.2; Type = 3 }
|
||||||
|
) {
|
||||||
|
$tmp = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), "vmreq-$(New-Guid).xml")
|
||||||
|
try {
|
||||||
|
# set some values
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].f = $fq
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].gain = $gain
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].q = $ql
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].type = $type
|
||||||
|
|
||||||
|
# save eq
|
||||||
|
$eq.Save($tmp)
|
||||||
|
Start-Sleep -Milliseconds 100
|
||||||
|
Test-Path $tmp | Should -BeTrue
|
||||||
|
|
||||||
|
# change values
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].f = 1000
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].gain = 0
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].q = 1
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].type = 0
|
||||||
|
|
||||||
|
# load eq
|
||||||
|
$eq.Load($tmp)
|
||||||
|
Start-Sleep -Milliseconds 100
|
||||||
|
|
||||||
|
# verify values
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].f | Should -Be $fq
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].gain | Should -Be $gain
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].q | Should -Be $ql
|
||||||
|
$eq.channel[$strip_ch].cell[$cells].type | Should -Be $type
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
if (Test-Path $tmp) {
|
||||||
|
Remove-Item $tmp -Force
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Context 'Bus, one physical, one virtual' -ForEach @(
|
Context 'Bus, one physical, one virtual' -ForEach @(
|
||||||
@{ Index = $phys_out }, @{ Index = $virt_out }
|
@{ Index = $phys_out }, @{ Index = $virt_out }
|
||||||
){
|
) {
|
||||||
It "Should set Bus[$index].Label" -ForEach @(
|
It "Should set Bus[$index].Label" -ForEach @(
|
||||||
@{ Value = "test0"; Expected = "test0" }
|
@{ Value = 'test0'; Expected = 'test0' }
|
||||||
@{ Value = "test1"; Expected = "test1" }
|
@{ Value = 'test1'; Expected = 'test1' }
|
||||||
){
|
) {
|
||||||
$vmr.bus[$index].label = $value
|
$vmr.bus[$index].label = $value
|
||||||
$vmr.bus[$index].label | Should -Be $expected
|
$vmr.bus[$index].label | Should -Be $expected
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Context 'EQ' -Skip:$ifBasic -ForEach @(
|
||||||
|
@{ Eq = $vmr.bus[$index].eq }
|
||||||
|
) {
|
||||||
|
It "Should save then load Bus[$index].EQ" -ForEach @(
|
||||||
|
@{ Fq = 1234.5; Gain = 4.2; Ql = 56.2; Type = 3 }
|
||||||
|
) {
|
||||||
|
$tmp = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), "vmreq-$(New-Guid).xml")
|
||||||
|
try {
|
||||||
|
# set some values
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].f = $fq
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].gain = $gain
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].q = $ql
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].type = $type
|
||||||
|
|
||||||
|
# save eq
|
||||||
|
$eq.Save($tmp)
|
||||||
|
Start-Sleep -Milliseconds 100
|
||||||
|
Test-Path $tmp | Should -BeTrue
|
||||||
|
|
||||||
|
# change values
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].f = 1000
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].gain = 0
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].q = 1
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].type = 0
|
||||||
|
|
||||||
|
# load eq
|
||||||
|
$eq.Load($tmp)
|
||||||
|
Start-Sleep -Milliseconds 100
|
||||||
|
|
||||||
|
# verify values
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].f | Should -Be $fq
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].gain | Should -Be $gain
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].q | Should -Be $ql
|
||||||
|
$eq.channel[$bus_ch].cell[$cells].type | Should -Be $type
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
if (Test-Path $tmp) {
|
||||||
|
Remove-Item $tmp -Force
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Context 'Bus, physical only' -ForEach @(
|
||||||
|
@{ Index = $phys_out }
|
||||||
|
) {
|
||||||
|
Context 'Device' -ForEach @(
|
||||||
|
@{ Value = 'testOutput' }, @{ Value = '' }
|
||||||
|
) {
|
||||||
|
It "Should set Bus[$index].Device.wdm" {
|
||||||
|
$vmr.bus[$index].device.wdm = $value
|
||||||
|
Start-Sleep -Milliseconds 800
|
||||||
|
$vmr.bus[$index].device.name | Should -Be $value
|
||||||
|
}
|
||||||
|
|
||||||
|
It "Should set Bus[$index].Device.ks" {
|
||||||
|
$vmr.bus[$index].device.ks = $value
|
||||||
|
Start-Sleep -Milliseconds 800
|
||||||
|
$vmr.bus[$index].device.name | Should -Be $value
|
||||||
|
}
|
||||||
|
|
||||||
|
It "Should set Bus[$index].Device.mme" {
|
||||||
|
$vmr.bus[$index].device.mme = $value
|
||||||
|
Start-Sleep -Milliseconds 800
|
||||||
|
$vmr.bus[$index].device.name | Should -Be $value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Context 'Bus, virtual only' -ForEach @(
|
||||||
|
@{ Index = $virt_out }
|
||||||
|
) {
|
||||||
|
Context 'Device' -Skip:$ifNotBasic -ForEach @(
|
||||||
|
@{ Value = 'testOutput' }, @{ Value = '' }
|
||||||
|
) {
|
||||||
|
It "Should set Bus[$index].Device.wdm" {
|
||||||
|
$vmr.bus[$index].device.wdm = $value
|
||||||
|
Start-Sleep -Milliseconds 800
|
||||||
|
$vmr.bus[$index].device.name | Should -Be $value
|
||||||
|
}
|
||||||
|
|
||||||
|
It "Should set Bus[$index].Device.ks" {
|
||||||
|
$vmr.bus[$index].device.ks = $value
|
||||||
|
Start-Sleep -Milliseconds 800
|
||||||
|
$vmr.bus[$index].device.name | Should -Be $value
|
||||||
|
}
|
||||||
|
|
||||||
|
It "Should set Bus[$index].Device.mme" {
|
||||||
|
$vmr.bus[$index].device.mme = $value
|
||||||
|
Start-Sleep -Milliseconds 800
|
||||||
|
$vmr.bus[$index].device.name | Should -Be $value
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Describe 'Vban' -ForEach @(
|
Describe 'Vban' -ForEach @(
|
||||||
@{ Index = $vban_in }
|
@{ Index = $vban_in }
|
||||||
){
|
) {
|
||||||
Context 'instream' {
|
Context 'instream' {
|
||||||
Context 'ip' -ForEach @(
|
Context 'ip' -ForEach @(
|
||||||
@{ Value = "0.0.0.0"; Expected = "0.0.0.0" }
|
@{ Value = '0.0.0.0'; Expected = '0.0.0.0' }
|
||||||
){
|
) {
|
||||||
It "Should set vban.instream[$index].name to $value" {
|
It "Should set vban.instream[$index].name to $value" {
|
||||||
$vmr.vban.instream[$index].ip = $value
|
$vmr.vban.instream[$index].ip = $value
|
||||||
$vmr.vban.instream[$index].ip | Should -Be $expected
|
$vmr.vban.instream[$index].ip | Should -Be $expected
|
||||||
@@ -284,8 +647,8 @@ Describe -Tag 'higher', -TestName 'All Higher Tests' {
|
|||||||
|
|
||||||
Context 'outstream' {
|
Context 'outstream' {
|
||||||
Context 'ip' -ForEach @(
|
Context 'ip' -ForEach @(
|
||||||
@{ Value = "0.0.0.0"; Expected = "0.0.0.0" }
|
@{ Value = '0.0.0.0'; Expected = '0.0.0.0' }
|
||||||
){
|
) {
|
||||||
It "Should set vban.outstream[$index].name to $value" {
|
It "Should set vban.outstream[$index].name to $value" {
|
||||||
$vmr.vban.outstream[$index].ip = $value
|
$vmr.vban.outstream[$index].ip = $value
|
||||||
$vmr.vban.outstream[$index].ip | Should -Be $expected
|
$vmr.vban.outstream[$index].ip | Should -Be $expected
|
||||||
|
|||||||
@@ -6,13 +6,13 @@ Describe -Tag 'lower', -TestName 'All Lower Tests' {
|
|||||||
Describe 'Macrobutton Tests' -ForEach @(
|
Describe 'Macrobutton Tests' -ForEach @(
|
||||||
@{ Value = 1; Expected = 1 }
|
@{ Value = 1; Expected = 1 }
|
||||||
@{ Value = 0; Expected = 0 }
|
@{ Value = 0; Expected = 0 }
|
||||||
){
|
) {
|
||||||
Context 'buttons 0, 69' -ForEach @(
|
Context 'buttons 0, 69' -ForEach @(
|
||||||
@{ Index = 0 }, @{ Index = 69 }
|
@{ Index = 0 }, @{ Index = 69 }
|
||||||
){
|
) {
|
||||||
Context 'state, stateonly and trigger' -ForEach @(
|
Context 'state, stateonly and trigger' -ForEach @(
|
||||||
@{ Mode = 1 }, @{ Mode = 2 }, @{ Mode = 3 }
|
@{ Mode = 1 }, @{ Mode = 2 }, @{ Mode = 3 }
|
||||||
){
|
) {
|
||||||
It "Should set and get macrobutton[$index] State" {
|
It "Should set and get macrobutton[$index] State" {
|
||||||
MB_Set -ID $index -SET $value -MODE $mode
|
MB_Set -ID $index -SET $value -MODE $mode
|
||||||
MB_Get -ID $index -MODE $mode | Should -Be $expected
|
MB_Get -ID $index -MODE $mode | Should -Be $expected
|
||||||
@@ -24,13 +24,13 @@ Describe -Tag 'lower', -TestName 'All Lower Tests' {
|
|||||||
Describe 'Set and Get Param Float Tests' -ForEach @(
|
Describe 'Set and Get Param Float Tests' -ForEach @(
|
||||||
@{ Value = 1; Expected = 1 }
|
@{ Value = 1; Expected = 1 }
|
||||||
@{ Value = 0; Expected = 0 }
|
@{ Value = 0; Expected = 0 }
|
||||||
){
|
) {
|
||||||
Context 'Strip, one physical one virtual' -ForEach @(
|
Context 'Strip, one physical one virtual' -ForEach @(
|
||||||
@{ Index = $phys_in }, @{ Index = $virt_in }
|
@{ Index = $phys_in }, @{ Index = $virt_in }
|
||||||
){
|
) {
|
||||||
Context 'mute, mono, A1, B2' -ForEach @(
|
Context 'mute, mono, A1, B2' -ForEach @(
|
||||||
@{ param = "mute" }, @{ param = "A1" }
|
@{ param = 'mute' }, @{ param = 'A1' }
|
||||||
){
|
) {
|
||||||
It "Should set Strip[0].$param to 1" {
|
It "Should set Strip[0].$param to 1" {
|
||||||
Param_Set -PARAM "Strip[$index].$param" -VALUE $value
|
Param_Set -PARAM "Strip[$index].$param" -VALUE $value
|
||||||
Param_Get -PARAM "Strip[$index].$param" | Should -Be $expected
|
Param_Get -PARAM "Strip[$index].$param" | Should -Be $expected
|
||||||
@@ -42,10 +42,10 @@ Describe -Tag 'lower', -TestName 'All Lower Tests' {
|
|||||||
Describe 'Set and Get Param String Tests' -ForEach @(
|
Describe 'Set and Get Param String Tests' -ForEach @(
|
||||||
@{ Value = 'test0'; Expected = 'test0' }
|
@{ Value = 'test0'; Expected = 'test0' }
|
||||||
@{ Value = 'test1'; Expected = 'test1' }
|
@{ Value = 'test1'; Expected = 'test1' }
|
||||||
){
|
) {
|
||||||
Context 'Strip, one physical one virtual' -ForEach @(
|
Context 'Strip, one physical one virtual' -ForEach @(
|
||||||
@{ Index = $phys_in }, @{ Index = $virt_in }
|
@{ Index = $phys_in }, @{ Index = $virt_in }
|
||||||
){
|
) {
|
||||||
It "Should set Strip[$index].Label to $value" {
|
It "Should set Strip[$index].Label to $value" {
|
||||||
Param_Set -PARAM "Strip[$index].Label" -VALUE $value
|
Param_Set -PARAM "Strip[$index].Label" -VALUE $value
|
||||||
Param_Get -PARAM "Strip[$index].Label" -IS_STRING $true | Should -Be $expected
|
Param_Get -PARAM "Strip[$index].Label" -IS_STRING $true | Should -Be $expected
|
||||||
|
|||||||
@@ -1,76 +0,0 @@
|
|||||||
Param([String]$tag, [Int]$num = 1, [switch]$log, [string]$kind = "potato")
|
|
||||||
Import-Module .\lib\Voicemeeter.psm1
|
|
||||||
|
|
||||||
Function ParseLog {
|
|
||||||
Param([String]$logfile)
|
|
||||||
$summary_file = Join-Path $PSScriptRoot "_summary.log"
|
|
||||||
if (Test-Path $summary_file) { Clear-Content $summary_file }
|
|
||||||
|
|
||||||
$PASSED_PATTERN = "^PassedCount\s+:\s(\d+)"
|
|
||||||
$FAILED_PATTERN = "^FailedCount\s+:\s(\d+)"
|
|
||||||
|
|
||||||
$DATA = @{
|
|
||||||
"passed" = 0
|
|
||||||
"failed" = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
ForEach ($line in `
|
|
||||||
$(Get-Content -Path "${logfile}")) {
|
|
||||||
if ($line -match $PASSED_PATTERN) {
|
|
||||||
$DATA["passed"] += $Matches[1]
|
|
||||||
}
|
|
||||||
elseif ($line -match $FAILED_PATTERN) {
|
|
||||||
$DATA["failed"] += $Matches[1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
"=========================`n" + `
|
|
||||||
"$num tests run:`n" + `
|
|
||||||
"=========================" | Tee-Object -FilePath $summary_file -Append
|
|
||||||
$DATA | ForEach-Object { $_ } | Tee-Object -FilePath $summary_file -Append
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
try {
|
|
||||||
$vmr = Connect-Voicemeeter -Kind $kind
|
|
||||||
Write-Host "Running tests for $vmr"
|
|
||||||
|
|
||||||
# test boundaries by kind
|
|
||||||
$phys_in = $vmr.kind.p_in - 1
|
|
||||||
$virt_in = $vmr.kind.p_in + $vmr.kind.v_in - 1
|
|
||||||
$phys_out = $vmr.kind.p_out - 1
|
|
||||||
$virt_out = $vmr.kind.p_out + $vmr.kind.v_out - 1
|
|
||||||
$vban_in = $vmr.kind.vban_in - 1
|
|
||||||
$vban_out = $vmr.kind.vban_out - 1
|
|
||||||
|
|
||||||
# skip conditions by kind
|
|
||||||
$ifBasic = $vmr.kind.name -eq "basic"
|
|
||||||
$ifBanana = $vmr.kind.name -eq "banana"
|
|
||||||
$ifPotato = $vmr.kind.name -eq "potato"
|
|
||||||
$ifNotBasic = $vmr.kind.name -ne "basic"
|
|
||||||
$ifNotBanana = $vmr.kind.name -ne "banana"
|
|
||||||
$ifNotPotato = $vmr.kind.name -ne "potato"
|
|
||||||
|
|
||||||
$logfile = Join-Path $PSScriptRoot "_results.log"
|
|
||||||
if (Test-Path $logfile) { Clear-Content $logfile }
|
|
||||||
|
|
||||||
1..$num | ForEach-Object {
|
|
||||||
if ($log) {
|
|
||||||
"Running test $_ of $num" | Tee-Object -FilePath $logfile -Append
|
|
||||||
Invoke-Pester -Tag $tag -PassThru | Tee-Object -FilePath $logfile -Append
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
"Running test $_ of $num"
|
|
||||||
Invoke-Pester -Tag $tag -PassThru
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($log) { Parselog -logfile $logfile }
|
|
||||||
}
|
|
||||||
finally { Disconnect-Voicemeeter }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if ($MyInvocation.InvocationName -ne '.') { main }
|
|
||||||
36
tests/run.ps1
Normal file
36
tests/run.ps1
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseDeclaredVarsMoreThanAssignments", "", Target = "variablename")]
|
||||||
|
Param([String]$tag, [string]$kind = 'potato')
|
||||||
|
Import-Module (Join-Path (Split-Path $PSScriptRoot -Parent) 'lib\Voicemeeter.psm1') -Force
|
||||||
|
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
try {
|
||||||
|
$vmr = Connect-Voicemeeter -Kind $kind
|
||||||
|
$vmr.command.RunMacrobuttons() # ensure macrobuttons is running before we begin
|
||||||
|
Write-Host "Running tests for $vmr"
|
||||||
|
|
||||||
|
# test boundaries by kind
|
||||||
|
$phys_in = $vmr.kind.p_in - 1
|
||||||
|
$virt_in = $vmr.kind.p_in + $vmr.kind.v_in - 1
|
||||||
|
$phys_out = $vmr.kind.p_out - 1
|
||||||
|
$virt_out = $vmr.kind.p_out + $vmr.kind.v_out - 1
|
||||||
|
$vban_in = $vmr.kind.vban_in - 1
|
||||||
|
$vban_out = $vmr.kind.vban_out - 1
|
||||||
|
$insert = $vmr.kind.insert - 1
|
||||||
|
$composite = $vmr.kind.composite - 1
|
||||||
|
$strip_ch = $vmr.kind.strip_ch - 1
|
||||||
|
$bus_ch = $vmr.kind.bus_ch - 1
|
||||||
|
$cells = $vmr.kind.cells - 1
|
||||||
|
|
||||||
|
# skip conditions by kind
|
||||||
|
$ifBasic = $vmr.kind.name -eq 'basic'
|
||||||
|
$ifNotBasic = $vmr.kind.name -ne 'basic'
|
||||||
|
$ifNotPotato = $vmr.kind.name -ne 'potato'
|
||||||
|
|
||||||
|
Invoke-Pester -Tag $tag -PassThru | Out-Null
|
||||||
|
}
|
||||||
|
finally { Disconnect-Voicemeeter }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
main
|
||||||
Reference in New Issue
Block a user