Metadata-Version: 2.1
Name: pyflp
Version: 2.0.0a3
Summary: FL Studio project file parser
Author-email: demberto <demberto@protonmail.com>
License: GPL-3.0
Project-URL: Source, https://github.com/demberto/PyFLP
Project-URL: Changelog, https://github.com/demberto/PyFLP/blob/master/CHANGELOG.md
Project-URL: Documentation, https://pyflp.rtfd.io
Project-URL: Bug Tracker, https://github.com/demberto/PyFLP/issues
Classifier: Development Status :: 3 - Alpha
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Requires-Python: >=3.7
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: colour (>=0.1.5)
Requires-Dist: construct-typing (>=0.5.2)
Requires-Dist: typing-extensions (>=4.3.0)

# PyFLP

PyFLP is an unofficial parser for [FL Studio](https://www.image-line.com/fl-studio/)
project and preset files written in Python.

<!-- SHIELDS -->
<!-- markdownlint-disable -->
<table>
  <colgroup>
    <col style="width: 10%;"/>
    <col style="width: 90%;"/>
  </colgroup>
  <tbody>
    <tr>
      <th>CI</th>
      <td>
        <img alt="build" src="https://img.shields.io/github/workflow/status/demberto/pyflp/main"/>
        <a href="https://pyflp.readthedocs.io/en/latest/">
          <img alt="Documentation Build Status" src="https://img.shields.io/readthedocs/pyflp/latest?logo=read-the-docs"/>
        </a>
        <a href="https://results.pre-commit.ci/latest/github/demberto/PyFLP/master">
          <img alt="pre-commit-ci" src="https://results.pre-commit.ci/badge/github/demberto/PyFLP/master.svg"/>
        </a>
      </td>
    </tr>
    <tr>
      <th>PyPI</th>
      <td>
        <a href="https://pypi.org/project/PyFLP">
          <img alt="PyPI - Package Version" src="https://img.shields.io/pypi/v/PyFLP"/>
        </a>
        <a href="https://pypi.org/project/PyFLP">
          <img alt="PyPI - Supported Python Versions" src="https://img.shields.io/pypi/pyversions/PyFLP?logo=python&amp;logoColor=white"/>
        </a>
        <a href="https://pypi.org/project/PyFLP">
          <img alt="PyPI - Supported Implementations" src="https://img.shields.io/pypi/implementation/PyFLP"/>
        </a>
        <a href="https://pypi.org/project/PyFLP">
          <img alt="PyPI - Wheel" src="https://img.shields.io/pypi/wheel/PyFLP"/>
        </a>
      </td>
    </tr>
    <tr>
      <th>Activity</th>
      <td>
        <img alt="Maintenance" src="https://img.shields.io/maintenance/yes/2022"/>
        <a href="https://pypistats.org/packages/pyflp">
          <img alt="PyPI - Downloads" src="https://img.shields.io/pypi/dm/PyFLP"/>
        </a>
      </td>
    </tr>
    <tr>
      <th>QA</th>
      <td>
        <a href="https://codecov.io/gh/demberto/PyFLP">
          <img alt="codecov" src="https://codecov.io/gh/demberto/PyFLP/branch/master/graph/badge.svg?token=RGSRMMF8PF"/>
        </a>
        <a href="https://codefactor.io/repository/github/demberto/PyFLP">
          <img alt="CodeFactor Grade" src="https://img.shields.io/codefactor/grade/github/demberto/PyFLP?logo=codefactor"/>
        </a>
        <a href="http://mypy-lang.org/">
          <img alt="Checked with mypy" src="http://www.mypy-lang.org/static/mypy_badge.svg">
        </a>
        <a href="https://github.com/pre-commit/pre-commit">
          <img alt="pre-commit" src="https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&amp;logoColor=white"/>
        </a>
        <a href="https://github.com/PyCQA/bandit">
          <img alt="Security Status" src="https://img.shields.io/badge/security-bandit-yellow.svg"/>
        </a>
      </td>
    </tr>
    <tr>
      <th>Other</th>
      <td>
        <a href="https://github.com/demberto/PyFLP/blob/master/LICENSE">
          <img alt="License" src="https://img.shields.io/github/license/demberto/PyFLP"/>
        </a>
        <img alt="GitHub top language" src="https://img.shields.io/github/languages/top/demberto/PyFLP"/>
        <a href="https://github.com/psf/black">
          <img alt="Code Style: Black" src="https://img.shields.io/badge/code%20style-black-black"/>
        </a>
        <a href="https://github.com/demberto/PyFLP/blob/master/CODE_OF_CONDUCT.md">
          <img alt="covenant" src="https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg"/>
        </a>
      </td>
    </tr>
  </tbody>
</table>
<!-- markdownlint-restore -->

From a very general point-of-view, this is the state of what is currently
implemented.

<!-- FEATURE TABLE -->
<!-- markdownlint-disable -->
<table>
  <tr>
    <th>Group</th>
    <th>Feature</th>
    <th>Implementation</th>
  </tr>
  <tr>
    <td rowspan="3"><a href="https://pyflp.readthedocs.io/en/latest/reference/arrangements.html">Arrangements</a></td>
    <td><a href="https://pyflp.readthedocs.io/en/latest/reference/arrangements.html#playlist">🎼 Playlist</a></td>
    <td>🚧 Work in progress</td>
  </tr>
  <tr>
    <td><a href="https://pyflp.readthedocs.io/en/latest/reference/arrangements.html#timemarker">🚩 Timemarkers</a></td>
    <td>✅ Implemented</td>
  </tr>
  <tr>
    <td><a href="https://pyflp.readthedocs.io/en/latest/reference/arrangements.html#track">Tracks</a></td>
    <td>✅ Implemented</td>
  </tr>
  <tr>
    <td rowspan="4"><a href="https://pyflp.readthedocs.io/en/latest/reference/channels.html">Channel Rack</a></td>
    <td><a href="https://pyflp.readthedocs.io/en/latest/reference/channels.html#pyflp.channel.Automation">📈 Automations</a></td>
    <td>📌 Currently WIP</td>
  </tr>
  <tr>
    <td><a href="https://pyflp.readthedocs.io/en/latest/reference/channels.html#pyflp.channel.Instrument">🎹 Instruments</a></td>
    <td>✅ Implemented</td>
  </tr>
  <tr>
    <td><a href="https://pyflp.readthedocs.io/en/latest/reference/channels.html#pyflp.channel.Layer">Layer</a></td>
    <td>✅ Implemented</td>
  </tr>
  <tr>
    <td><a href="https://pyflp.readthedocs.io/en/latest/reference/channels.html#pyflp.channel.Sampler">📁 Sampler</a></td>
    <td>🚀 Almost there</td>
  </tr>
  <tr>
    <td rowspan="2"><a href="https://pyflp.readthedocs.io/en/latest/reference/mixer.html">Mixer</a></td>
    <td><a href="https://pyflp.readthedocs.io/en/latest/reference/mixer.html#pyflp.mixer.Insert">🎚️ Inserts</a></td>
    <td>✅ Implemented</td>
  </tr>
    <tr>
    <td><a href="https://pyflp.readthedocs.io/en/latest/reference/mixer.html#pyflp.mixer.Slot">🎰 Effect slots</a></td>
    <td>✅ Implemented</td>
  </tr>
  <tr>
    <td rowspan="3"><a href="https://pyflp.readthedocs.io/en/latest/reference/patterns.html">Patterns</a></td>
    <td><a href="https://pyflp.readthedocs.io/en/latest/reference/patterns.html#pyflp.pattern.Controller">🎛 Controllers</a></td>
    <td>🚧 Work in progress</td>
  </tr>
    <tr>
    <td><a href="https://pyflp.readthedocs.io/en/latest/reference/patterns.html#pyflp.pattern.Note">🎵 Notes</a></td>
    <td>✅ Implemented</td>
  </tr>
  <tr>
    <td>🚩 Timemarkers</td>
    <td>⏰ Planned</td>
  </tr>
  <tr>
    <td rowspan="2"><a href="https://pyflp.readthedocs.io/en/latest/reference/plugins.html">Plugins</a></td>
    <td>Native</td>
    <td>7
      <a href="https://pyflp.readthedocs.io/en/latest/reference/plugins.html#effects">effects</a>,
      1 <a href="https://pyflp.readthedocs.io/en/latest/reference/plugins.html#generators">synth</a></td>
  </tr>
  <tr>
    <td><a href="https://pyflp.readthedocs.io/en/latest/reference/plugins.html#pyflp.plugin.VSTPlugin">3rd party</a></td>
    <td>VST 2/3, Waveshells</td>
  </tr>
  <tr>
    <td rowspan="2"><a href="https://pyflp.readthedocs.io/en/latest/reference/project.html">Misc</a></td>
    <td colspan="2">ℹ Song information and project settings</td>
  </tr>
</table>
<!-- markdownlint-restore -->

## ⏬ Installation

**Python 3.7+** required (CPython is tested, alternate implementations like PyPy
might work but are currently untested):

```console
python -m pip install -U --pre pyflp
```

*The pre-release version is more stable and supported than the current
stable version. Please prefer to use it over the legacy 1.x versions.*

## ▶ Usage

[Load](https://pyflp.readthedocs.io/en/latest/reference.html#pyflp.parse) a project file:

```py
import pyflp
project = pyflp.parse("/path/to/parse.flp")
```

[Save](https://pyflp.readthedocs.io/en/latest/reference.html#pyflp.save) the project:

```py
pyflp.save(project, "/path/to/save.flp")
```

> The format used by FL Studio - the "FLP format" is essentially undocumented.
> Every new version of FL Studio brings a change in the format and might break
> PyFLP. It is advised to do a backup of your projects before doing any changes.
> After you are done with them, it is recommended to open the modified project
> in FL Studio one to ensure that it works as intended.

PyFLP provides a low-level events-based API and a high-level API. Generally,
you should only need the high level API though.

## 🙏 Acknowledgements

- Monad.FLParser: <https://github.com/monadgroup/FLParser>
- FLPEdit (repo deleted by [author](https://github.com/roadcrewworker))

## ✨ Contributors

<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
[All Contributors](https://img.shields.io/badge/all_contributors-3-orange.svg?style=flat-square)
<!-- ALL-CONTRIBUTORS-BADGE:END -->

Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
  <tbody>
    <tr>
      <td align="center"><a href="https://github.com/nickberry17"><img src="https://avatars.githubusercontent.com/u/18670565?v=4?s=50" width="50px;" alt=""/><br /><sub><b>nickberry17</b></sub></a><br /><a href="https://github.com/demberto/PyFLP/commits?author=nickberry17" title="Code">💻</a></td>
      <td align="center"><a href="https://github.com/zacanger"><img src="https://avatars.githubusercontent.com/u/12520493?v=4?s=50" width="50px;" alt=""/><br /><sub><b>zacanger</b></sub></a><br /><a href="https://github.com/demberto/PyFLP/issues?q=author%3Azacanger" title="Bug reports">🐛</a> <a href="https://github.com/demberto/PyFLP/commits?author=zacanger" title="Documentation">📖</a></td>
      <td align="center"><a href="https://github.com/ttaschke"><img src="https://avatars.githubusercontent.com/u/7067750?v=4?s=50" width="50px;" alt=""/><br /><sub><b>Tim</b></sub></a><br /><a href="https://github.com/demberto/PyFLP/commits?author=ttaschke" title="Documentation">📖</a> <a href="https://github.com/demberto/PyFLP/commits?author=ttaschke" title="Code">💻</a> <a href="#maintenance-ttaschke" title="Maintenance">🚧</a></td>
    </tr>
  </tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->

This project follows the [all-contributors] specification. Contributions of
any kind are welcome!

Please see the [contributor's guide](https://pyflp.readthedocs.io/en/latest/contributing.html)
for more information about contributing.

## 📧 Contact

You can contact me either via [issues](https://github.com/demberto/PyFLP/issues)
and [discussions](https://github.com/demberto/PyFLP/discussions) or through
email via ``demberto(at)proton(dot)me``.

## © License

The code in this project has been licensed under the
[GNU Public License v3](https://www.gnu.org/licenses/gpl-3.0.en.html).
