Skip to content

10 Time Scale ​

In this chapter, we will display each time scale change as a yellow line and value in the left margin, completing Preview mode.

Time Scale Change ​

The time scale change implementation is similar to the BPM change from the previous chapter. Both use standard archetype names and imported fields from sonolus.script.archetype. A time scale value belongs in the left margin because it affects the chart's time-based display.

First, in guide/lib/skin.py, map a field to the standard yellow grid sprite. Keep the existing fields. This reuses the grid resource from the selected skin:

python
@skin
class Skin:
    # ...

    timescale_change_line: StandardSprite.GRID_YELLOW

Then append the archetype below to guide/preview/bar_line.py. The imports it needs were added for PreviewBpmChange in the previous chapter:

python
class PreviewTimescaleChange(PreviewArchetype):
    name = StandardArchetypeName.TIMESCALE_CHANGE

    beat: StandardImport.BEAT
    timescale: StandardImport.TIMESCALE

    def preprocess(self):
        Chart.beats = max(Chart.beats, self.beat)
        Chart.duration = max(Chart.duration, beat_to_time(self.beat))

    def render(self):
        draw_line(Skin.timescale_change_line, self.beat, order=2, a=0.5)
        print_at_time(
            self.timescale,
            beat_to_time(self.beat),
            fmt=PrintFormat.TIMESCALE,
            color=PrintColor.YELLOW,
            side="left",
        )

Finally, import PreviewTimescaleChange in guide/preview/mode.py and add it after PreviewBpmChange in the archetypes list:

python
from guide.preview.bar_line import PreviewBpmChange, PreviewTimescaleChange

preview_mode = PreviewMode(
    archetypes=[
        PreviewInitialization,
        PreviewStage,
        PreviewNote,
        PreviewBpmChange,
        PreviewTimescaleChange,
    ],
    skin=Skin,
)

Order 2 places a time scale marker above the other timing lines at the same beat.

Checkpoint ​

Build the project from the project directory:

shell
uv run sonolus-py build

Open the sample level in Preview. Confirm all of the following:

  • Notes appear in the correct panels.
  • Time labels and yellow time scale values appear on the left.
  • Measure labels and purple BPM values appear on the right.
  • Every whole beat has a line, with a stronger line every four beats.
  • The canvas includes the last visible event.

Continue to Tutorial Mode.