add Get_Profiles and Set_Profile functions. Now possible to load many parameters from a psd1 config file. example config added add Config Files section to readme
Powershell Wrapper for Voicemeeter API
This wrapper was written in response to a request in the VB-AUDIO discord for a way to invoke commands using Powershell. It is designed to be simple to use but not every feature is added.
For past/future changes to this project refer to: CHANGELOG
Tested against
- Basic 1.0.8.1
 - Banana 2.0.6.1
 - Potato 3.0.2.1
 
You may have success with many commands in earlier versions but some commands (example Macrobuttons) were only added to the API in later releases.
Requirements
- Voicemeeter: https://voicemeeter.com/
 - Powershell 5.1
 
Installation
PowerShellGet:
In Powershell as admin:
Install-Module Voicemeeter
In Powershell as current user:
Install-Module -Name Voicemeeter -Scope CurrentUser
You may be asked to install NuGet provider required by PowerShellGet if you don't have it already.
When prompted you will need to accept PSGallery as a trusted repository.
More Info:
Direct download:
git clone https://github.com/onyx-and-iris/voicemeeter-api-powershell.git
All examples in this readme assume you've installed as a module. If you decide to direct download see alternative instructions.
Use
When you instantiate Remote class you will automatically be logged in. Use a try finally block to ensure you logout at the end of your code.
Import-Module Voicemeeter
try {
    # Run the factory function for required Voicemeeter type
    $vmr = Get-RemoteBanana
    # Set strip and bus params
    $vmr.strip[0].mono = $true
    $vmr.strip[0].mono  '=> $true'
    $vmr.bus[1].mute = $false
    $vmr.bus[1].mute    '=> $false'
    # Set macrobutton with id 4, mode state to 1
    $vmr.button[4].state = $true
    $vmr.button[4].state    '=> $true'
}
finally { $vmr.Logout() }
Voicemeeter factory function can be:
- Get-RemoteBasic
 - Get-RemoteBanana
 - Get-RemotePotato
 
There is no bounds checking in this wrapper, meaning if you attempt to set a parameter that does not exist for that version of Voicemeeter the wrapper will throw an error. So make sure what you are settings actually exists.
Strip|Bus
The following strip/bus commands are available:
- mute
 - mono
 - solo
 - A1-A5
 - B1-B3
 - limit
 - gain
 - comp
 - gate
 
A,B commands depend on Voicemeeter type.
Macrobuttons
Three modes defined: state, stateonly and trigger.
- State runs associated scripts
 - Stateonly does not run associated scripts
 - Index range (0, 69)
 
$vmr.button[3].state = $true
$vmr.button[4].stateonly = $false
$vmr.button[5].trigger = $true
VBAN
- vmr.vban.enable: Toggle VBAN on or off. Accepts a boolean value.
 
For each vban in/out stream the following parameters are defined:
- on: boolean
 - name: string
 - ip: string
 - port: int from 1024 - 65535
 - sr: int (11025, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000)
 - channel: int from 1 to 8
 - bit: int 16 or 24
 - quality: int from 0 to 4
 - route: int from 0 to 8
 
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.
example:
$vmr.vban.enable = $true
$vmr.vban.instream[0].on = $true
$vmr.vban.instream[2].port = 6990
$vmr.vban.outstream[3].bit = 16
Command
Certain 'special' commands are defined by the API as performing actions rather than setting values.
The following methods are available:
- show
 - restart
 - shutdown
 
The following properties are write only and accept boolean values:
- showvbanchat
 - lock
 
example:
$vmr.command.show
$vmr.command.lock = $true
Multiple parameters
Set many strip/bus/macrobutton/vban parameters at once, for Example
Import-Module Voicemeeter
try {
    $vmr = Get-RemoteBanana
    $hash = @{
        strip_0 = @{mute = $true; mono = $true};
        strip_2 = @{mute = $true; mono = $true};
        bus_1 = @{mute = $true; mono = $true};
        button_34 = @{state = $true};
        button_12 = @{trigger = $false};
        vban_instream_3 = @{name = 'streamname'};
        vban_outstream_0 = @{on = $false};
    }
    $vmr.Set_Multi($hash)
}
finally { $vmr.Logout() }
Remote class
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_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.
Access to lower level polling functions are provided with these functions:
$vmr.PDirty: Returns true if a parameter has been updated.$vmr.MDirty: Returns true if a macrobutton has been updated.
example:
$vmr.Getter('Strip[2].Mute')
$vmr.Getter_String('Bus[1].Label')
$vmr.Setter('Strip[4].Label', 'stripname')
$vmr.Setter('Strip[0].Gain', -3.6)
Config Files
$vmr.Set_Profile('config')
You may load config files in psd1 format. An example profile has been included with the package. Remember to save current settings before loading a profile. To test simply rename _profiles directory to profiles. It will be loaded into memory but not set. To set one you may do:
Import-Module Voicemeeter
try {
    $vmr = Get-RemoteBanana
    $vmr.Set_Profile("config")
}
finally { $vmr.Logout() }
will load a config file at profiles/banana/config.psd1 for Voicemeeter Banana.
Run tests
Run tests using .\runall.ps1 which accepts two parameters:
- tag Run tests of this type
 - num Run this number of tests
 
Current test types are 'higher' and 'lower'
Example:
.\runall.ps1 -tag 'higher' -num 3
Results will be logged and summary file written.