Before reading into this format, make sure you either have a good understand of how binary works, or read the Binary Breakdown page for a quick understanding of how it works.
SSPMv1 is very simplistic, and in some ways better than v2 because of how easy to read it is. The only reason it was abandoned is because it wasn’t future-proof. (You couldn’t add new features to the format)
Header
Magic Number (4 bytes)
53 53 2B 6D (SS + M when converted to text)
Version Number (2 bytes)
01 00 (1 for SSPMv1)
Reserved Space (2 bytes)
00 00
Metadata
Map ID
UTF-8 newline-terminated String converted to hexadecimal (example: haxagon_-_iyowa_-_kyu-kurarin_7_7_bootleg)
Map Name (Artist - Title)
UTF-8 newline-terminated String converted to hexadecimal (example: iyowa - Kyu-kurarin (7_7 bootleg))
Map Creator
UTF-8 newline-terminated String converted to hexadecimal (example: Haxagon)
Millisecond of the very last note (4 bytes)
32 bit unsigned integer (00 00 00 00)
Total Note Count (4 bytes)
32 bit unsigned integer (00 00 00 00)
SSPMv1 Map Difficulty (1 byte)
Cover
Cover Storage Type (1 byte)
If the storage type is 0x02 (PNG):
Length of the PNG Data in Bytes (8 bytes)
00 00 00 00 00 00 00 00
PNG Data (Must contain a full PNG image)
(however long it is set in the 8 bytes above)
Audio
Audio Storage Type (1 byte)
If the storage type is 0x01 (Stored audio file):
Length of the Audio Data in Bytes (8 bytes)
0x00 00 00 00 00 00 00 00
Audio Data (Must contain a full MP3 or OGG audio)
(however long it is set in the 8 bytes above)
Note Data
Note that this is for every note. After the end, the next note is written in the same format as shown below.
For the X and Y position, they are on a 1 incremented plane as well, but the origin is at 1,1
2 on the X axis is to the right, and 0 is to the left
The Y axis is actually flipped, so 0 on the Y axis is up, and 2 is down
Time (in milliseconds, 4 bytes)
32 bit unsigned integer (00 00 00 00)
Note Storage Type (1 byte)
If the storage type is 0x00 (Integer):
X position (1 byte)
8 bit unsigned integer (00)
Y position (1 byte)
8 bit unsigned integer (00)
If the storage type is 0x01 (Quantum):
X position (4 bytes)
32 bit signed float (00 00 00 00)
Y position (4 bytes)
32 bit signed float (00 00 00 00)