You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
PyFLP creates an object from an FLP. You can edit it and save it back also. *Please don't use this for serious stuffs, I have done minimal testing myself and much of the features are yet to be implemented.*
# Use ProjectParser(verbose=True) if you want to see logs
13
17
```
14
18
15
-
## [More about FLP Format](doc/flp-format.md)
16
-
17
-
## [How does it work?](doc/how-does-it-work.md)
19
+
## Installation
18
20
19
-
# Classes
20
-
21
-
## `Project`
22
-
The main entry point. Created by `ProjectParser().parse()`
23
-
24
-
```Python
25
-
misc: Misc
26
-
playlist: Playlist
27
-
patterns: List[Pattern]
28
-
filterchannels: List[FilterChannel]
29
-
channels: List[Channel]
30
-
arrangements: List[Arrangement]
31
-
timemarkers: List[TimeMarker]
32
-
tracks: List[Track]
33
-
inserts: List[Insert]
34
-
_unparsed_events: List[Event]
21
+
```
22
+
pip install pyflp
35
23
```
36
24
37
-
Below are brief descriptions of the classes used above
38
-
39
-
### `Misc`
40
-
Stores many one-time events like project Artists, Title, Tempo, Save timestamp etc. Most of the work here is done.
41
-
42
-
### `Pattern`
43
-
Represents a pattern. Only `index`, `name` and `color` properties are implemented.
44
-
45
-
### `Channel`
46
-
Represents a channel. This includes everything visible in Channel Rack. Automation, Samplers, plain audio clips, instruments are treated as a channel by FL. At this point many essential properties of a channel are implemented and a lot more are yet to be done.
47
-
48
-
### `Insert`
49
-
Represents a mixer track ("Insert" from here on). Only `name`, `color`, `routing` and `flags` (properties like whether an `Insert` is docked to the middle, left or right, whether it is locked or not) are implemented yet. `InsertSlot`s are also stored in an `Insert`.
25
+
## [More about FLP Format](doc/flp-format.md)
50
26
51
-
### `InsertSlot`
52
-
Represents a mixer track channel ("insert slot" from here on). Like `Insert` only few basic properties like `name`, `color` and `index` are implemented.
27
+
## [How does it work?](doc/how-does-it-work.md)
53
28
54
-
### Unparsed events
55
-
There are still many events which are not implemented. You can find them commented in one of the `*EventID` enums spread across the `FLObject` subclasses.
29
+
##Documentation
30
+
Docs are available on [Read The Docs](pyflp.rtfd.io)
56
31
57
32
## Testing
58
-
I have created a [null test](tests/test_parser.py) and provided an empty FLP as well. However due to module import errors, I cannot get that test running :(
33
+
I have created a [null test](test_parser.py). More tests need to be added.
Copy file name to clipboardExpand all lines: docs/how-does-it-work.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# How does the parser work?
2
2
3
-
*I recommend you to read [More about FLP Format](doc/flp-format.md) before this.*
3
+
*I recommend you to read [More about FLP Format](flp-format.md) before this.*
4
4
5
5
Since, FLP is an event-based binary format, we need to work with data types of C *(Delphi actually, because FL is written in Delphi, but Delphi's basic data types aren't different from C's data types)*. Python provides a nice way to read these types through the `struct` module. I made my own extension of `io.BytesIO` class named [`BytesIOEx`](../pyflp/bytesioex.py) which is inspired by C#'s `BinaryReader` and `BinaryWriter`. The extension `read_*` and `write_*` just convert raw bytes into a data type.
0 commit comments