Beatmap Format - kbz/SIFTrain GitHub Wiki

The main template is as follows (sample below):

  • song_name: UTF-8 encoding, currently works for latin and japanese alphabets (probably chinese too, to some degree)
  • difficulty: numeric 1-4 (1 being the lowest difficulty - easy)
  • difficulty_name: UTF-8 encoded string with the name for your difficulty (not required)
  • music_file: the name of the music file used with this beatmap (not required - will look up for files in the /beatmaps/soundfiles only, you can specify the file extension or not, in which case the app will look up for either a .mp3, .wav or .ogg file)
  • lead_in: time in seconds (not required, specifies the lead_in time before the sound file starts playing - doesn't modify timing of the notes as they should be timed to the soundfile, if not specified, the default value is 0s)
  • rank_info: a list of rank items (not required anymore, but recommended. If specified, it needs at least 4 and max 5 entries, can be unordered)(Obsolete as of 2.0)
  • song_info: a list of items (currently the game handles only 1 item)

Each rank item contains the following info:

  • rank_max: max amount of points required to meet this rank(Obsolete as of 2.0)

A song info item contains the following elements:

  • notes_speed: in seconds, this represents the time it takes the note to reach the tap zone since it appears on screen(Obsolete as of 2.0)
  • notes: the list of notes of the beatmap

Each note contains the following information:

  • timing_sec: represents the time when this note should be tapped relative to the start of the song
  • effect: effect mask representing different possible effects (more info below).
  • effect_value: numeric value can be left blank except for holds
  • position: represents the circle which should be tapped (numbered from 1-9, with 1 being the rightmost circle)

Sample:

{
  "song_name": "SAMPLE NAME",
  "difficulty": 2,
  "lead_in":1.0,
  "difficulty_name":"kb_z's easy",
  "music_file":"rick_roll.mp3",
  "song_info": [
    {
      "notes": [
        {
          "timing_sec": 3.043,
          "effect": 1,
          "effect_value": 2,
          "position": 9
        },
        {
          "timing_sec": 4.889,
          "effect": 1,
          "effect_value": 2,
          "position": 1
        },
        {
          "timing_sec": 6.736,
          "effect": 2,
          "effect_value": 2,
          "position": 7
        },
        {
          "timing_sec": 8.351,
          "effect": 1,
          "effect_value": 2,
          "position": 3
        }
      ]
    }
  ]
}
  • Effects:
Note Type Effect Mask Mask value in decimal Effect Value
Normal | 0b00000001 | 1 | 2
~~Filled~~ | 0b00000010 | 2 | 2 (obsolete as of 2.0)
Hold | 0b00000100 | 4 | time in seconds
~~Exclamation~~ | 0b00001000 | 8 | 2 (obsolete as of 2.0)
Simult Start | 0b00010000 | 16 | 
Simult End | 0b00100000 | 32 | used only by the randomizer
  • Normal Example:

    { "timing_sec": 8.351, "effect": 1, "effect_value": 2, "position": 3 }

  • Filled Example:

    { "timing_sec": 8.351, "effect": 2, "effect_value": 2, "position": 3 }

  • Hold Example:

    { "timing_sec": 8.351, "effect": 4, "effect_value": 4.214, "position": 3 }

  • Exclamation Example:

    { "timing_sec": 8.351, "effect": 8, "effect_value": 2, "position": 3 }

  • Simultaneous (normals - 16+1/ filled 16+2 / holds 16+4 / exclamation 16 + 8):

    { "timing_sec": 31.698, "effect": 17, "effect_value": 2, "position": 6 }, { "timing_sec": 31.698, "effect": 17, "effect_value": 2, "position": 4 }

For more examples, please check the files under datafiles