Free! FL Studio .fst ShaperBox presets to native .fxp without FL Studio

Discussion in 'Software' started by shinyzen, May 23, 2026 at 6:39 AM.

  1. shinyzen

    shinyzen Audiosexual

    Joined:
    Sep 28, 2023
    Messages:
    1,641
    Likes Received:
    985
    I often find shaperbox presets that are shared in .fst format, which only works with FL Studio. To get these to open in Shaperbox with any DAW, I had chatgpt develop a python script that converts an entire folder of .fst to Shaperbox .fxp in seconds. Super easy to use, and I imagine this could work with other presets with a bit of tweaking.

    Here is the read me, I'll paste the actual script below. Its super simple to use, and works great.

    # ShaperBox `.fst` → `.fxp` Converter

    Converts old FL Studio-only ShaperBox presets (`.fst`) into native ShaperBox `.fxp` presets without needing FL Studio.

    ## Requirements

    - Python 3
    - One legitimate exported ShaperBox 3 `.fxp` preset
    This is used as the template container.

    ## How it works

    The script:

    1. Extracts the compressed ShaperBox plugin state from each `.fst`
    2. Injects it into a valid ShaperBox `.fxp` structure
    3. Outputs working `.fxp` presets

    ## Usage

    ```bash
    python3 shaperbox_fst_to_fxp.py "template.fxp" "input_folder" "output_folder"
    ```
    Example:
    ```bash
    python3 shaperbox_fst_to_fxp.py "Space Chopper.fxp" "./FSTs" "./Converted"
    ```
    macOS example with full paths:

    ```bash
    python3 shaperbox_fst_to_fxp.py "/Users/yourname/Desktop/Space Chopper.fxp" "/Users/yourname/Desktop/SHAPERBOX" "/Users/yourname/Desktop/Presets New"
    ```
    ## Notes

    - Tested successfully with ShaperBox 3 presets
    - Works best when presets come from the same major ShaperBox version
    - Some presets may inherit internal preset names from embedded metadata
    - Original `.fst` files remain untouched
    - If a preset fails, it may not contain the expected compressed ShaperBox state or may be corrupted

    ## What this does not do

    This does not crack, modify, or bypass ShaperBox.
    It only repackages existing preset state data from an FL Studio `.fst` into a ShaperBox-readable `.fxp` container.

    ## Basic troubleshooting

    If Terminal says Python is not found, install Python 3 and try again.

    On macOS with Homebrew:

    ```bash
    brew install python
    ```
    Then rerun the command using `python3`.
     
  2.  
  3. shinyzen

    shinyzen Audiosexual

    Joined:
    Sep 28, 2023
    Messages:
    1,641
    Likes Received:
    985
    Here is the actual py script. Copy and paste, save as "converter.py", or whatever you want .py, make sure you are using plain text. Then run the script and link to your input and output folders, and the legitimate exported .fxp

    Code:
    import zlib
    from pathlib import Path
    import sys
    
    # Usage:
    # python3 shaperbox_fst_to_fxp.py "template.fxp" "input_folder" "output_folder"
    
    def extract_plugin_state(fst_path):
        data = Path(fst_path).read_bytes()
    
        marker = b'#zip#'
        idx = data.find(marker)
    
        if idx == -1:
            raise ValueError("No compressed plugin state found")
    
        comp = data[idx + len(marker):]
    
        # Find valid zlib stream
        for i in range(min(256, len(comp))):
            try:
                dec = zlib.decompress(comp[i:])
    
                if len(dec) > 1000:
                    return dec
    
            except Exception:
                pass
    
        raise ValueError("Could not decompress plugin state")
    
    
    def parse_template(template_path):
        data = bytearray(Path(template_path).read_bytes())
    
        marker = b'#zip#'
        idx = data.find(marker)
    
        if idx == -1:
            raise ValueError("Template FXP missing #zip# marker")
    
        comp_start = idx + len(marker)
    
        # Locate valid zlib stream
        for i in range(256):
            try:
                dec = zlib.decompress(data[comp_start + i:])
                return data, comp_start + i, dec
    
            except Exception:
                pass
    
        raise ValueError("Could not locate compressed block in template")
    
    
    def rebuild(template_data, old_comp_start, new_state, out_path):
        new_comp = zlib.compress(new_state)
    
        rebuilt = (
            template_data[:old_comp_start]
            + new_comp
        )
    
        Path(out_path).write_bytes(rebuilt)
    
    
    def main():
    
        if len(sys.argv) != 4:
            print("Usage:")
            print(
                'python3 shaperbox_fst_to_fxp.py '
                '"template.fxp" "input_folder" "output_folder"'
            )
            sys.exit(1)
    
        template = Path(sys.argv[1])
        in_dir = Path(sys.argv[2])
        out_dir = Path(sys.argv[3])
    
        out_dir.mkdir(parents=True, exist_ok=True)
    
        template_data, comp_start, _ = parse_template(template)
    
        fst_files = sorted(in_dir.glob("*.fst"))
    
        if not fst_files:
            print("No .fst files found")
            return
    
        converted = 0
        failed = 0
    
        for fst in fst_files:
    
            try:
                state = extract_plugin_state(fst)
    
                out_name = fst.stem + ".fxp"
                out_path = out_dir / out_name
    
                rebuild(template_data, comp_start, state, out_path)
    
                converted += 1
    
                print(f"Converted: {fst.name} -> {out_name}")
    
            except Exception as e:
    
                failed += 1
    
                print(f"FAILED: {fst.name} | {e}")
    
        print()
        print(f"Done. Converted: {converted} | Failed: {failed}")
    
    
    if __name__ == "__main__":
        main()
     
Loading...
Loading...