Coordinate system: The position 0, 0 is between the pads, on the back edge. A panel is one unit in size. Left side is negative x, right side is positive x, y is always positive. The angle pi points towards the screen. Each step has some statistics that describe it abstractly. move_dist is how far the step requires the foot hitting it to move. stretch_dist is how far about the feet will be when the step is hit. facing_change is how much the direction the player is facing will change. facing_away is how far away from forward the player will face when hitting the step. body_x_motion is how far the step moves the player's center in x. body_y_motion is how far the step moves the player's center in y. body_motion is how far the step moves the player's center. (not body_x_motion + body_y_motion because that is not how vector magnitudes work) body_x_pos is where the player's center is in x. body_y_pos is where the player's center is in y. goalness is how close the step is to the "goal". This is a feature that was not fully implemented and will not behave usefully. The config file is a set of whitespace seperated tokens. The following settings do not affect the types of patterns generated. "bpm 140" tells the generator that this is a 140 bpm file. This is only used to calculate how many measures to generate. "npm 16" sets the notes per measure to 16. "minutes 240" sets the duration in minutes to 240. This is only used to calculate how many measures to generate. "empty 1" tells the generator to produce 1 empty measure before steps begin. "use_random_seed" tells the generator to seed the RNG before starting. "singles" indicates a singles chart. "doubles" indicates a doubles chart. "fake_header" tells the generator to attach a hardcoded header area, to make viewing the results in a common chart viewer easier. The intended use case is to append the output to an existing .sm file that already has a header. "diff Challenge" sets the difficulty to Challenge. "author Kyzentun\ Science" sets the author to "Kyzentun Science". This is the only thing that allows a space in a token, and the space must be escaped. (actually sets the chart name and description fields, because the author field doesn't exist in .sm files.) "feet 16" sets the foot rating to 16. The following settings control what patterns are generated. "constraint" marks the beginning of a constraint field. Constraints determine whether a possible step is valid. The next token after "constraint" must be the type of the constraint. These are identical to the names of the statistics that describe a step. "move_dist", "stretch_dist", "facing_change", "facing_away", "body_x_motion", "body_y_motion", "body_motion", "body_x_pos", "body_y_pos" After the type are tokens that set various fields of the constraint. "max" indicates that the constraint limits the maximum value of the stat. "min" indicates that the constraint limits the minimum value of the stat. "cur 1.2" sets the current value of the constraint. "edge", "goal", "rate", "after_edge" are used to make the constraint change over time. "edge 2.1" indicates that if the stat passes 2.1, it will trigger the edge condition. If this is a max constraint, then the comparison will be "stat > 2.1". If this is a min constraint, then the comparison will be "stat < 2.1". When the edge condition is triggered, the constraint is set to the after_edge value. "after_edge -1.5" sets the after_edge value to 1.5 "rate 0.01" sets 0.01 to be added to the current value after every step. "goal 2.0" means the constraint will stop changing when it reaches 2. "end" marks the end of the constraint. "weight" marks the beginning of a weight field. Weight fields change the chance of a possible step being picked. Weights have the same set of types as constraints. After the type are tokens that set various fields of the weight. ">" indicates that if the stat is greater than the weight's value, the change amount will be applied. "<" is for less than. "value 0.9" sets the value to compare with to 0.9. "change 6" adds 6 to the weight of any step where the comparison is true. "varia" means that the weight's value will vary according to a wave function. The next 5 tokens set the type and parameters for the wave function. The wave function type can by "sin", "cos", or "tan". The four tokens after that are the offset, phase, amplitude, and frequency of the wave function. See variation_data_t::eval() to see where each of these fits into the wave function. "noveria" means that the weight does not vary. "end" marks the end of a weight. There is not a limit on the number of weights and constraints that can be in the config file. Keep in mind that the constraints and weights apply to the whole chart. If you're trying to construct a constraint that only applies to part of the chart, use a cleverly specififed weight.