7 Commits

Author SHA1 Message Date
4dd01a0e99 add missing help messages
patch bump
2026-03-05 19:59:32 +00:00
cd5b8b0636 upd lockfile 2026-03-03 20:29:04 +00:00
77e21617af increase subheading size 2026-03-03 20:05:26 +00:00
5f448fa48e add Strip Denoiser to README 2026-03-03 16:29:44 +00:00
7eb8dc0bb6 patch bump 2026-03-03 15:55:42 +00:00
81b3841241 annotate optional args as Optional. 2026-03-03 15:13:47 +00:00
6e6a60e9bd remove meta launchers for comp, gate, denoiser. 2026-03-03 15:13:29 +00:00
11 changed files with 88 additions and 101 deletions

View File

@@ -63,7 +63,7 @@ vban-cli strip 2 gain -18.7
see `vban-cli strip --help` for more info.
##### Strip EQ
#### Strip EQ
*Usage: vban-cli strip \<index> eq COMMAND [OPTIONS]*
@@ -75,7 +75,7 @@ vban-cli strip 0 eq on true
see `vban-cli strip eq --help` for more info.
##### Strip EQ Cell Command
#### Strip EQ Cell Command
*Usage: vban-cli strip \<index> eq cell \<band> COMMAND [ARGS]*
@@ -91,7 +91,7 @@ vban-cli strip 4 eq cell 5 type 5
see `vban-cli strip eq cell --help` for more info.
##### Strip Comp Command
#### Strip Comp Command
*Usage: vban-cli strip \<index> comp COMMAND [OPTIONS]*
@@ -105,7 +105,7 @@ vban-cli strip 3 comp auto-makeup true
see `vban-cli strip comp --help` for more info.
##### Strip Gate Command
#### Strip Gate Command
*Usage: vban-cli strip \<index> gate COMMAND [OPTIONS]*
@@ -119,7 +119,19 @@ vban-cli strip 5 gate hold 2088.7
see `vban-cli strip comp --help` for more info.
##### Strip Gainlayer Command
#### Strip Denoiser Command
*Usage: vban-cli strip \<index> denoiser COMMAND [OPTIONS]*
examples:
```console
vban-cli strip 4 denoiser knob 3.6
```
see `vban-cli strip denoiser --help` for more info.
#### Strip Gainlayer Command
*Usage: vban-cli strip \<index> gainlayer \<gainlayer_index> COMMAND [OPTIONS] [ARGS]*

View File

@@ -1,11 +1,11 @@
[project]
name = "vban-cli"
version = "0.12.0"
version = "0.12.2"
description = "A command-line interface for Voicemeeter leveraging VBAN."
readme = "README.md"
license = { text = "LICENSE" }
requires-python = ">=3.13"
dependencies = ["cyclopts>=4.6.0", "loguru>=0.7.3", "vban-cmd>=2.9.1"]
dependencies = ["cyclopts>=4.6.0", "loguru>=0.7.3", "vban-cmd>=2.9.6"]
classifiers = [
"Development Status :: 4 - Beta",
"Programming Language :: Python",

View File

@@ -5,7 +5,11 @@ from cyclopts import App, Parameter
from .context import Context
from .help import BaseHelpFormatter
app = App(name='command', help_formatter=BaseHelpFormatter())
app = App(
name='command',
help='Execute commands that perform actions',
help_formatter=BaseHelpFormatter(),
)
@app.command(name='show')

View File

@@ -1,31 +1,20 @@
from typing import Annotated
from typing import Annotated, Optional
from cyclopts import App, Argument, Parameter
from .context import Context
from .help import StripHelpFormatter
app = App(name='comp', help_formatter=StripHelpFormatter())
@app.meta.default
def launcher(
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
):
"""Control the compressor parameters."""
additional_kwargs = {}
command, bound, _ = app.parse_args(tokens)
additional_kwargs['index'] = index
additional_kwargs['ctx'] = ctx
return command(*bound.args, **bound.kwargs, **additional_kwargs)
app = App(
name='comp',
help='Control the compressor settings',
help_formatter=StripHelpFormatter(),
)
@app.command(name='knob')
def knob(
new_knob: Annotated[float, Argument()] = None,
new_knob: Annotated[Optional[float], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
@@ -34,7 +23,7 @@ def knob(
Parameters
----------
new_knob : int, optional
new_knob : float, optional
If provided, sets the knob to this value. If not provided, the current knob is printed.
"""
if new_knob is None:
@@ -46,7 +35,7 @@ def knob(
@app.command(name='input-gain')
def input_gain(
new_gain: Annotated[float, Argument()] = None,
new_gain: Annotated[Optional[float], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
@@ -67,7 +56,7 @@ def input_gain(
@app.command(name='ratio')
def ratio(
new_ratio: Annotated[float, Argument()] = None,
new_ratio: Annotated[Optional[float], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
@@ -88,7 +77,7 @@ def ratio(
@app.command(name='threshold')
def threshold(
new_threshold: Annotated[float, Argument()] = None,
new_threshold: Annotated[Optional[float], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
@@ -109,7 +98,7 @@ def threshold(
@app.command(name='attack')
def attack(
new_attack: Annotated[float, Argument()] = None,
new_attack: Annotated[Optional[float], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
@@ -130,7 +119,7 @@ def attack(
@app.command(name='release')
def release(
new_release: Annotated[float, Argument()] = None,
new_release: Annotated[Optional[float], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
@@ -151,7 +140,7 @@ def release(
@app.command(name='knee')
def knee(
new_knee: Annotated[float, Argument()] = None,
new_knee: Annotated[Optional[float], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
@@ -172,7 +161,7 @@ def knee(
@app.command(name='output-gain')
def output_gain(
new_gain: Annotated[float, Argument()] = None,
new_gain: Annotated[Optional[float], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
@@ -193,7 +182,7 @@ def output_gain(
@app.command(name='auto-makeup')
def makeup(
new_makeup: Annotated[bool, Argument()] = None,
new_makeup: Annotated[Optional[bool], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],

View File

@@ -1,31 +1,20 @@
from typing import Annotated
from typing import Annotated, Optional
from cyclopts import App, Argument, Parameter
from .context import Context
from .help import StripHelpFormatter
app = App(name='denoiser', help_formatter=StripHelpFormatter())
@app.meta.default
def launcher(
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
):
"""Control the denoiser parameters."""
additional_kwargs = {}
command, bound, _ = app.parse_args(tokens)
additional_kwargs['index'] = index
additional_kwargs['ctx'] = ctx
return command(*bound.args, **bound.kwargs, **additional_kwargs)
app = App(
name='denoiser',
help='Control the denoiser settings',
help_formatter=StripHelpFormatter(),
)
@app.command(name='knob')
def knob(
new_knob: Annotated[float, Argument()] = None,
new_knob: Annotated[Optional[float], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
@@ -34,7 +23,7 @@ def knob(
Parameters
----------
new_knob : int, optional
new_knob : float, optional
If provided, sets the knob to this value. If not provided, the current knob is printed.
"""
if new_knob is None:

View File

@@ -1,4 +1,4 @@
from typing import Annotated
from typing import Annotated, Optional
from cyclopts import App, Argument, Parameter
@@ -35,7 +35,7 @@ def launcher(
@app.command(name='on')
def on(
new_state: Annotated[bool, Argument()] = None,
new_state: Annotated[Optional[bool], Argument()] = None,
*,
target: Annotated[object, Parameter(parse=False)],
):
@@ -43,7 +43,7 @@ def on(
Parameters
----------
new_state : bool
new_state : bool, optional
If provided, sets the on state to this value. If not provided, the current on state is printed.
"""
if new_state is None:
@@ -73,7 +73,7 @@ def cell_launcher(
@cell_app.command(name='on')
def cell_on(
new_state: Annotated[bool, Argument()] = None,
new_state: Annotated[Optional[bool], Argument()] = None,
*,
target: Annotated[object, Parameter(parse=False)],
):
@@ -81,7 +81,7 @@ def cell_on(
Parameters
----------
new_state : bool
new_state : bool, optional
If provided, sets the on state to this value. If not provided, the current on state is printed.
"""
if new_state is None:
@@ -93,7 +93,7 @@ def cell_on(
@cell_app.command(name='freq')
def cell_freq(
new_freq: Annotated[float, Argument()] = None,
new_freq: Annotated[Optional[float], Argument()] = None,
*,
target: Annotated[object, Parameter(parse=False)],
):
@@ -101,7 +101,7 @@ def cell_freq(
Parameters
----------
new_freq : float
new_freq : float, optional
If provided, sets the frequency to this value. If not provided, the current frequency is printed.
"""
if new_freq is None:
@@ -113,7 +113,7 @@ def cell_freq(
@cell_app.command(name='gain')
def cell_gain(
new_gain: Annotated[float, Argument()] = None,
new_gain: Annotated[Optional[float], Argument()] = None,
*,
target: Annotated[object, Parameter(parse=False)],
):
@@ -121,7 +121,7 @@ def cell_gain(
Parameters
----------
new_gain : float
new_gain : float, optional
If provided, sets the gain to this value. If not provided, the current gain is printed.
"""
if new_gain is None:
@@ -133,7 +133,7 @@ def cell_gain(
@cell_app.command(name='quality')
def cell_q(
new_q: Annotated[float, Argument()] = None,
new_q: Annotated[Optional[float], Argument()] = None,
*,
target: Annotated[object, Parameter(parse=False)],
):
@@ -141,7 +141,7 @@ def cell_q(
Parameters
----------
new_q : float
new_q : float, optional
If provided, sets the Q to this value. If not provided, the current Q is printed.
"""
if new_q is None:
@@ -153,7 +153,7 @@ def cell_q(
@cell_app.command(name='type')
def cell_type(
new_type: Annotated[int, Argument()] = None,
new_type: Annotated[Optional[int], Argument()] = None,
*,
target: Annotated[object, Parameter(parse=False)],
):
@@ -161,7 +161,7 @@ def cell_type(
Parameters
----------
new_type : int
new_type : int, optional
If provided, sets the type to this value. If not provided, the current type is printed.
"""
if new_type is None:

View File

@@ -1,4 +1,4 @@
from typing import Annotated
from typing import Annotated, Optional
from cyclopts import App, Argument, Parameter
@@ -28,7 +28,7 @@ def launcher(
@app.command(name='level')
def level(
new_level: Annotated[float, Argument()] = None,
new_level: Annotated[Optional[float], Argument()] = None,
*,
strip_index: Annotated[int, Parameter(parse=False)],
gainlayer_index: Annotated[int, Parameter(parse=False)],
@@ -38,7 +38,7 @@ def level(
Parameters
----------
new_level : float
new_level : float, optional
If provided, sets the level to this value. If not provided, the current level is printed.
"""
if new_level is None:

View File

@@ -1,31 +1,20 @@
from typing import Annotated
from typing import Annotated, Optional
from cyclopts import App, Argument, Parameter
from .context import Context
from .help import StripHelpFormatter
app = App(name='gate', help_formatter=StripHelpFormatter())
@app.meta.default
def launcher(
*tokens: Annotated[str, Parameter(show=False, allow_leading_hyphen=True)],
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
):
"""Control the compressor parameters."""
additional_kwargs = {}
command, bound, _ = app.parse_args(tokens)
additional_kwargs['index'] = index
additional_kwargs['ctx'] = ctx
return command(*bound.args, **bound.kwargs, **additional_kwargs)
app = App(
name='gate',
help='Control the gate settings',
help_formatter=StripHelpFormatter(),
)
@app.command(name='knob')
def knob(
new_knob: Annotated[float, Argument()] = None,
new_knob: Annotated[Optional[float], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
@@ -34,7 +23,7 @@ def knob(
Parameters
----------
new_knob : int, optional
new_knob : float, optional
If provided, sets the knob to this value. If not provided, the current knob is printed.
"""
if new_knob is None:
@@ -46,7 +35,7 @@ def knob(
@app.command(name='threshold')
def threshold(
new_threshold: Annotated[float, Argument()] = None,
new_threshold: Annotated[Optional[float], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
@@ -67,7 +56,7 @@ def threshold(
@app.command(name='damping-max')
def damping_max(
new_damping_max: Annotated[float, Argument()] = None,
new_damping_max: Annotated[Optional[float], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
@@ -88,7 +77,7 @@ def damping_max(
@app.command(name='bp-sidechain')
def bp_sidechain(
new_bp_sidechain: Annotated[float, Argument()] = None,
new_bp_sidechain: Annotated[Optional[float], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
@@ -109,7 +98,7 @@ def bp_sidechain(
@app.command(name='attack')
def attack(
new_attack: Annotated[float, Argument()] = None,
new_attack: Annotated[Optional[float], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
@@ -130,7 +119,7 @@ def attack(
@app.command(name='hold')
def hold(
new_hold: Annotated[float, Argument()] = None,
new_hold: Annotated[Optional[float], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],
@@ -151,7 +140,7 @@ def hold(
@app.command(name='release')
def release(
new_release: Annotated[float, Argument()] = None,
new_release: Annotated[Optional[float], Argument()] = None,
*,
index: Annotated[int, Parameter(parse=False)],
ctx: Annotated[Context, Parameter(parse=False)],

View File

@@ -7,7 +7,11 @@ from . import validation
from .context import Context
from .help import BaseHelpFormatter
app = App(name='recorder', help_formatter=BaseHelpFormatter())
app = App(
name='recorder',
help='Control the recorder playback and recording',
help_formatter=BaseHelpFormatter(),
)
@app.command(name='play')

View File

@@ -8,9 +8,9 @@ from .help import StripHelpFormatter
app = App(name='strip', help_formatter=StripHelpFormatter())
app.command(eq.app.meta, name='eq')
app.command(comp.app.meta, name='comp')
app.command(gate.app.meta, name='gate')
app.command(denoiser.app.meta, name='denoiser')
app.command(comp.app, name='comp')
app.command(gate.app, name='gate')
app.command(denoiser.app, name='denoiser')
app.command(gainlayer.app.meta, name='gainlayer')

4
uv.lock generated
View File

@@ -124,7 +124,7 @@ wheels = [
[[package]]
name = "vban-cli"
version = "0.12.0"
version = "0.12.2"
source = { editable = "." }
dependencies = [
{ name = "cyclopts" },
@@ -141,7 +141,7 @@ requires-dist = [
[[package]]
name = "vban-cmd"
version = "2.9.1"
version = "2.9.6"
source = { editable = "../vban-cmd-python" }
[package.metadata]