Level Files with Structure

Hello, im making a game but becuase I want it to be very mod friendly with a map editor so im trying to make the Levels being on a file with this structure:

(Its a rhythm game with a ongoing pattern so the structure will be easy)
("<==" these are used to comment)

"Title",

:map:

[000.000<== seconds in the song]
bpm(BPM)
tempo(TEMPO)
wait(000.000 <==kinda of a short afk limit);

[000.000 <== now gonna change stuff in this sec]
bpm(BPM)
tempo(TEMPO)
wait(000.000);

:map-End:

How can I do this?

Well you would have to write a parser. This is a bit complex so you probably won’t succeed if you are not experienced using the event sheet. What you want is a variable telling you the current character and reading character by character. For example, just for interpreting those bpm(BPM), you would do something like this:

text = "bpm(12, 4, 7)"
commandname = ""
arguments = new Array()
writingcommand = true
While (variable currentcharindex is < than the text length) {
  currentchar = GetCharAt(text, currentcharindex)

  if(currentchar === "(") {
    if(commandname === "") { 
      displayError("Syntax Error! Didn't expect an empty command name.")
    }
    // We are finished writing the command name, now we are giving arguments
    writingcommand = false
  } else if(currentchar === ")") {
    if(writingcommand === false) { 
      displayError("Syntax Error! Didn't expect a ')' without a '('.")
    }
    // The arguments are finished as well, time to do something with the command name and arguments.
    if(commandname === "bpm") {
        if(arguments.length < 1) { 
          displayError("Syntax Error! Missing a parameter for command bpm.")
        }
        newBPM = arguments[0]
    }
    if(commandname === "addbpm") {
        if(arguments.length < 1) { 
          displayError("Syntax Error! Missing a parameter for command addbpm.")
        }
        newBPM += arguments[0]
    }
  } else if(currentchar === ",") {
    if(writingcommand === true) { 
      displayError("Syntax Error! Didn't expect a ',' in a command name.")
    }
    // Adding another argument by adding a new string variable to the array
    arguments.push("");
  } else if(currentchar === NewLine()) {
    // New line, new command. Reset all command parsing variables.
    commandname = ""
    arguments = new Array()
    writingcommand = true
  } else {
    // This is not a special character, append it to whatever is being written.
    if(writingcommand === true) commandname.concatenate(currentchar);
    else arguments.setLast(
      (arguments.getLast() or if not existing "").concatenate(currentchar)
    )
  }

  currentcharindex.add(1)
}

Assuming the new Arrays are also compatible with the conversion to JSON, I would recommend using JSON instead of creating your own parser and format.
What you want to do should be representable in JSON and will make it trivial for you to import and export to and from Gdevelop structures.