diff --git a/docs/reference/plugins.rst b/docs/reference/plugins.rst index 6d46344..68de6df 100644 --- a/docs/reference/plugins.rst +++ b/docs/reference/plugins.rst @@ -35,6 +35,8 @@ Effects .. autoclass:: FruityBalance :members: +.. autoclass:: FruityBloodOverdrive + :members: .. autoclass:: FruityFastDist :members: .. autoclass:: FruityNotebook2 diff --git a/pyflp/mixer.py b/pyflp/mixer.py index 774b1c9..344a4d4 100644 --- a/pyflp/mixer.py +++ b/pyflp/mixer.py @@ -68,6 +68,8 @@ from .plugin import ( FruityBalance, FruityBalanceEvent, + FruityBloodOverdrive, + FruityBloodOverdriveEvent, FruityFastDist, FruityFastDistEvent, FruityNotebook2, @@ -385,6 +387,7 @@ def __index__(self) -> int: VSTPluginEvent: VSTPlugin, FruityBalanceEvent: FruityBalance, FruityFastDistEvent: FruityFastDist, + FruityBloodOverdriveEvent: FruityBloodOverdrive, FruityNotebook2Event: FruityNotebook2, FruitySendEvent: FruitySend, FruitySoftClipperEvent: FruitySoftClipper, diff --git a/pyflp/plugin.py b/pyflp/plugin.py index d36ea8a..0c9bfc0 100644 --- a/pyflp/plugin.py +++ b/pyflp/plugin.py @@ -44,6 +44,7 @@ __all__ = [ "BooBass", "FruityBalance", + "FruityBloodOverdrive", "FruityFastDist", "FruityFastDistKind", "FruityNotebook2", @@ -67,6 +68,23 @@ class _FruityBalanceStruct(StructBase): PROPS = {"pan": "I", "volume": "I"} +class _FruityBloodOverdriveStruct(StructBase): + PROPS = dict.fromkeys( + ( + "plugin_marker", + "pre_band", + "color", + "pre_amp", + "x100", + "post_filter", + "post_gain", + "_u1", + "_u2", + ), + "I", + ) + + class _FruityFastDistStruct(StructBase): PROPS = dict.fromkeys(("pre", "threshold", "kind", "mix", "post"), "I") @@ -113,6 +131,10 @@ class FruityBalanceEvent(StructEventBase): STRUCT = _FruityBalanceStruct +class FruityBloodOverdriveEvent(StructEventBase): + STRUCT = _FruityBloodOverdriveStruct + + class FruityFastDistEvent(StructEventBase): STRUCT = _FruityFastDistStruct @@ -450,6 +472,80 @@ class FruityBalance(_PluginBase[FruityBalanceEvent], _IPlugin, ModelReprMixin): """ +class FruityBloodOverdrive( + _PluginBase[FruityBloodOverdriveEvent], _IPlugin, ModelReprMixin +): + """![]()""" # noqa + + INTERNAL_NAME = "Fruity Blood Overdrive" + + plugin_marker = _PluginDataProp[int]() # 3 + + pre_band = _PluginDataProp[int]() + """Linear. + + | Type | Value | Representation | + |---------|-------|----------------| + | Min | 0 | 0.0000 | + | Max | 10000 | 1.0000 | + | Default | 0 | 0.0000 | + """ + + color = _PluginDataProp[int]() + """Linear. + + | Type | Value | Representation | + |---------|-------|----------------| + | Min | 0 | 0.0000 | + | Max | 10000 | 1.0000 | + | Default | 5000 | 0.5000 | + + """ + + pre_amp = _PluginDataProp[int]() + """Linear. + + | Type | Value | Representation | + |---------|-------|----------------| + | Min | 0 | 0.0000 | + | Max | 10000 | 1.0000 | + | Default | 0 | 0.0000 | + """ + + x100 = _PluginDataProp[bool]() + """Boolean. + + | Type | Value | Representation | + |---------|-------|----------------| + | Off | 0 | Off | + | On | 1 | On | + | Default | 0 | Off | + """ + + post_filter = _PluginDataProp[int]() + """Linear. + + | Type | Value | Representation | + |---------|-------|----------------| + | Min | 0 | 0.0000 | + | Max | 10000 | 1.0000 | + | Default | 0 | 0.0000 | + """ + + post_gain = _PluginDataProp[int]() + """Linear. + + | Type | Value | Representation | + |---------|-------|----------------| + | Min | 0 | -1.0000 | + | Max | 10000 | 0.0000 | + | Default | 10000 | 0.0000 | + """ + + _u1 = _PluginDataProp[int]() + _u2 = _PluginDataProp[int]() + + @enum.unique class FruityFastDistKind(enum.IntEnum): """Used by :attr:`FruityFastDist.kind`.""" diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 625671d..87545db 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -8,6 +8,7 @@ from pyflp.plugin import ( AnyPlugin, FruityBalance, + FruityBloodOverdrive, FruityFastDist, FruityFastDistKind, FruitySend, @@ -23,7 +24,7 @@ @pytest.fixture(scope="session") def plugins(inserts: tuple[Insert, ...]): - return [slot.plugin for slot in inserts[19]][:7] + return [slot.plugin for slot in inserts[19]][:8] def test_plugin_types(plugins: tuple[AnyPlugin, ...]): @@ -35,6 +36,7 @@ def test_plugin_types(plugins: tuple[AnyPlugin, ...]): FruityStereoEnhancer, Soundgoodizer, VSTPlugin, + FruityBloodOverdrive, ] @@ -91,3 +93,13 @@ def test_vst_plugin(plugins: tuple[AnyPlugin, ...]): with pytest.raises(KeyError): ott.fourcc + + +def test_fruity_blood_overdrive(plugins: tuple[AnyPlugin, ...]): + fruity_blood_overdrive = cast(FruityBloodOverdrive, plugins[7]) + print(plugins[7].color) + 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