LMMS / LMMS/lmms

JSON project format

Open
#3,981 32 comments 17 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

enhancement
Dominant language
C++
Stars
10.4k
Forks
1.3k
Avg merge
2d 13h
Merged PRs (30d)
7

Description

Proposal to add a new JSON-backed, ZIP-encapsulated project format.

The Problem

  • The .mmpz format is confusing because it's a standard compression with a byte offset that makes it unreadable by common archive tools like 7zip.
    • This can be even more difficult for bug reporters/testers because the recommended technique for a bug report is to provide an uncompressed project file, but this can prove difficult if LMMS can't open it, yet is required for decompressing it.
  • The .xml project format is very resilient but XML can be tricky for power-users to hand-edit and is less popular format for newcomers (as opposed to .yml, .json, etc)
  • Although the .mmpz format is compressed, no current standard exists for storing and extracting project resources (samples, patches, soundfonts, plugins, etc).
    • A new project format can help blueprint portable project files, also making it easier to debug loading issues, since it's easy for the power-user to hand-edit a .zip file and folders/files within.

Possible Solutions

  • Change the .mmpz save code to fix the byte offset. This would cause compatibility issues, but could address the 7zip problems.
    -- OR --
  • Create a new format based on the popular .zip format, designed using standards that our power users already know and are familiar with.

Mockup
image

image

Benefits

  • JSON based, easier to read
  • Standard ZIP format
    • Provides quick access for developers to open/debug projects
    • Provides a scalable method for eventually bundling portable project files (#1257)

Before

<?xml version="1.0"?>
<!DOCTYPE lmms-project>
<lmms-project version="1.0" creator="LMMS" creatorversion="1.1.3" type="song">
  <head timesig_numerator="4" mastervol="100" timesig_denominator="4" bpm="140" masterpitch="0"/>
  <song>
    <trackcontainer width="600" x="5" y="5" maximized="0" height="300" visible="1" type="song" minimized="0">
      <track muted="0" type="0" name="TripleOscillator" solo="0">

After (mockup)

{
  lmms-project: {
    version: 1.0,
    creator: "LMMS",
    creatorversion: "1.1.3",
    type: "song",
    head: {
      timesig_numerator: 4,
      mastervol: 100,
      timesig_denominator: 4,
      bpm: 140,
      masterpitch: 0
    },
    song: {
      trackcontainer: {
        width: 600,
        x: 5,
        y: 5,
        maximized: 0,
        height: 300,
        visible: 1,
        type: "song",
        minimized: 0,
        track: [
          {
            muted: 0,
            type: 0,
            name: "TripleOscillator",
            solo: 0,

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Review the current .mmpz and XML project save/load paths, then determine how a JSON-backed ZIP format would fit the existing project-file handling. Done would require an agreed format, compatibility decisions, resource packaging behavior, and corresponding load/save validation.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp, json
Domain
desktop
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.