12 KiB
Powershell Wrapper for Voicemeeter API
This module offers a Powershell interface for the Voicemeeter Remote C API.
For past/future changes to this project refer to: CHANGELOG
Tested against
- Basic 1.0.8.8
- Banana 2.0.6.8
- Potato 3.0.2.8
Requirements
- Voicemeeter
- Powershell 5.1+ or Powershell 7.2+
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
Script files
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
Added in v3
you may also use the following entry/exit points:
- Connect-Voicemeeter
- Disconnect-Voicemeeter
Connect-Voicemeeter
takes a single parameter Kind
.
for example:
$vmr = Connect-Voicemeeter -Kind "potato"
...
Disconnect-Voicemeeter
Through the Shell
One liners should be run through a subshell, you may pipe the Remote object to a script block, for example:
powershell { Get-RemoteBanana | % { $_.strip[0].mute=$true; $_.Logout() } }
You may also save the object returned by a factory function to a local variable, then invoke any commands through the shell, for example:
$vmr = Get-RemoteBanana
$vmr.strip[0].mute=1
$vmr.strip[0].mute
$vmr.Logout()
Strip
The following strip commands are available:
- mute: bool
- mono: bool
- mc: bool
- k: int, from 0 to 4
- solo: bool
- A1-A5: bool
- B1-B3: bool
- limit: int, from -40 to 12
- gain: float, from -60.0 to 12.0
- label: string
- reverb: float, from 0.0 to 10.0
- delay: float, from 0.0 to 10.0
- fx1: 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_y: float, from 0.0 to 1.0
- color_x: float, from -0.5 to 0.5
- color_y: float, from 0.0 to 1.0
- fx_x: float, from -0.5 to 0.5
- fx_y: float, from 0.0 to 1.0
- postreverb: bool
- postdelay: bool
- postfx1: bool
- postfx2: bool
- gainlayer0-gainlayer7: float
for example:
$vmr.strip[5].gainlayer1 = -8.3
A,B commands depend on Voicemeeter type.
gainlayers defined for Potato version only.
mc, k for virtual strips only.
comp
The following strip.comp commands are available:
- knob: float, from 0.0 to 10.0
- gainin: float, from -24.0 to 24.0
- ratio: float, from 1.0 to 8.0
- threshold: float, from -40.0 to -3.0
- attack: float, from 0.0 to 200.0
- release: float, from 0.0 to 5000.0
- knee: float, 0.0 to 1.0
- gainout: float, from -24.0 to 24.0
- makeup: bool
for example:
$vmr.strip[3].comp.attack = 8.5
gate
The following strip.gate commands are available:
- knob: float, from 0.0 to 10.0
- threshold: float, from -60.0 to -10.0
- damping: float, from -60.0 to -10.0
- bpsidechain: int, from 100 to 4000
- attack: float, from 0.0 to 1000.0
- hold: float, from 0.0 to 5000.0
- release: float, from 0.0 to 5000.0
for example:
$vmr.strip[3].gate.threshold = -40.5
denoiser
The following strip.denoiser commands are available:
- knob: float, from 0.0 to 10.0
for example:
$vmr.strip[3].denoiser.knob = 5
AppGain | AppMute
AppGain(amount, gain)
: string, floatAppMute(amount, mutestate)
: string, bool
for example:
$vmr.strip[5].AppGain("Spotify", 0.5)
$vmr.strip[5].AppMute("Spotify", $true)
levels
The following strip.level commands are available:
- PreFader()
- PostFader()
- PostMute()
for example:
$vmr.strip[2].levels.PreFader() -Join ', ' | Write-Host
Bus
The following bus commands are available:
- mute: bool
- mono: bool
- limit: int, from -40 to 12
- gain: float, from -60.0 to 12.0
- label: string
- returnreverb: float, from 0.0 to 10.0
- returndelay: float, from 0.0 to 10.0
- returnfx1: float, from 0.0 to 10.0
- returnfx2: float, from 0.0 to 10.0
for example:
$vmr.bus[3].returnreverb = 5.7
modes
The following bus.mode members are available:
- normal: bool
- amix: bool
- bmix: bool
- repeat: bool
- composite: bool
- tvmix: bool
- upmix21: bool
- upmix41: bool
- upmix61: bool
- centeronly: bool
- lfeonly: bool
- rearonly: bool
The following bus.mode commands are available:
- Get(): returns the current bus mode.
for example:
$vmr.bus[0].mode.centeronly = $true
$vmr.bus[0].mode.Get()
levels
The following strip.level commands are available:
- All()
for example:
$vmr.bus[2].levels.All() -Join ', ' | Write-Host
Strip|Bus
device
The following strip.device | bus.device commands are available:
- name: string
- sr: int
- wdm: string
- ks: string
- mme: string
- asio: string
for example:
$vmr.strip[0].device.wdm = "Mic|Line|Instrument 1 (Audient EVO4)"
$vmr.bus[0].device.name
name, sr are defined as read only. wdm, ks, mme, asio are defined as write only.
eq
The following strip.eq | bus.eq commands are available:
- on: bool
- ab: bool
for example:
$vmr.strip[0].eq.on = $true
$vmr.bus[0].eq.ab = $false
FadeTo | FadeBy
FadeTo(amount, time)
: float, intFadeBy(amount, time)
: float, int
Modify gain to or by the selected amount in db over a time interval in ms.
for example:
$vmr.strip[3].FadeTo(-18.7, 1000)
$vmr.bus[0].FadeBy(-10, 500)
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 bool value.
For each vban in/out stream the following parameters are defined:
- on: bool
- name: string
- ip: string
- port: int, from 1024 - 65535
- sr: in, (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 commands are available:
- show
- hide
- restart
- shutdown
- showvbanchat: bool, (write only)
- lock: bool, (write only)
The following methods are available:
- Load($filepath): string
example:
$vmr.command.show
$vmr.command.lock = $true
$vmr.command.Load("path/to/filename.xml")
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:
- Load($filepath): string
- GoTo($timestring): string, must match the format 'hh:mm:ss'
- FileType($format): string, ('wav', 'aiff', 'bwf', 'mp3')
example:
$vmr.recorder.play
$vmr.recorder.A1 = $true
$vmr.recorder.GoTo("00:01:15") # go to 1min 15sec into track
Mode
The following commands are available:
- recbus
- playonload
- loop
- multitrack
example:
$vmr.recorder.mode.loop = $true
ArmStrip[i]|ArmBus[i]
The following method is available:
- Set($val): bool
example:
$vmr.recorder.armstrip[0].Set($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() }
Config Files
$vmr.Set_Profile(<configname>)
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.
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.
$vmr.Getter('Strip[2].Mute')
$vmr.Getter_String('Bus[1].Label')
$vmr.Setter('Strip[4].Label', 'stripname')
$vmr.Setter('Strip[0].Gain', -3.6)
$vmr.SendText
: Set parameters by script
$vmr.SendText("strip[0].mute=1;strip[2].gain=3.8;bus[1].eq.On=1")
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.
Run tests
Run tests using .\tests\pre-commit.ps1 which accepts the following parameters:
kind
: Run tests of this kindtag
: Run tests tagged with this marker (currentlyhigher
orlower
)num
: Run this number of testslog
: Write summary log file
Run tests from repository root in a subshell and write logs, like so:
powershell .\tests\pre-commit.ps1 -k "potato" -t "higher" -log