Compare commits

...

7 Commits

Author SHA1 Message Date
3119b1080e make help output a console block 2026-01-20 15:33:46 +00:00
a45f7a93af add -help option to help message 2026-01-20 15:31:03 +00:00
0e552873f0 rename input variable 2026-01-20 13:35:53 +00:00
3d87f5c03f fix interactive prompt 2026-01-20 13:20:43 +00:00
aaa4672cbc fix 2026-01-20 13:12:38 +00:00
f5dead51df fix 2026-01-20 13:12:20 +00:00
259c7309dc update CLI example 2026-01-20 13:08:43 +00:00
2 changed files with 124 additions and 65 deletions

View File

@ -1,5 +1,22 @@
<#
.SYNOPSIS
Command Line Interface for Voicemeeter control.
.DESCRIPTION
This script provides a command line interface to interact with Voicemeeter. It supports both interactive mode and scripted commands.
Users can specify the type of Voicemeeter (banana or potato) and execute commands to get or set parameters.
.PARAMETER help
Displays help information.
.PARAMETER interactive
Starts the CLI in interactive mode.
.PARAMETER kind
Specifies the type of Voicemeeter to connect to (banana or potato). Default is 'banana'.
.PARAMETER script
A list of commands to execute in sequence.
#>
[cmdletbinding()]
param(
[switch]$help,
[switch]$interactive,
[String]$kind = 'banana',
[String[]]$script = @()
@ -7,62 +24,99 @@ param(
Import-Module ..\..\lib\Voicemeeter.psm1
function get-value {
param([object]$vmr, [string]$line)
if ($help -or ($script.Count -eq 0 -and -not $interactive)) {
Write-Host 'Voicemeeter CLI'
Write-Host ''
Write-Host 'Usage:'
Write-Host ' CLI.ps1 [-interactive] [-kind <basic|banana|potato>] [-script <command1>, <command2>, ...]'
Write-Host ''
Write-Host 'Options:'
Write-Host ' -help Display this help message.'
Write-Host ' -interactive Start in interactive mode.'
Write-Host ' -kind <type> Specify the Voicemeeter type (basic, banana or potato). Default is banana.'
Write-Host ' -script <commands> Provide a list of commands to execute in sequence.'
Write-Host ''
Write-Host 'Commands can be of the form:'
Write-Host ' Parameter=Value Set a parameter to a specific value.'
Write-Host ' !Parameter Toggle a boolean parameter.'
Write-Host ' Parameter Get the current value of a parameter.'
exit 0
}
function Get-ParameterValue {
param(
[object]$vmr,
[string]$Parameter
)
try {
$retval = $vmr.Getter($line)
$retval = $vmr.Getter($Parameter)
}
catch {
$retval = $vmr.Getter_String($line)
$retval = $vmr.Getter_String($Parameter)
}
$retval
}
function msgHandler {
param([object]$vmr, [string]$line)
$line + ' passed to handler' | Write-Debug
if ($line[0] -eq '!') {
'Toggling ' + $line.substring(1) | Write-Debug
$retval = get-value -vmr $vmr -line $line.substring(1)
$vmr.Setter($line.substring(1), 1 - $retval)
function Invoke-VoicemeeterCLICommand {
param(
[object]$vmr,
[string]$Command
)
# Toggle command
if ($Command[0] -eq '!') {
$parameter = $Command.Substring(1).Trim()
$currentValue = Get-ParameterValue -vmr $vmr -Parameter $parameter
if ($currentValue -ne 0 -and $currentValue -ne 1) {
throw "Cannot toggle non-boolean parameter '$parameter' with value '$currentValue'"
}
elseif ($line.Contains('=')) {
"Setting $line" | Write-Debug
$vmr.SendText($line)
$newValue = 1 - $currentValue
$vmr.SendText("$parameter=$newValue")
Write-Host "Toggled $parameter to $newValue"
}
# Set command
elseif ($Command.Contains('=')) {
$vmr.SendText("$Command")
Write-Host "Set $Command"
}
# Get command
else {
"Getting $line" | Write-Debug
$retval = get-value -vmr $vmr -line $line
$line + ' = ' + $retval | Write-Host
$parameter = $Command.Trim()
$value = Get-ParameterValue -vmr $vmr -Parameter $parameter
Write-Host "$parameter = $value"
}
}
function read-hostuntilempty {
param([object]$vmr)
while (($line = Read-Host) -cne [string]::Empty) { msgHandler -vmr $vmr -line $line }
}
function main {
function Start-VoicemeeterCLI {
param(
[object]$vmr
)
Write-Host "Connected to Voicemeeter. Type 'Q' to quit." -ForegroundColor Green
while (($CommandFromInput = Read-Host 'command') -ne 'Q') {
try {
Invoke-VoicemeeterCLICommand -vmr $vmr -Command $CommandFromInput
}
catch {
Write-Host "Error: $_" -ForegroundColor Red
}
}
}
try {
$vmr = Connect-Voicemeeter -Kind $kind
if ($interactive) {
'Press <Enter> to exit' | Write-Host
read-hostuntilempty -vmr $vmr
return
Start-VoicemeeterCLI -vmr $vmr
}
if ($script.Count -eq 0) {
'No script provided, exiting' | Write-Host
return
else {
foreach ($command in $script) {
Invoke-VoicemeeterCLICommand -vmr $vmr -Command $command
}
$script | ForEach-Object {
msgHandler -vmr $vmr -line $_
}
}
finally { Disconnect-Voicemeeter }
}
main

View File

@ -1,34 +1,39 @@
## About
A simple voicemeeter-cli script. Offers ability to toggle, get and set parameters.
A basic command-line interface
## Use
Toggle with `!` prefix, get by excluding `=` and set by including `=`. Mix and match arguments.
```console
Voicemeeter CLI
You may pass the following optional flags:
Usage:
CLI.ps1 [-interactive] [-kind <basic|banana|potato>] [-script <command1>, <command2>, ...]
- -o: (-output) to toggle console output.
- -i: (-interactive) to toggle interactive mode.
- -k: (-kind) to set the kind of Voicemeeter. Defaults to banana.
- -s: (script) a string array, one string for each command.
Options:
-help Display this help message.
-interactive Start in interactive mode.
-kind <type> Specify the Voicemeeter type (basic, banana or potato). Default is banana.
-script <commands> Provide a list of commands to execute in sequence.
Commands can be of the form:
Parameter=Value Set a parameter to a specific value.
!Parameter Toggle a boolean parameter.
Parameter Get the current value of a parameter.
```
for example:
```powershell
.\CLI.ps1 -o -k "banana" -s "strip[0].mute", "!strip[0].mute", "strip[0].mute", "bus[2].eq.on=1", "command.lock=1"
.\CLI.ps1 -script strip[0].mute, !strip[0].mute, strip[0].mute, bus[2].eq.on=1, command.lock=1
```
Expected output:
should produce the output:
```powershell
Getting strip[0].mute
strip[0].mute = 0
Toggling strip[0].mute
Getting strip[0].mute
```console
strip[0].mute = 1
Setting bus[2].eq.on=1
Setting command.lock=1
Toggled strip[0].mute to 0
strip[0].mute = 0
Set bus[2].eq.on=1
Set command.lock=1
```
If running in interactive mode press `<Enter>` to exit.