Skip to content

Instantly share code, notes, and snippets.

@shakesoda
Created January 8, 2014 19:22
Show Gist options
  • Save shakesoda/8322745 to your computer and use it in GitHub Desktop.
Save shakesoda/8322745 to your computer and use it in GitHub Desktop.
WaveFrame's RS format spec
waveframe's .rs format
----------------------
Waveframe's implementation of the .rs format is nothing more than a specific
definition of what Waveframe looks for. It may or may not match shakesoda's
wishes for the format, though it tries to stay as close to the spec as possible.
=={ Standard Sections }==
These standard sections may include nonstandard elements.
See each section's intro text for more information.
-- meta
This section holds any song metadata. Any tag not mentioned in the official .rs
specification will be prefixed with [~]. (the file itself will not use [~])
title (required)
The song title.
subtitle (optional)
The subtitle of the song.
artist (required)
The song's artist.
genre (optional)
The song's genre.
version (required for compatibility)
The .rs format version of this file.
This is not specific to Waveframe, so please don't make it specific to Waveframe.
[~]origin (optional)
Origin of the song. This is meant for ports of songs from other games, or
possibly album titles, event titles (e.g. BMS OF FIGHTERS 20XX), etc.
[~]background (optional)
Path to the song's background file.
[~]banner (optional)
Path to the song's banner file.
-- timing
bpm <time> <newBPM>
Changes the BPM at the specified <time> to <newBPM>.
speed <time> <length> <multiplier>
Multiplies the speed.
The .rs timing definition allows for stops by using "bpm (time) 0".
I'm guessing the way .rs would determine the difference between stops/delays
is based on when the note appears relative to the stop(?).
-- chart.*
Charts should appear at the end, after every other section.
Each chart is meant to have a unique identifier.
The official spec uses "chart.dance.single.medium" as an example.
This translates to "chart.<gametype>.<style>.<difficulty>".
The <gametype> in WaveFrame is based on the available mappings.
Typically, <style> is "single" or "double". However, if the <gametype> is
"generic", the style may either be a specific mapping (e.g. "o2jam"), or a
generic "#lines" tag (e.g. "7lines").
<difficulty> is optional, but highly recommended.
[~]meter <level>
Sets the meter for this song. Level is either numeric or a question mark.
I am unsure if I will allow strings for this.
[~]meterscale <minlevel>:<maxlevel>
(tentative, optional.)
Allows for setting the minimum/maximum meter scale for this song, in order to
find out the "proper" difficulty level. Don't bother using this if you're using
a question mark in meter.
Examples include:
* 1:7 beatmania (old)
* 1:10 Dance Dance Revolution (old)
* 1:12 beatmania IIDX (new)
* 1:13 In the Groove
* 1:20 Dance Dance Revolution (new)
* 1:43? pop'n music
* 1:200? Mungyodance
[~]author <name>
The author of this chart.
[~]description <text>
A description of this chart.
[~]judgerank <number> (optional)
Judgement Ranking window configuration. Provided for BMS compatibility (#RANK).
Valid values are 0-4, ranging from "Very Hard" (0) to "Very Easy" (4).
[~]defexrank <number> (optional)
Extended judgment ranking window configuration. The initial judgement is set
based on a percentage (so decimal values are also accepted). Provided for BMS
compatibility (#DEFEXRANK).
Valid values are similar to nanasi groove's, though different names are used.
* 0 Absolutely Hard
* > 0, < 48 Super Hard
* 48 == #RANK 0 (Very Hard)
* > 48, < 64 Harder
* 64 == #RANK 1 (Hard)
* > 64, < 100 Little Hard
* 100 == #RANK 2 (Normal; reference value)
* > 100, < 120 Little Easy
* 120 == #RANK 3 (Easy)
* > 120, < 160 Easier
* 160 == #RANK 4 (Very Easy)
* > 160, < 200 Super Easy
* 200+ Absolutely Easy
[~]total <number> (optional)
Defines the increase rate of the life meter. Specifically, this is the value
the gauge increases to if all J1s are obtained. Provided for BMS compatibility.
[~]sampleset <string> (optional)
Defines the sample set to use for this chart. Only used for keysounded files.
row <time>, <note data>, <note coloring hint> [, reserved for future usage]
Defines a row of notes at the specified time.
WaveFrame does not use the note coloring hint.
// note data: 0=nothing,1=tap,h=hold,r=roll,m=mine,l=lift
WaveFrame does not support all of the note types (namely rolls or lifts).
[~]bgm <time>, <bgm data>
Defines a set of background noises at the specified time. Multiple items can be
in the bgm data section, and the lengths do not need to match up. All items in
the bgm section are defined as key($) (see below for more information).
=={ Non-Standard Sections }==
These sections are typically used by Waveframe and are not mentioned in any
official .rs spec. As such, they are subject to change.
-- sampleset.default
This section is a collection of "keysound" mappings.
BMS files can use up to 1296 indices using base36 ([0-9A-Za-z][0-9A-Za-z]).
Waveframe uses numerical indices, with a hard limit at 65536 (00000-65535).
Different soundbanks (other than "default") can be defined.
sound <numID> <sample>
Assigns a sound (<sample> path) to a specific sample number.
alias <numID> <text>
Assigns an alias (<text>) to a specific sample number.
This can help charters set up the correct sounds without fumbling over numbers.
=={ Note Data }==
Holds have a mandatory "len(#)" command that sets the length of the hold.
h:len(#)
The length, like all times in .rs files, is in milliseconds.
Assigning keysounds is done via the key($) command. "$" is either the numeric
ID of the sound in the sampleset or an alias.
0:key("$") invisible keysound change
1:key("$") visible keysounded note
m:key("$") mine with specific keysound
Assigning keysounds to holds is a little more complex:
h:len(#):key("$"):keyend("$")
"keyend" may only be used on holds, and will be played even if forced keyup is
disabled on the player side.
Other bullshit I may or may not support:
* pan(#) panning (-128 to 127)
* vol(#) volume (0 to 255)
* pitch(#) pitch shifting
________________________________________________________________________________
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment