-
Notifications
You must be signed in to change notification settings - Fork 64
Timing groups
This is a reference document on timing groups in ArcCreate.
1. How timing groups work
A timing group can be imagined as a separate layer of notes.
Without timing groups, all notes within the chart scroll with the same speed relative to other notes. That's why timing groups' main usage is to create notes that move at different speed to each other. Check out section 2 for more details about this behaviour.
Beside that, timing groups can be used to assign special properties to notes. Check out section 3 for more details about timing group properties in ArcCreate.
You can edit timing groups in two ways, through ArcCreate editor or directly edit the .aff chart file.
To edit timing groups within ArcCreate editor, heads over to the Events panel (with the flag icon). The table at the top will list all timing groups of the chart.
Each row of the table correspond to one timing event. Here you can edit the timing group's name, change the timing group's properties, or toggle its visibility.
To edit timing groups directly in the .aff chart file, the syntax for a timing group is
timinggroup([properties]){
[notes of the groups]
};
e.g
timinggroup(){
timing(0,100.00,4.00);
(0,1);
hold(1000,2000,2);
};
timinggroup(noinput){
timing(0,100.00,4.00);
(0,4);
};
timinggroup(anglex=10.00,angley=10.00){
timing(0,20.00,4.00);
(2000,2);
};
2. Scroll speed
Scroll speed in ArcCreate is defined entirely through BPM. By changing the bpm you can change the scroll speed, and this is achieved through the use of timing events.
To edit timing events within ArcCreate editor, heads over to the Events panel (with the flag icon), and click the Timing button.
The table at the bottom of panel will list all timing events of the currently selected timing group. Each row of the table correspond to one event, and the 3 columns correspond to the 3 properties of a timing event: time, bpm and divisor.
The event is represented the .aff chart file with the following format.
timing([time],[bpm],[divisor]);Where:
- Time means the timing at which the change happens.
- BPM means the bpm to change to.
- Divisor means the number of beats in a bar.
e.g:
timing(1000,200.00,4.00);
To go into more details:
- The exact scroll speed of a note is proportional to
(current bpm) * (song's base bpm) / (bpm at timing 0 of timing group 0) - The divisor property is only used for drawing grey lines on the track at the start of every bar. Since these lines are only drawn for timing group 0, this value is unused for any other timing groups.
- Divisor value is usually decided based on the time signature of the song. A few common value being: 4 for 4/4 time signature, 3 for 3/4 time signature.
- Divisor value of 0 will disable grey lines drawing for the timing event.
A timing event affects the scroll speed of all notes within the same timing group as the event. For example, consider the following setup:
- One timing group with a bpm of 100 and one tap note at lane 1
- Another timing group with a bpm of 200 and one tap note at lane 2
The .aff file will look something like this:
timinggroup(){
timing(0,100.00,4.00);
(1000,1);
};
timinggroup(){
timing(0,200.00,4.00);
(1000,2);
};
The tap note at lane 2 will scroll with the bpm 200, independently from the tap note at lane 1 which will scroll with the bpm 100. The result is that the tap note at lane 2 will scroll twice as fast.
3. Group properties
The following lists all timing group properties, along with their behaviours.
3.1 name
Define the name of the timing group.
Example:
timinggroup(name="Gimmick section")
Changing a timing group's name have no real impact on visual or gameplay. It's only displayed within ArcCreate editor.
3.2. noinput
Disable judgement of notes
Example:
timinggroup(noinput)
Notes within a timing group with noinput will not contribute to the total note count. It also can not be hit, making them essentially decoration notes.
3.3. noclip
Disable notes clipping, i.e making them pass through the judgement plane.
Example:
timinggroup(noclip)
3.4. noheightindicator
Disable rendering vertical beam of arc notes.
Example:
timinggroup(noheightindicator)
3.5. nohead
Disable rendering head segment of arc and trace notes.
Example:
timinggroup(nohead)
3.6. noarccap
Disable rendering approach indicator diamond of arc notes.
Example:
timinggroup(noarccap)
3.7. noshadow
Disable rendering arc and trace notes' shadow.
Example:
timinggroup(noshadow)
3.8. noconnection
Disable rendering connection lines between taps and arctaps of the same timing.
Example:
timinggroup(noconnection)
3.9. fadingholds
Configure hold notes to gradually fade out when missed instead of instantly turning transparent.
Example:
timinggroup(fadingholds)
3.10. ignoremirror
Force notes in timing group to not be mirrored even when the chart is played with mirror modifier.
Example:
timinggroup(ignoremirror)
3.11. light
Forces note skin to be light side.
Example:
timinggroup(light)
3.12. conflict
Forces note skin to be conflict side.
Example:
timinggroup(conflict)
3.13. anglex
Rotates the note's trajectory along the X axis. Default value is 0.
Example:
timinggroup(anglex=45.00)
Normally, a note's trajectory is a straight line along the Z axis. Use this timing group to rotate this line along the x axis, or in other words, rotate it up or down. The note's position at the judgement plane (the z=0 plane) stays unchanged. The angle value is measured in degrees.
3.14. angley
Rotates the note's trajectory along the Y axis. Default value is 0.
Example:
timinggroup(angley=45.00)
Normally, a note's trajectory is a straight line along the Z axis. Use this timing group to rotate this line along the y axis, or in other words, rotate it left or right. The note's position at the judgement plane (the z=0 plane) stays unchanged. The angle value is measured in degrees.
3.15. arcresolution
Increases segment density of arc notes. Default value is 1.
Example:
timinggroup(arcresolution=2)
This change is purely aesthetic and does not affect judgement. Increasing this value will also increase objects count which might lower performance.
3.16. judgesizex
Changes the horizontal judgement hitbox size of notes in this timing group. Default value is 1.
Example:
timinggroup(judgesizex=2)
3.17. judgesizey
Changes the vertical judgement hitbox size of notes in this timing group. Default value is 1.
Example:
timinggroup(judgesizey=2)
3.18. judgeoffsetx
Offsets the judgement hitbox location on the horizontal axis of notes in this timing group. Default value is 0.
Example:
timinggroup(judgeoffsetx=100)
3.19. judgeoffsety
Offsets the judgement hitbox location on the vertical axis of notes in this timing group. Default value is 0.
Example:
timinggroup(judgeoffsety=100)
3.20. judgeoffsetz
Offsets the judgement hitbox location on the depth axis of notes in this timing group. Default value is 0.
Example:
timinggroup(judgeoffsetz=100)
4. Judgement remaps
A special set of timing group properties allows charters to override judgement results (max, perfect, good, miss) to a different result.
- For example, you can emulate mine notes in games such as Beat Saber so that hitting the note perfectly on time results in a miss, while not hitting at all results in a max judgement.
- Or you can create a timing group where taps note only give max or miss and doesn't give good judgement at all.
The properties syntax is as follow: [from_result_type]=[to_result_type]
- Example:
timinggroup(max=miss,miss=max)will turn miss judgements to max, and vice versa.- Example:
timinggroup(perfect=max,good=max)will turn perfect and good judgements to max.
The effect is that all judgement result that matches [from_result_type] will instead be overriden by the judgement result specified by [to_result_type].
The list of valid judgement results is as follow:
| Name | Description |
|---|---|
max |
Max judgements |
perfect |
Perfect early or perfect late judgements |
perfectearly |
Perfect early judgements |
perfectlate |
Perfect late judgements |
good |
Good early or good late judgements |
goodearly |
Good early judgements |
goodlate |
Good late judgements |
miss |
Miss early or miss late judgements |
missearly |
Miss early judgements |
misslate |
Miss late judgements |