Schema
This page gives a top-down view of how a memon file is structured
Root
{
"version": "x.y.z",
"metadata": {},
"timing": {},
"data": {}
}
This is the root / top level structure of a memon file.
It’s a json object with the following keys :
version
string, required
Indicates the schema version this memon file uses, follows semver. If a memon file does not have this key it’s probably following the pre-semver format
metadata
object, optional
Contains the metadata object
timing
object, optional
Contains the default / fallback timing object
See Multiple Timing Objects for more details on the behavior this should have
data
object, required
Contains the data object
Metadata
{
"title": "",
"artist": "",
"audio": "",
"jacket": "",
"preview": {},
}
Contains information that applies to the whole set of charts
title
string, optional
Song title
artist
string, optional
audio
string, optional
Path to the music file, relative to the memon file.
jacket
string, optional
Relative path to the jacket / album cover / album art to be shown in music select for example. usually a square image.
preview
object or string, optional
Contains either a preview object or a path to a bms-style preview file
Preview
{
"start": 0.0,
"duration": 0.0,
}
Describes the part of the music file that’s meant to be played on loop when previewing this song at the music select screen
start
number or string, required
In seconds, start of the loop
Positive
Strings allowed for easier decimal representation preservation
duration
number or string, required
In seconds, duration of the loop
Strictly positive
Strings allowed for easier decimal representation preservation
Timing
{
"offset": 0,
"resolution": 240,
"bpms": [],
"hakus": []
}
Describes the relationship between seconds in the audio file and symbolic time (time measured in beats)
offset
number or string, optional
If the key is missing, defaults to 0
In seconds, time at which the first beat occurs in the music file.
For instance, if the first beat occurs at 0.15 seconds in the audio file, the offset should be the number literal
0.15, or the string"0.15"if the tools used can’t keep a clean decimal representation when using json number literals.
resolution
integer, optional
Greater than 0, always an integer
If the key is missing, defaults to 240
Number of ticks in a beat for the bpm events defined in this timing object, if some bpm events define a beat using a single integer, this is the implicit fraction denominator to use to convert the integer number of ticks to a fractional number of beats.
bpms
array, optional
If the key is missing, defaults to
[{"beat": 0, "bpm": 120}]
Array of BPM events
hakus
array, optional
If the key is missing, default to the regular background bounce pattern
HAKUs (named after the
HAKUcommand in .eve files) describe how the background animation should bounce along with the music, most songs just leave a default regular patterns that makes the background bounce on every beat, but some songs use these commands as a gimmick. In that sense they are similar to beat lines in BMS
Timing objects can appear in multiple places in a memon file. The section Multiple Timing Objects explains how to deal with them.
BPM
{
"beat": 0,
"bpm": 120
}
Defines a change in tempo measured in beats per minutes happening at a specific symbolic time (measured in beats)
beat
symbolic time, required
Beat at which the tempo changes
bpm
number or string
Song tempo at the given beat, in Beats per Minute.
Striclty positive
Strings allowed for easier decimal representation preservation
Data
{
"BSC": {},
"ADV": {},
"...": {},
"My cool chart": {}
}
The data object maps difficulty names to chart objects.
Keys in this object are not fixed, they can be any string.
By convention, "BSC", "ADV" and "EXT" are to be understood as the usual 3 levels found in jubeat. Other values are “edits” or bonus charts.
When sorting, difficulties may be presented in that order :
BSC ➔ ADV ➔ EXT ➔ (everything else in alphabetical order)
Chart
{
"level": 10.3,
"resolution": 240,
"timing": {},
"notes": []
}
level
number or string, optional
Chart level, can be an integer or a decimal value, or even a string holding a decimal number
resolution
integer, optional
Greater than 0, always an integer
If the key is missing, defaults to 240
Number of ticks in a beat for all the notes in the chart, see Symbolic Time
timing
Timing object, optional
Chart-specific timing information
See Multiple Timing Objects for more details on the behavior this should have
notes
array, required
Array of tap notes and long notes that make up the chart
Tap Note
{
"n": 0,
"t": 3600,
}
A classic note.
n
number, required
Integer between 0 and 15 inclusive
The note position, given this way :
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
t
Symbolic Time, required
Beat at which the note occurs
Long Note
{
"n": 0,
"t": 3600,
"l": 10000,
"p": 5
}
A classic long note, with a tail
n : same as in a tap note
t : same as in a tap note
l
Symbolic Time, required
If a number, strictly positive
If an array,
l[0]andl[1]cannot both be zero at the same timeLong note duration in ticks or beats
p
number, required
Integer between 0 and 5 inclusive
Tail starting position in 6-notation :
For every given button on the controller, there are 6 possible starting positions for long note tails.
For example if the long note is held here :
□□□□ □□□□ □■□□ □□□□
the long note’s tail can start on any of the six squares marked with an × :
□×□□ □×□□ ×■×× □×□□
6-notation labels these 6 possibilities this way :
0, 1, 2 : horizontal tails from left to right
3, 4, 5 : vertical tails from top to bottom
If we replace
×s with the numbers we get :□3□□ □4□□ 0■12 □5□□
For example,
"p": 0produces the following long note :□□□□ □□□□ ▷■□□ □□□□
and
"p": 3gives :□▽□□ □|□□ □■□□ □□□□
Symbolic Time
Either an integer like 0 or an array like [0, 2, 3].
Represents a time point (or a duration) measured in beats
As a number
integer greater or equal to 0
Time measured in ticks :
Ticks are fractions of the beat. Using ticks implies a resolution is defined somewhere else in the file. The resolution defines how many ticks are in a beat. In other words if the resolution is 240, a tick lasts for 1/240th of a beat.
For more info about measuring time in ticks, see bmson’s docs (their docs refers to ticks as pulses).
As an array
The array MUST have length 3
The first and second elements are integers greater or equal to 0
The third element is an integer greater than 0
The array reprensents a time in beats as a mixed number
If
ais the array in question and we use the bracket notation for array access, the value represented by the array is the following :a[0] + (a[1] / a[2])
For instance
[1, 2, 3]represents 1 + 2/3,[0, 1, 20]represents 0 + 1/20.As it currently is, the schema allows for improper fractions (0 + 5/1) and non-reduced fractions (0 + 2/4)