/********** * This is the seventh iteration of a chart format proposal workshopped by Eric and Emma. * * The chart format is split into several files. */ /********** * Playable: `gameplay/songs//_metadata.json` * Non-playable: `core/music/_metadata.json` * * This is the first file the game searches for when loading a song. * It provides important information such as readable name and credits, * information on how to read the song such as BPM and time signatures, * and custom data used by mods. * * This file is mandatory for playable songs, * and is optional (but useful) for non-playable songs such as menu music. */ { /** * The file version. * Patch version increments (2.0.x) should only be used for bug fixes. * Minor version increments (2.x.0) should be used for new features. * Major version increments (x.0.0) should be used for breaking changes, * and should include a migration function such that older charts can still be used. * * An additional suffix (2.0.0-custom) should be used if the chart uses additional data * or changes that can only be utilized by a mod or engine. * The base game will ignore this suffix, and the chart ought to function as expected in this case. * Other engines may choose to either accomodate or ignore the additional suffix. */ "version": "2.0.0", /** * The canonical name of the song in question and its artist. * This is only supposed to be used to show the proper name of the song, and not for anything to do with loading files! * In the future, this will need to be changed to a localization key. */ "songName": "Philly Nice", "artist": "Kawai Sprite", /** * timeFormat specifies what kind of timestamps will be used by timeChanges, events, and notes (see chart.json). * The supported formats are `ticks, ms, and float`. `ticks` will be used in this document for demonstration. * * ticks: * If the chosen format is `ticks`, an extra value called `divisions` needs to be specified as well. * * float: * If the chosen format is `float`, timestamps are based around quarter notes. * A timestamp of 4.0 is equal to one whole note. * * ms: * If the chosen format is `ms`, timestamps are based on hard millisecond time. * This means notes are entirely independent of BPM, and cannot be exactly converted from one to another if needed. * * Every format is converted to `ms` when the song is loaded in for playing. * These options mostly exist to allow more flexibility while creating a chart. * * If the song is not playable, and there are no BPM or time signature changes, * this value has no effect and can be excluded. * @default "ms" */ "timeFormat": "ticks", "divisions": 96, /** * timeChanges is an array of objects that specify changes in BPM and time signature. It should always be sorted by `t`. * * The first element in the list is used to initialize the BPM and time signature, and its `t` is ignored. * To ensure that it's at the top of the list, the first element should ideally have a `t` of 0 or below. * * - t: Timestamp in specified `timeFormat`. * - b: Time in beats (int). The game will calculate further beat values based on this one, so it can do it in a simple linear fashion. * - bpm: Quarter notes per minute (float). Cannot be empty in the first element of the list, but otherwise it's optional, * and defaults to the value of the previous element. * - n: Time signature numerator (int). Optional, defaults to 4. * - d: Time signature denominator (int). Optional, defaults to 4. Should only ever be a power of two. * - bt: Beat tuplets (Array or int). This defines how many steps each beat is divided into. * It can either be an array of length `n` (see above) or a single integer number. Optional, defaults to 4. */ "timeChanges": [ {"t": -1, "b": 0, "bpm": 175, "n": 4, "d": 4, "bt": [4, 4, 4, 4]} ], /** * Whether the song should loop or not. Only relevant for non-playable songs. * TODO: Add properties for loopStart and loopEnd, once Flixel supports this functionality */ "loop": false, /** * playData contains any information that is ONLY relevant to playable songs. * It is therefore excluded when the metadata file is describing a non-playable song. * * The metadata file should include any information that is needed by the game before loading the chart, * such as available difficulties and the characters/stages used. */ "playData": { /** * Informs the game that there is a secondary metadata/chart file pair for this song. * * For example, with the song variation `erect`, the game would search for * `data/songs//erect_metadata.json` and load it, and later load `data/songs//erect_chart.json` if relevant. * * Any difficulties defined in the other metadata files will use * the secondary file's values for `playableChars`, `stage`, etc. * * Additionally, the audio files that the game loads for the instrumental and vocals * will also change, from `songs//Inst.ogg` to `songs///Inst.ogg`. */ "songVariations": ["erect"], /** * The available difficulties for this song. * The game should not allow attempting to load difficulties that are not specified in this array. * * Any custom difficulties should automatically work. */ "difficulties": ["easy", "normal", "hard"], /** * The list of allowed playable characters, for this song and set of difficulties. * The keys define the set of playable characters, * with the values definining what other characters are to be loaded alongside them. * If no character or `null` is given, there will be no character loaded for that specific role. * * - g: The supporting character (ex. gf). * - o: The opponent character. * - i: The instrumental track to use. Default is used if not specified. */ "playableChars": { "bf": {"g": "gf", "o": "pico"}, "pico": { "g": "nene", "o": "bf", "i": "Pico"}, "tankman": { "o": "pico", "f": false} }, /** * The stage this song is played on. See `data/stages/`. * This information is relevant to the loading state, so stage assets can reliably be loaded ahead of time. * @default "stage" */ "stage": "phillyTrain", /** * The note skin used by the song. * Noteskin would have its own format, which also specifies the number of notes on the strumline. * @default "default" */ "noteSkin": "default" /** * Additional information for use in menus can be added here as needed. * TODO: How do we allow mods to access this info? */ }, // Not used by anything, but just a note to keep this value free so you can keep track of tool versions to help with troubleshooting. "generatedBy": "FNF SongConverter v69" } /***** * `data/songs//chart.json` * This is the file which contains the actual chart data, as loaded and used for gameplay. */ { /** * The file version. See above for more information. */ "version": "2.0.0", /** * The scroll speed used for each difficulty. * scrollSpeed can be one of the following: * - A single number; the chosen scroll speed will be used for all difficulties in this chart file. * - An object; the keys of the object are the difficulties, and the values are the scroll speeds. * The "default" key is also supported, and will be used if no scroll speed is specified for a specific difficulty. */ "scrollSpeed": { "easy": 1, "normal": 1.3, "hard": 2, "default": 1.3 }, /** * The list of song events in this chart. * * Song events represent behavior which occurs at a specific time in the song. * - t: A number providing timestamp at which the event triggers, in the `timeFormat` specified in the metadata file. * - e: A string specifying the event type. See below for more info. * - v: The (optional) value for this event. Its type depends on the associated event (it could be a number, bool, string, array, object...) * * This list is assumed to be in timestamp order, and unexpected behavior may occur if it is not. * * This list will be iterated through before the song is loaded, allowing for modules to mutate them before the song starts. * It also serves to allow for pre-loading certain assets that may be added to the game mid-song through events. * * Many event types will be supported, all with the goal of keeping the game's logic dynamic and synchronized with the song. * Common actions (such as triggering a specific animation at a certain time in the song) should be supported through this mechanism, * without having to create any additional scripts. * * Several possible ideas for event types include: * - "FocusCamera": Sets which character the camera is currently focused on. * This would fully replace "mustHitSection", which is great because it drives me insane. * - "PlayAnimation": Forces a character to play a specific animation. * - "SetIdleSuffix": Sets the suffix to be added to a character's idle animation. * For example, if the value is "-alt", the character will play the "idle-alt" or "danceLeft-alt" animations, as appropriate. * - "SetScrollSpeed": Multiply the current difficulty's scroll speed by the given value. * For example, if this difficulty has a scroll speed of 1.3, and the event specifies a value of 1.5, the scroll speed will be set to 1.95. * - "ScriptEvent": Fires a script event, which is received by all scripts, including character, stage, song, and module scripts. * This should be more than sufficient for mods to implement custom events. */ "events": [ {"t":0,"e":"FocusCamera","v":1}, {"t":2304,"e":"FocusCamera","v":0}, {"t":3840,"e":"FocusCamera","v":1}, {"t":5376,"e":"FocusCamera","v":0}, {"t":6912,"e":"FocusCamera","v":1}, {"t":8448,"e":"FocusCamera","v":0}, {"t":9984,"e":"FocusCamera","v":1}, {"t":11520,"e":"FocusCamera","v":0}, {"t":13056,"e":"FocusCamera","v":1}, {"t":14592,"e":"FocusCamera","v":0}, {"t":16128,"e":"FocusCamera","v":1}, {"t":17664,"e":"FocusCamera","v":0}, {"t":19200,"e":"FocusCamera","v":1}, {"t":20736,"e":"FocusCamera","v":0}, {"t":22272,"e":"FocusCamera","v":1}, {"t":23808,"e":"FocusCamera","v":0} ], /** * The actual playable charts for each difficulty. * The keys are the difficulty names, and the values are arrays of NoteData objects. * Notes are key/value objects, rather than arrays, to allow for easier manipulation. * Each difficulty's chart is assumed to be in timestamp order, and unexpected behavior may occur if it is not. * Note that optional keys should be scrubbed to save space. * * - t: Timestamp in the timeFormat specified in the metadata file. * - d: Index on the strumline (i.e. direction). * The `strumlineSize` value is determined by the song's `noteSkin`. * Performing `floor(d / strumlineSize)` specifies which strumline the note appears on. * (with 0 being the player, 1 being the opponent, etc.). * Performing `d % strumlineSize` specifies the actual note direction (index) on the strumline. * - l: Hold length in specified timeFormat. If none is given, no sustain trail is created. * - k: Kind of this note. If unspecified, defaults to `"normal"`. * This can allow the note to either include custom behavior defined in a module script, * or have a custom appearance defined by the noteSkin (or both). * - el: Editor layer (index) which this note is placed on. * Optional, defaults to 0. * The user can use the UI to toggle visibility of notes placed on different layers. * - ep: Editor pattern child note. * Optional. * If specified, this note is in the chart because it is part of a placed pattern. * The value is the ID of the pattern the note was copied from. * The final chart should be able to be fully recreated by deleting all notes with non-empty `ep`, * then applying the pattern placement data from the `editor` object. */ "notes": { "easy": [ {"t":816,"d":6}, {"t":960,"d":5,"l":72}, {"t":1056,"d":7,"l":48}, {"t":1200,"d":6}, {"t":1344,"d":5,"l":72}, {"t":1440,"d":7,"l":48}, {"t":1584,"d":6}, {"t":1728,"d":5,"l":72}, {"t":1824,"d":7,"l":48}, {"t":1920,"d":4}, {"t":2016,"d":6}, {"t":2112,"d":6}, {"t":2208,"d":4}, {"t":2352,"d":2}, {"t":2496,"d":1,"l":72}, {"t":2592,"d":3,"l":48}, {"t":2736,"d":2}, {"t":2880,"d":1,"l":72}, {"t":2976,"d":3,"l":48}, {"t":3120,"d":2}, {"t":3264,"d":1,"l":72}, {"t":3360,"d":3,"l":48}, {"t":3456,"d":0}, {"t":3552,"d":2}, {"t":3648,"d":2}, {"t":3744,"d":0}, {"t":3936,"d":6}, {"t":4032,"d":4}, {"t":4320,"d":7}, {"t":4416,"d":6}, {"t":4560,"d":5}, {"t":4704,"d":7}, {"t":4800,"d":4}, {"t":4896,"d":7}, {"t":4992,"d":7}, {"t":5088,"d":5}, {"t":5184,"d":7}, {"t":5472,"d":2}, {"t":5568,"d":0}, {"t":5856,"d":3}, {"t":5952,"d":2}, {"t":6096,"d":1}, {"t":6240,"d":3}, {"t":6336,"d":0}, {"t":6432,"d":3}, {"t":6528,"d":3}, {"t":6624,"d":1}, {"t":6720,"d":3}, {"t":6912,"d":6}, {"t":7104,"d":4}, {"t":7200,"d":7}, {"t":7392,"d":7}, {"t":7488,"d":6}, {"t":7632,"d":5}, {"t":7776,"d":7}, {"t":7872,"d":4}, {"t":7968,"d":7}, {"t":8064,"d":7}, {"t":8160,"d":5}, {"t":8256,"d":7}, {"t":8448,"d":2}, {"t":8640,"d":0}, {"t":8736,"d":3}, {"t":8928,"d":3}, {"t":9024,"d":2}, {"t":9168,"d":1}, {"t":9312,"d":3}, {"t":9408,"d":0}, {"t":9504,"d":3}, {"t":9600,"d":3}, {"t":9696,"d":1}, {"t":9792,"d":3}, {"t":9984,"d":6}, {"t":10176,"d":6}, {"t":10272,"d":4}, {"t":10368,"d":6}, {"t":10560,"d":6}, {"t":10656,"d":4}, {"t":10752,"d":6}, {"t":10944,"d":6}, {"t":11040,"d":4}, {"t":11136,"d":6}, {"t":11328,"d":6}, {"t":11424,"d":4}, {"t":11520,"d":2}, {"t":11712,"d":2}, {"t":11808,"d":0}, {"t":11904,"d":2}, {"t":12096,"d":2}, {"t":12192,"d":0}, {"t":12288,"d":2}, {"t":12480,"d":2}, {"t":12576,"d":0}, {"t":12672,"d":2}, {"t":12864,"d":2}, {"t":12960,"d":0}, {"t":13056,"d":6}, {"t":13248,"d":6}, {"t":13344,"d":4}, {"t":13440,"d":6}, {"t":13632,"d":6}, {"t":13728,"d":4}, {"t":13824,"d":6}, {"t":14016,"d":6}, {"t":14112,"d":4}, {"t":14208,"d":7}, {"t":14400,"d":6}, {"t":14496,"d":4}, {"t":14592,"d":2}, {"t":14784,"d":2}, {"t":14880,"d":0}, {"t":14976,"d":2}, {"t":15168,"d":2}, {"t":15264,"d":0}, {"t":15360,"d":2}, {"t":15552,"d":2}, {"t":15648,"d":0}, {"t":15744,"d":3}, {"t":15936,"d":2}, {"t":16032,"d":0}, {"t":16128,"d":7}, {"t":16320,"d":6}, {"t":16512,"d":6}, {"t":16608,"d":7}, {"t":16704,"d":6}, {"t":16896,"d":7}, {"t":17088,"d":6}, {"t":17232,"d":4}, {"t":17280,"d":6}, {"t":17376,"d":4}, {"t":17472,"d":6}, {"t":17568,"d":4}, {"t":17664,"d":3}, {"t":17856,"d":2}, {"t":18048,"d":2}, {"t":18144,"d":3}, {"t":18240,"d":2}, {"t":18432,"d":3}, {"t":18624,"d":2}, {"t":18768,"d":0}, {"t":18816,"d":2}, {"t":18912,"d":0}, {"t":19008,"d":2}, {"t":19104,"d":0}, {"t":19200,"d":6}, {"t":19392,"d":6}, {"t":19584,"d":4}, {"t":19776,"d":6}, {"t":19968,"d":7}, {"t":20160,"d":6}, {"t":20256,"d":4}, {"t":20352,"d":7}, {"t":20544,"d":6}, {"t":20640,"d":4}, {"t":20736,"d":2}, {"t":20928,"d":2}, {"t":21120,"d":0}, {"t":21312,"d":2}, {"t":21504,"d":3}, {"t":21696,"d":2}, {"t":21792,"d":0}, {"t":21888,"d":3}, {"t":22080,"d":2}, {"t":22176,"d":0}, {"t":22272,"d":6}, {"t":22464,"d":6}, {"t":22560,"d":4}, {"t":22656,"d":6}, {"t":22848,"d":6}, {"t":22944,"d":4}, {"t":23040,"d":6}, {"t":23232,"d":6}, {"t":23328,"d":4}, {"t":23424,"d":7}, {"t":23616,"d":6}, {"t":23712,"d":4}, {"t":23808,"d":2}, {"t":24000,"d":2}, {"t":24096,"d":0}, {"t":24192,"d":2}, {"t":24384,"d":2}, {"t":24480,"d":0}, {"t":24576,"d":2}, {"t":24768,"d":2}, {"t":24864,"d":0}, {"t":24960,"d":3}, {"t":25152,"d":2}, {"t":25248,"d":0}, {"t":25296,"d":0}, {"t":25344,"d":1} ], "normal": [ {"t":816,"d":6}, {"t":960,"d":5,"l":72}, {"t":1056,"d":7,"l":48}, {"t":1200,"d":6}, {"t":1344,"d":5,"l":72}, {"t":1440,"d":7,"l":48}, {"t":1584,"d":6}, {"t":1728,"d":5,"l":72}, {"t":1824,"d":7,"l":48}, {"t":1920,"d":4}, {"t":2112,"d":6}, {"t":2208,"d":4}, {"t":2352,"d":2}, {"t":2496,"d":1,"l":72}, {"t":2592,"d":3,"l":48}, {"t":2736,"d":2}, {"t":2880,"d":1,"l":72}, {"t":2976,"d":3,"l":48}, {"t":3120,"d":2}, {"t":3264,"d":1,"l":72}, {"t":3360,"d":3,"l":48}, {"t":3456,"d":0}, {"t":3552,"d":2}, {"t":3648,"d":2}, {"t":3744,"d":0}, {"t":3936,"d":6}, {"t":4032,"d":4}, {"t":4128,"d":7}, {"t":4176,"d":6}, {"t":4320,"d":7}, {"t":4416,"d":6}, {"t":4512,"d":4}, {"t":4560,"d":5}, {"t":4656,"d":4}, {"t":4704,"d":7}, {"t":4800,"d":4}, {"t":4896,"d":7}, {"t":4992,"d":7}, {"t":5088,"d":5}, {"t":5184,"d":6}, {"t":5280,"d":7}, {"t":5472,"d":2}, {"t":5568,"d":0}, {"t":5664,"d":3}, {"t":5712,"d":2}, {"t":5856,"d":3}, {"t":5952,"d":2}, {"t":6048,"d":0}, {"t":6096,"d":1}, {"t":6192,"d":0}, {"t":6240,"d":3}, {"t":6336,"d":0}, {"t":6432,"d":3}, {"t":6528,"d":3}, {"t":6624,"d":1}, {"t":6720,"d":2}, {"t":6816,"d":3}, {"t":6912,"d":6}, {"t":6960,"d":6}, {"t":7008,"d":6}, {"t":7104,"d":4}, {"t":7200,"d":7}, {"t":7248,"d":6}, {"t":7392,"d":7}, {"t":7488,"d":6}, {"t":7584,"d":4}, {"t":7632,"d":5}, {"t":7728,"d":4}, {"t":7776,"d":7}, {"t":7824,"d":7}, {"t":7872,"d":4}, {"t":7920,"d":4}, {"t":7968,"d":7}, {"t":8016,"d":7}, {"t":8064,"d":7}, {"t":8160,"d":5}, {"t":8256,"d":6}, {"t":8352,"d":7}, {"t":8448,"d":2}, {"t":8496,"d":2}, {"t":8544,"d":2}, {"t":8640,"d":0}, {"t":8736,"d":3}, {"t":8784,"d":2}, {"t":8928,"d":3}, {"t":9024,"d":2}, {"t":9120,"d":0}, {"t":9168,"d":1}, {"t":9264,"d":0}, {"t":9312,"d":3}, {"t":9360,"d":3}, {"t":9408,"d":0}, {"t":9456,"d":0}, {"t":9504,"d":3}, {"t":9552,"d":3}, {"t":9600,"d":3}, {"t":9696,"d":1}, {"t":9792,"d":2}, {"t":9888,"d":3}, {"t":9984,"d":6}, {"t":10176,"d":6}, {"t":10224,"d":7}, {"t":10272,"d":4}, {"t":10320,"d":7}, {"t":10368,"d":6}, {"t":10560,"d":6}, {"t":10608,"d":7}, {"t":10656,"d":4}, {"t":10704,"d":5}, {"t":10752,"d":6}, {"t":10944,"d":6}, {"t":10992,"d":7}, {"t":11040,"d":4}, {"t":11088,"d":7}, {"t":11136,"d":6}, {"t":11328,"d":6}, {"t":11376,"d":7}, {"t":11424,"d":4}, {"t":11472,"d":4}, {"t":11520,"d":2}, {"t":11712,"d":2}, {"t":11760,"d":3}, {"t":11808,"d":0}, {"t":11856,"d":3}, {"t":11904,"d":2}, {"t":12096,"d":2}, {"t":12144,"d":3}, {"t":12192,"d":0}, {"t":12240,"d":1}, {"t":12288,"d":2}, {"t":12480,"d":2}, {"t":12528,"d":3}, {"t":12576,"d":0}, {"t":12624,"d":3}, {"t":12672,"d":2}, {"t":12864,"d":2}, {"t":12912,"d":3}, {"t":12960,"d":0}, {"t":13008,"d":0}, {"t":13056,"d":6}, {"t":13152,"d":5}, {"t":13248,"d":6}, {"t":13296,"d":7}, {"t":13344,"d":4}, {"t":13392,"d":7}, {"t":13440,"d":6}, {"t":13536,"d":6}, {"t":13632,"d":6}, {"t":13680,"d":7}, {"t":13728,"d":4}, {"t":13776,"d":5}, {"t":13824,"d":6}, {"t":13920,"d":5}, {"t":14016,"d":6}, {"t":14064,"d":7}, {"t":14112,"d":4}, {"t":14160,"d":7}, {"t":14208,"d":6}, {"t":14304,"d":6}, {"t":14400,"d":6}, {"t":14448,"d":7}, {"t":14496,"d":4}, {"t":14544,"d":4}, {"t":14592,"d":2}, {"t":14688,"d":1}, {"t":14784,"d":2}, {"t":14832,"d":3}, {"t":14880,"d":0}, {"t":14928,"d":3}, {"t":14976,"d":2}, {"t":15072,"d":2}, {"t":15168,"d":2}, {"t":15216,"d":3}, {"t":15264,"d":0}, {"t":15312,"d":1}, {"t":15360,"d":2}, {"t":15456,"d":1}, {"t":15552,"d":2}, {"t":15600,"d":3}, {"t":15648,"d":0}, {"t":15696,"d":3}, {"t":15744,"d":2}, {"t":15840,"d":2}, {"t":15936,"d":2}, {"t":15984,"d":3}, {"t":16032,"d":0}, {"t":16080,"d":0}, {"t":16128,"d":7}, {"t":16224,"d":5}, {"t":16320,"d":6}, {"t":16464,"d":4}, {"t":16512,"d":6}, {"t":16608,"d":7}, {"t":16704,"d":6}, {"t":16848,"d":5}, {"t":16896,"d":7}, {"t":16992,"d":5}, {"t":17088,"d":6}, {"t":17232,"d":4}, {"t":17280,"d":6}, {"t":17376,"d":4}, {"t":17472,"d":6}, {"t":17568,"d":4}, {"t":17616,"d":6}, {"t":17664,"d":3}, {"t":17760,"d":1}, {"t":17856,"d":2}, {"t":18000,"d":0}, {"t":18048,"d":2}, {"t":18144,"d":3}, {"t":18240,"d":2}, {"t":18384,"d":1}, {"t":18432,"d":3}, {"t":18528,"d":1}, {"t":18624,"d":2}, {"t":18768,"d":0}, {"t":18816,"d":2}, {"t":18912,"d":0}, {"t":19008,"d":2}, {"t":19104,"d":0}, {"t":19152,"d":2}, {"t":19200,"d":6}, {"t":19296,"d":5}, {"t":19392,"d":6}, {"t":19488,"d":5}, {"t":19584,"d":4}, {"t":19680,"d":5}, {"t":19776,"d":6}, {"t":19872,"d":6}, {"t":19968,"d":7}, {"t":20064,"d":4}, {"t":20160,"d":6}, {"t":20256,"d":4}, {"t":20352,"d":7}, {"t":20448,"d":6}, {"t":20544,"d":6}, {"t":20592,"d":7}, {"t":20640,"d":4}, {"t":20688,"d":5}, {"t":20736,"d":2}, {"t":20832,"d":1}, {"t":20928,"d":2}, {"t":21024,"d":1}, {"t":21120,"d":0}, {"t":21216,"d":1}, {"t":21312,"d":2}, {"t":21408,"d":2}, {"t":21504,"d":3}, {"t":21600,"d":0}, {"t":21696,"d":2}, {"t":21792,"d":0}, {"t":21888,"d":3}, {"t":21984,"d":2}, {"t":22080,"d":2}, {"t":22128,"d":3}, {"t":22176,"d":0}, {"t":22224,"d":1}, {"t":22272,"d":6}, {"t":22368,"d":5}, {"t":22464,"d":6}, {"t":22512,"d":7}, {"t":22560,"d":4}, {"t":22608,"d":7}, {"t":22656,"d":6}, {"t":22752,"d":6}, {"t":22848,"d":6}, {"t":22896,"d":7}, {"t":22944,"d":4}, {"t":22992,"d":5}, {"t":23040,"d":6}, {"t":23136,"d":5}, {"t":23232,"d":6}, {"t":23280,"d":7}, {"t":23328,"d":4}, {"t":23376,"d":7}, {"t":23424,"d":6}, {"t":23520,"d":6}, {"t":23616,"d":6}, {"t":23664,"d":7}, {"t":23712,"d":4}, {"t":23760,"d":4}, {"t":23808,"d":2}, {"t":23904,"d":1}, {"t":24000,"d":2}, {"t":24048,"d":3}, {"t":24096,"d":0}, {"t":24144,"d":3}, {"t":24192,"d":2}, {"t":24288,"d":2}, {"t":24384,"d":2}, {"t":24432,"d":3}, {"t":24480,"d":0}, {"t":24528,"d":1}, {"t":24576,"d":2}, {"t":24672,"d":1}, {"t":24768,"d":2}, {"t":24816,"d":3}, {"t":24864,"d":0}, {"t":24912,"d":3}, {"t":24960,"d":2}, {"t":25056,"d":2}, {"t":25152,"d":2}, {"t":25200,"d":3}, {"t":25248,"d":0}, {"t":25296,"d":0}, {"t":25344,"d":1} ], "hard": [ {"t":816,"d":6}, {"t":864,"d":4}, {"t":960,"d":5,"l":72}, {"t":1056,"d":7,"l":48}, {"t":1200,"d":6}, {"t":1248,"d":4}, {"t":1344,"d":5,"l":72}, {"t":1440,"d":7,"l":48}, {"t":1584,"d":6}, {"t":1632,"d":4}, {"t":1728,"d":5,"l":72}, {"t":1824,"d":7,"l":48}, {"t":1920,"d":4}, {"t":1968,"d":7}, {"t":2016,"d":6}, {"t":2112,"d":6}, {"t":2208,"d":4}, {"t":2256,"d":4}, {"t":2352,"d":2}, {"t":2400,"d":0}, {"t":2496,"d":1,"l":72}, {"t":2592,"d":3,"l":48}, {"t":2736,"d":2}, {"t":2784,"d":0}, {"t":2880,"d":1,"l":72}, {"t":2976,"d":3,"l":48}, {"t":3120,"d":2}, {"t":3168,"d":0}, {"t":3264,"d":1,"l":72}, {"t":3360,"d":3,"l":48}, {"t":3456,"d":0}, {"t":3504,"d":3}, {"t":3552,"d":2}, {"t":3648,"d":2}, {"t":3744,"d":0}, {"t":3888,"d":6}, {"t":3936,"d":4}, {"t":4032,"d":4}, {"t":4128,"d":7}, {"t":4176,"d":5}, {"t":4272,"d":7}, {"t":4320,"d":4}, {"t":4416,"d":6}, {"t":4512,"d":4}, {"t":4560,"d":5}, {"t":4656,"d":4}, {"t":4704,"d":5}, {"t":4752,"d":7}, {"t":4800,"d":5}, {"t":4848,"d":4}, {"t":4896,"d":5}, {"t":4944,"d":7}, {"t":4968,"d":4}, {"t":4992,"d":7}, {"t":5040,"d":7}, {"t":5088,"d":5}, {"t":5184,"d":6}, {"t":5280,"d":6}, {"t":5328,"d":7}, {"t":5424,"d":2}, {"t":5472,"d":0}, {"t":5568,"d":0}, {"t":5664,"d":3}, {"t":5712,"d":1}, {"t":5808,"d":3}, {"t":5856,"d":0}, {"t":5952,"d":2}, {"t":6048,"d":0}, {"t":6096,"d":1}, {"t":6192,"d":0}, {"t":6240,"d":1}, {"t":6288,"d":3}, {"t":6336,"d":1}, {"t":6384,"d":0}, {"t":6432,"d":1}, {"t":6480,"d":3}, {"t":6504,"d":0}, {"t":6528,"d":3}, {"t":6576,"d":3}, {"t":6624,"d":1}, {"t":6720,"d":2}, {"t":6816,"d":2}, {"t":6864,"d":3}, {"t":6912,"d":6}, {"t":6960,"d":6}, {"t":7008,"d":4}, {"t":7104,"d":4}, {"t":7200,"d":7}, {"t":7248,"d":5}, {"t":7344,"d":7}, {"t":7392,"d":4}, {"t":7488,"d":6}, {"t":7584,"d":4}, {"t":7632,"d":5}, {"t":7728,"d":4}, {"t":7776,"d":5}, {"t":7824,"d":7}, {"t":7872,"d":5}, {"t":7920,"d":4}, {"t":7968,"d":5}, {"t":8016,"d":7}, {"t":8040,"d":4}, {"t":8064,"d":7}, {"t":8112,"d":7}, {"t":8160,"d":5}, {"t":8256,"d":6}, {"t":8352,"d":6}, {"t":8400,"d":7}, {"t":8448,"d":2}, {"t":8496,"d":2}, {"t":8544,"d":0}, {"t":8640,"d":0}, {"t":8736,"d":3}, {"t":8784,"d":1}, {"t":8880,"d":3}, {"t":8928,"d":0}, {"t":9024,"d":2}, {"t":9120,"d":0}, {"t":9168,"d":1}, {"t":9264,"d":0}, {"t":9312,"d":1}, {"t":9360,"d":3}, {"t":9408,"d":1}, {"t":9456,"d":0}, {"t":9504,"d":1}, {"t":9552,"d":3}, {"t":9576,"d":0}, {"t":9600,"d":3}, {"t":9648,"d":3}, {"t":9696,"d":1}, {"t":9792,"d":2}, {"t":9888,"d":2}, {"t":9936,"d":3}, {"t":9984,"d":6}, {"t":10032,"d":7}, {"t":10080,"d":5}, {"t":10128,"d":4}, {"t":10176,"d":6}, {"t":10224,"d":7}, {"t":10272,"d":4}, {"t":10320,"d":7}, {"t":10368,"d":6}, {"t":10416,"d":7}, {"t":10464,"d":6}, {"t":10512,"d":4}, {"t":10560,"d":6}, {"t":10608,"d":7}, {"t":10656,"d":4}, {"t":10704,"d":5}, {"t":10752,"d":6}, {"t":10800,"d":7}, {"t":10848,"d":5}, {"t":10896,"d":4}, {"t":10944,"d":6}, {"t":10992,"d":7}, {"t":11040,"d":4}, {"t":11088,"d":7}, {"t":11136,"d":6}, {"t":11184,"d":7}, {"t":11232,"d":6}, {"t":11280,"d":4}, {"t":11328,"d":6}, {"t":11376,"d":7}, {"t":11424,"d":4}, {"t":11472,"d":4}, {"t":11520,"d":2}, {"t":11568,"d":3}, {"t":11616,"d":1}, {"t":11664,"d":0}, {"t":11712,"d":2}, {"t":11760,"d":3}, {"t":11808,"d":0}, {"t":11856,"d":3}, {"t":11904,"d":2}, {"t":11952,"d":3}, {"t":12000,"d":2}, {"t":12048,"d":0}, {"t":12096,"d":2}, {"t":12144,"d":3}, {"t":12192,"d":0}, {"t":12240,"d":1}, {"t":12288,"d":2}, {"t":12336,"d":3}, {"t":12384,"d":1}, {"t":12432,"d":0}, {"t":12480,"d":2}, {"t":12528,"d":3}, {"t":12576,"d":0}, {"t":12624,"d":3}, {"t":12672,"d":2}, {"t":12720,"d":3}, {"t":12768,"d":2}, {"t":12816,"d":0}, {"t":12864,"d":2}, {"t":12912,"d":3}, {"t":12960,"d":0}, {"t":13008,"d":0}, {"t":13056,"d":6}, {"t":13104,"d":7}, {"t":13152,"d":5}, {"t":13200,"d":4}, {"t":13248,"d":6}, {"t":13296,"d":7}, {"t":13344,"d":4}, {"t":13392,"d":7}, {"t":13440,"d":6}, {"t":13488,"d":7}, {"t":13536,"d":6}, {"t":13584,"d":4}, {"t":13632,"d":6}, {"t":13680,"d":7}, {"t":13728,"d":4}, {"t":13776,"d":4}, {"t":13824,"d":6}, {"t":13872,"d":7}, {"t":13920,"d":5}, {"t":13968,"d":4}, {"t":14016,"d":6}, {"t":14064,"d":7}, {"t":14112,"d":4}, {"t":14160,"d":7}, {"t":14208,"d":6}, {"t":14256,"d":7}, {"t":14304,"d":6}, {"t":14352,"d":4}, {"t":14400,"d":6}, {"t":14448,"d":7}, {"t":14496,"d":4}, {"t":14544,"d":4}, {"t":14592,"d":2}, {"t":14640,"d":3}, {"t":14688,"d":1}, {"t":14736,"d":0}, {"t":14784,"d":2}, {"t":14832,"d":3}, {"t":14880,"d":0}, {"t":14928,"d":3}, {"t":14976,"d":2}, {"t":15024,"d":3}, {"t":15072,"d":2}, {"t":15120,"d":0}, {"t":15168,"d":2}, {"t":15216,"d":3}, {"t":15264,"d":0}, {"t":15312,"d":0}, {"t":15360,"d":2}, {"t":15408,"d":3}, {"t":15456,"d":1}, {"t":15504,"d":0}, {"t":15552,"d":2}, {"t":15600,"d":3}, {"t":15648,"d":0}, {"t":15696,"d":3}, {"t":15744,"d":2}, {"t":15792,"d":3}, {"t":15840,"d":2}, {"t":15888,"d":0}, {"t":15936,"d":2}, {"t":15984,"d":3}, {"t":16032,"d":0}, {"t":16080,"d":0}, {"t":16128,"d":7}, {"t":16176,"d":7}, {"t":16224,"d":5}, {"t":16272,"d":5}, {"t":16320,"d":6}, {"t":16368,"d":6}, {"t":16464,"d":4}, {"t":16512,"d":6}, {"t":16560,"d":7}, {"t":16584,"d":4}, {"t":16608,"d":7}, {"t":16656,"d":7}, {"t":16704,"d":6}, {"t":16752,"d":4}, {"t":16800,"d":4}, {"t":16848,"d":5}, {"t":16896,"d":7}, {"t":16944,"d":7}, {"t":16968,"d":4}, {"t":16992,"d":7}, {"t":17040,"d":5}, {"t":17088,"d":6}, {"t":17136,"d":6}, {"t":17184,"d":4}, {"t":17232,"d":4}, {"t":17280,"d":6}, {"t":17328,"d":7}, {"t":17376,"d":4}, {"t":17424,"d":7}, {"t":17472,"d":6}, {"t":17568,"d":5}, {"t":17616,"d":7}, {"t":17664,"d":3}, {"t":17712,"d":3}, {"t":17760,"d":1}, {"t":17808,"d":1}, {"t":17856,"d":2}, {"t":17904,"d":2}, {"t":18000,"d":0}, {"t":18048,"d":2}, {"t":18096,"d":3}, {"t":18120,"d":0}, {"t":18144,"d":3}, {"t":18192,"d":3}, {"t":18240,"d":2}, {"t":18288,"d":0}, {"t":18336,"d":0}, {"t":18384,"d":1}, {"t":18432,"d":3}, {"t":18480,"d":3}, {"t":18504,"d":0}, {"t":18528,"d":3}, {"t":18576,"d":1}, {"t":18624,"d":2}, {"t":18672,"d":2}, {"t":18720,"d":0}, {"t":18768,"d":0}, {"t":18816,"d":2}, {"t":18864,"d":3}, {"t":18912,"d":0}, {"t":18960,"d":3}, {"t":19008,"d":2}, {"t":19104,"d":1}, {"t":19152,"d":3}, {"t":19200,"d":6}, {"t":19296,"d":5}, {"t":19344,"d":7}, {"t":19392,"d":6}, {"t":19488,"d":5}, {"t":19536,"d":7}, {"t":19584,"d":4}, {"t":19632,"d":7}, {"t":19680,"d":5}, {"t":19728,"d":7}, {"t":19776,"d":6}, {"t":19872,"d":6}, {"t":19920,"d":6}, {"t":19968,"d":7}, {"t":20016,"d":5}, {"t":20064,"d":4}, {"t":20112,"d":7}, {"t":20160,"d":6}, {"t":20256,"d":4}, {"t":20304,"d":4}, {"t":20352,"d":7}, {"t":20400,"d":7}, {"t":20448,"d":6}, {"t":20496,"d":4}, {"t":20544,"d":6}, {"t":20592,"d":7}, {"t":20640,"d":4}, {"t":20688,"d":5}, {"t":20736,"d":2}, {"t":20832,"d":1}, {"t":20880,"d":3}, {"t":20928,"d":2}, {"t":21024,"d":1}, {"t":21072,"d":3}, {"t":21120,"d":0}, {"t":21168,"d":3}, {"t":21216,"d":1}, {"t":21264,"d":3}, {"t":21312,"d":2}, {"t":21408,"d":2}, {"t":21456,"d":2}, {"t":21504,"d":3}, {"t":21552,"d":1}, {"t":21600,"d":0}, {"t":21648,"d":3}, {"t":21696,"d":2}, {"t":21792,"d":0}, {"t":21840,"d":0}, {"t":21888,"d":3}, {"t":21936,"d":3}, {"t":21984,"d":2}, {"t":22032,"d":0}, {"t":22080,"d":2}, {"t":22128,"d":3}, {"t":22176,"d":0}, {"t":22224,"d":1}, {"t":22272,"d":6}, {"t":22320,"d":7}, {"t":22368,"d":5}, {"t":22416,"d":4}, {"t":22464,"d":6}, {"t":22512,"d":7}, {"t":22560,"d":4}, {"t":22608,"d":7}, {"t":22656,"d":6}, {"t":22704,"d":7}, {"t":22752,"d":6}, {"t":22800,"d":4}, {"t":22848,"d":6}, {"t":22896,"d":7}, {"t":22944,"d":4}, {"t":22992,"d":4}, {"t":23040,"d":6}, {"t":23088,"d":7}, {"t":23136,"d":5}, {"t":23184,"d":4}, {"t":23232,"d":6}, {"t":23280,"d":7}, {"t":23328,"d":4}, {"t":23376,"d":7}, {"t":23424,"d":6}, {"t":23472,"d":7}, {"t":23520,"d":6}, {"t":23568,"d":4}, {"t":23616,"d":6}, {"t":23664,"d":7}, {"t":23712,"d":4}, {"t":23760,"d":4}, {"t":23808,"d":2}, {"t":23856,"d":3}, {"t":23904,"d":1}, {"t":23952,"d":0}, {"t":24000,"d":2}, {"t":24048,"d":3}, {"t":24096,"d":0}, {"t":24144,"d":3}, {"t":24192,"d":2}, {"t":24240,"d":3}, {"t":24288,"d":2}, {"t":24336,"d":0}, {"t":24384,"d":2}, {"t":24432,"d":3}, {"t":24480,"d":0}, {"t":24528,"d":0}, {"t":24576,"d":2}, {"t":24624,"d":3}, {"t":24672,"d":1}, {"t":24720,"d":0}, {"t":24768,"d":2}, {"t":24816,"d":3}, {"t":24864,"d":0}, {"t":24912,"d":3}, {"t":24960,"d":2}, {"t":25008,"d":3}, {"t":25056,"d":2}, {"t":25104,"d":0}, {"t":25152,"d":2}, {"t":25200,"d":3}, {"t":25248,"d":0}, {"t":25296,"d":0}, {"t":25344,"d":1} ] }, /** * Data used only by the chart editor. * This object is optional, and the chart file ought to be fully playable when it is excluded. */ "editor": { /** * An map of patterns which exist for this chart. * You can browse through these using the interface on the right side, * place them in the chart in multiple places, create them from an existing selection, * and double click to enter the pattern for editing. * * Editing a pattern will affect the grouped notes in all locations that the pattern was placed. * If a user destroys a pattern from the UI, they will be prompted to either * ungroup the notes (leaving them in the chart) or remove the grouped notes from the chart. * * The key for the map is a randomized unique ID for the pattern, used to quickly reference it elsewhere in the chart. */ "patternDefinitions": { "a7be4f8": { /** * A label to identify the pattern. * Should be customizable by the user, and does not need to be unique (the key for the map keeps patterns separate) */ "label": "Secondary Motif", /** * A color to highlight the grouped notes with in the UI. * Should be customizable by the user (HaxeUI has a color picker, yay!). */ "color": "#FF3333", /** * The notes placed in the pattern. * These are of the same format as the main `notes` object, with the exception that * editor attributes (such as layer and pattern child) are not allowed. * * `t` acts as an offset with 0 representing the timestamp the pattern was placed. */ "notes": [ {"t":300, "d":4}, {"t":600, "d":2}, {"t":900, "d":1},- {"t":1300, "d":3}, ] } }, /** * Defines where in the chart that patterns are currently placed. * Add one key for each difficulty in the chart. * * When placing a pattern in a chart, an element should be added to the appropriate array below, * then the pattern should be fetched, and the pattern notes (with `t = pattern time + offset) * copied to the chart, with `ep` set so the chart editor knows the notes are part of a pattern. */ "patternPlacements": { "easy": [], "normal": [ { "t": 3000, "p": "a7be4f8", "f": false, "el": 2 } ], "hard": [ { "t": 3000, "p": "a7be4f8", "f": false, "el": 2 } ] }, /** * Metadata about the layers in the chart. * The first layer (0) is always named "Default" and it cannot be rearranged or deleted. * If there are no other layers in the chart, this array will be empty. */ "layers": [ { /** * The name this note layer has in the interface. */ "label": "Test" } ] }, // Not used by anything, but just a note to keep this value free so you can keep track of tool versions to help with troubleshooting. "generatedBy": "FNF SongConverter v69" }