Another chart previewing library for Arcaea.
- pydantic~=1.9.1
- Pillow~=9.1.1
- opencv-python~=4.5.5.64
- numpy~=1.23.0
- pyparsing~=3.0.9
- pytest~=7.2.2(for test only, remove it if you don't need to run tests)
pip install -r requirements.txtOr, if you are using uv:
uv syncRender an Arcaea Chart simply.
Before using, you need to copy and rename theme.py to theme_local.py, and edit theme_local.py to locate assets file.
If a property of BaseTheme is inherited by one of its subclasses (e.g. LightTheme), you should modify the property on its subclass. If the property is not inherited, then you should modify it directly on BaseTheme.
| name | file |
|---|---|
font_Exo_SemiBold_XX |
Exo-SemiBold.ttf |
font_Kazesawa_Regular_XX |
Kazesawa-Regular.ttf |
font_SourceHanMonoSC_Regular_XX |
SourceHanMonoSC-Regular.otf |
tile_path |
track.png and track_dark.png |
tap_path |
note.png and note_dark.png |
hold_path |
note_hold.png and note_hold_dark.png |
arctap_path |
tap_l.png and tap_d.png |
arctap_designant_path |
tap_tomato.png |
arctap_sfx_path |
sfx_l_note.jpg and sfx_d_note.jpg |
default_bg_path |
base_light.jpg and base_conflict.jpg |
custom_bg_dir_path |
put your custom background here if bg field has been defined in songlist |
⚠ Note:
This repo does NOT provide these assets files, you need to obtain them by yourself. It is recommended to get them at Arcaea-Infinity/OpenArcaeaArts (Licensed underCC BY-NC).
When rendering the official chart, you deserve to have a songlist from which you can build the song metadata.
from ArcaeaChartRender.render import Render
from ArcaeaChartRender.utils import fetch_song_info
render = Render(
aff_path='./songs/panicbounceattack/2.aff',
cover_path='./songs/panicbounceattacki/base.jpg',
song=fetch_song_info('./songs/songlist', 'panicbounceattack'),
difficulty=2,
constant=7.0,
)
render.show()
render.save('panicbounceattack_2.png')In some cases, you may not be conscious of creating a songlist (e.g. fan-made chart), then you can use the Song model instead of the fetch_song_info() function.
from ArcaeaChartRender.render import Render
from ArcaeaChartRender.model import Song
my_song = Song(
**{
"id": "panicbounceattack",
"idx": 0,
"title_localized": {
"en": "PANIC! BOUNCE!! ATTACK!!!"
},
"artist": "3R2 feat. ptar124",
"bpm": "248",
"bpm_base": 248,
"set": "base",
"purchase": "",
"audioPreview": 94798,
"audioPreviewEnd": 110250,
"side": 0,
"bg": "shiawase2",
"version": "3.12.6",
"date": 1649603401,
"difficulties": [
{
"ratingClass": 2,
"chartDesigner": "Rabi-MisakaChan",
"jacketDesigner": "Misaka12456\naffected by\nYumemochi",
"rating": 10,
"ratingPlus": True
}
]
}
)
render = Render(
aff_path='./songs/panicbounceattack/2.aff',
cover_path='./songs/panicbounceattacki/base.jpg',
song=my_song,
difficulty=2,
constant=7.0,
)
render.show()
render.save('panicbounceattack_2.png')- The yellow area means that the BPM in that area is not equal to the
bpm_baseof the song.
In addition to rendering charts, you can use the library to do the following things.
A minimal syntax check for individual commands in a chart.
from ArcaeaChartRender.aff.decoder import parse_aff
from ArcaeaChartRender.utils import read_file
chart = parse_aff(read_file('./songs/panicbounceattacki/2.aff'))
for cmd in chart.command_list:
print(cmd.syntax_check(), cmd)Statistical information such as combo calculation.
See element.py for more information.
from ArcaeaChartRender.aff.decoder import parse_aff
from ArcaeaChartRender.element import Tap
from ArcaeaChartRender.utils import read_file
chart = parse_aff(read_file('./songs/panicbounceattacki/2.aff'))
print(chart.get_total_combo())
print(chart.get_combo_of(Tap))
print(chart.get_bpm_proportion())
print(chart.get_interval())
...Compose your Arcaea chart by Python DSL, and easily convert plain text of aff file to dict or list.
See aff_parsing.py for more information.
from ArcaeaChartRender.aff.parsing import command
from ArcaeaChartRender.utils import read_file
content = read_file('./songs/panicbounceattacki/2.aff')
print(command.parse_string(content).as_dict())
print(command.parse_string(content).as_list())
...- beautify text style (at text area)
- add support for segmented combo count (per bar)
- add support for custom background (when
Song.bgfield is notNone) - other chart statistics (density, multi-finger, crossed hand, etc.)
BOFXVI - PANIC! BOUNCE! ATTACK!!!from Arcaea-Infinity/FanmadeCharts under616 SB LicenseAff2Previewfrom Arcaea-Infinity/Aff2Preview under616 SB Licensepyparsingfrom pyparsing/pyparsing underMIT Licenseopencv2from opencv/opencv-python underMIT LicensePillowfrom python-pillow/Pillow underHPND License
This project is licensed under the terms of the 616 SB License.
