From f7e1303270433297ebb5cd2ee460ad7a9748ba52 Mon Sep 17 00:00:00 2001 From: demberto Date: Sat, 18 Mar 2023 17:41:20 +0530 Subject: [PATCH] docs: restructure --- .readthedocs.yaml | 2 +- CHANGELOG.md | 15 ++- docs/architecture/flp-format.rst | 2 +- docs/conf.py | 14 ++- .../plugin/effects/fruity-blood-overdrive.png | Bin 0 -> 56931 bytes docs/reference.rst | 1 + docs/reference/arrangement/arrangement.rst | 14 +++ docs/reference/arrangement/index.rst | 19 +++ docs/reference/arrangement/playlist.rst | 15 +++ .../track.rst} | 44 +------ docs/reference/channel/automation.rst | 13 ++ docs/reference/channel/channel.rst | 17 +++ docs/reference/channel/display-group.rst | 11 ++ docs/reference/channel/index.rst | 20 +++ docs/reference/channel/instrument.rst | 7 ++ docs/reference/channel/layer.rst | 7 ++ docs/reference/channel/sampler.rst | 56 +++++++++ docs/reference/channel/shared.rst | 33 +++++ docs/reference/channels.rst | 117 ------------------ docs/reference/controllers.rst | 4 +- docs/reference/events.rst | 4 +- docs/reference/mixer/index.rst | 22 ++++ .../reference/{mixer.rst => mixer/insert.rst} | 28 ++--- docs/reference/mixer/slot.rst | 14 +++ docs/reference/patterns.rst | 26 ---- docs/reference/patterns/index.rst | 22 ++++ docs/reference/patterns/pattern.rst | 20 +++ docs/reference/plugins.rst | 83 ------------- docs/reference/plugins/effects.rst | 31 +++++ docs/reference/plugins/generators.rst | 7 ++ docs/reference/plugins/index.rst | 28 +++++ docs/reference/plugins/vst.rst | 34 +++++ docs/reference/project.rst | 8 +- docs/reference/timemarkers.rst | 11 +- docs/requirements.txt | 4 +- pyflp/_descriptors.py | 7 +- pyflp/plugin.py | 4 +- requirements.txt | 2 +- 38 files changed, 451 insertions(+), 315 deletions(-) create mode 100644 docs/img/plugin/effects/fruity-blood-overdrive.png create mode 100644 docs/reference/arrangement/arrangement.rst create mode 100644 docs/reference/arrangement/index.rst create mode 100644 docs/reference/arrangement/playlist.rst rename docs/reference/{arrangements.rst => arrangement/track.rst} (54%) create mode 100644 docs/reference/channel/automation.rst create mode 100644 docs/reference/channel/channel.rst create mode 100644 docs/reference/channel/display-group.rst create mode 100644 docs/reference/channel/index.rst create mode 100644 docs/reference/channel/instrument.rst create mode 100644 docs/reference/channel/layer.rst create mode 100644 docs/reference/channel/sampler.rst create mode 100644 docs/reference/channel/shared.rst delete mode 100644 docs/reference/channels.rst create mode 100644 docs/reference/mixer/index.rst rename docs/reference/{mixer.rst => mixer/insert.rst} (55%) create mode 100644 docs/reference/mixer/slot.rst delete mode 100644 docs/reference/patterns.rst create mode 100644 docs/reference/patterns/index.rst create mode 100644 docs/reference/patterns/pattern.rst delete mode 100644 docs/reference/plugins.rst create mode 100644 docs/reference/plugins/effects.rst create mode 100644 docs/reference/plugins/generators.rst create mode 100644 docs/reference/plugins/index.rst create mode 100644 docs/reference/plugins/vst.rst diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 7895618..2d7cd46 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -17,6 +17,6 @@ sphinx: # Optionally declare the Python requirements required to build your docs python: install: - - path: . + - path: . # Required by importlib.version for Sphinx (setuptools_scm) - requirements: docs/requirements.txt - requirements: requirements.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index b19b608..a0413c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## [2.0.0] - 2023-03-18 + +Welcome PyFLP 2.0 🎉 +Read the previous changelogs to get the complete list of changes. + +### Added + +- `FruityBloodOverdrive` - thanks to @@ttaschke [#120]. + +### Changed + +- Docs are way more easier to navigate now. ### Fixed @@ -19,6 +30,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Support for PyPy 3.7 (unable to run tox, cannot find a download). [#113]: https://github.com/demberto/PyFLP/issues/113 +[#120]: https://github.com/demberto/PyFLP/pull/120 ## [2.0.0a7] - 2022-12-19 @@ -629,6 +641,7 @@ Same as in 0.1.1 - `flpinfo` doesn't output correctly sometimes due to long strings. - Extraneous data dumped sometimes by `InsertSlotEvent.Plugin`, why this is caused is not known. +[2.0.0]: https://github.com/demberto/PyFLP/compare/v2.0.0a7.post0...v2.0.0 [2.0.0a7]: https://github.com/demberto/PyFLP/compare/v2.0.0a6...v2.0.0a7 [2.0.0a6]: https://github.com/demberto/PyFLP/compare/v2.0.0a5.post...v2.0.0a6 [2.0.0a5.post]: https://github.com/demberto/PyFLP/compare/v2.0.0a5...v2.0.0a5.post diff --git a/docs/architecture/flp-format.rst b/docs/architecture/flp-format.rst index 2a1f345..9b21354 100644 --- a/docs/architecture/flp-format.rst +++ b/docs/architecture/flp-format.rst @@ -4,7 +4,7 @@ Part I: FLP Format & Events FLP is a binary format used by Image-Line FL Studio, a music production software, to store project files. Instead of using C-style structs entirely, the FLP format has evolved from what once was a MIDI-like format to a really -bad and messy combination of :wikipedia:`type-length-value` encoded "events" +bad and messy combination of :wikipedia:`Type-length-value` encoded "events" and structs. Specification diff --git a/docs/conf.py b/docs/conf.py index 1d6eccb..13361cd 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -22,16 +22,22 @@ from pyflp.arrangement import _TrackColorProp BITLY_LINK = re.compile(r"!\[.*\]\((https://bit\.ly/[A-z0-9]*)\)") +"""Shortened URLs for links to in-docstring images and docs.""" + NEW_IN_FL = re.compile(r"\*New in FL Studio v([^\*]*)\*[\.:](.*)") +"""Matched in docstrings and replaced with an SVG by :meth:`badge_flstudio`.""" + EVENT_ID_DOC = re.compile(r"([0-9\.]*)\+") FL_BADGE = "https://img.shields.io/badge/FL%20Studio-{}+-5f686d?labelColor=ff7629&style=for-the-badge" GHUC_PREFIX = "https://raw.githubusercontent.com/demberto/PyFLP/master/docs/" +"""Raw image URL root used for in-docstring images and docs.""" + IGNORED_BITLY = ["3RDM1yn"] project = "PyFLP" author = "demberto" copyright = f"2022, {author}" -release = importlib.metadata.version("pyflp") +release = importlib.metadata.version("pyflp") # Needs package installation! extensions = [ "hoverxref.extension", "m2r2", # Markdown to reStructuredText conversion @@ -48,7 +54,7 @@ "sphinx.ext.todo", # Items I need to document "sphinx.ext.viewcode", # "Show source" button next to autodoc output "sphinx_toolbox", # Badges and goodies - "sphinx_toolbox.github", + "sphinx_toolbox.github", # Link to project issues / PRs easily "sphinx_toolbox.more_autodoc.autoprotocol", # Autodoc extension for typing.Protocol "sphinx_toolbox.more_autodoc.sourcelink", # Python docs-style source code link "sphinx_toolbox.sidebar_links", # Links to repo and PyPi project in the sidebar @@ -73,9 +79,9 @@ todo_include_todos = True # Include .. todo:: directives in output todo_emit_warnings = True # Emit warnings about it as well, so I don't forget html_css_files = [ - "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css" + "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css" ] # https://sphinx-design.rtfd.io/en/furo-theme/badges_buttons.html#fontawesome-icons -sd_fontawesome_latex = True +sd_fontawesome_latex = True # Output FontAwesome icons in LaTeX intersphinx_mapping = { "python": ("https://docs.python.org/3", None), "construct": ("https://construct.readthedocs.io/en/latest", None), diff --git a/docs/img/plugin/effects/fruity-blood-overdrive.png b/docs/img/plugin/effects/fruity-blood-overdrive.png new file mode 100644 index 0000000000000000000000000000000000000000..7af4b6cfaa6d8dc0b38c9269e313e4747db67d37 GIT binary patch literal 56931 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≺jyX$X$CoD&6Qf?y1w00NJn=@{*4eD|f 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⪼UE|95E~$<4<|W{; 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%0AxbBJheJLrMwjXo~g$QKiB=wF8ETm+-w; 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 JPDHLkV1oNaG#LN@ literal 0 HcmV?d00001 diff --git a/docs/reference.rst b/docs/reference.rst index 591a43c..023e77a 100644 --- a/docs/reference.rst +++ b/docs/reference.rst @@ -7,6 +7,7 @@ :caption: Contents: :glob: + reference/*/index reference/* :material-outlined:`api` API diff --git a/docs/reference/arrangement/arrangement.rst b/docs/reference/arrangement/arrangement.rst new file mode 100644 index 0000000..37e62f9 --- /dev/null +++ b/docs/reference/arrangement/arrangement.rst @@ -0,0 +1,14 @@ +\ :fas:`trowel-bricks` Arrangement +================================== + +.. currentmodule:: pyflp.arrangement + +.. autoclass:: Arrangement + :members: + +.. autoclass:: TimeSignature + :members: + +.. autoclass:: ArrangementID + :members: + :member-order: bysource diff --git a/docs/reference/arrangement/index.rst b/docs/reference/arrangement/index.rst new file mode 100644 index 0000000..60767ef --- /dev/null +++ b/docs/reference/arrangement/index.rst @@ -0,0 +1,19 @@ +Arrangements +============ + +.. module:: pyflp.arrangement + +.. toctree:: + :maxdepth: 2 + :titlesonly: + :caption: Contents: + :glob: + + * + +.. autoclass:: Arrangements + :members: + +.. autoclass:: ArrangementsID + :members: + :member-order: bysource diff --git a/docs/reference/arrangement/playlist.rst b/docs/reference/arrangement/playlist.rst new file mode 100644 index 0000000..4ecebb8 --- /dev/null +++ b/docs/reference/arrangement/playlist.rst @@ -0,0 +1,15 @@ +\ :material-sharp:`playlist_play;1.2em;sd-pb-1` Playlist +======================================================== + +.. currentmodule:: pyflp.arrangement + +.. autoclass:: PLItemBase + :members: + +.. autoclass:: ChannelPLItem + :members: + :show-inheritance: PLItemBase + +.. autoclass:: PatternPLItem + :members: + :show-inheritance: PLItemBase diff --git a/docs/reference/arrangements.rst b/docs/reference/arrangement/track.rst similarity index 54% rename from docs/reference/arrangements.rst rename to docs/reference/arrangement/track.rst index 2714639..d5d928c 100644 --- a/docs/reference/arrangements.rst +++ b/docs/reference/arrangement/track.rst @@ -1,30 +1,7 @@ -Arrangements -============ - -.. module:: pyflp.arrangement -.. autoclass:: Arrangements - :members: - -Arrangement ------------ - -.. autoclass:: Arrangement - :members: - -Playlist --------- - -.. autoclass:: PLItemBase - :members: -.. autoclass:: ChannelPLItem - :members: - :show-inheritance: PLItemBase -.. autoclass:: PatternPLItem - :members: - :show-inheritance: PLItemBase - Track ------ +===== + +.. currentmodule:: pyflp.arrangement .. autoclass:: Track :members: @@ -68,21 +45,6 @@ Track .. image:: /img/arrangement/track/sync.png -Classes -------- - -.. autoclass:: TimeSignature - :members: - -Event IDs ---------- - -.. autoclass:: ArrangementsID - :members: - :member-order: bysource -.. autoclass:: ArrangementID - :members: - :member-order: bysource .. autoclass:: TrackID :members: :member-order: bysource diff --git a/docs/reference/channel/automation.rst b/docs/reference/channel/automation.rst new file mode 100644 index 0000000..57269cf --- /dev/null +++ b/docs/reference/channel/automation.rst @@ -0,0 +1,13 @@ +\ :fas:`bezier-curve` Automation +================================ + +.. currentmodule:: pyflp.channel + +.. autoclass:: Automation + :members: + +.. autoclass:: AutomationLFO + :members: + +.. autoclass:: AutomationPoint + :members: diff --git a/docs/reference/channel/channel.rst b/docs/reference/channel/channel.rst new file mode 100644 index 0000000..0df9e16 --- /dev/null +++ b/docs/reference/channel/channel.rst @@ -0,0 +1,17 @@ +Channel +======= + +.. currentmodule:: pyflp.channel + +.. autoclass:: Channel + :members: + +Enums +----- + +.. autoclass:: ChannelType + :members: + +.. autoclass:: ChannelID + :members: + :member-order: bysource diff --git a/docs/reference/channel/display-group.rst b/docs/reference/channel/display-group.rst new file mode 100644 index 0000000..3717dbe --- /dev/null +++ b/docs/reference/channel/display-group.rst @@ -0,0 +1,11 @@ +DisplayGroup +============ + +.. currentmodule:: pyflp.channel + +.. autoclass:: DisplayGroup + :members: + +.. autoclass:: DisplayGroupID + :members: + :member-order: bysource diff --git a/docs/reference/channel/index.rst b/docs/reference/channel/index.rst new file mode 100644 index 0000000..dcbb709 --- /dev/null +++ b/docs/reference/channel/index.rst @@ -0,0 +1,20 @@ +\ :material-sharp:`dns;1.2em;sd-pb-1` Channel Rack +================================================== + +.. toctree:: + :maxdepth: 2 + :titlesonly: + :caption: Contents: + :glob: + + * + +.. module:: pyflp.channel +.. autoclass:: ChannelRack + :members: + +.. autoclass:: RackID + :members: + :member-order: bysource + +.. autoexception:: ChannelNotFound diff --git a/docs/reference/channel/instrument.rst b/docs/reference/channel/instrument.rst new file mode 100644 index 0000000..31bb353 --- /dev/null +++ b/docs/reference/channel/instrument.rst @@ -0,0 +1,7 @@ +Instrument +========== + +.. currentmodule:: pyflp.channel + +.. autoclass:: Instrument + :members: diff --git a/docs/reference/channel/layer.rst b/docs/reference/channel/layer.rst new file mode 100644 index 0000000..21914f6 --- /dev/null +++ b/docs/reference/channel/layer.rst @@ -0,0 +1,7 @@ +\ :fas:`layer-group` Layer +========================== + +.. currentmodule:: pyflp.channel + +.. autoclass:: Layer + :members: diff --git a/docs/reference/channel/sampler.rst b/docs/reference/channel/sampler.rst new file mode 100644 index 0000000..ffd7a5d --- /dev/null +++ b/docs/reference/channel/sampler.rst @@ -0,0 +1,56 @@ +\ :material-sharp:`audio_file;1.2em;sd-pb-1` Sampler +==================================================== + +.. currentmodule:: pyflp.channel + +.. autoclass:: Sampler + :members: + +.. autoclass:: Content + :members: + +.. autoclass:: Envelope + :members: + +.. autoclass:: Filter + :members: + +.. autoclass:: FX + :members: + +.. autoclass:: Playback + :members: + +.. autoclass:: Reverb + :members: + +.. autoclass:: SamplerLFO + :members: + +.. autoclass:: TimeStretching + :members: + +Enums +----- + +.. autoclass:: DeclickMode + :members: + +.. autoclass:: LFOShape + :members: + +.. autoclass:: ReverbType + :members: + +.. grid:: + + .. grid-item:: + + .. autoclass:: StretchMode + :members: + + .. grid-item:: + :child-align: center + :columns: auto + + .. image:: /img/channel/stretch-mode.png diff --git a/docs/reference/channel/shared.rst b/docs/reference/channel/shared.rst new file mode 100644 index 0000000..030407f --- /dev/null +++ b/docs/reference/channel/shared.rst @@ -0,0 +1,33 @@ +Shared +====== + +.. currentmodule:: pyflp.channel + +These implement functionality used by :class:`Channel` or its subclasses. + +.. autoclass:: Arp + :members: + +.. autoclass:: Delay + :members: + +.. autoclass:: Keyboard + :members: + +.. autoclass:: LevelAdjusts + :members: + +.. autoclass:: Polyphony + :members: + +.. autoclass:: Time + :members: + +.. autoclass:: Tracking + :members: + +Enums +----- + +.. autoclass:: ArpDirection + :members: diff --git a/docs/reference/channels.rst b/docs/reference/channels.rst deleted file mode 100644 index 023fcfa..0000000 --- a/docs/reference/channels.rst +++ /dev/null @@ -1,117 +0,0 @@ -\ :material-regular:`dns;1.2em;sd-pb-1` Channel Rack -==================================================== - -.. module:: pyflp.channel -.. autoclass:: ChannelRack - :members: - -Channel Types -------------- - -.. autoclass:: Channel - :members: -.. autoclass:: Automation - :members: -.. autoclass:: Instrument - :members: -.. autoclass:: Layer - :members: -.. autoclass:: Sampler - :members: -.. autoclass:: DisplayGroup - :members: - -Classes -------- - -These implement functionality used by :class:`Channel` or its subclasses. - -.. autoclass:: Arp - :members: -.. autoclass:: AutomationLFO - :members: -.. autoclass:: AutomationPoint - :members: -.. autoclass:: Content - :members: -.. autoclass:: Delay - :members: -.. autoclass:: Envelope - :members: -.. autoclass:: Filter - :members: -.. autoclass:: FX - :members: -.. autoclass:: Keyboard - :members: -.. autoclass:: LevelAdjusts - :members: -.. autoclass:: SamplerLFO - :members: -.. autoclass:: Polyphony - :members: -.. autoclass:: Playback - :members: -.. autoclass:: Reverb - :members: -.. autoclass:: Time - :members: -.. autoclass:: TimeStretching - :members: -.. autoclass:: Tracking - :members: - -Enumerations ------------- - -.. autosummary:: - :nosignatures: - - ArpDirection - ChannelType - DeclickMode - LFOShape - ReverbType - StretchMode - -.. autoclass:: ArpDirection - :members: -.. autoclass:: ChannelType - :members: -.. autoclass:: DeclickMode - :members: -.. autoclass:: LFOShape - :members: -.. autoclass:: ReverbType - :members: - -.. grid:: - - .. grid-item:: - - .. autoclass:: StretchMode - :members: - - .. grid-item:: - :child-align: center - :columns: auto - - .. image:: /img/channel/stretch-mode.png - -Event IDs ---------- - -.. autoclass:: ChannelID - :members: - :member-order: bysource -.. autoclass:: DisplayGroupID - :members: - :member-order: bysource -.. autoclass:: RackID - :members: - :member-order: bysource - -Exceptions ----------- - -.. autoexception:: ChannelNotFound diff --git a/docs/reference/controllers.rst b/docs/reference/controllers.rst index 037ae8b..9cd66ea 100644 --- a/docs/reference/controllers.rst +++ b/docs/reference/controllers.rst @@ -5,8 +5,8 @@ .. autoclass:: RemoteController :members: -Event IDs ---------- +Enums +----- .. autoclass:: ControllerID :members: diff --git a/docs/reference/events.rst b/docs/reference/events.rst index 900497a..4eec746 100644 --- a/docs/reference/events.rst +++ b/docs/reference/events.rst @@ -1,5 +1,5 @@ -Events -====== +\ :fas:`ellipsis` Events +======================== This section is intended for those who want to delve into PyFLP's low-level API or understand how internally events are ordered. A good understanding diff --git a/docs/reference/mixer/index.rst b/docs/reference/mixer/index.rst new file mode 100644 index 0000000..170fd71 --- /dev/null +++ b/docs/reference/mixer/index.rst @@ -0,0 +1,22 @@ +\ :material-sharp:`settings_input_component;1.2em;sd-pb-1` Mixer +================================================================ + +.. module:: pyflp.mixer + +.. toctree:: + :maxdepth: 2 + :titlesonly: + :caption: Contents: + :glob: + + * + +.. autoclass:: Mixer + :members: + +Enums +----- + +.. autoclass:: MixerID + :members: + :member-order: bysource diff --git a/docs/reference/mixer.rst b/docs/reference/mixer/insert.rst similarity index 55% rename from docs/reference/mixer.rst rename to docs/reference/mixer/insert.rst index f65bd7f..b4063fb 100644 --- a/docs/reference/mixer.rst +++ b/docs/reference/mixer/insert.rst @@ -1,24 +1,19 @@ -Mixer -===== +\ :fas:`sliders` Insert +======================= -.. module:: pyflp.mixer -.. autoclass:: Mixer - :members: - -Classes -------- +.. currentmodule:: pyflp.mixer .. autoclass:: Insert - :members: -.. autoclass:: Slot :members: + .. autoclass:: InsertEQ :members: + .. autoclass:: InsertEQBand :members: -Enumerations ------------- +Enums +----- .. grid:: auto @@ -32,15 +27,6 @@ Enumerations .. image:: /img/mixer/insert/dock.png -Event IDs ---------- - -.. autoclass:: MixerID - :members: - :member-order: bysource .. autoclass:: InsertID :members: :member-order: bysource -.. autoclass:: SlotID - :members: - :member-order: bysource diff --git a/docs/reference/mixer/slot.rst b/docs/reference/mixer/slot.rst new file mode 100644 index 0000000..af61d8e --- /dev/null +++ b/docs/reference/mixer/slot.rst @@ -0,0 +1,14 @@ +\ :fas:`folder-tree` Slot +========================= + +.. currentmodule:: pyflp.mixer + +.. autoclass:: Slot + :members: + +Enums +----- + +.. autoclass:: SlotID + :members: + :member-order: bysource diff --git a/docs/reference/patterns.rst b/docs/reference/patterns.rst deleted file mode 100644 index 03a923a..0000000 --- a/docs/reference/patterns.rst +++ /dev/null @@ -1,26 +0,0 @@ -🎹 Patterns -============ - -.. module:: pyflp.pattern -.. autoclass:: Patterns - :members: - -Classes -------- - -.. autoclass:: Pattern - :members: -.. autoclass:: Controller - :members: -.. autoclass:: Note - :members: - -Event IDs ---------- - -.. autoclass:: PatternsID - :members: - :member-order: bysource -.. autoclass:: PatternID - :members: - :member-order: bysource diff --git a/docs/reference/patterns/index.rst b/docs/reference/patterns/index.rst new file mode 100644 index 0000000..ae5f7be --- /dev/null +++ b/docs/reference/patterns/index.rst @@ -0,0 +1,22 @@ +🎹 Patterns +============ + +.. module:: pyflp.pattern + +.. toctree:: + :maxdepth: 2 + :titlesonly: + :caption: Contents: + :glob: + + * + +.. autoclass:: Patterns + :members: + +Enums +----- + +.. autoclass:: PatternsID + :members: + :member-order: bysource diff --git a/docs/reference/patterns/pattern.rst b/docs/reference/patterns/pattern.rst new file mode 100644 index 0000000..a97c36f --- /dev/null +++ b/docs/reference/patterns/pattern.rst @@ -0,0 +1,20 @@ +Pattern +======= + +.. currentmodule:: pyflp.pattern + +.. autoclass:: Pattern + :members: + +.. autoclass:: Controller + :members: + +.. autoclass:: Note + :members: + +Enums +----- + +.. autoclass:: PatternID + :members: + :member-order: bysource diff --git a/docs/reference/plugins.rst b/docs/reference/plugins.rst deleted file mode 100644 index 7bc82bf..0000000 --- a/docs/reference/plugins.rst +++ /dev/null @@ -1,83 +0,0 @@ -\ :material-sharp:`extension;1.2em;sd-pb-1` Plugins -=================================================== - -.. module:: pyflp.plugin -.. autoclass:: _PluginBase - :members: -.. autoclass:: PluginIOInfo - :members: - -Generators ----------- - -.. autoclass:: BooBass - :members: - -Effects -------- - -.. autoclass:: FruityBalance - :members: -.. autoclass:: FruityBloodOverdrive - :members: -.. autoclass:: FruityCenter - :members: -.. autoclass:: FruityFastDist - :members: -.. autoclass:: FruityNotebook2 - :members: -.. autoclass:: FruitySend - :members: -.. autoclass:: FruitySoftClipper - :members: -.. autoclass:: FruityStereoEnhancer - :members: -.. autoclass:: Soundgoodizer - :members: - -VST ---- - -.. autoclass:: VSTPlugin - :members: - - .. tab-set:: - - .. tab-item:: Settings - - .. image:: /img/plugin/wrapper/settings.png - - .. autoclass:: pyflp.plugin::VSTPlugin._AutomationOptions - :members: - .. autoclass:: pyflp.plugin::VSTPlugin._MIDIOptions - :members: - .. autoclass:: pyflp.plugin::VSTPlugin._UIOptions - :members: - - .. tab-item:: Processing - - .. image:: /img/plugin/wrapper/processing.png - - .. autoclass:: pyflp.plugin::VSTPlugin._ProcessingOptions - :members: - - .. tab-item:: Troubleshooting - - .. image:: /img/plugin/wrapper/troubleshooting.png - - .. autoclass:: pyflp.plugin::VSTPlugin._CompatibilityOptions - :members: - - -Enums ------ - -.. autoclass:: WrapperPage - :members: - -Event IDs ---------- - -.. autoclass:: PluginID - :members: - :member-order: bysource diff --git a/docs/reference/plugins/effects.rst b/docs/reference/plugins/effects.rst new file mode 100644 index 0000000..717de6e --- /dev/null +++ b/docs/reference/plugins/effects.rst @@ -0,0 +1,31 @@ +Effects +======= + +.. currentmodule:: pyflp.plugin + +.. autoclass:: FruityBalance + :members: + +.. autoclass:: FruityBloodOverdrive + :members: + +.. autoclass:: FruityCenter + :members: + +.. autoclass:: FruityFastDist + :members: + +.. autoclass:: FruityNotebook2 + :members: + +.. autoclass:: FruitySend + :members: + +.. autoclass:: FruitySoftClipper + :members: + +.. autoclass:: FruityStereoEnhancer + :members: + +.. autoclass:: Soundgoodizer + :members: diff --git a/docs/reference/plugins/generators.rst b/docs/reference/plugins/generators.rst new file mode 100644 index 0000000..792bc4f --- /dev/null +++ b/docs/reference/plugins/generators.rst @@ -0,0 +1,7 @@ +Generators +========== + +.. currentmodule:: pyflp.plugin + +.. autoclass:: BooBass + :members: diff --git a/docs/reference/plugins/index.rst b/docs/reference/plugins/index.rst new file mode 100644 index 0000000..94ea3c8 --- /dev/null +++ b/docs/reference/plugins/index.rst @@ -0,0 +1,28 @@ +\ :material-sharp:`extension;1.2em;sd-pb-1` Plugins +=================================================== + +.. module:: pyflp.plugin + +.. toctree:: + :maxdepth: 2 + :titlesonly: + :caption: Contents: + :glob: + + * + +.. autoclass:: _PluginBase + :members: + +.. autoclass:: PluginIOInfo + :members: + +Enums +----- + +.. autoclass:: WrapperPage + :members: + +.. autoclass:: PluginID + :members: + :member-order: bysource diff --git a/docs/reference/plugins/vst.rst b/docs/reference/plugins/vst.rst new file mode 100644 index 0000000..1d7ba5d --- /dev/null +++ b/docs/reference/plugins/vst.rst @@ -0,0 +1,34 @@ +VST +=== + +.. currentmodule:: pyflp.plugin + +.. autoclass:: VSTPlugin + :members: + + .. tab-set:: + + .. tab-item:: Settings + + .. image:: /img/plugin/wrapper/settings.png + + .. autoclass:: pyflp.plugin::VSTPlugin._AutomationOptions + :members: + .. autoclass:: pyflp.plugin::VSTPlugin._MIDIOptions + :members: + .. autoclass:: pyflp.plugin::VSTPlugin._UIOptions + :members: + + .. tab-item:: Processing + + .. image:: /img/plugin/wrapper/processing.png + + .. autoclass:: pyflp.plugin::VSTPlugin._ProcessingOptions + :members: + + .. tab-item:: Troubleshooting + + .. image:: /img/plugin/wrapper/troubleshooting.png + + .. autoclass:: pyflp.plugin::VSTPlugin._CompatibilityOptions + :members: diff --git a/docs/reference/project.rst b/docs/reference/project.rst index dc8b095..fe7836c 100644 --- a/docs/reference/project.rst +++ b/docs/reference/project.rst @@ -46,19 +46,17 @@ .. image:: /img/project/settings.png :align: right -Enumerations ------------- +Enums +----- .. autoclass:: FileFormat :members: :member-order: bysource + .. autoclass:: PanLaw :members: :member-order: bysource -Event IDs ---------- - .. autoclass:: ProjectID :members: :member-order: bysource diff --git a/docs/reference/timemarkers.rst b/docs/reference/timemarkers.rst index dd8adab..6e1b8e9 100644 --- a/docs/reference/timemarkers.rst +++ b/docs/reference/timemarkers.rst @@ -1,10 +1,14 @@ -Timemarkers -=========== +\ :fas:`timeline` Timemarkers +============================= .. module:: pyflp.timemarker + .. autoclass:: TimeMarker :members: +Enums +----- + .. grid:: .. grid-item:: @@ -18,9 +22,6 @@ Timemarkers .. image:: /img/arrangement/timemarker/action.png -Event IDs ---------- - .. autoclass:: TimeMarkerID :members: :member-order: bysource diff --git a/docs/requirements.txt b/docs/requirements.txt index fdeb673..d4b1f0e 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,8 +1,8 @@ furo m2r2==0.3.2 # https://github.com/CrossNox/m2r2/issues/55 -sphinx +sphinx==5.3.0 sphinx-copybutton -sphinx-design +sphinx-design==0.3.0 sphinx-hoverxref sphinx-toolbox>=3.4.0 sphinxcontrib-spelling diff --git a/pyflp/_descriptors.py b/pyflp/_descriptors.py index c024921..c322188 100644 --- a/pyflp/_descriptors.py +++ b/pyflp/_descriptors.py @@ -29,6 +29,11 @@ else: from typing_extensions import Protocol, final, runtime_checkable +if sys.version_info >= (3, 10): + from typing import TypeAlias +else: + from typing_extensions import TypeAlias + import construct as c import construct_typed as ct @@ -238,7 +243,7 @@ def _set(self, ev_or_ins: ItemModel[Any], value: T) -> None: ev_or_ins[self._prop] = value -SimpleAdapter = ct.Adapter[T, T, U, U] +SimpleAdapter: TypeAlias = ct.Adapter[T, T, U, U] """Duplicates type parameters for `construct.Adapter`.""" diff --git a/pyflp/plugin.py b/pyflp/plugin.py index f353d7f..ef719b4 100644 --- a/pyflp/plugin.py +++ b/pyflp/plugin.py @@ -651,7 +651,7 @@ class _ProcessingOptions(EventModel): """ class _UIOptions(EventModel): - """See :attr:`VSTPlugin.ui`.. + """See :attr:`VSTPlugin.ui`. ![](https://bit.ly/3Nb3dtP) """ @@ -772,7 +772,7 @@ class FruityBalance(_PluginBase[FruityBalanceEvent], _IPlugin, ModelReprMixin): class FruityBloodOverdrive( _PluginBase[FruityBloodOverdriveEvent], _IPlugin, ModelReprMixin ): - """![]()""" # noqa + """![](https://bit.ly/3LnS1LE)""" INTERNAL_NAME = "Fruity Blood Overdrive" diff --git a/requirements.txt b/requirements.txt index f1a009f..02db12a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ colour==0.1.5 -construct-typing==0.5.3 +construct-typing==0.5.5 f-enum==0.2.0;python_version<="3.10" sortedcontainers==2.4.0 typing_extensions==4.5.0