diff --git a/docs/reference/plugins.rst b/docs/reference/plugins.rst index 7499c3f..7bc82bf 100644 --- a/docs/reference/plugins.rst +++ b/docs/reference/plugins.rst @@ -18,6 +18,8 @@ Effects .. autoclass:: FruityBalance :members: +.. autoclass:: FruityBloodOverdrive + :members: .. autoclass:: FruityCenter :members: .. autoclass:: FruityFastDist diff --git a/pyflp/mixer.py b/pyflp/mixer.py index 38f8233..3ee0f51 100644 --- a/pyflp/mixer.py +++ b/pyflp/mixer.py @@ -72,6 +72,7 @@ from .exceptions import ModelNotFound, NoModelsFound, PropertyCannotBeSet from .plugin import ( FruityBalance, + FruityBloodOverdrive, FruityCenter, FruityFastDist, FruityNotebook2, @@ -399,6 +400,7 @@ def __repr__(self) -> str: plugin = PluginProp( VSTPlugin, FruityBalance, + FruityBloodOverdrive, FruityCenter, FruityFastDist, FruityNotebook2, diff --git a/pyflp/plugin.py b/pyflp/plugin.py index a5d51a2..f353d7f 100644 --- a/pyflp/plugin.py +++ b/pyflp/plugin.py @@ -48,6 +48,7 @@ __all__ = [ "BooBass", "FruityBalance", + "FruityBloodOverdrive", "FruityFastDist", "FruityNotebook2", "FruitySend", @@ -88,6 +89,21 @@ class FruityBalanceEvent(StructEventBase): STRUCT = c.Struct("pan" / c.Int32ul, "volume" / c.Int32ul).compile() +class FruityBloodOverdriveEvent(StructEventBase): + STRUCT = c.Struct( + "plugin_marker" + / c.If(c.this._.len == 36, c.Bytes(4)), # redesigned native plugin marker + "pre_band" / c.Int32ul, + "color" / c.Int32ul, + "pre_amp" / c.Int32ul, + "x100" / FourByteBool, + "post_filter" / c.Int32ul, + "post_gain" / c.Int32ul, + "_u1" / c.Bytes(4), + "_u2" / c.Bytes(4), + ).compile() + + class FruityCenterEvent(StructEventBase): STRUCT = c.Struct( "_u1" / c.If(c.this._.len == 8, c.Bytes(4)), @@ -753,6 +769,74 @@ class FruityBalance(_PluginBase[FruityBalanceEvent], _IPlugin, ModelReprMixin): """ +class FruityBloodOverdrive( + _PluginBase[FruityBloodOverdriveEvent], _IPlugin, ModelReprMixin +): + """![]()""" # noqa + + INTERNAL_NAME = "Fruity Blood Overdrive" + + pre_band = _NativePluginProp[int]() + """Linear. + + | Type | Value | Representation | + |---------|-------|----------------| + | Min | 0 | 0.0000 | + | Max | 10000 | 1.0000 | + | Default | 0 | 0.0000 | + """ + + color = _NativePluginProp[int]() + """Linear. + + | Type | Value | Representation | + |---------|-------|----------------| + | Min | 0 | 0.0000 | + | Max | 10000 | 1.0000 | + | Default | 5000 | 0.5000 | + """ + + pre_amp = _NativePluginProp[int]() + """Linear. + + | Type | Value | Representation | + |---------|-------|----------------| + | Min | 0 | 0.0000 | + | Max | 10000 | 1.0000 | + | Default | 0 | 0.0000 | + """ + + x100 = _NativePluginProp[bool]() + """Boolean. + + | Type | Value | Representation | + |---------|-------|----------------| + | Off | 0 | Off | + | On | 1 | On | + | Default | 0 | Off | + """ + + post_filter = _NativePluginProp[int]() + """Linear. + + | Type | Value | Representation | + |---------|-------|----------------| + | Min | 0 | 0.0000 | + | Max | 10000 | 1.0000 | + | Default | 0 | 0.0000 | + """ + + post_gain = _NativePluginProp[int]() + """Linear. + + | Type | Value | Representation | + |---------|-------|----------------| + | Min | 0 | -1.0000 | + | Max | 10000 | 0.0000 | + | Default | 10000 | 0.0000 | + """ + + class FruityCenter(_PluginBase[FruityCenterEvent], _IPlugin, ModelReprMixin): """![](https://bit.ly/3TA9IIv)""" diff --git a/tests/assets/plugins/fruity-blood-overdrive.fst b/tests/assets/plugins/fruity-blood-overdrive.fst new file mode 100644 index 0000000..6def34f Binary files /dev/null and b/tests/assets/plugins/fruity-blood-overdrive.fst differ diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 46561f7..479de80 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -5,6 +5,7 @@ from pyflp.plugin import ( AnyPlugin, FruityBalance, + FruityBloodOverdrive, FruityCenter, FruityFastDist, FruitySend, @@ -31,6 +32,17 @@ def test_fruity_balance(): assert fruity_balance.pan == 0 +def test_fruity_blood_overdrive(): + fruity_blood_overdrive = get_plugin( + "fruity-blood-overdrive.fst", FruityBloodOverdrive + ) + assert fruity_blood_overdrive.pre_band == 0 + assert fruity_blood_overdrive.color == 5000 + assert fruity_blood_overdrive.pre_amp == 0 + assert fruity_blood_overdrive.x100 == 0 + assert fruity_blood_overdrive.post_filter == 0 + + def test_fruity_center(): fruity_center = get_plugin("fruity-center.fst", FruityCenter) assert not fruity_center.enabled