The Four Chart Formats of Maimai Classic

Erratum (10 March, 2021): I have made an error about SRT slide pattern values and have fixed them.
Edit (23 March, 2021): I have replaced "slide tap note" with "star note". I also added some more information about star and slide notes in utage charts.

Maimai fascinates me because of its unique take on rhythm games. When I played it for the first time, I was caught off-guard by how hard it is to play when the notes are coming from the centre towards the machine's buttons. It was different from other arcade rhythm games, where the judgement line is on one area. You'd typically look at that area to accurately time the notes. But in Maimai, the judgement line is a judgement ring. A judgement ring always ensures that a part of it is always in the player's peripheral vision, making the notes harder to time. Add to that the various slide notes in the game that will make you trace your hands on the screen, blocking a part of your view of the screen. It can get pretty overwhelming at the start, and you have to get a good feel at the game to get even decent at it. Talking about it makes me itch to play some right now, but the current pandemic makes it hard.

The creative use of button and slides to choreograph moves in time with the music interests me on how this game works. After digging around and studying the game files for a while, I'm here to give my findings. I'm still not sure about many of these things, so if you can correct me, I'll gladly appreciate it. If you have any correction or additional information, please message me at my guestbook here on Listed.to or at Twitter.

Maimai classic, over eight years, used four different chart formats for their game. Each was incrementally building on the previous for additional features or refinements to the game. Since the differences between them are minimal, I'll start with things they share in common.


Common traits of the four formats

Note Types

There are three note types in Maimai classic: tap, hold and slide. Tap notes are notes that come from the centre towards one of the buttons. The player has to press the button or tap the area on the touchscreen near the button when it comes to the judgement ring. Hold notes are just like tap notes, but the player has to hold the button for a set amount of time before they let go. In Maimai classic, releasing the hold note early or late will give a low judgement. A slide note begins like a tap note, but after you hit/miss it, the rest of the slide will appear after you hit/miss it. The player then has to trace their hands across the touchscreen, following the pattern shown. Tap and slide notes can have a "break" modifier to have a higher value in grading.

Position

Maimai Classic's chart formats have no way of representing touchscreen zones. They are only used to keep track of slide notes and as an additional input to the buttons. It's only in Maimai DX, where they are included in the format, but that's for another time. For Maimai Classic, there are eight positions, all corresponding to the eight buttons on the machine. Internally, the buttons start from 0 to 7. The first (or 0th) button is the button at the 1 o'clock position, and the last button (7th) is the button at the 11 o'clock position. The ordering of the buttons is in a clockwise manner.

Time

Maimai classic chart formats don't have the concept of BPM changes nor fine time offsets; heck, it doesn't even say what BPM the song is. All it does is track what measure a particular note is with 6 or 4 decimal places of precision starting at measure 1.0000. The engine would grab a chart file and the BPM of the song from one of its tables to make sense of a song's timing. Even though it doesn't support BPM changes or offsets, you can compensate for it via the format's four decimal place precision. Nothing is stopping you from charting a song in a BPM different from the song's correct BPM. Just as long as you give the engine your chart file and the song's BPM and you'll have no problem.

In general, the chart format has no absolute definition of time. All notes' timing is in terms of measures, which is dependent on BPM. For holds and slides, the starting and ending measure determines the duration.

Internally, the chart formats use three floats to keep track of what time a note happens. Below is a simplified sample of 4 tap notes: One that occurs at the beginning of the first measure, the middle of the second measure, the third quarter of the same measure, and the first quarter of the fourth measure.

1.0000, 0.0000, 0.0625,
2.0000, 0.5000, 0.0625,
2.0000, 0.7500, 0.0625,
4.0000, 0.2500, 0.0625,

Even though the first column looks like a float, it's an integer representing the whole number part of the current measure. The second column is the fractional part. The third column is the duration of the note. So if you have two hold notes at the same time, one lasting for half a measure and the other lasting for two bars, you would write them like this:

1.0000, 0.0000, 0.5000,
1.0000, 0.0000, 2.0000,

So what was the '0.0625' at the first example? To be honest, I don't know. The value doesn't matter for tap notes, and I haven't seen any pattern from looking at official charts or my testing. If you do know, please message me so I can add it here.


Differences

SRT

SRT is the first chart format created for Maimai Classic. It has seven columns: 3 for time, 1 for location, 1 for note type, 2 for slide information. Each line represents a note and looks like the one below. In the example below, it's a tap note at button one at measure 1.000000.

1.000000, 0.000000, 0.062500, 1,   0,   0,   0,
Column 1 Column 2 Column 3 Column 4 Column 5 Column 6 Column 7
Measure (whole part) Measure (fractional part) Hold/slide duration or unknown Note location Note Type Slide ID Slide Pattern

Column 5 (Note type) Values for SRTs

Value Description
0 Tap note
2 Hold note
4 Break tap note
128 End slide

A pair of tap note (0) and end slide (128) generates a slide note. A slide note's tap note should have a unique non-zero slide id and slide pattern. The corresponding end slide note should have the same slide id and slide pattern. Below is an example of a straight slide from button 0 to 4 that lasts for one measure. The following section contains more information on slide patterns.

1.000000, 0.000000, 1.000000, 0,   0,   1,   0,
2.000000, 0.000000, 0.000000, 4, 128,   1,   0,

Column 7 (Slide Pattern) Values for SRTs

Value Description Simai equivalent
0 Straight line -
1 Along the judgement ring CW (Can only go 3 places max) <, >, or ^
2 Along judgement ring CCW (Can only go 3 places max) <, >, or ^

Note that note types 1 and 2 can only travel up to 3 places max even if given an end position longer than three places.


SZT

The SZT format brings a significant change to the SRT format by changing how slides work and adding and changing note types. But it's still a seven-column format like SRT. To show the difference, let's use the same example of a tap note at button one at measure 1.

1.000000, 0.000000, 0.062500, 1,   1,   0,   0,
Column 1 Column 2 Column 3 Column 4 Column 5 Column 6 Column 7
Measure (whole part) Measure (fractional part) Hold/slide duration or unknown Note location Note Type Slide ID Slide Pattern

Column 5 (Note type) Values for SZTs

Value Description
0 Start slide
1 Regular Tap note
2 Hold note
3 Break note
4 Star note
5 Break star note
128 End slide

Slides now need three notes instead of two. It needs:

  1. A star note or break star note (with zero slide id and slide pattern)
  2. Start slide (with a unique slide id and a non-zero slide pattern)
  3. End slide (with same slide id and slide pattern as paired start slide)

Actually, you only need 2 and 3. The star note is sometimes discarded in some utage charts. And in the case of some utage charts like その群青が愛しかったようだった, all tap notes are replaced with star notes with no slides.

Column 7 (Slide Pattern) Values for SZTs

Value Description Simai equivalent
1 Straight line -
2 Along the judgement ring (CCW) <, >, or ^
3 Along judgement ring (CW) <, >, or ^
4 Arc CCW around the center p
5 Arc CW around the center q
6 Zigzag (S) s
7 Zigzag (Z) z
8 Start to center (straight) to end (straight) v
9 Start to center (straight) to end (CCW arc) pp
10 Start to center (straight) to end (CW arc) qq
11 Start to two places CCW (straight) to end (straight) V
12 Start to two places CW (straight) to end (straight) V
13 Fan w

Note that patterns 2 and 3 are no longer limited to 3 places and can now complete a 360-degree rotation.


SCT

SCT adds a feature to create multiple slides coming from one position at the same time. It does so by adding another column, which we'll call the slide amount for lack of a better term. Using the previous example, let's add a star note at button one that will spawn two straight slides to button four and button six.

1.000000, 0.000000, 0.062500, 1,   1,   0,   0,   0,
1.000000, 0.500000, 0.062500, 1,   4,   0,   0,   2,
1.000000, 0.500000, 0.500000, 1,   0,   1,   1,   0,
1.000000, 0.500000, 0.500000, 1,   0,   2,   1,   0,
2.000000, 0.000000, 0.000000, 4, 128,   1,   1,   0,
2.000000, 0.000000, 0.000000, 6, 128,   2,   1,   0,

From the example above, we begin with a tap note in button one at measure 1.0. Then a star note at measure 1.5 at button 1. Notice the value of 2 in the 8th column; this indicates that there will be two slides coming out of button one simultaneously. The following two lines state the beginning of two straight slides from button 1 with a duration of 0.5 measures. The last two lines at measure 2.0 state that the two straight slides we defined earlier will end at buttons 4 and 6.

Slide mechanics are mostly the same as SZTs, but we have to specify how many slides a star or break star note will make. Other than that, there are no other differences I can find for SCT files.

Column 1 Column 2 Column 3 Column 4 Column 5 Column 6 Column 7 Column 8
Measure (whole part) Measure (fractional part) Hold/slide duration or unknown Note location Note Type Slide ID Slide Pattern Slide Amount

SDT

SDT is the final chart format created for Maimai Classic. It adds a new feature to slides that allow charters to specify the delay of a slide. The delay is how much time, in measures, will pass before the star in the slide will begin to move. By default, in older chart formats, the delay is a quarter note with no way to change it.

This way, you can create slides faster than a quarter note without the bug caused by a delay being greater than the slide duration. Before the slide duration is less than a quarter note, the slide would finish without the star moving, confusing the player. You could also make gimmicks out of this by creating a slide with a long duration and a delay that's a bit smaller than the slide duration. Making the star wait for a while at the start then quickly move to the end. You can see this gimmick at the end of QZKago Requiem Re:master, where the fan slide is visible for a long time but only moves quickly at the end.

Using the previous example in the SCT format, let's make the straight slide from button 1 to 4 have a quarter note delay (0.2500) and remove the straight slide's delay from button 1 to 6.

1.0000, 0.0000, 0.0625, 1,   1,   0,   0,   0,  0.0000,
1.0000, 0.5000, 0.0625, 1,   4,   0,   0,   2,  0.0000,
1.0000, 0.5000, 0.5000, 1,   0,   1,   1,   0,  0.2500,
1.0000, 0.5000, 0.5000, 1,   0,   2,   1,   0,  0.0000,
2.0000, 0.0000, 0.0000, 4, 128,   1,   1,   0,  0.0000,
2.0000, 0.0000, 0.0000, 6, 128,   2,   1,   0,  0.0000,

You might have noticed that there are just four decimal places instead of 6 previously. Looking at the chart files from previous chart formats, it seems like it only ever used four decimal places. The last two decimal places are only zeroes. It looks like the engine only parses four decimal places in the first place.

Column 1 Column 2 Column 3 Column 4 Column 5 Column 6 Column 7 Column 8 Column 9
Measure (whole part) Measure (fractional part) Hold/slide duration or unknown Note location Note Type Slide ID Slide Pattern Slide Amount Slide Delay

Slide Samples

To get a better image of the various patterns and combinations, I've compiled all of them in a video with information. The SDT file used to create the samples shown, and the equivalent Simai chart is available.

Straight

  • SRT slide pattern: 0
  • SZT, SCT and SDT pattern: 1
  • Simai equivalent: -

Pattern 1

NOTE: End position should at least be two places away from the start position. Otherwise, it will default to an end position two places away (CCW) from the start position.


Around the judgement ring (CCW)

  • SRT slide pattern: 2
  • SZT, SCT and SDT pattern: 2
  • Simai equivalent: <, >, or ^

Pattern 2

NOTE: For SRT files, it can only do end positions three places max.


Around the judgement ring (CW)

  • SRT slide pattern: 1
  • SZT, SCT and SDT pattern: 3
  • Simai equivalent: <, >, or ^

Pattern 3

NOTE: For SRT files, it can only do end positions three places max.


Arc along the center (CCW)

  • SZT, SCT and SDT pattern: 4
  • Simai equivalent: q

Pattern 4


Arc along the center (CW)

  • SZT, SCT and SDT pattern: 5
  • Simai equivalent: p

Pattern 5


Zigzag (S)

  • SZT, SCT and SDT pattern: 6
  • Simai equivalent: s

Pattern 6

NOTE: There is only one possible end position for a given start position.


Zigzag (Z)

  • SZT, SCT and SDT pattern: 7
  • Simai equivalent: z

Pattern 7

NOTE: There is only one possible end position for a given start position. It will only work when the end position is at 180 degrees with the start position. Otherwise, it will look like a zigzag (s).


Start to center (straight) to end (straight)

  • SZT, SCT and SDT pattern: 8
  • Simai equivalent: v

Pattern 8


Start to center (straight) to end (CCW arc)

  • SZT, SCT and SDT pattern: 9
  • Simai equivalent: pp

Pattern 9


Start to center (straight) to end (CW arc)

  • SZT, SCT and SDT pattern: 10
  • Simai equivalent: pp

Pattern 10


Start to two places CCW (straight) to end (straight)

  • SZT, SCT and SDT pattern: 11
  • Simai equivalent: V

Pattern 11

NOTE: Will crash the game when the start and end position are the same. A bug happens when the end position is in-between the start and second point or is at the second point.


Start to two places CW (straight) to end (straight)

  • SZT, SCT and SDT pattern: 12
  • Simai equivalent: V

Pattern 12

NOTE: Will crash the game when the start and end position are the same. A bug happens when the end position is in-between the start and second point or is at the second point.


Fan

  • SZT, SCT and SDT pattern: 13
  • Simai equivalent: w

Pattern 13

NOTE: Will always fan to the opposite button regardless of the end position.


Conclusion

Writing and preparing for this was long and tedious. I hope this will be valuable information for those who want it. Much information is still unknown or unclear to me, so please let me know of corrections or additions. If I do find some additional information, I'll make a follow-up post.

For now, I'm working on a continuation of this. You might have noticed that Maimai Finale chart files are not in the same format as what I've discussed here. I'll talk about that in the next blog post about Maimai Classic.

I'm also working on a Simai to SDT converter. I just used it right now for the slide samples above. It was first written in Simai format before being converted to SDT. I'll release the complete code to my newly created Github account @donmai-me.

I hope you learned something from this and I'll see you next time.


Saltpack signed message


You'll only receive email when they publish something new.

More from donmai