├── .github └── workflows │ └── main.yml ├── .gitignore ├── LICENSE ├── README.rst ├── docs ├── Makefile ├── deploy.py └── source │ ├── appendix.rst │ ├── client.rst │ ├── conf.py │ ├── index.rst │ ├── replays.rst │ ├── what-is-a-beatmap.rst │ └── working-with-beatmaps.rst ├── setup.py └── slider ├── __init__.py ├── __main__.py ├── abc.py ├── beatmap.py ├── bit_enum.py ├── cli.py ├── client.py ├── collection.py ├── curve.py ├── example_data ├── __init__.py ├── beatmaps │ ├── AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Beginner].osu │ ├── AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Extra].osu │ ├── AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Hard].osu │ ├── AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Kyshiro's Extra].osu │ ├── AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Nathan's Insane].osu │ ├── AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Normal].osu │ ├── AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Sharkie's Insane].osu │ ├── AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Smoothie World's Extra].osu │ ├── AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Super Beginner].osu │ ├── AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Tatoe].osu │ ├── AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Ultra Beginner].osu │ ├── AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Walao's Advanced].osu │ ├── AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Yuistrata's Easy].osu │ ├── AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [ktgster's Insane].osu │ ├── AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [pishi's Extra].osu │ ├── AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [sheela's Very Hard].osu │ ├── AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [toybot's Insane].osu │ ├── Remo Prototype[CV Hanamori Yumiri] - Sendan Life (Narcissu) [Crystal's Garakowa].osu │ ├── Remo Prototype[CV Hanamori Yumiri] - Sendan Life (Narcissu) [Easy].osu │ ├── Remo Prototype[CV Hanamori Yumiri] - Sendan Life (Narcissu) [Extra].osu │ ├── Remo Prototype[CV Hanamori Yumiri] - Sendan Life (Narcissu) [Little's Hard].osu │ ├── Remo Prototype[CV Hanamori Yumiri] - Sendan Life (Narcissu) [Little's Insane].osu │ ├── Remo Prototype[CV Hanamori Yumiri] - Sendan Life (Narcissu) [Normal].osu │ ├── Sambomaster - Sekai wa Sore wo Ai to Yobunda ze (ZZT the Fifth) [Normal].osu │ └── __init__.py └── collections │ ├── __init__.py │ └── test.db ├── game_mode.py ├── library.py ├── mod.py ├── position.py ├── replay.py ├── tests ├── __init__.py ├── test_beatmap.py ├── test_collection.py └── test_utils.py └── utils.py /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | build-and-test: 10 | 11 | runs-on: ${{ matrix.os }} 12 | strategy: 13 | matrix: 14 | os: [ubuntu-latest, windows-latest, macos-latest] 15 | python-version: [3.7, 3.8] 16 | steps: 17 | - uses: actions/checkout@v1 18 | - name: Set up Python ${{ matrix.python-version }} 19 | uses: actions/setup-python@v1 20 | with: 21 | python-version: ${{ matrix.python-version }} 22 | - name: Install dependencies 23 | run: | 24 | python -m pip install --upgrade pip 25 | pip install -e .[dev] 26 | - name: Lint with flake8 27 | run: | 28 | flake8 slider 29 | - name: Test with pytest 30 | run: | 31 | pytest slider/ 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | etc/unzipped-beatmap 2 | notebooks/ 3 | 4 | build/ 5 | dist/ 6 | *.egg 7 | *.egg-info 8 | 9 | # python artifacts 10 | *.pyc 11 | 12 | # spearmint 13 | output/ 14 | 15 | # osu! API key 16 | .api-key 17 | 18 | .params 19 | 20 | .ipynb_checkpoints/* 21 | *.ipynb 22 | 23 | data/* 24 | venv/* 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | 9 | This version of the GNU Lesser General Public License incorporates 10 | the terms and conditions of version 3 of the GNU General Public 11 | License, supplemented by the additional permissions listed below. 12 | 13 | 0. Additional Definitions. 14 | 15 | As used herein, "this License" refers to version 3 of the GNU Lesser 16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU 17 | General Public License. 18 | 19 | "The Library" refers to a covered work governed by this License, 20 | other than an Application or a Combined Work as defined below. 21 | 22 | An "Application" is any work that makes use of an interface provided 23 | by the Library, but which is not otherwise based on the Library. 24 | Defining a subclass of a class defined by the Library is deemed a mode 25 | of using an interface provided by the Library. 26 | 27 | A "Combined Work" is a work produced by combining or linking an 28 | Application with the Library. The particular version of the Library 29 | with which the Combined Work was made is also called the "Linked 30 | Version". 31 | 32 | The "Minimal Corresponding Source" for a Combined Work means the 33 | Corresponding Source for the Combined Work, excluding any source code 34 | for portions of the Combined Work that, considered in isolation, are 35 | based on the Application, and not on the Linked Version. 36 | 37 | The "Corresponding Application Code" for a Combined Work means the 38 | object code and/or source code for the Application, including any data 39 | and utility programs needed for reproducing the Combined Work from the 40 | Application, but excluding the System Libraries of the Combined Work. 41 | 42 | 1. Exception to Section 3 of the GNU GPL. 43 | 44 | You may convey a covered work under sections 3 and 4 of this License 45 | without being bound by section 3 of the GNU GPL. 46 | 47 | 2. Conveying Modified Versions. 48 | 49 | If you modify a copy of the Library, and, in your modifications, a 50 | facility refers to a function or data to be supplied by an Application 51 | that uses the facility (other than as an argument passed when the 52 | facility is invoked), then you may convey a copy of the modified 53 | version: 54 | 55 | a) under this License, provided that you make a good faith effort to 56 | ensure that, in the event an Application does not supply the 57 | function or data, the facility still operates, and performs 58 | whatever part of its purpose remains meaningful, or 59 | 60 | b) under the GNU GPL, with none of the additional permissions of 61 | this License applicable to that copy. 62 | 63 | 3. Object Code Incorporating Material from Library Header Files. 64 | 65 | The object code form of an Application may incorporate material from 66 | a header file that is part of the Library. You may convey such object 67 | code under terms of your choice, provided that, if the incorporated 68 | material is not limited to numerical parameters, data structure 69 | layouts and accessors, or small macros, inline functions and templates 70 | (ten or fewer lines in length), you do both of the following: 71 | 72 | a) Give prominent notice with each copy of the object code that the 73 | Library is used in it and that the Library and its use are 74 | covered by this License. 75 | 76 | b) Accompany the object code with a copy of the GNU GPL and this license 77 | document. 78 | 79 | 4. Combined Works. 80 | 81 | You may convey a Combined Work under terms of your choice that, 82 | taken together, effectively do not restrict modification of the 83 | portions of the Library contained in the Combined Work and reverse 84 | engineering for debugging such modifications, if you also do each of 85 | the following: 86 | 87 | a) Give prominent notice with each copy of the Combined Work that 88 | the Library is used in it and that the Library and its use are 89 | covered by this License. 90 | 91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license 92 | document. 93 | 94 | c) For a Combined Work that displays copyright notices during 95 | execution, include the copyright notice for the Library among 96 | these notices, as well as a reference directing the user to the 97 | copies of the GNU GPL and this license document. 98 | 99 | d) Do one of the following: 100 | 101 | 0) Convey the Minimal Corresponding Source under the terms of this 102 | License, and the Corresponding Application Code in a form 103 | suitable for, and under terms that permit, the user to 104 | recombine or relink the Application with a modified version of 105 | the Linked Version to produce a modified Combined Work, in the 106 | manner specified by section 6 of the GNU GPL for conveying 107 | Corresponding Source. 108 | 109 | 1) Use a suitable shared library mechanism for linking with the 110 | Library. A suitable mechanism is one that (a) uses at run time 111 | a copy of the Library already present on the user's computer 112 | system, and (b) will operate properly with a modified version 113 | of the Library that is interface-compatible with the Linked 114 | Version. 115 | 116 | e) Provide Installation Information, but only if you would otherwise 117 | be required to provide such information under section 6 of the 118 | GNU GPL, and only to the extent that such information is 119 | necessary to install and execute a modified version of the 120 | Combined Work produced by recombining or relinking the 121 | Application with a modified version of the Linked Version. (If 122 | you use option 4d0, the Installation Information must accompany 123 | the Minimal Corresponding Source and Corresponding Application 124 | Code. If you use option 4d1, you must provide the Installation 125 | Information in the manner specified by section 6 of the GNU GPL 126 | for conveying Corresponding Source.) 127 | 128 | 5. Combined Libraries. 129 | 130 | You may place library facilities that are a work based on the 131 | Library side by side in a single library together with other library 132 | facilities that are not Applications and are not covered by this 133 | License, and convey such a combined library under terms of your 134 | choice, if you do both of the following: 135 | 136 | a) Accompany the combined library with a copy of the same work based 137 | on the Library, uncombined with any other library facilities, 138 | conveyed under the terms of this License. 139 | 140 | b) Give prominent notice with the combined library that part of it 141 | is a work based on the Library, and explaining where to find the 142 | accompanying uncombined form of the same work. 143 | 144 | 6. Revised Versions of the GNU Lesser General Public License. 145 | 146 | The Free Software Foundation may publish revised and/or new versions 147 | of the GNU Lesser General Public License from time to time. Such new 148 | versions will be similar in spirit to the present version, but may 149 | differ in detail to address new problems or concerns. 150 | 151 | Each version is given a distinguishing version number. If the 152 | Library as you received it specifies that a certain numbered version 153 | of the GNU Lesser General Public License "or any later version" 154 | applies to it, you have the option of following the terms and 155 | conditions either of that published version or of any later version 156 | published by the Free Software Foundation. If the Library as you 157 | received it does not specify a version number of the GNU Lesser 158 | General Public License, you may choose any version of the GNU Lesser 159 | General Public License ever published by the Free Software Foundation. 160 | 161 | If the Library as you received it specifies that a proxy can decide 162 | whether future versions of the GNU Lesser General Public License shall 163 | apply, that proxy's public statement of acceptance of any version is 164 | permanent authorization for you to choose that version for the 165 | Library. 166 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | slider 2 | ====== 3 | 4 | Utilities for working with `osu! `_ files and data. 5 | 6 | `Read the docs! `_ 7 | 8 | Included Tools 9 | -------------- 10 | 11 | Beatmap Parser 12 | ~~~~~~~~~~~~~~ 13 | 14 | Slider includes an osu! beatmap parser for programmatic access and manipulation of 15 | ``.osu`` and ``.osz`` files. 16 | 17 | Replay Parser 18 | ~~~~~~~~~~~~~ 19 | 20 | Slider includes an osu! replay parser for reading metadata, 300/100/50/miss 21 | counts, and input stream data out of ``.osr`` files. 22 | 23 | Osu! API 24 | ~~~~~~~~ 25 | 26 | Slider includes a Python interface to the osu! web API for requesting 27 | information about users or beatmaps. 28 | 29 | Dependencies 30 | ------------ 31 | 32 | Slider currently requires Python 3.6+. 33 | 34 | Slider also requires a few PyData tools like numpy and scipy; see the 35 | ``setup.py`` for a full list of required packages. 36 | 37 | Thanks 38 | ------ 39 | 40 | I would like to thank `peppy `_ for creating osu! and 41 | providing resources for writing these tools. 42 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | SPHINXPROJ = slider 8 | SOURCEDIR = source 9 | BUILDDIR = build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -------------------------------------------------------------------------------- /docs/deploy.py: -------------------------------------------------------------------------------- 1 | # This file is taken from the Zipline project with minor modifications: 2 | # github.com/quantopian/zipline 3 | # 4 | # Copyright 2016 Quantopian, Inc. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # http://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | 18 | from contextlib import contextmanager 19 | from glob import glob 20 | import os 21 | from os.path import abspath, basename, dirname, exists, isfile 22 | from shutil import move, rmtree 23 | from subprocess import check_call 24 | 25 | HERE = dirname(abspath(__file__)) 26 | SLIDER_ROOT = dirname(HERE) 27 | TEMP_LOCATION = "/tmp/slider-doc" 28 | TEMP_LOCATION_GLOB = TEMP_LOCATION + "/*" 29 | 30 | 31 | @contextmanager 32 | def removing(path): 33 | try: 34 | yield 35 | finally: 36 | rmtree(path) 37 | 38 | 39 | def ensure_not_exists(path): 40 | if not exists(path): 41 | return 42 | if isfile(path): 43 | os.unlink(path) 44 | else: 45 | rmtree(path) 46 | 47 | 48 | def main(): 49 | old_dir = os.getcwd() 50 | print("Moving to %s." % HERE) 51 | os.chdir(HERE) 52 | 53 | try: 54 | print("Building docs with 'make html'") 55 | check_call(["make", "html"]) 56 | 57 | print("Clearing temp location '%s'" % TEMP_LOCATION) 58 | rmtree(TEMP_LOCATION, ignore_errors=True) 59 | 60 | with removing(TEMP_LOCATION): 61 | print("Copying built files to temp location.") 62 | move("build/html", TEMP_LOCATION) 63 | 64 | print("Moving to '%s'" % SLIDER_ROOT) 65 | os.chdir(SLIDER_ROOT) 66 | 67 | print("Checking out gh-pages branch.") 68 | check_call( 69 | ["git", "branch", "-f", "--track", "gh-pages", "origin/gh-pages"] 70 | ) 71 | check_call(["git", "checkout", "gh-pages"]) 72 | check_call(["git", "reset", "--hard", "origin/gh-pages"]) 73 | 74 | print("Copying built files:") 75 | for file_ in glob(TEMP_LOCATION_GLOB): 76 | base = basename(file_) 77 | 78 | print("%s -> %s" % (file_, base)) 79 | ensure_not_exists(base) 80 | move(file_, ".") 81 | finally: 82 | os.chdir(old_dir) 83 | 84 | print() 85 | print("Updated documentation branch in directory %s" % SLIDER_ROOT) 86 | print("If you are happy with these changes, commit and push to gh-pages.") 87 | 88 | 89 | if __name__ == "__main__": 90 | main() 91 | -------------------------------------------------------------------------------- /docs/source/appendix.rst: -------------------------------------------------------------------------------- 1 | Appendix 2 | ======== 3 | 4 | Beatmap 5 | ------- 6 | 7 | .. autoclass:: slider.beatmap.Beatmap 8 | :members: 9 | 10 | .. autoclass:: slider.beatmap.HitObject 11 | :members: 12 | 13 | .. autoclass:: slider.beatmap.Circle 14 | :members: 15 | 16 | .. autoclass:: slider.beatmap.Slider 17 | :members: 18 | 19 | .. autoclass:: slider.beatmap.Spinner 20 | :members: 21 | 22 | .. autoclass:: slider.beatmap.HoldNote 23 | :members: 24 | 25 | Library 26 | ------- 27 | 28 | .. autoclass:: slider.library.Library 29 | :members: 30 | 31 | Client 32 | ------ 33 | 34 | .. autoclass:: slider.client.Client 35 | :members: 36 | 37 | .. autoclass:: slider.client.BeatmapResult 38 | :members: 39 | 40 | .. autoclass:: slider.client.UnknownBeatmap 41 | :members: 42 | 43 | .. autoclass:: slider.client.User 44 | :members: 45 | 46 | .. autoclass:: slider.client.UserEvent 47 | :members: 48 | 49 | .. autoclass:: slider.client.HighScore 50 | :members: 51 | 52 | .. autoclass:: slider.client.ApprovedState 53 | :members: 54 | :undoc-members: 55 | 56 | .. autoclass:: slider.client.Genre 57 | :members: 58 | :undoc-members: 59 | 60 | .. autoclass:: slider.client.Language 61 | :members: 62 | :undoc-members: 63 | 64 | Replay 65 | ------ 66 | 67 | .. autoclass:: slider.replay.Replay 68 | :members: 69 | 70 | .. autoclass:: slider.replay.Action 71 | :members: 72 | 73 | Collection 74 | ---------- 75 | 76 | .. autoclass:: slider.collection.CollectionDB 77 | :members: 78 | 79 | .. autoclass:: slider.collection.Collection 80 | :members: 81 | 82 | Game Modes 83 | ---------- 84 | 85 | .. autoclass:: slider.game_mode.GameMode 86 | :members: 87 | :undoc-members: 88 | 89 | Mods 90 | ---- 91 | 92 | .. autoclass:: slider.mod.Mod 93 | :members: 94 | :undoc-members: 95 | 96 | .. autofunction:: slider.mod.ar_to_ms 97 | 98 | .. autofunction:: slider.mod.ms_to_ar 99 | 100 | .. autofunction:: slider.mod.circle_radius 101 | 102 | Utilities 103 | --------- 104 | 105 | .. autofunction:: slider.utils.accuracy 106 | 107 | .. autoclass:: slider.position.Position 108 | :members: 109 | 110 | .. autoclass:: slider.bit_enum.BitEnum 111 | :members: 112 | -------------------------------------------------------------------------------- /docs/source/client.rst: -------------------------------------------------------------------------------- 1 | Osu! API 2 | ======== 3 | 4 | Peppy, being the hero that he is, exposes a web API for making queries about 5 | osu!. Slider provides a Python interface to this web API through a 6 | :class:`~slider.client.Client` object. The client knows how to format messages 7 | to send to the osu! API and knows how to parse the results returned. It will 8 | also attempt to do argument validation client side to avoid making a bad web 9 | request. 10 | 11 | User Information 12 | ---------------- 13 | 14 | The :class:`~slider.client.Client` can fetch user information with the 15 | :meth:`~slider.client.Client.user` method. This method can look up a user by 16 | either username or user id. It will explicitly tell the osu! server which 17 | identifier you are using to avoid ambiguity. The method also accepts the game 18 | mode to fetch information about. 19 | 20 | High Scores 21 | ~~~~~~~~~~~ 22 | 23 | If we already have a :class:`~slider.client.User` object, we can request their 24 | high scores with the :meth:`~slider.client.User.high_scores` method. This will 25 | return a list of :class:`~slider.client.HighScore` objects which has metadata 26 | about the play like which map it was and the hit counts. Right now there is no 27 | way to recover the :class:`~slider.replay.Replay` object from the 28 | :class:`~slider.client.HighScore`. 29 | 30 | If we do not yet have a :class:`~slider.client.User` object, we can request the 31 | high scores directly with :meth:`~slider.client.Client.user_best`. This takes 32 | the user identifier and game mode but just directly returns the list of 33 | :class:`~slider.client.HighScore` objects. This method is more efficient if you 34 | only want to get the high scores for a user. 35 | 36 | Beatmaps 37 | -------- 38 | 39 | The osu! API allows us to query for beatmaps themselves. Slider exposes this 40 | through the :meth:`~slider.client.Client.beatmap` method. This method can either 41 | be used to look up a single beatmap by id or md5 hash, or to fetch maps in bulk 42 | by date ranked. 43 | 44 | .. note:: 45 | 46 | When fetching maps in bulk, we can only get 500 results at a time. 47 | 48 | When we get results from the :meth:`~slider.client.Client.beatmap` method, they 49 | are returned as :class:`~slider.client.BeatmapResult` objects instead of the 50 | normal :class:`slider.beatmap.Beatmap`. The 51 | :class:`~slider.client.BeatmapResult` object holds the extra information about a 52 | map which is only available through the client, for example: the pass and play 53 | counts. 54 | 55 | The :class:`~slider.client.Beatmap` can be fetched from the 56 | :class:`~slider.client.BeatmapResult` object with the 57 | :meth:`~slider.client.BeatmapResult.beatmap` method. This can be passed 58 | ``save=True`` to save the downloaded ``.osu`` file into the 59 | :class:`~slider.library.Library`. 60 | -------------------------------------------------------------------------------- /docs/source/conf.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | # 4 | # slider documentation build configuration file, created by 5 | # sphinx-quickstart on Tue Apr 18 01:37:25 2017. 6 | # 7 | # This file is execfile()d with the current directory set to its 8 | # containing dir. 9 | # 10 | # Note that not all possible configuration values are present in this 11 | # autogenerated file. 12 | # 13 | # All configuration values have a default; values that are commented out 14 | # serve to show the default. 15 | 16 | # If extensions (or modules to document with autodoc) are in another directory, 17 | # add these directories to sys.path here. If the directory is relative to the 18 | # documentation root, use os.path.abspath to make it absolute, like shown here. 19 | # 20 | # import os 21 | # import sys 22 | # sys.path.insert(0, os.path.abspath('.')) 23 | 24 | 25 | # -- General configuration ------------------------------------------------ 26 | 27 | # If your documentation needs a minimal Sphinx version, state it here. 28 | # 29 | # needs_sphinx = '1.0' 30 | 31 | # Add any Sphinx extension module names here, as strings. They can be 32 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 33 | # ones. 34 | extensions = [ 35 | "sphinx.ext.autodoc", 36 | "sphinx.ext.intersphinx", 37 | "sphinx.ext.extlinks", 38 | "sphinx.ext.autosummary", 39 | "sphinx.ext.todo", 40 | "sphinx.ext.mathjax", 41 | "sphinx.ext.viewcode", 42 | "numpydoc", 43 | ] 44 | 45 | numpydoc_show_class_members = False 46 | 47 | # Add any paths that contain templates here, relative to this directory. 48 | templates_path = ["_templates"] 49 | 50 | # The suffix(es) of source filenames. 51 | # You can specify multiple suffix as a list of string: 52 | # 53 | # source_suffix = ['.rst', '.md'] 54 | source_suffix = ".rst" 55 | 56 | # The master toctree document. 57 | master_doc = "index" 58 | 59 | # General information about the project. 60 | project = "slider" 61 | copyright = "2017, Joe Jevnik" 62 | author = "Joe Jevnik" 63 | 64 | # The version info for the project you're documenting, acts as replacement for 65 | # |version| and |release|, also used in various other places throughout the 66 | # built documents. 67 | # 68 | # The short X.Y version. 69 | version = "0.8.2" 70 | # The full version, including alpha/beta/rc tags. 71 | release = "0.8.2" 72 | 73 | # The language for content autogenerated by Sphinx. Refer to documentation 74 | # for a list of supported languages. 75 | # 76 | # This is also used if you do content translation via gettext catalogs. 77 | # Usually you set "language" from the command line for these cases. 78 | language = None 79 | 80 | # List of patterns, relative to source directory, that match files and 81 | # directories to ignore when looking for source files. 82 | # This patterns also effect to html_static_path and html_extra_path 83 | exclude_patterns = [] 84 | 85 | # The name of the Pygments (syntax highlighting) style to use. 86 | pygments_style = "sphinx" 87 | 88 | # If true, `todo` and `todoList` produce output, else they produce nothing. 89 | todo_include_todos = True 90 | 91 | 92 | # -- Options for HTML output ---------------------------------------------- 93 | 94 | # The theme to use for HTML and HTML Help pages. See the documentation for 95 | # a list of builtin themes. 96 | # 97 | html_theme = "sphinx_rtd_theme" 98 | 99 | # Theme options are theme-specific and customize the look and feel of a theme 100 | # further. For a list of options available for each theme, see the 101 | # documentation. 102 | # 103 | # html_theme_options = {} 104 | 105 | # Add any paths that contain custom static files (such as style sheets) here, 106 | # relative to this directory. They are copied after the builtin static files, 107 | # so a file named "default.css" will overwrite the builtin "default.css". 108 | html_static_path = ["_static"] 109 | 110 | 111 | # -- Options for HTMLHelp output ------------------------------------------ 112 | 113 | # Output file base name for HTML help builder. 114 | htmlhelp_basename = "sliderdoc" 115 | 116 | 117 | # -- Options for LaTeX output --------------------------------------------- 118 | 119 | latex_elements = { 120 | # The paper size ('letterpaper' or 'a4paper'). 121 | # 122 | # 'papersize': 'letterpaper', 123 | # The font size ('10pt', '11pt' or '12pt'). 124 | # 125 | # 'pointsize': '10pt', 126 | # Additional stuff for the LaTeX preamble. 127 | # 128 | # 'preamble': '', 129 | # Latex figure (float) alignment 130 | # 131 | # 'figure_align': 'htbp', 132 | } 133 | 134 | # Grouping the document tree into LaTeX files. List of tuples 135 | # (source start file, target name, title, 136 | # author, documentclass [howto, manual, or own class]). 137 | latex_documents = [ 138 | (master_doc, "slider.tex", "slider Documentation", "Joe Jevnik", "manual"), 139 | ] 140 | 141 | 142 | # -- Options for manual page output --------------------------------------- 143 | 144 | # One entry per manual page. List of tuples 145 | # (source start file, name, description, authors, manual section). 146 | man_pages = [(master_doc, "slider", "slider Documentation", [author], 1)] 147 | 148 | 149 | # -- Options for Texinfo output ------------------------------------------- 150 | 151 | # Grouping the document tree into Texinfo files. List of tuples 152 | # (source start file, target name, title, author, 153 | # dir menu entry, description, category) 154 | texinfo_documents = [ 155 | ( 156 | master_doc, 157 | "slider", 158 | "slider Documentation", 159 | author, 160 | "slider", 161 | "One line description of project.", 162 | "Miscellaneous", 163 | ), 164 | ] 165 | 166 | 167 | # Example configuration for intersphinx: refer to the Python standard library. 168 | intersphinx_mapping = {"https://docs.python.org/": None} 169 | -------------------------------------------------------------------------------- /docs/source/index.rst: -------------------------------------------------------------------------------- 1 | .. include:: ../../README.rst 2 | 3 | .. toctree:: 4 | :maxdepth: 2 5 | :caption: Contents: 6 | 7 | what-is-a-beatmap 8 | working-with-beatmaps 9 | replays 10 | client 11 | appendix 12 | 13 | Indices and tables 14 | ================== 15 | 16 | * :ref:`genindex` 17 | * :ref:`modindex` 18 | * :ref:`search` 19 | -------------------------------------------------------------------------------- /docs/source/replays.rst: -------------------------------------------------------------------------------- 1 | Replays 2 | ======= 3 | 4 | Osu! saves player replays in the osu!/data/r directory as ``.osr`` files. We can use 5 | slider to read and process these binary files. Slider represents an osu! replay 6 | with the :class:`~slider.replay.Replay` object. This object stores metadata 7 | about the play like the user who was playing, when the replay was recorded, and 8 | the hit counts. The replay also stores a time-series of all of the events the 9 | user performed during the session. 10 | 11 | Reading a :class:`~slider.replay.Replay` 12 | ---------------------------------------- 13 | 14 | To read a replay, we first need to get a :class:`~slider.library.Library`. It 15 | might seem odd that we need to know about all of our beatmaps to read a single 16 | replay; however, the replay only stores an md5 hash of the beatmap played, not 17 | the beatmap id. This is likely so that revisions to the map will invalidate the 18 | old replay. The library contains a lookup table from md5 to beatmap object which 19 | is used to resolve the actual :class:`~slider.beatmap.Beatmap` object for the 20 | replay. To parse a replay, we can use :meth:`~slider.replay.Replay.from_path` 21 | and pass the path to the ``.osr`` file along with the 22 | :class:`~slider.library.Library`. 23 | 24 | Replay Data 25 | ----------- 26 | 27 | The replay stores the user's hit counts (``count_300``, ``count_100``, 28 | ``count_50``, and ``count_miss``) along with the max combo. The replay also 29 | tells us which mods were used when playing the song. The replay also stores all 30 | of the user input as a time-series of (cursor location, keyboard state) 31 | pairs. 32 | 33 | Slider stores this information in a :class:`slider.replay.Action`. The offset 34 | here is an offset from the previous action, not an absolute offset. 35 | -------------------------------------------------------------------------------- /docs/source/what-is-a-beatmap.rst: -------------------------------------------------------------------------------- 1 | What is a Beatmap? 2 | ================== 3 | 4 | A Beatmap in osu! is a description of song, including metadata like title and 5 | artist as well as the locations of all of the circles, sliders, and 6 | spinners. Osu! stores this information in ``.osu`` files. The ``.osu`` format is 7 | a text format like an ``.ini`` file with extensions for encoding the 8 | time-series of hit objects. 9 | 10 | In slider, the :class:`~slider.beatmap.Beatmap` object represents a beatmap and 11 | exposes the information from the ``.osu`` file. 12 | 13 | Hit Objects 14 | ----------- 15 | 16 | A hit object is the generic term for a circle, slider, or spinner. These are the 17 | things you click in osu!. A hit object is composed of the (x, y, time) position 18 | in the map and the type. For some types of objects, there is some extra 19 | information. 20 | 21 | The (x, y) bounds for all hit objects are [0, 512] by [0, 384]. All hit objects 22 | fall within these bounds regardless of your resolution or window size. 23 | 24 | Sliders 25 | ``````` 26 | 27 | For sliders, the (x, y, time) coordinate is for the start of the slider. The 28 | curve is encoded as a curve type, one of Linear, Bezier, Perfect, or Catmull, 29 | and the control points. The control points are a sequence of (x, y) coordinates 30 | which are interpreted by the curve type to define the shape of the 31 | slider. Control points may fall outside of the [0, 512] by [0, 384] bounds 32 | because they don't actually appear on your screen explicitly. 33 | 34 | Spinners 35 | ```````` 36 | 37 | In addition to (x, y, time), spinners must encode the duration. 38 | -------------------------------------------------------------------------------- /docs/source/working-with-beatmaps.rst: -------------------------------------------------------------------------------- 1 | Working with :class:`~slider.beatmap.Beatmap`\s 2 | =============================================== 3 | 4 | Instantiating a :class:`~slider.beatmap.Beatmap` 5 | ------------------------------------------------ 6 | 7 | A :class:`~slider.beatmap.Beatmap` object can be created directly from a 8 | ``.osu`` file with :meth:`~slider.beatmap.Beatmap.from_path`. This function 9 | takes the path to the ``.osu`` file and returns the slider representation of it. 10 | 11 | To read an entire beatmap set (``.osz``), there is 12 | :meth:`~slider.beatmap.Beatmap.from_osz_path` which takes the path to the 13 | ``.osz`` file and returns a dictionary from version name to 14 | :class:`~slider.beatmap.Beatmap` object. 15 | 16 | Managing :class:`~slider.beatmap.Beatmap`\s with a :class:`~slider.library.Library` 17 | ----------------------------------------------------------------------------------- 18 | 19 | A :class:`~slider.library.Library` is a collection of 20 | :class:`~slider.beatmap.Beatmap` objects which can be looked up by beatmap id 21 | or md5 hash. 22 | 23 | Creating a :class:`~slider.library.Library` 24 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 25 | 26 | CLI 27 | ``` 28 | 29 | Slider libraries can be created from the command line like: 30 | 31 | .. code-block:: bash 32 | 33 | $ python -m slider library /path/to/beatmap/root [--recurse/--no-recurse] 34 | 35 | .. note:: 36 | 37 | To use the CLI, you must install additional dependencies. Use ``pip install 38 | slider[cli]`` to do so. 39 | 40 | 41 | This command will search through ``/path/to/beatmap/root`` recursively and store 42 | metadata to allow slider to quickly find the ``.osu`` files. In the root of the 43 | directory a ``.slider.db`` file will be added which holds the lookup tables 44 | needed to fetch the ``.osu`` files on demand. To disable recursive traversal, 45 | you may use ``--no-recurse``. 46 | 47 | Programmatic 48 | ```````````` 49 | 50 | A :class:`~slider.library.Library` can be created with 51 | :meth:`~slider.library.Library.create_db` which takes a directory and 52 | recursively searches for ``.osu`` files to add. In the root of the directory a 53 | ``.slider.db`` file will be added which holds the lookup tables needed to fetch 54 | the ``.osu`` files on demand. 55 | 56 | Downloading New Beatmaps 57 | ------------------------ 58 | 59 | A :class:`~slider.library.Library` also has a 60 | :meth:`~slider.library.Library.download` method for fetching new beatmaps from 61 | the osu! server. This allows us to quickly get any map we need. The fetched map 62 | can optionally be saved to disk with ``save=True`` so that next time the map is 63 | requested we can load it from disk instead of making a web connection. 64 | 65 | The :meth:`~slider.library.Library.lookup_by_id` method also accepts a 66 | ``download=True`` argument which will fallback to downloading the map from the 67 | osu! server if it is not in the local library. 68 | 69 | Removing a Beatmap 70 | ------------------ 71 | 72 | :meth:`~slider.library.Library.delete` will remove a 73 | :class:`~slider.beatmap.Beatmap` from the library. ``remove_file=False`` may be 74 | passed to preserve the underlying ``.osu`` file while removing the metadata from 75 | the internal library database. 76 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from setuptools import setup, find_packages 3 | import sys 4 | 5 | long_description = "" 6 | 7 | if "sdist" in sys.argv: 8 | with open("README.rst") as f: 9 | long_description = f.read() 10 | 11 | 12 | setup( 13 | name="slider", 14 | version="0.8.2", 15 | description="Utilities for working with osu! files and data", 16 | author="Joe Jevnik", 17 | author_email="joejev@gmail.com", 18 | packages=find_packages(), 19 | long_description=long_description, 20 | license="LGPLv3+", 21 | classifiers=[ 22 | "Development Status :: 3 - Alpha", 23 | "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)", # noqa 24 | "Natural Language :: English", 25 | "Programming Language :: Python :: 3.6", 26 | "Programming Language :: Python :: 3 :: Only", 27 | "Topic :: Games/Entertainment", 28 | ], 29 | url="https://github.com/llllllllll/slider", 30 | install_requires=[ 31 | "numpy", 32 | "requests", 33 | "scipy", 34 | ], 35 | extras_require={ 36 | "dev": [ 37 | "flake8==3.7.9", 38 | "mccabe==0.6.1", 39 | "pyflakes==2.1.1", 40 | "pytest==5.4.1", 41 | ], 42 | "cli": [ 43 | "click", 44 | ], 45 | }, 46 | ) 47 | -------------------------------------------------------------------------------- /slider/__init__.py: -------------------------------------------------------------------------------- 1 | from .beatmap import Beatmap, Circle, Slider, Spinner, TimingPoint, HitObject, HoldNote 2 | from .client import Client 3 | from .game_mode import GameMode 4 | from .mod import Mod 5 | from .position import Position 6 | from .replay import Replay 7 | from .library import Library 8 | from .collection import CollectionDB 9 | 10 | __version__ = "0.8.2" 11 | 12 | 13 | __all__ = [ 14 | "Beatmap", 15 | "Client", 16 | "GameMode", 17 | "Library", 18 | "Mod", 19 | "Position", 20 | "Replay", 21 | "CollectionDB", 22 | "Circle", 23 | "Slider", 24 | "Spinner", 25 | "TimingPoint", 26 | "HitObject", 27 | "HoldNote", 28 | ] 29 | -------------------------------------------------------------------------------- /slider/__main__.py: -------------------------------------------------------------------------------- 1 | from . import Library 2 | 3 | try: 4 | import click 5 | except ImportError as e: 6 | raise ImportError("click must be installed to use the slider cli") from e 7 | 8 | 9 | @click.group() 10 | def main(): 11 | """Slider utilities.""" 12 | 13 | 14 | @main.command() 15 | @click.argument( 16 | "beatmaps", 17 | type=click.Path(exists=True, file_okay=False), 18 | ) 19 | @click.option( 20 | "--recurse/--no-recurse", 21 | help="Recurse through ``path`` searching for beatmaps?", 22 | default=True, 23 | ) 24 | @click.option( 25 | "--progress/--no-progress", 26 | help="Show a progress bar?", 27 | default=True, 28 | ) 29 | @click.option( 30 | "--skip-exceptions/--no-skip-exceptions", 31 | help="Skip beatmap files that cause exceptions rather than exiting?", 32 | default=False, 33 | ) 34 | def library(beatmaps, recurse, progress, skip_exceptions): 35 | """Create a slider database from a directory of beatmaps.""" 36 | Library.create_db( 37 | beatmaps, 38 | recurse=recurse, 39 | show_progress=progress, 40 | skip_exceptions=skip_exceptions, 41 | ) 42 | 43 | 44 | if __name__ == "__main__": 45 | main() 46 | -------------------------------------------------------------------------------- /slider/abc.py: -------------------------------------------------------------------------------- 1 | import abc 2 | 3 | # re-export 4 | abstractmethod = abc.abstractmethod 5 | 6 | 7 | class ABCMeta(abc.ABCMeta): 8 | def __new__(cls, name, bases, dict_): 9 | self = super().__new__(cls, name, bases, dict_) 10 | 11 | # copy docstrings down to implementation if the method does not 12 | # explicitly overwrite it 13 | super_dispatch = super(self, self) 14 | for meth in self.__abstractmethods__: 15 | impl = getattr(self, meth) 16 | if impl.__doc__ is None: 17 | try: 18 | impl.__doc__ = getattr(super_dispatch, meth).__doc__ 19 | except AttributeError: 20 | pass 21 | 22 | return self 23 | -------------------------------------------------------------------------------- /slider/bit_enum.py: -------------------------------------------------------------------------------- 1 | import enum 2 | from functools import reduce 3 | import operator as op 4 | 5 | 6 | class BitEnum(enum.IntEnum): 7 | """A type for enums representing bitmask field values.""" 8 | 9 | @classmethod 10 | def pack(cls, **kwargs): 11 | """Pack a bitmask from explicit bit values. 12 | 13 | Parameters 14 | ---------- 15 | kwargs 16 | The names of the fields and their status. Any fields not explicitly 17 | passed will be set to False. 18 | 19 | Returns 20 | ------- 21 | bitmask : int 22 | The packed bitmask. 23 | """ 24 | members = cls.__members__ 25 | try: 26 | return reduce( 27 | op.or_, 28 | (members[k] * bool(v) for k, v in kwargs.items()), 29 | ) 30 | except KeyError as e: 31 | raise TypeError(f"{e} is not a member of {cls.__qualname__}") 32 | 33 | @classmethod 34 | def unpack(cls, bitmask): 35 | """Unpack a bitmask into a dictionary from field name to field state. 36 | 37 | Parameters 38 | ---------- 39 | bitmask : int 40 | The bitmask to unpack. 41 | 42 | Returns 43 | ------- 44 | status : dict[str, bool] 45 | The mapping from field name to field status. 46 | """ 47 | return {k: bool(bitmask & v) for k, v in cls.__members__.items()} 48 | -------------------------------------------------------------------------------- /slider/cli.py: -------------------------------------------------------------------------------- 1 | from contextlib import contextmanager 2 | 3 | 4 | def maybe_show_progress(it, show_progress, **kwargs): 5 | """Optionally show a progress bar for the given iterator. 6 | 7 | Parameters 8 | ---------- 9 | it : iterable 10 | The underlying iterator. 11 | show_progress : bool 12 | Should progress be shown. 13 | **kwargs 14 | Forwarded to the click progress bar. 15 | 16 | Returns 17 | ------- 18 | itercontext : context manager 19 | A context manager whose enter is the actual iterator to use. 20 | 21 | Examples 22 | -------- 23 | .. code-block:: python 24 | 25 | with maybe_show_progress([1, 2, 3], True) as ns: 26 | for n in ns: 27 | ... 28 | """ 29 | if show_progress: 30 | try: 31 | import click 32 | except ImportError as e: 33 | raise ImportError("click must be installed to show a progressbar") from e 34 | return click.progressbar(it, **kwargs) 35 | 36 | @contextmanager 37 | def ctx(): 38 | yield it 39 | 40 | return ctx() 41 | -------------------------------------------------------------------------------- /slider/collection.py: -------------------------------------------------------------------------------- 1 | from .replay import consume_int, consume_string 2 | 3 | 4 | class CollectionDB: 5 | """An osu! ``collection.db`` file. 6 | 7 | Parameters 8 | ---------- 9 | version : int 10 | Version number (e.g. 20150203) 11 | num_collections : int 12 | Number of collections 13 | collections : list[Collection] 14 | List of :class:`~slider.collection.Collection` s 15 | """ 16 | 17 | def __init__(self, version, num_collections, collections): 18 | self.version = version 19 | self.num_collections = num_collections 20 | self.collections = collections 21 | 22 | @classmethod 23 | def from_path(cls, path): 24 | """Read in a ``collection.db`` file from disk. 25 | 26 | Parameters 27 | ---------- 28 | path : str or pathlib.Path 29 | The path to the file to read from. 30 | """ 31 | with open(path, "rb") as f: 32 | return cls.from_file(f) 33 | 34 | @classmethod 35 | def from_file(cls, file): 36 | """Read in a ``collection.db`` file from an open file object. 37 | 38 | Parameters 39 | ---------- 40 | file : file-like 41 | The file object to read from. 42 | """ 43 | return cls.parse(file.read()) 44 | 45 | @classmethod 46 | def parse(cls, data): 47 | """Parse from ``collection.db`` data. 48 | 49 | Parameters 50 | ---------- 51 | data : bytes 52 | The data from a ``collection.db`` file. 53 | """ 54 | buffer = bytearray(data) 55 | 56 | version = consume_int(buffer) 57 | num_collections = consume_int(buffer) 58 | collections = [] 59 | for i in range(num_collections): 60 | collections.append(Collection.parse(buffer)) 61 | 62 | return cls(version, num_collections, collections) 63 | 64 | 65 | class Collection: 66 | """An osu! collection. One or more collections are present in a 67 | `collection.db` file. 68 | 69 | Parameters 70 | ---------- 71 | name : str 72 | The collection's name 73 | num_beatmaps : int 74 | How many beatmaps the collection contains 75 | md5_hashes : list[str] 76 | List of MD5 hashes of each beatmap 77 | """ 78 | 79 | def __init__(self, name, num_beatmaps, md5_hashes): 80 | self.name = name 81 | self.num_beatmaps = num_beatmaps 82 | self.md5_hashes = md5_hashes 83 | 84 | @classmethod 85 | def parse(cls, buffer): 86 | """Parse an osu! collection. 87 | 88 | Parameters 89 | ---------- 90 | buffer : bytearray 91 | Buffer passed in from parsing ``CollectionDB`` 92 | """ 93 | name = consume_string(buffer) 94 | num_beatmaps = consume_int(buffer) 95 | md5_hashes = [] 96 | for i in range(num_beatmaps): 97 | md5_hashes.append(consume_string(buffer)) 98 | 99 | return cls(name, num_beatmaps, md5_hashes) 100 | -------------------------------------------------------------------------------- /slider/example_data/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llllllllll/slider/2f4437ac002e7eb6e2d0ae6dfc2da04e9fb82075/slider/example_data/__init__.py -------------------------------------------------------------------------------- /slider/example_data/beatmaps/AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Beginner].osu: -------------------------------------------------------------------------------- 1 | osu file format v14 2 | 3 | [General] 4 | AudioFilename: tatoe.mp3 5 | AudioLeadIn: 0 6 | PreviewTime: 6538 7 | Countdown: 0 8 | SampleSet: Soft 9 | StackLeniency: 0.7 10 | Mode: 0 11 | LetterboxInBreaks: 0 12 | WidescreenStoryboard: 0 13 | 14 | [Editor] 15 | DistanceSpacing: 1 16 | BeatDivisor: 4 17 | GridSize: 4 18 | TimelineZoom: 1.8 19 | 20 | [Metadata] 21 | Title:MIIRO vs. Ai no Scenario 22 | TitleUnicode:海色 vs. アイのシナリオ 23 | Artist:AKINO from bless4 & CHiCO with HoneyWorks 24 | ArtistUnicode:AKINO from bless4 & CHiCO with HoneyWorks 25 | Creator:monstrata 26 | Version:Beginner 27 | Source: 28 | Tags:kyshiro sukinathan ktgster pishifat smoothie world walaowey toybot sheela901 yuii- Sharkie みいろ tv size opening kantai collection kancolle fleet girls magic kaito 1412 まじっく快斗1412 艦隊これくしょん -艦これ- 29 | BeatmapID:741358 30 | BeatmapSetID:325158 31 | 32 | [Difficulty] 33 | HPDrainRate:2 34 | CircleSize:2.5 35 | OverallDifficulty:2 36 | ApproachRate:2 37 | SliderMultiplier:0.75 38 | SliderTickRate:1 39 | 40 | [Events] 41 | //Background and Video events 42 | 0,0,"miiro_no_scenario.png",0,0 43 | //Break Periods 44 | //Storyboard Layer 0 (Background) 45 | //Storyboard Layer 1 (Fail) 46 | //Storyboard Layer 2 (Pass) 47 | //Storyboard Layer 3 (Foreground) 48 | //Storyboard Sound Samples 49 | 50 | [TimingPoints] 51 | 0,307.692307692308,4,2,1,60,1,0 52 | 1076,-133.333333333333,4,2,1,60,0,0 53 | 3692,-133.333333333333,4,1,1,60,0,0 54 | 7230,-133.333333333333,4,1,1,60,0,0 55 | 17230,-133.333333333333,4,2,1,45,0,0 56 | 27076,-133.333333333333,4,1,1,60,0,0 57 | 36923,-133.333333333333,4,2,1,45,0,0 58 | 46769,-133.333333333333,4,2,1,60,0,0 59 | 55692,333.333333333333,4,2,1,45,1,0 60 | 56692,333.333333333333,4,2,1,70,1,1 61 | 56692,-133.333333333333,4,2,1,70,0,1 62 | 67275,-133.333333333333,4,2,1,70,0,0 63 | 67358,-133.333333333333,4,2,1,70,0,1 64 | 79025,-133.333333333333,4,2,1,50,0,0 65 | 66 | 67 | [Colours] 68 | Combo1 : 0,64,128 69 | Combo2 : 0,255,255 70 | Combo3 : 128,0,255 71 | Combo4 : 192,192,192 72 | 73 | [HitObjects] 74 | 88,200,1230,6,0,P|121:250|175:274,2,112.500004291535,6|0|2,0:0|0:0|0:0,0:0:0:0: 75 | 113,91,3076,1,0,0:0:0:0: 76 | 194,168,3692,2,0,B|304:225|304:133|410:184,1,225,6|2,0:2|2:0,0:0:0:0: 77 | 370,224,7230,6,0,L|223:241,1,140.625005364418,4|0,0:0|0:0,0:0:0:0: 78 | 126,194,8615,2,0,P|137:130|199:78,1,140.625005364418,6|2,0:0|0:0,0:0:0:0: 79 | 244,96,9692,6,0,B|297:113|297:113|334:75|384:84,1,140.625005364418,6|2,0:0|0:0,0:0:0:0: 80 | 373,195,11076,2,0,P|309:222|239:206,1,140.625005364418,2|0,0:0|0:0,0:0:0:0: 81 | 188,186,12153,6,0,P|171:256|192:320,1,140.625005364418,6|0,0:0|0:0,0:0:0:0: 82 | 298,358,13538,2,0,B|360:379|360:379|423:364|424:296,1,168.750006437302,2|8,0:0|0:0,0:0:0:0: 83 | 424,250,14769,6,0,B|404:195|445:192|423:136,2,112.500004291535,2|8|2,0:0|0:0|0:0,0:0:0:0: 84 | 313,270,16615,1,2,0:2:0:0: 85 | 203,253,17230,6,0,P|225:202|268:167,2,112.500004291535,2|0|0,0:2|0:0|0:0,0:0:0:0: 86 | 247,359,19076,1,2,0:0:0:0: 87 | 313,270,19692,6,0,B|355:260|355:260|389:283|423:264,2,112.500004291535,2|2|0,0:2|0:0|0:0,0:0:0:0: 88 | 300,158,21538,1,2,0:0:0:0: 89 | 208,222,22153,6,0,B|100:253|100:253|62:199|-5:219,2,225.000008583069,2|0|0,0:0|0:0|0:0,0:0:0:0: 90 | 315,189,25230,1,0,0:0:0:0: 91 | 379,281,25846,1,6,0:0:0:0: 92 | 192,155,27076,6,0,B|136:125|152:59|152:59|120:8|72:23,2,196.875007510186,4|2|8,0:0|0:0|0:0,0:0:0:0: 93 | 240,184,29538,6,0,B|295:219|279:279|279:279|337:259|381:307,2,225.000008583069,0|2|2,0:0|0:2|0:0,0:0:0:0: 94 | 128,167,32615,2,0,B|71:167|71:167|25:202,2,112.500004291535,0|2|2,0:2|0:0|0:2,0:0:0:0: 95 | 256,192,34461,12,4,36923,0:0:0:0: 96 | 256,192,38153,6,0,L|174:150,2,84.3750032186509,2|2|2,2:0|2:0|2:0,0:0:0:0: 97 | 307,215,39384,2,0,B|363:244|410:205|410:205|445:261|405:309,2,225.000008583069,2|2|2,2:0|2:0|2:0,0:0:0:0: 98 | 236,126,42461,5,2,2:0:0:0: 99 | 194,230,43076,2,0,L|118:290,2,84.3750032186509,2|2|2,2:0|2:0|2:0,0:0:0:0: 100 | 239,195,44307,6,0,B|277:187|284:149|284:149|358:214|365:124|437:186,2,225.000008583069,2|10|6,2:0|2:0|0:0,0:0:0:0: 101 | 136,242,47384,5,2,0:0:0:0: 102 | 228,308,48000,2,0,B|280:333|336:308|336:308|388:332|448:308,1,225.000008583069,2|0,0:0|0:0,0:0:0:0: 103 | 512,220,49846,5,2,0:0:0:0: 104 | 420,154,50461,2,0,B|368:129|312:154|312:154|260:130|200:154,1,225.000008583069,2|4,0:0|2:0,0:0:0:0: 105 | 256,192,52000,12,0,55230,2:0:0:0: 106 | 256,192,56692,38,0,P|320:229|327:368,1,225.000008583069,6|0,0:0|0:0,0:0:0:0: 107 | 235,303,58692,1,0,1:0:0:0: 108 | 150,230,59358,6,0,P|150:156|266:80,1,225.000008583069,2|0,0:0|0:0,0:0:0:0: 109 | 256,192,61358,1,0,1:0:0:0: 110 | 235,303,62025,6,0,P|188:335|127:340,2,112.500004291535,4|8|2,0:0|0:0|0:0,0:0:0:0: 111 | 342,266,64025,1,8,0:0:0:0: 112 | 363,154,64691,6,0,B|373:100|373:100|325:50|251:62|227:120,1,225.000008583069,8|2,0:0|0:0,0:0:0:0: 113 | 257,223,66691,1,8,0:0:0:0: 114 | 173,298,67358,6,0,L|66:347,2,112.500004291535,4|2|0,0:0|0:0|0:0,0:0:0:0: 115 | 184,186,69358,1,0,1:0:0:0: 116 | 287,140,70025,6,0,L|394:91,2,112.500004291535,2|2|0,0:0|0:0|0:0,0:0:0:0: 117 | 275,252,72025,1,0,1:0:0:0: 118 | 366,318,72691,6,0,B|411:353|411:353|433:261|496:324|515:228,1,225.000008583069,4|2,0:0|0:0,0:0:0:0: 119 | 477,126,74691,1,0,1:0:0:0: 120 | 365,105,75358,6,0,B|330:130|285:127|285:127|282:171|243:196|243:196|236:262,1,225.000008583069,2|12,0:0|0:0,0:0:0:0: 121 | 147,325,77358,1,8,0:0:0:0: 122 | 41,287,78025,6,0,P|12:218|64:118,1,168.750006437302,6|14,0:0|0:0,0:0:0:0: 123 | -------------------------------------------------------------------------------- /slider/example_data/beatmaps/AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Hard].osu: -------------------------------------------------------------------------------- 1 | osu file format v14 2 | 3 | [General] 4 | AudioFilename: tatoe.mp3 5 | AudioLeadIn: 0 6 | PreviewTime: 6538 7 | Countdown: 0 8 | SampleSet: Normal 9 | StackLeniency: 0.7 10 | Mode: 0 11 | LetterboxInBreaks: 0 12 | WidescreenStoryboard: 0 13 | 14 | [Editor] 15 | DistanceSpacing: 1.2 16 | BeatDivisor: 4 17 | GridSize: 4 18 | TimelineZoom: 1.8 19 | 20 | [Metadata] 21 | Title:MIIRO vs. Ai no Scenario 22 | TitleUnicode:海色 vs. アイのシナリオ 23 | Artist:AKINO from bless4 & CHiCO with HoneyWorks 24 | ArtistUnicode:AKINO from bless4 & CHiCO with HoneyWorks 25 | Creator:monstrata 26 | Version:Hard 27 | Source: 28 | Tags:kyshiro sukinathan ktgster pishifat smoothie world walaowey toybot sheela901 yuii- Sharkie みいろ tv size opening kantai collection kancolle fleet girls magic kaito 1412 まじっく快斗1412 艦隊これくしょん -艦これ- 29 | BeatmapID:722986 30 | BeatmapSetID:325158 31 | 32 | [Difficulty] 33 | HPDrainRate:5 34 | CircleSize:4 35 | OverallDifficulty:6 36 | ApproachRate:7.3 37 | SliderMultiplier:1.3 38 | SliderTickRate:1 39 | 40 | [Events] 41 | //Background and Video events 42 | 0,0,"miiro_no_scenario.png",0,0 43 | //Break Periods 44 | //Storyboard Layer 0 (Background) 45 | //Storyboard Layer 1 (Fail) 46 | //Storyboard Layer 2 (Pass) 47 | //Storyboard Layer 3 (Foreground) 48 | //Storyboard Sound Samples 49 | 50 | [TimingPoints] 51 | 0,307.692307692308,4,2,1,60,1,0 52 | 1076,-133.333333333333,4,2,1,60,0,0 53 | 3692,-133.333333333333,4,1,1,60,0,0 54 | 4923,-142.857142857143,4,1,1,60,0,0 55 | 5384,-125,4,1,1,60,0,0 56 | 5846,-111.111111111111,4,1,1,60,0,0 57 | 6307,-100,4,1,1,60,0,0 58 | 7230,-100,4,1,1,60,0,0 59 | 17230,-133.333333333333,4,2,1,45,0,0 60 | 27076,-100,4,1,1,60,0,0 61 | 36923,-133.333333333333,4,2,1,45,0,0 62 | 46769,-100,4,2,1,60,0,0 63 | 55692,333.333333333333,4,2,1,45,1,0 64 | 56692,333.333333333333,4,1,1,70,1,1 65 | 67275,-100,4,2,1,70,0,0 66 | 67358,-100,4,1,1,70,0,1 67 | 79025,-100,4,1,1,50,0,0 68 | 69 | 70 | [Colours] 71 | Combo1 : 0,64,128 72 | Combo2 : 0,255,255 73 | Combo3 : 128,0,255 74 | Combo4 : 192,192,192 75 | 76 | [HitObjects] 77 | 53,106,1230,6,0,L|115:116,1,48.750001859665,6|0,0:0|0:0,0:0:0:0: 78 | 106,187,1538,2,0,L|168:177,1,48.750001859665,0|0,0:0|0:0,0:0:0:0: 79 | 208,128,1846,2,0,P|275:90|343:136,1,146.250005578995,2|0,0:0|0:0,0:0:0:0: 80 | 275,168,2461,6,0,B|268:215|268:215|298:262,1,97.50000371933,2|2,0:0|0:0,0:0:0:0: 81 | 335,318,2923,2,0,L|363:369,2,48.750001859665,0|2|0,0:0|0:0|0:0,0:0:0:0: 82 | 408,304,3384,2,0,L|466:304,1,48.750001859665,2|0,0:0|0:0,0:0:0:0: 83 | 433,233,3692,6,0,P|442:219|339:238,1,292.50001115799,6|2,0:2|2:2,0:0:0:0: 84 | 160,320,4923,6,0,L|99:330,2,45.4999986114502,0|2|2,2:0|2:0|2:0,0:0:0:0: 85 | 212,262,5384,6,0,L|272:272,2,52,0|2|2,2:0|2:0|2:0,0:0:0:0: 86 | 134,218,5846,6,0,L|73:228,2,58.4999982147217,0|2|2,2:0|2:0|2:0,0:0:0:0: 87 | 215,163,6307,6,0,L|309:179,2,65,0|2|2,2:0|2:0|2:0,0:0:0:0: 88 | 126,121,6769,6,0,P|159:80|242:68,1,130,0|0,2:0|2:0,0:0:0:0: 89 | 215,163,7230,6,0,L|184:310,1,130,4|2,0:0|0:3,0:0:0:0: 90 | 177,368,7692,2,0,L|258:341,1,65,8|0,0:0|0:0,0:0:0:0: 91 | 268,275,8000,2,0,L|349:248,2,65,0|0|8,0:0|0:0|0:0,0:0:0:0: 92 | 116,312,8615,6,0,B|84:248|140:248|112:184,1,130,2|8,0:2|0:0,0:0:0:0: 93 | 104,108,9076,1,2,0:2:0:0: 94 | 257,72,9384,2,0,L|321:48,1,65,2|8,0:2|0:0,0:0:0:0: 95 | 388,17,9692,6,0,P|353:69|367:130,1,130,4|2,0:0|0:3,0:0:0:0: 96 | 405,199,10153,2,0,L|443:267,1,65,8|0,0:0|0:0,0:0:0:0: 97 | 361,278,10461,2,0,L|321:344,1,65,2|0,0:2|0:0,0:0:0:0: 98 | 270,279,10769,2,0,L|192:277,1,65,8|0,0:0|0:0,0:0:0:0: 99 | 173,206,11076,6,0,L|108:205,2,65,2|0|8,0:2|0:0|0:0,0:0:0:0: 100 | 250,206,11538,2,0,B|252:175|235:152|209:135|209:135|209:67,1,130,2|0,0:2|0:0,0:0:0:0: 101 | 209,12,12000,1,8,0:0:0:0: 102 | 209,12,12153,6,0,B|172:24|172:24|128:12|128:12|85:28,1,130,4|2,0:0|0:3,0:0:0:0: 103 | 68,105,12615,2,0,L|-3:131,1,65,8|0,0:0|0:0,0:0:0:0: 104 | 56,188,12923,2,0,L|43:262,2,65,2|0|8,0:2|0:0|0:0,0:0:0:0: 105 | 85,28,13538,6,0,B|122:36|145:67|146:99|146:99|242:99,1,195,2|2,0:2|0:2,0:0:0:0: 106 | 424,104,14307,2,0,B|462:188,1,65,0|8,0:0|0:0,0:0:0:0: 107 | 389,212,14615,1,2,0:2:0:0: 108 | 389,212,14769,6,0,B|427:296,1,65,8|2,0:0|0:2,0:0:0:0: 109 | 337,275,15076,2,0,B|253:313,1,65,8|2,0:0|0:2,0:0:0:0: 110 | 274,223,15384,1,8,0:0:0:0: 111 | 326,160,15538,1,2,0:2:0:0: 112 | 326,160,15846,5,2,0:2:0:0: 113 | 297,82,16000,2,0,L|344:24,1,65,8|0,0:2|0:0,0:0:0:0: 114 | 215,69,16307,2,0,L|188:-2,1,65,8|0,0:0|0:0,0:0:0:0: 115 | 161,133,16615,1,10,0:0:0:0: 116 | 189,211,16769,1,10,0:0:0:0: 117 | 189,211,17230,6,0,L|223:308,1,97.50000371933,2|0,0:0|0:0,0:0:0:0: 118 | 243,373,17692,2,0,P|251:312|336:281,1,146.250005578995,2|0,0:0|0:3,0:0:0:0: 119 | 317,355,18307,1,2,0:0:0:0: 120 | 317,355,18461,6,0,B|365:355|365:355|420:315,1,97.50000371933,0|2,0:0|0:0,0:0:0:0: 121 | 420,176,19076,2,0,B|372:176|372:176|317:216,1,97.50000371933,2|0,0:0|0:0,0:0:0:0: 122 | 321,278,19538,1,0,0:0:0:0: 123 | 320,277,19692,6,0,P|277:258|257:215,1,97.50000371933,2|0,0:0|0:0,0:0:0:0: 124 | 288,149,20153,2,0,B|268:138|223:139|200:169|200:169|136:170,1,146.250005578995,2|0,0:0|0:0,0:0:0:0: 125 | 77,170,20769,1,2,0:0:0:0: 126 | 77,170,20923,6,0,B|78:217|120:241|143:242|143:242|232:242,1,195.00000743866,0|2,0:0|0:0,0:0:0:0: 127 | 358,169,21846,2,0,L|408:169,1,48.750001859665,2|0,0:0|0:0,0:0:0:0: 128 | 462,121,22153,6,0,P|425:176|453:261,1,146.250005578995,2|0,0:0|0:0,0:0:0:0: 129 | 484,310,22769,2,0,B|467:320|440:327|416:316|416:316|387:327,1,97.50000371933,2|0,0:0|0:0,0:0:0:0: 130 | 324,356,23230,6,0,P|250:350|206:282,1,146.250005578995,2|0,0:0|0:0,0:0:0:0: 131 | 225,224,23846,1,2,0:0:0:0: 132 | 225,224,24000,2,0,L|257:111,1,97.50000371933,0|0,0:0|0:0,0:0:0:0: 133 | 313,91,24461,6,0,B|264:101|264:101|170:64,1,146.250005578995,2|0,0:0|0:0,0:0:0:0: 134 | 107,35,25076,1,2,0:0:0:0: 135 | 107,34,25230,2,0,P|102:90|137:131,1,97.50000371933,2|2,0:0|0:0,0:0:0:0: 136 | 186,173,25692,1,0,0:0:0:0: 137 | 186,173,25846,6,0,L|170:264,2,65.0000024795533,2|0|0,1:2|0:0|0:0,0:0:0:0: 138 | 254,134,26461,2,0,L|238:43,2,65.0000024795533,0|0|0,1:0|0:0|0:0,0:0:0:0: 139 | 319,179,27076,6,0,P|319:247|266:289,2,130,4|8|2,0:0|0:0|0:2,0:0:0:0: 140 | 254,134,27846,1,0,0:0:0:0: 141 | 182,168,28000,1,8,0:0:0:0: 142 | 175,247,28153,6,0,B|176:299|133:334|133:334|175:345,1,130,2|0,0:3|0:0,0:0:0:0: 143 | 240,356,28615,1,8,0:0:0:0: 144 | 291,295,28769,2,0,P|340:261|410:283,1,130,0|0,0:0|0:0,0:0:0:0: 145 | 432,349,29230,1,8,0:0:0:0: 146 | 356,338,29384,6,0,L|336:200,1,130,2|0,0:3|0:0,0:0:0:0: 147 | 360,134,29846,1,8,0:0:0:0: 148 | 413,76,30000,2,0,P|437:133|396:201,1,130,0|0,0:0|0:0,0:0:0:0: 149 | 337,209,30461,1,8,0:0:0:0: 150 | 283,152,30615,6,0,B|268:128|268:128|232:144|196:128|196:128|182:152,1,130,2|2,0:3|0:3,0:0:0:0: 151 | 153,224,31076,1,8,0:0:0:0: 152 | 299,278,31384,2,0,P|366:282|407:176,1,195,2|0,0:2|0:0,0:0:0:0: 153 | 344,132,32000,6,0,B|282:153|282:153|214:122,2,130,4|8|2,0:0|0:0|3:2,0:0:0:0: 154 | 416,103,32769,1,0,0:0:0:0: 155 | 477,150,32923,2,0,L|467:239,1,65,8|2,0:0|0:2,0:0:0:0: 156 | 464,292,33230,6,0,P|443:250|357:231,2,130,2|8|0,0:3|0:0|0:0,0:0:0:0: 157 | 437,366,34000,1,0,3:0:0:0: 158 | 359,380,34153,2,0,L|274:353,1,65,8|2,0:0|0:2,0:0:0:0: 159 | 220,341,34461,6,0,P|281:317|303:238,1,130,4|8,0:0|0:0,0:0:0:0: 160 | 267,191,34923,1,0,0:0:0:0: 161 | 189,192,35076,2,0,B|165:184|165:184|141:192|141:192|113:184|113:184|89:192|89:192|65:184,1,130,2|8,0:3|0:0,0:0:0:0: 162 | 28,114,35538,6,0,B|17:92|17:92|137:110,1,130,2|2,0:3|3:2,0:0:0:0: 163 | 199,108,36000,1,8,0:0:0:0: 164 | 199,108,36153,2,0,L|287:95,1,65,6|0,0:2|0:0,0:0:0:0: 165 | 340,85,36461,2,0,B|348:109|348:109|340:133|340:133|348:161|348:161|340:185|340:185|348:209,1,130,2|0,3:2|0:0,0:0:0:0: 166 | 374,282,36923,6,0,B|273:302|273:302|217:287,1,146.250005578995,4|0,0:0|2:0,0:0:0:0: 167 | 156,268,37538,2,0,P|174:234|237:211,1,97.50000371933,2|2,2:0|2:0,0:0:0:0: 168 | 382,205,38153,2,0,P|425:221|432:329,2,146.250005578995,2|2|2,2:0|2:0|2:0,0:0:0:0: 169 | 231,290,39384,6,0,B|273:302|273:302|374:282,2,146.250005578995,2|2|2,2:0|2:0|2:0,0:0:0:0: 170 | 203,137,40615,2,0,P|260:98|342:134,2,146.250005578995,2|2|2,2:0|2:0|2:0,0:0:0:0: 171 | 158,286,41846,6,0,P|175:334|216:361,2,97.50000371933,2|2|2,2:0|2:0|2:0,0:0:0:0: 172 | 123,133,42769,1,2,2:0:0:0: 173 | 273,179,43076,2,0,B|320:192|320:192|348:232|348:232|405:250,2,146.250005578995,2|2|2,2:0|2:0|2:0,0:0:0:0: 174 | 168,63,44307,6,0,P|86:58|42:114,2,146.250005578995,2|2|2,2:0|2:0|2:0,0:0:0:0: 175 | 208,194,45538,1,8,2:3:0:0: 176 | 206,213,46000,1,8,0:3:0:0: 177 | 204,232,46461,1,4,0:3:0:0: 178 | 202,251,46769,6,0,L|215:314,1,65,4|0,0:0|0:0,0:0:0:0: 179 | 285,279,47076,2,0,L|298:342,1,65,2|0,0:3|0:0,0:0:0:0: 180 | 309,204,47384,2,0,L|372:190,1,65,2|0,0:0|0:0,0:0:0:0: 181 | 337,121,47692,2,0,L|400:107,1,65,2|0,0:3|0:0,0:0:0:0: 182 | 306,48,48000,6,0,L|242:34,1,65,2|0,0:0|0:0,0:0:0:0: 183 | 244,112,48307,2,0,L|180:98,1,65,2|0,0:3|0:0,0:0:0:0: 184 | 129,38,48615,2,0,P|156:98|124:169,1,130,2|2,0:0|0:0,0:0:0:0: 185 | 82,211,49076,1,12,0:0:0:0: 186 | 33,272,49230,6,0,P|41:323|64:349,1,65,0|0,0:0|0:0,0:0:0:0: 187 | 111,284,49538,2,0,P|159:302|193:295,1,65,2|0,0:3|0:0,0:0:0:0: 188 | 160,222,49846,2,0,P|192:224|220:239,1,65,2|0,0:0|0:0,0:0:0:0: 189 | 283,190,50153,2,0,P|296:219|297:251,1,65,2|0,0:3|0:0,0:0:0:0: 190 | 312,328,50461,6,0,L|376:342,1,65,2|0,0:0|0:0,0:0:0:0: 191 | 373,263,50769,2,0,L|437:277,1,65,8|0,0:3|0:0,0:0:0:0: 192 | 488,337,51076,2,0,P|461:277|493:206,1,130,12|2,0:3|0:3,0:0:0:0: 193 | 512,144,51538,1,2,3:2:0:0: 194 | 463,79,51692,6,0,L|398:93,1,65,4|0,2:0|0:0,0:0:0:0: 195 | 380,169,52000,2,0,L|315:183,1,65,12|0,0:3|0:0,0:0:0:0: 196 | 297,259,52307,1,2,3:3:0:0: 197 | 220,276,52461,1,2,0:0:0:0: 198 | 166,217,52615,1,2,0:3:0:0: 199 | 190,140,52769,1,12,0:3:0:0: 200 | 268,122,52923,6,0,L|332:136,1,65,10|2,0:0|0:0,0:0:0:0: 201 | 351,212,53230,2,0,L|415:226,1,65,8|2,0:3|0:0,0:0:0:0: 202 | 434,302,53538,1,10,0:0:0:0: 203 | 377,356,53692,1,12,0:3:0:0: 204 | 301,333,53846,1,2,0:3:0:0: 205 | 282,255,54000,1,2,0:3:0:0: 206 | 204,232,54153,6,0,B|160:220|124:232|124:232|36:292|120:384|208:296|124:232|124:232|44:176|108:100,1,455,12|2,0:3|2:0,0:0:0:0: 207 | 300,36,55692,6,0,P|364:20|436:40,2,130 208 | 212,164,56692,6,0,B|200:249|200:249|219:303,1,130,4|8,0:2|0:0,0:0:0:0: 209 | 247,361,57192,1,0,0:0:0:0: 210 | 247,361,57358,2,0,P|322:359|365:311,1,130,2|8,0:3|0:0,0:0:0:0: 211 | 400,256,57858,6,0,L|434:194,1,65,2|0,0:2|0:0,0:0:0:0: 212 | 379,139,58192,2,0,L|345:201,1,65,2|8,0:2|0:0,0:0:0:0: 213 | 309,263,58525,2,0,B|256:285|214:250|214:250|168:250,1,130,2|2,0:2|0:3,0:0:0:0: 214 | 107,253,59025,1,8,0:0:0:0: 215 | 56,105,59358,6,0,B|116:82|116:82|190:97,1,130,2|8,0:2|0:0,0:0:0:0: 216 | 256,114,59858,1,0,0:0:0:0: 217 | 332,96,60025,2,0,B|396:82|396:82,2,65,2|0|8,0:3|0:0|0:0,0:0:0:0: 218 | 310,171,60525,6,0,P|289:250|336:298,1,130,2|2,0:3|0:2,0:0:0:0: 219 | 388,299,61025,1,8,0:0:0:0: 220 | 388,299,61191,2,0,L|462:311,1,65,0|2,0:0|0:3,0:0:0:0: 221 | 438,231,61525,2,0,L|479:180,1,65,2|8,0:2|0:0,0:0:0:0: 222 | 404,153,61858,1,0,0:0:0:0: 223 | 404,153,62025,6,0,P|379:100|305:75,2,130,4|8|2,0:0|0:0|0:2,0:0:0:0: 224 | 354,221,62858,2,0,L|312:272,1,65,0|8,0:0|0:0,0:0:0:0: 225 | 237,252,63191,1,2,0:3:0:0: 226 | 237,252,63358,6,0,L|195:302,1,65,2|0,0:2|0:0,0:0:0:0: 227 | 120,282,63691,2,0,L|78:332,1,65,8|0,0:0|0:0,0:0:0:0: 228 | 60,230,64025,2,0,P|44:177|86:109,1,130,2|8,0:2|0:0,0:0:0:0: 229 | 149,83,64525,1,2,0:3:0:0: 230 | 149,83,64691,6,0,P|179:77|236:100,1,65,2|0,0:2|0:0,0:0:0:0: 231 | 242,12,65025,2,0,P|267:28|291:85,1,65,8|2,0:0|0:2,0:0:0:0: 232 | 357,27,65358,2,0,P|363:56|340:113,1,65,2|2,0:2|0:2,0:0:0:0: 233 | 427,118,65691,2,0,P|410:143|353:167,1,65,8|2,0:0|0:2,0:0:0:0: 234 | 412,231,66025,6,0,P|382:237|325:214,1,65,4|0,0:2|0:0,0:0:0:0: 235 | 304,165,66358,2,0,P|272:158|240:164,1,65,8|2,0:0|3:2,0:0:0:0: 236 | 195,228,66691,2,0,L|149:238,2,32.5,2|0|0,3:3|3:0|3:0,0:0:0:0: 237 | 272,237,67025,2,0,L|318:247,2,32.5,8|0|2,3:1|3:0|3:0,0:0:0:0: 238 | 226,300,67358,6,0,B|160:316|160:316|114:307|95:271,1,130,4|8,0:0|0:0,0:0:0:0: 239 | 90,210,67858,1,0,0:0:0:0: 240 | 90,209,68025,2,0,B|69:118|69:118|131:127,1,130,2|8,0:3|0:0,0:0:0:0: 241 | 181,136,68525,6,0,L|260:149,1,65,2|2,0:2|3:3,0:0:0:0: 242 | 298,89,68858,2,0,L|377:102,1,65,0|8,0:0|0:0,0:0:0:0: 243 | 415,42,69191,2,0,P|438:78|412:162,1,130,0|2,0:0|0:2,0:0:0:0: 244 | 340,175,69691,1,8,0:0:0:0: 245 | 181,136,70025,6,0,P|158:172|184:256,1,130,2|8,0:2|0:0,0:0:0:0: 246 | 247,289,70525,1,0,0:0:0:0: 247 | 313,248,70691,2,0,L|392:292,2,65,2|0|8,0:2|0:0|0:0,0:0:0:0: 248 | 310,170,71191,6,0,B|317:115|272:86|272:86|222:87,1,130,2|0,0:2|0:0,0:0:0:0: 249 | 166,59,71691,1,8,0:0:0:0: 250 | 166,59,71858,2,0,L|97:59,1,65,2|2,0:2|0:3,0:0:0:0: 251 | 120,134,72191,1,2,3:0:0:0: 252 | 120,134,72358,2,0,L|47:177,1,65,8|2,0:0|0:3,0:0:0:0: 253 | 110,229,72691,6,0,P|125:296|186:322,2,130,4|8|2,0:0|0:0|0:3,0:0:0:0: 254 | 162,170,73525,1,0,0:0:0:0: 255 | 214,110,73691,2,0,L|300:108,1,65,8|2,0:0|0:3,0:0:0:0: 256 | 341,61,74025,6,0,P|318:97|344:181,2,130,4|8|2,0:0|0:0|0:3,0:0:0:0: 257 | 407,19,74858,1,0,0:0:0:0: 258 | 476,55,75025,2,0,L|515:137,1,65,8|2,0:0|0:3,0:0:0:0: 259 | 452,172,75358,6,0,L|491:254,1,65,2|0,0:2|0:0,0:0:0:0: 260 | 404,252,75691,1,8,0:0:0:0: 261 | 404,252,75858,2,0,L|352:326,1,65,2|2,0:2|0:3,0:0:0:0: 262 | 310,250,76191,1,2,2:0:0:0: 263 | 310,250,76358,2,0,L|219:242,1,65,8|2,0:0|0:2,0:0:0:0: 264 | 167,239,76691,5,8,0:0:0:0: 265 | 132,168,76858,1,0,0:0:0:0: 266 | 53,162,77025,1,8,0:0:0:0: 267 | 8,227,77191,1,0,0:0:0:0: 268 | 40,298,77358,2,0,L|-7:366,1,65,8|0,0:0|0:0,0:0:0:0: 269 | 117,305,77691,2,0,L|151:381,1,65,8|0,0:0|0:0,0:0:0:0: 270 | 167,239,78025,6,0,L|250:246,2,65,2|8|4,0:3|0:3|0:3,0:0:0:0: 271 | 132,168,78525,2,0,L|48:175,2,65,2|8|4,0:3|0:3|0:3,0:0:0:0: 272 | 167,97,79025,1,4,0:0:0:0: 273 | 256,192,79108,12,0,80691,0:0:0:0: 274 | -------------------------------------------------------------------------------- /slider/example_data/beatmaps/AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Normal].osu: -------------------------------------------------------------------------------- 1 | osu file format v14 2 | 3 | [General] 4 | AudioFilename: tatoe.mp3 5 | AudioLeadIn: 0 6 | PreviewTime: 6538 7 | Countdown: 0 8 | SampleSet: Soft 9 | StackLeniency: 0.7 10 | Mode: 0 11 | LetterboxInBreaks: 0 12 | WidescreenStoryboard: 0 13 | 14 | [Editor] 15 | DistanceSpacing: 1 16 | BeatDivisor: 4 17 | GridSize: 4 18 | TimelineZoom: 1.8 19 | 20 | [Metadata] 21 | Title:MIIRO vs. Ai no Scenario 22 | TitleUnicode:海色 vs. アイのシナリオ 23 | Artist:AKINO from bless4 & CHiCO with HoneyWorks 24 | ArtistUnicode:AKINO from bless4 & CHiCO with HoneyWorks 25 | Creator:monstrata 26 | Version:Normal 27 | Source: 28 | Tags:kyshiro sukinathan ktgster pishifat smoothie world walaowey toybot sheela901 yuii- Sharkie みいろ tv size opening kantai collection kancolle fleet girls magic kaito 1412 まじっく快斗1412 艦隊これくしょん -艦これ- 29 | BeatmapID:729927 30 | BeatmapSetID:325158 31 | 32 | [Difficulty] 33 | HPDrainRate:4 34 | CircleSize:3 35 | OverallDifficulty:4.5 36 | ApproachRate:5.4 37 | SliderMultiplier:0.95 38 | SliderTickRate:1 39 | 40 | [Events] 41 | //Background and Video events 42 | 0,0,"miiro_no_scenario.png",0,0 43 | //Break Periods 44 | //Storyboard Layer 0 (Background) 45 | //Storyboard Layer 1 (Fail) 46 | //Storyboard Layer 2 (Pass) 47 | //Storyboard Layer 3 (Foreground) 48 | //Storyboard Sound Samples 49 | 50 | [TimingPoints] 51 | 0,307.692307692308,4,2,1,60,1,0 52 | 1076,-100,4,2,1,60,0,0 53 | 3692,-100,4,1,1,60,0,0 54 | 4923,-100,4,1,1,60,0,0 55 | 7230,-100,4,1,1,60,0,0 56 | 17230,-100,4,2,1,45,0,0 57 | 27076,-100,4,1,1,60,0,0 58 | 36923,-100,4,2,1,45,0,0 59 | 46769,-100,4,2,1,60,0,0 60 | 55692,333.333333333333,4,2,1,45,1,0 61 | 56692,333.333333333333,4,1,1,70,1,1 62 | 66025,-105.263157894737,4,1,1,70,0,1 63 | 67275,-100,4,2,1,70,0,0 64 | 67358,-100,4,1,1,70,0,1 65 | 79025,-100,4,1,1,50,0,0 66 | 67 | 68 | [Colours] 69 | Combo1 : 0,64,128 70 | Combo2 : 0,255,255 71 | Combo3 : 128,0,255 72 | Combo4 : 192,192,192 73 | 74 | [HitObjects] 75 | 271,236,1230,6,0,L|379:272,2,95,6|0|2,0:0|0:0|0:0,0:0:0:0: 76 | 181,204,2153,2,0,L|125:222,1,47.5,0|0,0:0|0:0,0:0:0:0: 77 | 90,234,2461,2,0,P|83:288|139:354,2,142.5,2|0|2,0:0|0:0|0:0,0:0:0:0: 78 | 111,141,3692,2,0,B|120:105|120:105|229:74,2,142.5,6|0|2,0:2|0:0|2:2,0:0:0:0: 79 | 90,234,4923,6,0,B|81:274|81:274|15:295|0:338,2,142.5,0|0|0,2:0|2:0|2:0,0:0:0:0: 80 | 182,203,6153,2,0,B|275:164|275:244|367:204,1,190,2|0,2:0|2:0,0:0:0:0: 81 | 490,136,7230,6,0,L|512:284,1,142.5,4|8,0:0|0:0,0:0:0:0: 82 | 435,337,8000,2,0,L|387:374,2,47.5,0|0|8,0:0|0:0|0:0,0:0:0:0: 83 | 421,242,8615,2,0,P|384:215|334:202,1,95,2|8,0:2|0:0,0:0:0:0: 84 | 290,189,9076,2,0,B|274:233|274:233|285:280|285:280|266:323,1,142.5,2|8,0:2|0:0,0:0:0:0: 85 | 246,366,9692,6,0,P|210:327|119:338,1,142.5,4|8,0:0|0:0,0:0:0:0: 86 | 32,347,10461,2,0,L|-10:380,2,47.5,2|0|8,0:2|0:0|0:0,0:0:0:0: 87 | 67,259,11076,2,0,L|103:172,1,95,2|8,0:2|0:0,0:0:0:0: 88 | 120,126,11538,2,0,B|192:100|192:152|258:125,1,142.5,2|8,0:2|0:0,0:0:0:0: 89 | 300,103,12153,6,0,L|271:256,1,142.5,4|8,0:0|0:0,0:0:0:0: 90 | 185,279,12923,2,0,L|131:297,2,47.5,2|0|8,0:2|0:0|0:0,0:0:0:0: 91 | 261,338,13538,2,0,L|314:356,2,47.5,2|0|8,0:2|0:0|0:0,0:0:0:0: 92 | 219,362,14000,1,2,0:2:0:0: 93 | 124,350,14307,2,0,B|77:343|77:343|50:298,1,95,0|2,0:0|0:2,0:0:0:0: 94 | 33,258,14769,6,0,P|73:239|97:182,1,95,8|8,0:0|0:0,0:0:0:0: 95 | 182,155,15384,2,0,P|178:199|215:248,1,95,8|0,0:0|0:0,0:0:0:0: 96 | 286,289,16000,1,8,0:2:0:0: 97 | 368,242,16307,1,8,0:0:0:0: 98 | 368,147,16615,2,0,L|333:87,1,47.5,2|2,0:0|0:0,0:0:0:0: 99 | 201,96,17230,6,0,P|215:161|163:234,2,142.5,2|2|0,0:0|0:0|0:3,0:0:0:0: 100 | 121,148,18461,2,0,P|85:207|98:276,2,142.5,0|0|0,0:0|0:0|0:0,0:0:0:0: 101 | 185,225,19692,6,0,B|280:230|280:230|334:271,2,142.5,2|2|0,0:0|0:0|0:0,0:0:0:0: 102 | 134,305,20923,2,0,B|38:299|38:299|-15:259,2,142.5,0|0|2,0:0|0:0|0:0,0:0:0:0: 103 | 217,349,22153,6,0,P|252:371|313:373,2,95,2|2|2,0:0|0:0|0:0,0:0:0:0: 104 | 191,256,23076,2,0,L|130:241,1,47.5,0|2,0:0|0:0,0:0:0:0: 105 | 98,233,23384,2,0,P|66:261|49:319,2,95,0|0|0,0:0|0:0|0:0,0:0:0:0: 106 | 165,165,24307,2,0,L|226:150,1,47.5,0|2,0:0|0:0,0:0:0:0: 107 | 257,142,24615,6,0,B|362:167,2,95,0|0|2,0:0|0:0|0:0,0:0:0:0: 108 | 186,78,25538,2,0,B|133:90,1,47.5,2|0,0:0|0:0,0:0:0:0: 109 | 93,100,25846,5,2,1:2:0:0: 110 | 93,100,27076,5,4,0:0:0:0: 111 | 186,78,27384,1,8,0:0:0:0: 112 | 251,147,27692,2,0,P|249:195|212:248,1,95,2|8,0:2|0:0,0:0:0:0: 113 | 236,282,28153,2,0,B|194:262|194:262|158:295|94:295|57:254,1,190,2|0,0:3|0:0,0:0:0:0: 114 | 35,167,29076,1,0,0:0:0:0: 115 | 129,190,29384,6,0,B|221:165|221:165|275:72,1,190,2|0,0:3|0:0,0:0:0:0: 116 | 324,160,30307,2,0,L|289:220,1,47.5,0|8,0:0|0:0,0:0:0:0: 117 | 277,243,30615,2,0,P|345:248|397:305,1,142.5,2|8,0:3|0:0,0:0:0:0: 118 | 304,337,31384,2,0,L|248:359,2,47.5,2|0|8,0:2|3:0|0:0,0:0:0:0: 119 | 387,383,32000,6,0,P|447:364|460:248,1,190,4|2,0:0|3:2,0:0:0:0: 120 | 407,172,32923,1,8,0:0:0:0: 121 | 330,229,33230,2,0,L|405:310,2,95,2|8|0,0:3|0:0|0:0,0:0:0:0: 122 | 320,134,34153,1,8,0:0:0:0: 123 | 398,80,34461,6,0,P|414:125|406:171,1,95,4|8,0:0|0:0,0:0:0:0: 124 | 492,213,35076,2,0,P|461:248|417:265,1,95,2|8,0:3|0:0,0:0:0:0: 125 | 369,255,35538,2,0,B|350:252|331:231|331:231|289:265|231:246,1,142.5,2|8,0:3|0:0,0:0:0:0: 126 | 192,246,36153,2,0,P|192:179|144:126,1,142.5,6|0,0:2|0:0,0:0:0:0: 127 | 103,213,36923,5,4,0:0:0:0: 128 | 103,213,37538,2,0,L|57:311,1,95,2|2,2:0|2:0,0:0:0:0: 129 | 149,336,38153,2,0,B|240:376|240:300|336:348,1,190,2|0,2:0|0:0,0:0:0:0: 130 | 420,381,39076,1,2,2:0:0:0: 131 | 493,322,39384,6,0,P|490:248|398:194,1,190,2|0,2:0|0:0,0:0:0:0: 132 | 320,249,40307,1,2,2:0:0:0: 133 | 232,211,40615,2,0,B|144:173|144:173|87:189,2,142.5,2|2|2,2:0|2:0|2:0,0:0:0:0: 134 | 309,154,41846,5,2,2:0:0:0: 135 | 309,154,42153,2,0,L|404:85,2,95,2|2|2,2:0|2:0|2:0,0:0:0:0: 136 | 221,115,43076,2,0,B|178:91|130:118|130:118|100:229,1,190,2|0,2:0|0:0,0:0:0:0: 137 | 83,301,44000,1,2,2:0:0:0: 138 | 173,274,44307,6,0,B|232:243|292:281|292:281|369:256,1,190,2|0,2:0|0:0,0:0:0:0: 139 | 443,231,45230,1,2,2:0:0:0: 140 | 461,138,45538,2,0,P|428:92|338:79,2,142.5,8|8|4,2:3|0:3|0:3,0:0:0:0: 141 | 371,168,46769,6,0,B|323:178|323:178|264:155,1,95,4|2,0:0|0:3,0:0:0:0: 142 | 217,89,47384,2,0,P|189:132|207:224,1,142.5,2|0,0:0|0:0,0:0:0:0: 143 | 223,261,48000,2,0,L|324:303,1,95,2|2,0:0|0:3,0:0:0:0: 144 | 372,370,48615,2,0,P|401:326|379:232,1,142.5,2|12,0:0|0:0,0:0:0:0: 145 | 367,197,49230,6,0,L|265:154,1,95,0|2,0:0|0:3,0:0:0:0: 146 | 189,127,49846,2,0,B|156:196|216:196|180:264,1,142.5,2|0,0:0|0:0,0:0:0:0: 147 | 140,289,50461,2,0,P|93:294|51:262,1,95,2|8,0:0|0:3,0:0:0:0: 148 | 22,178,51076,2,0,B|42:134|15:87|15:87|80:80,1,142.5,12|2,0:3|3:2,0:0:0:0: 149 | 256,192,51692,12,10,55230,2:3:0:0: 150 | 163,209,56692,6,0,P|138:254|144:318,1,95,4|8,0:2|0:0,0:0:0:0: 151 | 234,277,57358,2,0,L|286:266,1,47.5,2|0,0:3|0:0,0:0:0:0: 152 | 305,224,57692,2,0,L|357:214,1,47.5,8|2,0:0|0:2,0:0:0:0: 153 | 376,172,58025,2,0,L|475:151,2,95,0|8|0,0:0|0:0|0:0,0:0:0:0: 154 | 290,129,59025,1,8,0:0:0:0: 155 | 210,181,59358,6,0,P|158:181|106:143,1,95,2|8,0:2|0:0,0:0:0:0: 156 | 186,89,60025,2,0,L|229:43,1,47.5,2|0,0:3|0:0,0:0:0:0: 157 | 263,65,60358,2,0,L|324:47,1,47.5,8|2,0:0|0:3,0:0:0:0: 158 | 342,83,60691,2,0,L|435:105,2,95,0|8|2,3:0|0:0|0:3,0:0:0:0: 159 | 273,149,61691,1,8,0:0:0:0: 160 | 294,242,62025,6,0,P|273:279|209:310,1,95,4|8,0:0|0:0,0:0:0:0: 161 | 136,282,62691,2,0,L|84:296,2,47.5,2|0|8,0:2|0:0|0:0,0:0:0:0: 162 | 203,214,63358,2,0,P|224:177|288:146,1,95,2|8,0:2|0:0,0:0:0:0: 163 | 361,174,64025,2,0,L|412:159,2,47.5,2|0|8,0:2|0:0|0:0,0:0:0:0: 164 | 294,242,64691,6,0,P|273:279|128:274,1,190,2|2,0:2|0:2,0:0:0:0: 165 | 73,218,65691,2,0,L|75:150,1,47.5,8|2,0:0|0:2,0:0:0:0: 166 | 76,124,66025,6,0,B|104:116|104:116|132:124|132:124|160:116|160:116|188:124|188:124|216:116|216:116|244:124|244:124|272:116|272:116|300:124|300:124|328:116|328:116|356:108,1,270.749992770195,4|8,0:2|3:1,0:0:0:0: 167 | 428,112,67358,6,0,L|392:211,1,95,4|8,0:0|0:0,0:0:0:0: 168 | 358,289,68025,2,0,L|306:298,1,47.5,2|0,0:3|0:0,0:0:0:0: 169 | 264,305,68358,1,8,0:0:0:0: 170 | 182,258,68691,2,0,P|170:206|188:152,2,95,2|8|2,3:3|0:0|0:3,0:0:0:0: 171 | 265,211,69691,1,8,0:0:0:0: 172 | 347,259,70025,6,0,P|399:271|453:253,1,95,2|8,0:2|0:0,0:0:0:0: 173 | 394,176,70691,2,0,L|361:115,1,47.5,2|0,0:2|0:0,0:0:0:0: 174 | 350,91,71025,1,8,0:0:0:0: 175 | 254,86,71358,2,0,B|251:117|251:117|259:149|259:149|252:179,2,95,2|8|2,0:3|0:0|0:3,0:0:0:0: 176 | 307,6,72358,1,8,0:0:0:0: 177 | 402,11,72691,6,0,L|461:14,2,47.5,4|0|8,0:0|0:0|0:0,0:0:0:0: 178 | 350,91,73358,1,2,0:3:0:0: 179 | 254,86,73691,1,8,0:0:0:0: 180 | 201,166,74025,2,0,L|141:162,2,47.5,4|0|8,0:0|0:0|0:0,0:0:0:0: 181 | 244,251,74691,1,2,0:3:0:0: 182 | 339,256,75025,1,8,0:0:0:0: 183 | 381,339,75358,6,0,P|430:355|488:337,1,95,2|8,0:2|0:0,0:0:0:0: 184 | 510,316,75858,2,0,P|526:251|511:205,1,95,2|2,0:2|2:0,0:0:0:0: 185 | 491,187,76358,1,8,0:0:0:0: 186 | 433,260,76691,2,0,L|369:256,1,47.5,8|0,0:0|0:0,0:0:0:0: 187 | 344,281,77025,2,0,L|280:277,1,47.5,8|0,0:0|0:0,0:0:0:0: 188 | 255,302,77358,1,8,0:0:0:0: 189 | 160,296,77691,1,8,0:0:0:0: 190 | 102,220,78025,6,0,B|77:179|77:179|88:115,1,95,2|4,0:3|0:3,0:0:0:0: 191 | 130,119,78525,2,0,B|174:102|174:102|197:60,1,95,2|4,0:3|0:3,0:0:0:0: 192 | 215,16,79025,1,4,0:0:0:0: 193 | 256,192,79191,12,0,80691,0:0:0:0: 194 | -------------------------------------------------------------------------------- /slider/example_data/beatmaps/AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Super Beginner].osu: -------------------------------------------------------------------------------- 1 | osu file format v14 2 | 3 | [General] 4 | AudioFilename: tatoe.mp3 5 | AudioLeadIn: 0 6 | PreviewTime: 6538 7 | Countdown: 0 8 | SampleSet: Soft 9 | StackLeniency: 0.7 10 | Mode: 0 11 | LetterboxInBreaks: 0 12 | WidescreenStoryboard: 0 13 | 14 | [Editor] 15 | DistanceSpacing: 1 16 | BeatDivisor: 4 17 | GridSize: 4 18 | TimelineZoom: 1.8 19 | 20 | [Metadata] 21 | Title:MIIRO vs. Ai no Scenario 22 | TitleUnicode:海色 vs. アイのシナリオ 23 | Artist:AKINO from bless4 & CHiCO with HoneyWorks 24 | ArtistUnicode:AKINO from bless4 & CHiCO with HoneyWorks 25 | Creator:monstrata 26 | Version:Super Beginner 27 | Source: 28 | Tags:kyshiro sukinathan ktgster pishifat smoothie world walaowey toybot sheela901 yuii- Sharkie みいろ tv size opening kantai collection kancolle fleet girls magic kaito 1412 まじっく快斗1412 艦隊これくしょん -艦これ- 29 | BeatmapID:722514 30 | BeatmapSetID:325158 31 | 32 | [Difficulty] 33 | HPDrainRate:1 34 | CircleSize:2.5 35 | OverallDifficulty:1 36 | ApproachRate:1 37 | SliderMultiplier:0.600000005960464 38 | SliderTickRate:1 39 | 40 | [Events] 41 | //Background and Video events 42 | 0,0,"miiro_no_scenario.png",0,0 43 | //Break Periods 44 | //Storyboard Layer 0 (Background) 45 | //Storyboard Layer 1 (Fail) 46 | //Storyboard Layer 2 (Pass) 47 | //Storyboard Layer 3 (Foreground) 48 | //Storyboard Sound Samples 49 | 50 | [TimingPoints] 51 | 0,307.692307692308,4,2,1,60,1,0 52 | 1230,-200,4,2,1,60,0,0 53 | 3692,-200,4,1,1,60,0,0 54 | 17230,-200,4,2,1,45,0,0 55 | 27076,-200,4,1,1,60,0,0 56 | 36923,-200,4,2,1,45,0,0 57 | 46769,-200,4,2,1,60,0,0 58 | 55692,333.333333333333,4,2,1,45,1,0 59 | 56692,333.333333333333,4,2,1,70,1,1 60 | 56692,-200,4,2,1,70,0,1 61 | 67275,-200,4,2,1,70,0,0 62 | 67358,-200,4,2,1,70,0,1 63 | 79025,-100,4,2,1,50,0,0 64 | 65 | 66 | [Colours] 67 | Combo1 : 0,64,128 68 | Combo2 : 0,255,255 69 | Combo3 : 128,0,255 70 | Combo4 : 192,192,192 71 | 72 | [HitObjects] 73 | 56,268,1230,6,0,B|119:246|168:294|168:294|253:229|296:336|397:274,1,360.000003576279,6|2,0:0|2:0,0:0:0:0: 74 | 268,88,7230,6,0,B|185:88|185:88|150:128|150:128|101:92|46:115,2,240.000002384186,4|6|6,0:0|0:0|0:0,0:0:0:0: 75 | 352,193,13538,1,2,0:0:0:0: 76 | 239,235,14769,6,0,B|176:265|136:206|136:206|149:147,1,180.000001788139,8|8,0:0|0:0,0:0:0:0: 77 | 165,88,17230,6,0,P|221:69|283:84,1,120.000001192093,2|0,0:0|0:0,0:0:0:0: 78 | 341,183,19692,2,0,B|288:210|225:188|225:188|165:209,1,180.000001788139,2|0,0:0|0:0,0:0:0:0: 79 | 112,231,22153,6,0,B|80:295|133:338|133:338|197:338,2,180.000001788139,2|0|6,0:0|0:0|0:0,0:0:0:0: 80 | 199,149,27076,6,0,B|254:121|254:121|331:189|420:139,2,240.000002384186,4|0|6,0:0|0:0|0:0,0:0:0:0: 81 | 94,207,33230,1,2,0:0:0:0: 82 | 92,325,34461,2,0,B|136:321|170:302|191:267|191:267|315:268,1,240.000002384186,6|4,0:0|0:0,0:0:0:0: 83 | 429,246,38153,6,0,B|420:184|359:157|359:157|236:156,2,240.000002384186,2|2|2,2:0|2:0|2:0,0:0:0:0: 84 | 311,267,44307,2,0,L|191:267|191:267,1,120.000001192093,2|10,2:0|2:0,0:0:0:0: 85 | 125,370,46769,6,0,P|72:280|124:166,1,240.000002384186,6|0,0:0|0:0,0:0:0:0: 86 | 184,165,49846,2,0,P|266:193|353:164,1,180.000001788139,2|4,0:0|2:0,0:0:0:0: 87 | 256,192,51846,12,0,55230,2:0:0:0: 88 | 255,191,56692,22,0,P|196:177|141:191,1,120.000001192093,6|0,0:0|0:0,0:0:0:0: 89 | 198,297,59358,2,0,P|257:311|312:297,1,120.000001192093,2|0,0:0|0:0,0:0:0:0: 90 | 399,214,62025,6,0,B|421:149|371:105|371:105|312:136|256:108,1,240.000002384186,4|4,0:0|0:2,0:0:0:0: 91 | 151,48,66025,1,2,0:0:0:0: 92 | 46,109,67358,6,0,B|46:169|46:169|78:224,1,120.000001192093,4|0,0:0|0:0,0:0:0:0: 93 | 190,258,70025,2,0,B|190:198|190:198|158:143,1,120.000001192093,2|0,0:0|0:0,0:0:0:0: 94 | 76,220,72691,6,0,P|82:306|209:376,1,240.000002384186,4|6,0:0|0:0,0:0:0:0: 95 | 315,326,76691,2,0,L|425:275,1,120.000001192093,8|6,0:0|0:0,0:0:0:0: 96 | -------------------------------------------------------------------------------- /slider/example_data/beatmaps/AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Ultra Beginner].osu: -------------------------------------------------------------------------------- 1 | osu file format v14 2 | 3 | [General] 4 | AudioFilename: tatoe.mp3 5 | AudioLeadIn: 0 6 | PreviewTime: 6538 7 | Countdown: 0 8 | SampleSet: Soft 9 | StackLeniency: 0.7 10 | Mode: 0 11 | LetterboxInBreaks: 0 12 | WidescreenStoryboard: 0 13 | 14 | [Editor] 15 | DistanceSpacing: 1.7 16 | BeatDivisor: 4 17 | GridSize: 8 18 | TimelineZoom: 0.9999999 19 | 20 | [Metadata] 21 | Title:MIIRO vs. Ai no Scenario 22 | TitleUnicode:海色 vs. アイのシナリオ 23 | Artist:AKINO from bless4 & CHiCO with HoneyWorks 24 | ArtistUnicode:AKINO from bless4 & CHiCO with HoneyWorks 25 | Creator:monstrata 26 | Version:Ultra Beginner 27 | Source: 28 | Tags:kyshiro sukinathan ktgster pishifat smoothie world walaowey toybot sheela901 yuii- Sharkie みいろ tv size opening kantai collection kancolle fleet girls magic kaito 1412 まじっく快斗1412 艦隊これくしょん -艦これ- 29 | BeatmapID:741477 30 | BeatmapSetID:325158 31 | 32 | [Difficulty] 33 | HPDrainRate:0 34 | CircleSize:2 35 | OverallDifficulty:0 36 | ApproachRate:0 37 | SliderMultiplier:0.400000005960464 38 | SliderTickRate:1 39 | 40 | [Events] 41 | //Background and Video events 42 | 0,0,"miiro_no_scenario.png",0,0 43 | //Break Periods 44 | //Storyboard Layer 0 (Background) 45 | //Storyboard Layer 1 (Fail) 46 | //Storyboard Layer 2 (Pass) 47 | //Storyboard Layer 3 (Foreground) 48 | //Storyboard Sound Samples 49 | 50 | [TimingPoints] 51 | 0,307.692307692308,4,2,1,60,1,0 52 | 1230,-300,4,2,1,60,0,0 53 | 3692,-300,4,1,1,60,0,0 54 | 17230,-300,4,2,1,45,0,0 55 | 27076,-300,4,1,1,60,0,0 56 | 36923,-300,4,2,1,45,0,0 57 | 46769,-300,4,2,1,60,0,0 58 | 55692,333.333333333333,4,2,1,45,1,0 59 | 56692,333.333333333333,4,2,1,70,1,1 60 | 56692,-300,4,2,1,70,0,1 61 | 67275,-300,4,2,1,70,0,0 62 | 67358,-300,4,2,1,70,0,1 63 | 78025,-300,4,2,1,70,0,0 64 | 79025,-300,4,2,1,50,0,0 65 | 66 | 67 | [Colours] 68 | Combo1 : 0,64,128 69 | Combo2 : 0,255,255 70 | Combo3 : 128,0,255 71 | Combo4 : 192,192,192 72 | 73 | [HitObjects] 74 | 93,237,1230,6,0,P|129:301|209:309,1,160.000002384186,6|2,0:0|2:0,0:0:0:0: 75 | 358,227,7230,6,0,B|320:128|320:128|265:108|222:151|222:151|149:162|129:103,1,326.666671534379,4|8,0:0|0:0,0:0:0:0: 76 | 97,20,16000,1,4,0:2:0:0: 77 | 186,34,17230,6,0,B|177:72|152:97|116:107|116:107|116:214|116:214|208:208|254:146,1,373.333338896433,2|6,0:0|0:0,0:0:0:0: 78 | 293,63,27076,6,0,B|328:82|347:117|342:151|342:151|448:151,2,213.333336512247,4|6|4,0:0|0:0|0:0,0:0:0:0: 79 | 254,146,38153,6,0,B|249:185|273:220|304:232|304:232|304:339|304:339,1,213.333336512247,2|2,2:0|2:0,0:0:0:0: 80 | 213,336,44307,6,0,B|108:336|108:336|46:303|79:245|79:245,1,213.333336512247,2|0,2:0|0:0,0:0:0:0: 81 | 139,176,50461,1,2,0:0:0:0: 82 | 256,192,51692,12,0,55230,2:0:0:0: 83 | 256,192,56692,6,0,B|236:218|235:261|253:292|253:292|216:339|155:320,2,213.333336512247,6|4|4,0:0|0:0|0:0,0:0:0:0: 84 | 330,242,68691,1,2,0:2:0:0: 85 | 386,313,70025,2,0,P|417:256|386:171,2,160.000002384186,2|4|6,0:0|0:0|0:0,0:0:0:0: 86 | -------------------------------------------------------------------------------- /slider/example_data/beatmaps/AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Walao's Advanced].osu: -------------------------------------------------------------------------------- 1 | osu file format v14 2 | 3 | [General] 4 | AudioFilename: tatoe.mp3 5 | AudioLeadIn: 0 6 | PreviewTime: 6538 7 | Countdown: 0 8 | SampleSet: Soft 9 | StackLeniency: 0.7 10 | Mode: 0 11 | LetterboxInBreaks: 0 12 | WidescreenStoryboard: 0 13 | 14 | [Editor] 15 | DistanceSpacing: 1.5 16 | BeatDivisor: 4 17 | GridSize: 4 18 | TimelineZoom: 1.8 19 | 20 | [Metadata] 21 | Title:MIIRO vs. Ai no Scenario 22 | TitleUnicode:海色 vs. アイのシナリオ 23 | Artist:AKINO from bless4 & CHiCO with HoneyWorks 24 | ArtistUnicode:AKINO from bless4 & CHiCO with HoneyWorks 25 | Creator:monstrata 26 | Version:Walao's Advanced 27 | Source: 28 | Tags:kyshiro sukinathan ktgster pishifat smoothie world walaowey toybot sheela901 yuii- Sharkie みいろ tv size opening kantai collection kancolle fleet girls magic kaito 1412 まじっく快斗1412 艦隊これくしょん -艦これ- 29 | BeatmapID:724337 30 | BeatmapSetID:325158 31 | 32 | [Difficulty] 33 | HPDrainRate:4.5 34 | CircleSize:3.5 35 | OverallDifficulty:5.3 36 | ApproachRate:6.8 37 | SliderMultiplier:1.4 38 | SliderTickRate:1 39 | 40 | [Events] 41 | //Background and Video events 42 | 0,0,"miiro_no_scenario.png",0,0 43 | //Break Periods 44 | //Storyboard Layer 0 (Background) 45 | //Storyboard Layer 1 (Fail) 46 | //Storyboard Layer 2 (Pass) 47 | //Storyboard Layer 3 (Foreground) 48 | //Storyboard Sound Samples 49 | 50 | [TimingPoints] 51 | 0,307.692307692308,4,2,1,60,1,0 52 | 1538,-133.333333333333,4,2,1,60,0,0 53 | 3692,-133.333333333333,4,1,1,60,0,0 54 | 7230,-100,4,1,1,60,0,0 55 | 17230,-133.333333333333,4,2,1,45,0,0 56 | 27076,-100,4,1,1,60,0,0 57 | 36923,-133.333333333333,4,2,1,45,0,0 58 | 46769,-100,4,2,1,60,0,0 59 | 55692,333.333333333333,4,2,1,45,1,0 60 | 56692,333.333333333333,4,1,1,70,1,1 61 | 67275,-100,4,2,1,70,0,1 62 | 67358,-100,4,1,1,70,0,1 63 | 79025,-100,4,1,1,50,0,0 64 | 65 | 66 | [Colours] 67 | Combo1 : 0,64,128 68 | Combo2 : 0,255,255 69 | Combo3 : 128,0,255 70 | Combo4 : 192,192,192 71 | 72 | [HitObjects] 73 | 120,96,1230,5,6,0:0:0:0: 74 | 120,96,1538,2,0,P|181:62|232:65,1,105.000004005432,0|2,0:0|0:0,0:0:0:0: 75 | 319,179,2153,2,0,B|322:248,1,52.5000020027161,0|0,0:0|0:0,0:0:0:0: 76 | 262,283,2461,6,0,P|186:290|142:229,2,157.500006008148,2|0|2,0:0|0:0|0:0,0:0:0:0: 77 | 184,146,3692,6,0,P|99:146|49:213,2,157.500006008148,6|0|2,0:2|0:0|2:2,0:0:0:0: 78 | 256,192,4923,12,0,6769,2:0:0:0: 79 | 293,96,7230,38,0,P|362:96|405:169,1,140,4|2,0:0|0:3,0:0:0:0: 80 | 399,232,7692,2,0,L|324:290,1,70,8|0,0:0|0:0,0:0:0:0: 81 | 267,237,8000,2,0,L|342:179,1,70,0|0,0:0|0:0,0:0:0:0: 82 | 247,156,8307,2,0,L|172:214,1,70,8|0,0:0|0:0,0:0:0:0: 83 | 156,275,8615,6,0,L|156:345,2,70,2|0|8,0:2|0:0|0:0,0:0:0:0: 84 | 107,206,9076,2,0,P|74:151|3:93,1,140,2|2,0:2|0:2,0:0:0:0: 85 | 72,36,9538,1,8,0:0:0:0: 86 | 149,70,9692,6,0,P|208:93|285:74,1,140,4|2,0:0|0:3,0:0:0:0: 87 | 363,94,10153,2,0,P|383:148|389:191,1,70,8|0,0:0|0:0,0:0:0:0: 88 | 301,143,10461,2,0,P|288:110|280:76,1,70,2|0,0:2|0:0,0:0:0:0: 89 | 337,14,10769,2,0,P|376:12|412:26,1,70,8|0,0:0|0:0,0:0:0:0: 90 | 447,95,11077,6,0,B|486:159|500:194|500:194|472:227,1,140,2|8,0:2|0:0,0:0:0:0: 91 | 432,283,11538,1,2,0:2:0:0: 92 | 267,241,11846,2,0,L|188:241,1,70,0|8,0:0|0:0,0:0:0:0: 93 | 274,156,12154,6,0,P|330:186|347:264,1,140,4|2,0:0|0:3,0:0:0:0: 94 | 302,318,12615,2,0,L|231:318,1,70,8|0,0:0|0:0,0:0:0:0: 95 | 267,241,12923,2,0,L|205:205,1,70,2|0,0:2|0:0,0:0:0:0: 96 | 274,156,13230,2,0,L|238:94,1,70,8|0,0:0|0:0,0:0:0:0: 97 | 158,68,13538,6,0,L|80:68,2,70,2|0|8,0:2|0:0|0:0,0:0:0:0: 98 | 221,15,14000,1,2,0:2:0:0: 99 | 300,41,14154,2,0,L|366:13,2,70,2|0|8,0:3|0:0|0:0,0:0:0:0: 100 | 239,95,14615,1,2,0:2:0:0: 101 | 239,95,14769,6,0,P|218:127|207:185,1,70,8|2,0:0|0:2,0:0:0:0: 102 | 252,229,15077,2,0,L|322:229,1,70,8|2,0:0|0:2,0:0:0:0: 103 | 400,259,15384,1,8,0:0:0:0: 104 | 387,342,15538,2,0,P|318:361|246:341,1,140,2|2,0:2|0:2,0:0:0:0: 105 | 183,297,16000,6,0,P|158:258|156:212,1,70,8|0,0:2|0:0,0:0:0:0: 106 | 155,151,16307,2,0,P|168:109|205:77,1,70,8|0,0:0|0:0,0:0:0:0: 107 | 264,62,16615,1,10,0:0:0:0: 108 | 348,60,16769,1,10,0:0:0:0: 109 | 416,236,17231,6,0,P|366:256|296:258,1,105.000004005432,2|0,0:0|0:0,0:0:0:0: 110 | 239,237,17692,2,0,P|197:206|180:152,2,105.000004005432,2|0|2,0:0|0:0|0:0,0:0:0:0: 111 | 298,184,18461,2,0,B|360:146|386:101|386:101|351:92,1,157.500006008148,0|0,0:0|0:0,0:0:0:0: 112 | 119,62,19384,2,0,L|75:111,1,52.5000020027161,0|0,0:0|0:0,0:0:0:0: 113 | 151,144,19692,6,0,P|167:201|160:257,1,105.000004005432,2|0,0:0|0:0,0:0:0:0: 114 | 92,283,20153,2,0,P|76:226|83:167,1,105.000004005432,2|0,0:0|0:0,0:0:0:0: 115 | 231,134,20769,1,2,0:0:0:0: 116 | 171,279,21076,1,2,0:0:0:0: 117 | 153,121,21384,2,0,P|190:66|241:56,1,105.000004005432,0|0,0:0|0:0,0:0:0:0: 118 | 231,134,21846,2,0,L|231:192,1,52.5000020027161,2|0,0:0|0:0,0:0:0:0: 119 | 71,360,22461,6,0,P|24:326|0:266,2,105.000004005432,2|2|0,0:0|0:0|0:0,0:0:0:0: 120 | 143,328,23230,2,0,P|161:256|142:208,1,105.000004005432,2|0,0:0|0:0,0:0:0:0: 121 | 34,139,23846,2,0,P|-4:209|12:302,1,157.500006008148,2|0,0:0|0:0,0:0:0:0: 122 | 77,257,24461,6,0,L|162:180,1,105.000004005432,2|2,0:0|0:0,0:0:0:0: 123 | 280,91,25076,2,0,P|340:86|394:122,1,105.000004005432,2|0,0:0|0:0,0:0:0:0: 124 | 405,180,25538,2,0,L|401:240,1,52.5000020027161,2|0,0:0|0:0,0:0:0:0: 125 | 400,311,25846,6,0,L|448:376,2,70.0000026702882,2|0|0,1:2|0:0|0:0,0:0:0:0: 126 | 319,243,26461,2,0,L|271:178,2,70.0000026702882,0|0|0,1:0|0:0|0:0,0:0:0:0: 127 | 209,263,27076,5,4,0:0:0:0: 128 | 66,173,27384,2,0,P|89:104|146:58,1,140,8|2,0:0|0:2,0:0:0:0: 129 | 305,93,28000,1,8,0:0:0:0: 130 | 369,147,28153,6,0,P|387:219|367:307,1,140,2|0,0:3|0:0,0:0:0:0: 131 | 218,315,28768,2,0,P|166:271|161:204,1,140,0|0,0:0|0:0,0:0:0:0: 132 | 210,133,29230,1,8,0:0:0:0: 133 | 294,136,29384,6,0,P|332:72|316:11,1,140,2|0,0:3|0:0,0:0:0:0: 134 | 156,63,29999,2,0,P|123:121|144:191,1,140,0|0,0:0|0:0,0:0:0:0: 135 | 210,133,30461,1,8,0:0:0:0: 136 | 210,133,30615,6,0,L|63:116,1,140,2|2,0:3|0:3,0:0:0:0: 137 | 72,200,31076,1,8,0:0:0:0: 138 | 230,255,31384,2,0,P|302:219|331:157,1,140,2|8,0:2|0:0,0:0:0:0: 139 | 171,114,32000,6,0,P|98:149|69:211,1,140,4|8,0:0|0:0,0:0:0:0: 140 | 206,300,32615,2,0,P|271:333|346:312,1,140,2|8,3:2|0:0,0:0:0:0: 141 | 450,198,33230,6,0,P|448:117|402:50,1,140,2|8,0:3|0:0,0:0:0:0: 142 | 335,65,33692,1,0,0:0:0:0: 143 | 265,112,33846,2,0,P|195:135|117:115,1,140,0|8,0:0|0:0,0:0:0:0: 144 | 70,65,34306,1,2,0:2:0:0: 145 | 70,65,34461,6,0,P|51:144|99:201,1,140,4|8,0:0|0:0,0:0:0:0: 146 | 227,271,35076,2,0,L|319:271,2,70,2|2|8,0:3|0:2|0:0,0:0:0:0: 147 | 146,248,35538,6,0,P|125:171|167:115,1,140,2|2,0:3|3:2,0:0:0:0: 148 | 207,190,35999,1,8,0:0:0:0: 149 | 227,271,36153,1,6,0:2:0:0: 150 | 67,325,36461,2,0,B|48:303|48:303|46:282|46:282|37:268|37:268|39:244|39:244|32:220|32:220|38:197|38:197,1,140,2|0,3:2|0:0,0:0:0:0: 151 | 59,120,36923,5,4,0:0:0:0: 152 | 309,85,37538,2,0,P|360:70|413:79,1,105.000004005432,2|2,2:0|2:0,0:0:0:0: 153 | 371,198,38153,2,0,P|356:287|289:321,2,157.500006008148,2|2|2,2:0|2:0|2:0,0:0:0:0: 154 | 251,157,39384,6,0,B|169:240|169:240|208:260,2,157.500006008148,2|2|2,2:0|2:0|2:0,0:0:0:0: 155 | 180,52,40615,2,0,P|255:30|328:56,2,157.500006008148,2|2|2,2:0|2:0|2:0,0:0:0:0: 156 | 251,157,41846,5,2,2:0:0:0: 157 | 375,138,42153,2,0,P|417:94|434:33,1,105.000004005432,2|2,2:0|2:0,0:0:0:0: 158 | 308,28,42768,1,2,2:0:0:0: 159 | 232,127,43076,2,0,B|245:178|229:206|211:233|239:303,2,157.500006008148,2|2|2,2:0|2:0|2:0,0:0:0:0: 160 | 130,52,44306,5,2,2:0:0:0: 161 | 61,228,44768,1,2,2:0:0:0: 162 | 208,346,45230,1,2,2:0:0:0: 163 | 285,246,45538,2,0,P|258:174|201:223,2,157.500006008148,8|8|4,2:3|0:3|0:3,0:0:0:0: 164 | 162,276,46768,5,4,0:0:0:0: 165 | 122,202,46922,2,0,P|108:163|132:112,1,70,0|2,0:0|0:3,0:0:0:0: 166 | 167,70,47230,1,0,0:0:0:0: 167 | 247,92,47384,2,0,P|328:104|385:76,1,140,2|2,0:0|0:3,0:0:0:0: 168 | 456,114,47845,1,0,0:0:0:0: 169 | 456,114,47999,6,0,P|439:151|443:178,1,70,2|0,0:0|0:0,0:0:0:0: 170 | 412,257,48306,1,2,0:3:0:0: 171 | 287,144,48615,2,0,P|270:106|247:92,1,70,2|4,0:0|2:0,0:0:0:0: 172 | 119,165,49076,2,0,L|145:230,1,70,12|0,0:0|0:0,0:0:0:0: 173 | 183,306,49384,2,0,L|158:378,2,70,0|2|0,0:0|0:3|0:0,0:0:0:0: 174 | 251,256,49845,2,0,P|275:201|259:109,1,140,2|2,0:0|0:3,0:0:0:0: 175 | 190,87,50307,1,0,0:0:0:0: 176 | 105,95,50461,6,0,P|81:127|74:179,1,70,2|0,0:0|0:0,0:0:0:0: 177 | 157,162,50769,1,8,0:3:0:0: 178 | 323,147,51076,2,0,B|402:137|402:137|386:109,2,105,12|0|2,0:3|0:0|3:2,0:0:0:0: 179 | 325,62,51692,6,0,P|361:36|408:38,1,70,4|0,2:0|0:0,0:0:0:0: 180 | 464,64,52000,2,0,P|490:100|488:147,1,70,12|0,0:3|0:0,0:0:0:0: 181 | 467,204,52307,2,0,P|431:230|384:228,1,70,2|2,3:3|0:0,0:0:0:0: 182 | 324,214,52615,2,0,P|298:178|300:131,1,70,2|12,0:3|0:3,0:0:0:0: 183 | 353,89,52923,6,0,P|378:127|377:175,1,70,10|2,0:0|0:0,0:0:0:0: 184 | 406,232,53230,2,0,P|391:265|364:288,1,70,8|2,0:3|0:0,0:0:0:0: 185 | 281,287,53538,2,0,P|255:261|241:228,2,70,10|12|2,0:0|0:3|0:3,0:0:0:0: 186 | 324,214,54000,1,2,0:3:0:0: 187 | 296,134,54153,6,0,P|236:104|143:117,1,140,12|0,0:3|0:3,0:0:0:0: 188 | 143,189,54614,1,10,0:3:0:0: 189 | 167,270,54769,2,0,P|166:310|138:357,1,70,0|6,0:3|0:3,0:0:0:0: 190 | 86,290,55076,2,0,P|65:261|58:229,1,70,2|2,0:0|2:0,0:0:0:0: 191 | 59,229,56692,6,0,B|30:128|30:128|82:126,1,140,4|8,0:2|0:0,0:0:0:0: 192 | 232,109,57359,2,0,P|272:109|308:97,1,70,2|0,0:3|0:0,0:0:0:0: 193 | 349,168,57692,1,8,0:0:0:0: 194 | 268,193,57858,6,0,P|234:184|199:187,1,70,2|0,0:2|0:0,0:0:0:0: 195 | 146,123,58192,2,0,L|156:53,1,70,2|8,0:2|0:0,0:0:0:0: 196 | 241,39,58525,2,0,L|231:109,1,70,2|0,0:2|0:0,0:0:0:0: 197 | 314,97,58858,2,0,L|324:27,1,70,2|8,0:3|0:0,0:0:0:0: 198 | 428,159,59358,6,0,P|410:230|345:269,1,140,2|8,0:2|0:0,0:0:0:0: 199 | 314,97,60025,2,0,P|350:89|403:111,1,70,2|0,0:3|0:0,0:0:0:0: 200 | 347,173,60358,1,8,0:0:0:0: 201 | 262,166,60526,6,0,L|206:123,1,70,2|0,0:3|3:0,0:0:0:0: 202 | 164,51,60858,2,0,P|130:43|96:51,1,70,2|8,0:2|0:0,0:0:0:0: 203 | 56,125,61191,2,0,L|90:192,1,70,0|2,0:0|0:3,0:0:0:0: 204 | 163,226,61525,2,0,P|219:254|274:308,1,140,2|0,0:2|0:0,0:0:0:0: 205 | 322,235,62025,6,0,P|284:184|260:111,1,140,4|8,0:0|0:0,0:0:0:0: 206 | 404,24,62692,2,0,P|438:40|465:87,1,70,2|0,0:2|0:0,0:0:0:0: 207 | 473,148,63026,2,0,P|465:191|429:226,1,70,8|0,0:0|0:0,0:0:0:0: 208 | 401,279,63359,6,0,P|350:321|257:299,1,140,2|0,0:2|0:0,0:0:0:0: 209 | 192,171,64025,2,0,L|237:102,1,70,2|0,0:2|0:0,0:0:0:0: 210 | 278,181,64358,2,0,L|233:250,1,70,8|2,0:0|0:3,0:0:0:0: 211 | 155,246,64691,6,0,P|111:193|124:120,1,140,2|8,0:2|0:0,0:0:0:0: 212 | 273,57,65359,2,0,L|351:57,2,70,2|2|0,0:2|0:2|0:0,0:0:0:0: 213 | 105,44,66026,6,0,P|70:57|45:89,1,70,4|0,0:2|0:0,0:0:0:0: 214 | 31,163,66359,1,8,0:0:0:0: 215 | 68,237,66525,2,0,P|68:265|59:312,1,70,2|2,3:2|3:3,0:0:0:0: 216 | 113,371,66858,1,0,3:0:0:0: 217 | 176,315,67025,2,0,P|179:286|195:241,1,70,8|2,3:1|3:0,0:0:0:0: 218 | 186,163,67359,6,0,P|243:126|311:136,1,140,4|0,0:0|0:0,0:0:0:0: 219 | 406,275,68026,2,0,L|341:315,1,70,2|0,0:3|0:0,0:0:0:0: 220 | 276,265,68359,1,8,0:0:0:0: 221 | 263,184,68526,6,0,P|288:150|325:132,1,70,2|2,0:2|3:3,0:0:0:0: 222 | 272,62,68858,2,0,P|230:57|195:34,1,70,0|8,0:0|0:0,0:0:0:0: 223 | 157,112,69191,2,0,P|173:150|171:191,1,70,0|2,0:0|0:3,0:0:0:0: 224 | 215,253,69525,2,0,P|245:266|282:265,2,70,2|8|2,0:2|0:0|0:3,0:0:0:0: 225 | 130,249,70026,6,0,P|61:241|47:169,1,140,2|0,0:2|0:0,0:0:0:0: 226 | 157,57,70692,2,0,L|228:57,1,70,2|0,0:2|0:0,0:0:0:0: 227 | 302,96,71026,1,8,0:0:0:0: 228 | 356,159,71192,6,0,P|355:202|369:250,1,70,2|2,0:2|0:3,0:0:0:0: 229 | 278,242,71525,2,0,P|278:198|265:151,1,70,0|8,0:0|0:0,0:0:0:0: 230 | 302,96,71859,2,0,P|358:77|433:131,1,140,2|0,0:2|0:0,0:0:0:0: 231 | 418,198,72358,2,0,L|364:241,1,70,8|2,0:0|0:3,0:0:0:0: 232 | 278,242,72692,6,0,B|222:239|222:239|144:286,1,140,4|8,0:0|0:0,0:0:0:0: 233 | 30,165,73358,2,0,L|88:124,1,70,2|0,0:3|0:0,0:0:0:0: 234 | 164,91,73691,2,0,L|235:91,1,70,8|2,0:0|0:3,0:0:0:0: 235 | 317,102,74025,6,0,B|366:131|366:131|389:226,1,140,4|8,0:0|0:0,0:0:0:0: 236 | 265,330,74691,2,0,P|236:310|217:281,1,70,2|0,0:3|0:0,0:0:0:0: 237 | 142,241,75025,2,0,P|119:281|90:302,1,70,8|2,0:0|0:3,0:0:0:0: 238 | 60,222,75358,6,0,P|99:168|194:177,1,140,2|8,0:2|0:0,0:0:0:0: 239 | 225,222,75858,2,0,P|307:214|364:168,1,140,2|2,0:2|2:0,0:0:0:0: 240 | 325,104,76358,1,8,0:0:0:0: 241 | 167,161,76691,6,0,L|145:237,1,70,8|0,0:0|0:0,0:0:0:0: 242 | 230,247,77025,2,0,L|190:314,1,70,8|0,0:0|0:0,0:0:0:0: 243 | 111,306,77358,2,0,P|71:310|11:298,1,70,8|0,0:0|0:0,0:0:0:0: 244 | 78,227,77691,2,0,P|112:223|147:227,1,70,8|0,0:0|0:0,0:0:0:0: 245 | 223,190,78025,6,0,P|240:157|245:121,1,70,2|8,0:3|0:3,0:0:0:0: 246 | 321,89,78358,1,4,0:3:0:0: 247 | 321,89,78525,2,0,P|327:125|346:156,1,70,2|8,0:3|0:3,0:0:0:0: 248 | 304,228,78858,1,4,0:3:0:0: 249 | 233,273,79025,5,4,0:0:0:0: 250 | 256,192,79108,12,0,80691,0:0:0:0: 251 | -------------------------------------------------------------------------------- /slider/example_data/beatmaps/AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [Yuistrata's Easy].osu: -------------------------------------------------------------------------------- 1 | osu file format v14 2 | 3 | [General] 4 | AudioFilename: tatoe.mp3 5 | AudioLeadIn: 0 6 | PreviewTime: 6538 7 | Countdown: 0 8 | SampleSet: Soft 9 | StackLeniency: 0.7 10 | Mode: 0 11 | LetterboxInBreaks: 0 12 | WidescreenStoryboard: 0 13 | 14 | [Editor] 15 | DistanceSpacing: 1 16 | BeatDivisor: 4 17 | GridSize: 4 18 | TimelineZoom: 1.8 19 | 20 | [Metadata] 21 | Title:MIIRO vs. Ai no Scenario 22 | TitleUnicode:海色 vs. アイのシナリオ 23 | Artist:AKINO from bless4 & CHiCO with HoneyWorks 24 | ArtistUnicode:AKINO from bless4 & CHiCO with HoneyWorks 25 | Creator:monstrata 26 | Version:Yuistrata's Easy 27 | Source: 28 | Tags:kyshiro sukinathan ktgster pishifat smoothie world walaowey toybot sheela901 yuii- Sharkie みいろ tv size opening kantai collection kancolle fleet girls magic kaito 1412 まじっく快斗1412 艦隊これくしょん -艦これ- 29 | BeatmapID:723197 30 | BeatmapSetID:325158 31 | 32 | [Difficulty] 33 | HPDrainRate:3 34 | CircleSize:3 35 | OverallDifficulty:3 36 | ApproachRate:3.4 37 | SliderMultiplier:0.9 38 | SliderTickRate:1 39 | 40 | [Events] 41 | //Background and Video events 42 | 0,0,"miiro_no_scenario.png",0,0 43 | //Break Periods 44 | 2,4815,5839 45 | //Storyboard Layer 0 (Background) 46 | //Storyboard Layer 1 (Fail) 47 | //Storyboard Layer 2 (Pass) 48 | //Storyboard Layer 3 (Foreground) 49 | //Storyboard Sound Samples 50 | 51 | [TimingPoints] 52 | 0,307.692307692308,4,2,1,60,1,0 53 | 1076,-100,4,2,1,60,0,0 54 | 3692,-100,4,1,1,60,0,0 55 | 7230,-100,4,1,1,60,0,0 56 | 17230,-100,4,2,1,45,0,0 57 | 27076,-100,4,1,1,60,0,0 58 | 36923,-100,4,2,1,45,0,0 59 | 46769,-100,4,2,1,60,0,0 60 | 55692,333.333333333333,4,2,1,45,1,0 61 | 56692,333.333333333333,4,2,1,70,1,1 62 | 67275,-100,4,2,1,70,0,0 63 | 67358,-100,4,2,1,70,0,1 64 | 79025,-100,4,2,1,50,0,0 65 | 66 | 67 | [Colours] 68 | Combo1 : 0,64,128 69 | Combo2 : 0,255,255 70 | Combo3 : 128,0,255 71 | Combo4 : 192,192,192 72 | 73 | [HitObjects] 74 | 37,158,1230,6,0,B|54:115|104:99|149:121|149:121|195:109,1,180,6|0,0:0|0:0,0:0:0:0: 75 | 281,85,2153,1,0,0:0:0:0: 76 | 344,146,2461,6,0,P|337:212|288:255,2,135,2|0|2,0:0|0:0|0:0,0:0:0:0: 77 | 259,171,3692,2,0,L|122:162,2,135,6|0|2,0:2|0:0|2:2,0:0:0:0: 78 | 256,192,7230,6,0,P|352:144|340:224,1,225,4|0,0:0|0:0,0:0:0:0: 79 | 285,276,8307,1,8,0:0:0:0: 80 | 197,258,8615,2,0,B|178:245|165:213|166:178|166:178|109:178,1,135,6|0,0:0|0:0,0:0:0:0: 81 | 69,103,9384,1,2,0:0:0:0: 82 | 69,103,9692,6,0,B|134:83|134:83|215:103|215:103|294:76,1,225,6|2,0:0|0:0,0:0:0:0: 83 | 370,49,10769,1,8,0:0:0:0: 84 | 438,107,11076,2,0,P|434:173|374:224,1,135,2|2,0:0|0:0,0:0:0:0: 85 | 354,137,11846,1,0,0:0:0:0: 86 | 354,137,12153,6,0,P|311:173|304:263,1,135,6|10,0:0|0:0,0:0:0:0: 87 | 362,312,12923,2,0,P|321:336|269:333,1,90,0|8,0:0|0:0,0:0:0:0: 88 | 213,275,13538,2,0,B|165:241|97:243|97:243|73:183,1,180,2|2,0:0|0:0,0:0:0:0: 89 | 93,101,14461,1,8,0:0:0:0: 90 | 93,101,14769,6,0,B|195:81|195:81|222:105|214:156|214:156|160:168,1,225,8|2,0:0|0:0,0:0:0:0: 91 | 155,254,15846,2,0,L|288:228,1,135,8|0,0:0|0:0,0:0:0:0: 92 | 351,164,16615,2,0,L|402:153,1,45,8|2,0:0|0:0,0:0:0:0: 93 | 280,83,17230,6,0,B|167:59|167:59|110:74|93:141,1,225,2|0,0:0|0:0,0:0:0:0: 94 | 39,200,18307,2,0,B|74:229|110:224|136:211|136:211|269:237,1,225,0|0,0:0|0:0,0:0:0:0: 95 | 343,248,19384,1,0,0:0:0:0: 96 | 375,332,19692,6,0,P|418:295|361:160,1,225,2|0,0:0|0:0,0:0:0:0: 97 | 296,100,20769,1,0,0:0:0:0: 98 | 212,132,21076,2,0,P|182:168|193:261,1,135,0|0,0:0|0:0,0:0:0:0: 99 | 265,207,21846,1,0,0:0:0:0: 100 | 343,248,22153,6,0,B|352:189|363:109|363:109|351:68|299:59,1,225,2|0,0:0|0:0,0:0:0:0: 101 | 214,33,23230,2,0,P|169:56|147:99,1,90,0|0,0:0|0:0,0:0:0:0: 102 | 232,123,23846,2,0,P|207:160|167:178,1,90,0|0,0:0|0:0,0:0:0:0: 103 | 104,242,24461,6,0,B|102:306|159:319|159:319|246:320,1,180,2|0,0:0|0:0,0:0:0:0: 104 | 310,208,25538,1,0,0:0:0:0: 105 | 338,119,25846,6,0,B|424:84|424:156|512:120,2,180,6|0|4,0:0|1:0|0:0,0:0:0:0: 106 | 250,97,27384,1,8,0:0:0:0: 107 | 224,184,27692,6,0,P|229:246|296:296,2,135,2|2|8,0:0|0:0|0:0,0:0:0:0: 108 | 275,110,28923,2,0,L|379:87,1,90,0|10,0:0|0:0,0:0:0:0: 109 | 313,14,29538,2,0,L|209:37,1,90,0|8,0:0|0:0,0:0:0:0: 110 | 175,108,30153,2,0,B|141:86|137:43|137:43|67:44,2,135,0|2|8,0:0|0:0|0:0,0:0:0:0: 111 | 224,184,31384,6,0,B|287:211|340:165|340:165|405:166,2,180,2|6|0,0:0|0:0|0:0,0:0:0:0: 112 | 215,94,32923,1,8,0:0:0:0: 113 | 201,8,33230,2,0,P|137:54|149:151,1,180,2|0,0:0|0:0,0:0:0:0: 114 | 224,184,34153,1,10,0:0:0:0: 115 | 223,275,34461,6,0,B|326:325|326:325|396:313,1,180,6|0,0:0|0:0,0:0:0:0: 116 | 454,194,35538,2,0,P|475:121|438:61,2,135,2|8|2,0:0|0:0|0:0,0:0:0:0: 117 | 319,201,36923,2,0,L|218:201,1,90,4|0,0:0|0:0,0:0:0:0: 118 | 173,271,37538,6,0,B|121:230|147:158|147:158|78:127,2,180,2|2|0,2:0|2:0|0:0,0:0:0:0: 119 | 260,275,39076,1,2,2:0:0:0: 120 | 313,347,39384,6,0,B|270:378|214:353|214:353|131:353,1,180,2|0,2:0|0:0,0:0:0:0: 121 | 104,269,40307,1,2,2:0:0:0: 122 | 13,265,40615,2,0,P|37:203|107:174,2,135,2|2|2,2:0|2:0|2:0,0:0:0:0: 123 | 104,269,41846,5,2,2:0:0:0: 124 | 194,269,42153,2,0,L|245:363,2,90,2|2|2,2:0|2:0|2:0,0:0:0:0: 125 | 149,190,43076,2,0,P|173:128|243:99,2,135,2|2|2,2:0|2:0|2:0,0:0:0:0: 126 | 239,190,44307,6,0,B|335:188|335:188|387:159,2,135,2|2|2,2:0|2:0|2:0,0:0:0:0: 127 | 194,269,45538,2,0,B|97:270|97:270|46:300,2,135,10|10|10,2:0|0:0|0:0,0:0:0:0: 128 | 282,270,46769,6,8,L|381:268,1,90,6|2,0:0|0:0,0:0:0:0: 129 | 332,186,47384,2,8,L|379:99,1,90,2|0,0:0|0:0,0:0:0:0: 130 | 284,100,48000,2,8,L|232:15,1,90,2|2,0:0|0:0,0:0:0:0: 131 | 185,98,48615,6,0,B|191:194|267:150|269:246,1,180,2|0,0:0|0:0,0:0:0:0: 132 | 247,333,49538,1,2,0:0:0:0: 133 | 159,357,49846,2,0,P|115:358|66:332,1,90,2|2,0:0|0:0,0:0:0:0: 134 | 97,252,50461,6,0,P|141:251|190:277,1,90,2|2,0:0|0:0,0:0:0:0: 135 | 247,333,51076,2,0,B|300:381|368:350|368:350|385:299,1,180,2|4,0:0|2:0,0:0:0:0: 136 | 413,217,52000,6,0,P|451:242|474:292,2,90,10|10|10,0:0|0:0|0:0,0:0:0:0: 137 | 323,226,52923,2,0,B|249:223|249:223|191:182|191:182|108:178,1,225,10|0,0:0|0:0,0:0:0:0: 138 | 24,176,54000,2,0,B|5:256|69:306|69:306|176:253|176:336|278:307,1,360,2|0,0:0|0:0,0:0:0:0: 139 | 399,292,55692,6,0,L|497:270,2,90 140 | 324,239,56692,6,0,P|261:181|161:218,1,180,6|2,0:0|0:0,0:0:0:0: 141 | 238,267,57692,1,2,0:0:0:0: 142 | 304,326,58025,2,0,L|409:332,2,89.9999999999999,0|10|0,0:0|0:0|0:0,0:0:0:0: 143 | 218,354,59025,1,8,0:0:0:0: 144 | 153,292,59358,6,8,P|165:211|260:180,1,180,2|2,0:0|0:0,0:0:0:0: 145 | 334,143,60358,1,8,0:0:0:0: 146 | 344,53,60691,2,0,L|442:14,2,90,0|0|0,0:0|0:0|0:0,0:0:0:0: 147 | 263,89,61691,1,0,0:0:0:0: 148 | 180,123,62025,6,0,P|161:175|243:267,1,180,4|8,0:0|0:0,0:0:0:0: 149 | 317,239,63025,1,8,0:0:0:0: 150 | 383,299,63358,2,8,P|403:260|397:199,2,90,2|2|8,0:0|0:0|0:0,0:0:0:0: 151 | 317,239,64358,1,8,0:0:0:0: 152 | 251,178,64691,6,0,L|107:182,2,135,8|0|8,0:0|0:0|0:0,0:0:0:0: 153 | 322,123,66025,1,2,0:0:0:0: 154 | 401,164,66358,1,2,0:0:0:0: 155 | 386,253,66691,2,0,P|362:316|330:339,1,90,8|2,0:0|0:0,0:0:0:0: 156 | 254,327,67358,6,0,B|232:360|232:360|184:348|184:348|132:360|132:360|108:328,1,180,4|2,0:0|0:0,0:0:0:0: 157 | 132,244,68358,1,8,0:0:0:0: 158 | 222,229,68691,2,8,L|316:215,2,90,0|0|0,0:0|0:0|0:0,0:0:0:0: 159 | 132,244,69691,1,2,0:0:0:0: 160 | 75,174,70025,6,8,L|15:99,2,90,2|2|2,0:0|0:0|0:0,0:0:0:0: 161 | 164,159,71025,1,8,0:0:0:0: 162 | 194,71,71358,2,0,L|294:55,1,90,0|0,0:0|0:0,0:0:0:0: 163 | 341,128,72025,2,0,P|338:170|305:218,2,90,0|2|4,0:0|0:0|0:0,0:0:0:0: 164 | 371,41,73025,6,0,L|473:25,2,90,2|8|8,0:0|0:0|0:0,0:0:0:0: 165 | 283,58,74025,1,4,0:0:0:0: 166 | 254,143,74358,2,0,L|216:239,2,90,2|8|8,0:0|0:0|0:0,0:0:0:0: 167 | 283,58,75358,6,0,B|220:32|220:80|148:52,2,135,2|2|12,0:0|0:0|0:0,0:0:0:0: 168 | 344,123,76691,2,0,B|406:188|406:188|464:200,2,135,8|0|8,0:0|0:0|0:0,0:0:0:0: 169 | 257,143,78025,6,0,L|208:279,2,135,6|6|14,0:0|0:0|0:0,0:0:0:0: 170 | 256,192,79191,12,0,80691,0:0:0:0: 171 | -------------------------------------------------------------------------------- /slider/example_data/beatmaps/AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [ktgster's Insane].osu: -------------------------------------------------------------------------------- 1 | osu file format v14 2 | 3 | [General] 4 | AudioFilename: tatoe.mp3 5 | AudioLeadIn: 0 6 | PreviewTime: 6538 7 | Countdown: 0 8 | SampleSet: Soft 9 | StackLeniency: 0.7 10 | Mode: 0 11 | LetterboxInBreaks: 0 12 | WidescreenStoryboard: 0 13 | 14 | [Editor] 15 | DistanceSpacing: 2 16 | BeatDivisor: 4 17 | GridSize: 4 18 | TimelineZoom: 1.4 19 | 20 | [Metadata] 21 | Title:MIIRO vs. Ai no Scenario 22 | TitleUnicode:海色 vs. アイのシナリオ 23 | Artist:AKINO from bless4 & CHiCO with HoneyWorks 24 | ArtistUnicode:AKINO from bless4 & CHiCO with HoneyWorks 25 | Creator:monstrata 26 | Version:ktgster's Insane 27 | Source: 28 | Tags:kyshiro sukinathan ktgster pishifat smoothie world walaowey toybot sheela901 yuii- Sharkie みいろ tv size opening kantai collection kancolle fleet girls magic kaito 1412 まじっく快斗1412 艦隊これくしょん -艦これ- 29 | BeatmapID:722448 30 | BeatmapSetID:325158 31 | 32 | [Difficulty] 33 | HPDrainRate:5.8 34 | CircleSize:5 35 | OverallDifficulty:8.4 36 | ApproachRate:9 37 | SliderMultiplier:1.7 38 | SliderTickRate:1 39 | 40 | [Events] 41 | //Background and Video events 42 | 0,0,"miiro_no_scenario.png",0,0 43 | //Break Periods 44 | //Storyboard Layer 0 (Background) 45 | //Storyboard Layer 1 (Fail) 46 | //Storyboard Layer 2 (Pass) 47 | //Storyboard Layer 3 (Foreground) 48 | //Storyboard Sound Samples 49 | 50 | [TimingPoints] 51 | 0,307.692307692308,4,2,2,50,1,0 52 | 1076,-133.333333333333,4,2,2,50,0,0 53 | 4923,-100,4,2,2,50,0,0 54 | 7230,-100,4,2,2,70,0,0 55 | 17230,-111.111111111111,4,3,1,40,0,0 56 | 25846,-111.111111111111,4,2,2,60,0,0 57 | 27076,-100,4,2,2,70,0,0 58 | 36923,-200,4,2,2,60,0,0 59 | 46769,-142.857142857143,4,2,2,70,0,0 60 | 51692,-111.111111111111,4,2,2,80,0,0 61 | 54153,-111.111111111111,4,2,2,90,0,0 62 | 55692,333.333333333333,4,2,2,70,1,0 63 | 56692,333.333333333333,4,2,2,80,1,1 64 | 67191,-100,4,2,2,80,0,0 65 | 67358,-100,4,2,2,80,0,1 66 | 78025,-100,4,2,2,90,0,0 67 | 80691,-100,4,2,2,5,0,0 68 | 69 | 70 | [Colours] 71 | Combo1 : 0,64,128 72 | Combo2 : 0,255,255 73 | Combo3 : 128,0,255 74 | Combo4 : 192,192,192 75 | 76 | [HitObjects] 77 | 77,79,1076,6,0,L|98:85,3,21.2500008106232,0|0|0|2,0:0|0:0|0:0|0:0,0:0:0:0: 78 | 98,85,1538,2,0,P|116:144|92:214,2,127.500004863739 79 | 155,34,2307,1,2,0:0:0:0: 80 | 230,23,2461,5,2,0:0:0:0: 81 | 285,75,2615,1,0,0:0:0:0: 82 | 295,150,2769,1,0,0:0:0:0: 83 | 281,225,2923,1,2,0:0:0:0: 84 | 209,252,3076,1,0,0:0:0:0: 85 | 268,300,3230,1,0,0:0:0:0: 86 | 221,177,3384,2,0,L|185:103,1,63.7500024318696,2|0,0:0|0:0,0:0:0:0: 87 | 230,23,3692,6,0,L|286:138,1,127.500004863739,2|0,0:0|0:0,0:0:0:0: 88 | 234,194,4153,2,0,L|177:78,1,127.500004863739 89 | 103,58,4615,1,2,0:0:0:0: 90 | 103,58,4922,5,0,0:0:0:0: 91 | 81,203,5076,1,2,0:0:0:0: 92 | 217,147,5230,1,2,0:0:0:0: 93 | 133,135,5384,5,0,0:0:0:0: 94 | 111,280,5538,1,2,0:0:0:0: 95 | 247,224,5692,1,2,0:0:0:0: 96 | 163,212,5846,5,0,0:0:0:0: 97 | 141,357,6000,1,2,0:0:0:0: 98 | 277,301,6154,1,2,0:0:0:0: 99 | 111,280,6307,5,0,0:0:0:0: 100 | 227,369,6461,1,2,0:0:0:0: 101 | 247,224,6615,1,2,0:0:0:0: 102 | 193,289,6769,6,0,L|137:362,1,85,0|0,0:0|0:0,0:0:0:0: 103 | 141,357,7230,6,0,L|66:166,1,170,4|0,1:0|3:0,0:0:0:0: 104 | 148,149,7692,2,0,L|193:265,1,85,10|0,1:2|3:2,0:2:0:0: 105 | 57,346,8000,1,0,1:2:0:0: 106 | 111,280,8154,1,0,3:2:0:0: 107 | 141,357,8307,2,0,L|227:335,1,85,10|0,1:2|3:2,0:2:0:0: 108 | 148,149,8615,6,0,L|62:171,1,85,2|0,1:2|1:2,0:2:0:0: 109 | 32,249,8923,1,8,1:2:0:0: 110 | 83,87,9076,2,0,L|165:65,1,85,2|0,0:2|1:2,0:2:0:0: 111 | 131,233,9384,1,2,3:2:0:0: 112 | 148,149,9538,1,8,1:2:0:0: 113 | 211,205,9692,6,0,L|195:375,1,170,4|0,1:0|1:2,0:2:0:0: 114 | 278,359,10153,2,0,L|285:274,1,85,8|0,1:2|3:2,1:2:0:0: 115 | 131,233,10461,1,0,3:2:0:0: 116 | 123,317,10615,1,0,1:2:0:0: 117 | 53,267,10769,1,10,1:2:0:0: 118 | 200,281,10923,1,0,0:2:0:0: 119 | 139,146,11076,5,0,1:2:0:0: 120 | 123,317,11230,1,0,1:2:0:0: 121 | 279,245,11384,1,10,1:2:0:0: 122 | 295,74,11538,2,0,L|289:164,1,85,2|0,0:2|3:2,0:2:0:0: 123 | 123,317,11846,1,2,1:2:0:0: 124 | 139,146,12000,1,8,1:2:0:0: 125 | 373,40,12153,6,0,L|359:235,1,170,4|0,1:0|1:2,0:2:0:0: 126 | 439,246,12615,1,10,1:2:0:0: 127 | 444,161,12768,1,0,0:2:0:0: 128 | 294,261,12923,2,0,P|327:287|369:294,1,85,0|0,1:2|3:2,0:2:0:0: 129 | 444,161,13230,1,10,1:2:0:0: 130 | 289,91,13384,1,0,0:2:0:0: 131 | 294,261,13538,6,0,L|299:364,1,85,2|0,1:2|3:2,0:2:0:0: 132 | 377,378,13846,1,8,1:2:0:0: 133 | 215,324,14000,2,0,L|204:115,1,170,2|0,0:2|3:2,0:2:0:0: 134 | 205,69,14461,1,10,1:2:0:0: 135 | 132,113,14615,1,0,1:2:0:0: 136 | 279,110,14769,5,8,1:2:0:0: 137 | 132,113,14923,1,0,1:2:0:0: 138 | 207,238,15076,1,8,1:2:0:0: 139 | 205,69,15230,5,0,3:2:0:0: 140 | 120,216,15384,1,8,1:2:0:0: 141 | 290,216,15538,1,8,1:2:0:0: 142 | 290,216,15846,1,8,1:2:0:0: 143 | 207,238,16000,5,8,1:2:0:0: 144 | 370,194,16153,1,0,3:2:0:0: 145 | 328,359,16307,1,8,1:2:0:0: 146 | 232,334,16461,5,0,3:2:0:0: 147 | 396,288,16615,1,2,1:2:0:0: 148 | 276,168,16769,1,2,1:2:0:0: 149 | 276,168,16923,2,0,L|308:277,1,85,0|0,0:2|0:2,0:2:0:0: 150 | 468,360,17230,6,0,P|497:291|466:216,1,152.999995330811,0|0,0:2|0:2,0:2:0:0: 151 | 401,187,17692,2,0,L|323:195,1,76.4999976654053,0|0,0:2|0:2,0:2:0:0: 152 | 280,133,18000,2,0,L|358:125,1,76.4999976654053,0|0,0:2|0:2,0:2:0:0: 153 | 248,202,18307,1,0,0:2:0:0: 154 | 173,210,18461,5,0,0:2:0:0: 155 | 173,210,18615,1,0,0:0:0:0: 156 | 324,194,18769,1,0,0:2:0:0: 157 | 324,194,18923,1,0,0:2:0:0: 158 | 203,141,19076,1,0,0:0:0:0: 159 | 203,141,19230,1,0,0:2:0:0: 160 | 293,264,19384,1,0,0:2:0:0: 161 | 293,264,19538,1,0,0:0:0:0: 162 | 173,210,19692,6,0,L|110:357,1,152.999995330811,0|0,0:2|0:2,0:2:0:0: 163 | 37,338,20153,2,0,L|67:267,1,76.4999976654053,0|0,0:2|0:2,0:2:0:0: 164 | 97,197,20461,1,0,0:2:0:0: 165 | 189,319,20615,1,0,0:2:0:0: 166 | 249,178,20769,6,0,L|224:93,1,76.4999976654053,0|0,0:2|0:2,0:2:0:0: 167 | 189,319,21076,2,0,L|263:337,1,76.4999976654053,0|0,0:2|0:2,0:2:0:0: 168 | 97,197,21384,2,0,L|44:252,1,76.4999976654053,0|0,0:2|0:2,0:2:0:0: 169 | 189,319,21692,1,0,0:2:0:0: 170 | 249,178,21846,1,0,0:2:0:0: 171 | 97,197,22000,1,0,0:2:0:0: 172 | 341,300,22153,5,0,3:2:0:0: 173 | 341,300,22307,1,0,0:2:0:0: 174 | 398,249,22461,2,0,L|377:170,1,76.4999976654053,0|0,0:2|0:2,0:2:0:0: 175 | 443,134,22769,2,0,L|462:207,1,76.4999976654053,0|0,0:2|0:2,0:2:0:0: 176 | 477,283,23076,1,0,0:2:0:0: 177 | 326,224,23230,6,0,L|246:193,1,76.4999976654053,0|0,0:2|0:2,0:2:0:0: 178 | 182,168,23538,1,0,0:2:0:0: 179 | 242,121,23692,1,0,0:2:0:0: 180 | 194,243,23846,2,0,L|159:322,1,76.4999976654053,0|0,0:2|0:2,0:2:0:0: 181 | 90,338,24153,1,0,0:2:0:0: 182 | 92,184,24307,1,0,0:2:0:0: 183 | 92,184,24461,6,0,L|122:114,1,76.4999976654053,0|0,0:2|0:2,0:2:0:0: 184 | 256,293,24769,2,0,L|225:362,1,76.4999976654053,0|0,0:2|0:2,0:2:0:0: 185 | 90,338,25076,2,0,P|121:275|197:226,1,152.999995330811,0|0,0:2|0:2,0:2:0:0: 186 | 263,213,25538,1,0,0:2:0:0: 187 | 337,230,25692,1,0,0:2:0:0: 188 | 337,230,25846,5,2,2:0:0:0: 189 | 415,94,26051,1,2,2:0:0:0: 190 | 415,230,26256,1,2,2:0:0:0: 191 | 337,94,26461,1,2,2:0:0:0: 192 | 455,163,26666,1,2,2:0:0:0: 193 | 302,161,26871,1,2,2:0:0:0: 194 | 302,161,27076,6,0,L|281:275,1,85,4|0,1:0|0:2,0:2:0:0: 195 | 258,325,27384,2,0,P|173:302|183:209,1,170,8|0,1:2|1:2,0:2:0:0: 196 | 217,162,27846,1,0,1:2:0:0: 197 | 217,162,28000,1,8,1:2:0:0: 198 | 348,352,28153,6,0,L|448:330,1,85,2|0,1:2|0:2,0:2:0:0: 199 | 478,169,28461,2,0,L|378:191,1,85,0|8,1:2|1:2,0:2:0:0: 200 | 431,371,28769,6,0,L|486:284,1,85,2|0,0:2|1:2,0:2:0:0: 201 | 394,149,29077,2,0,L|339:236,1,85,0|8,1:2|1:2,0:2:0:0: 202 | 265,361,29384,6,0,P|187:370|132:298,1,170,2|2,0:2|0:2,0:2:0:0: 203 | 143,219,29846,1,8,1:2:0:0: 204 | 203,158,30000,2,0,L|305:159,1,85,2|0,0:2|1:2,0:2:0:0: 205 | 348,98,30307,1,2,3:2:0:0: 206 | 287,37,30461,1,8,1:2:0:0: 207 | 310,238,30615,6,0,L|208:239,1,85,2|0,1:2|0:2,0:2:0:0: 208 | 143,219,30923,1,0,1:2:0:0: 209 | 203,158,31076,1,8,1:2:0:0: 210 | 167,301,31230,1,0,0:2:0:0: 211 | 308,261,31384,2,0,L|135:217,1,170,0|8,1:2|1:2,0:2:0:0: 212 | 203,158,31846,1,0,0:2:0:0: 213 | 223,163,31922,1,0,0:2:0:0: 214 | 244,168,32000,6,0,L|408:209,1,170,4|8,1:0|1:2,0:2:0:0: 215 | 481,165,32461,1,0,0:2:0:0: 216 | 484,249,32615,2,0,P|455:280|397:297,1,85,0|0,1:2|1:2,0:2:0:0: 217 | 336,274,32923,1,8,1:2:0:0: 218 | 383,111,33076,1,2,1:2:0:0: 219 | 512,329,33230,6,0,P|416:369|345:351,1,170,2|8,0:2|1:2,0:2:0:0: 220 | 293,295,33692,1,0,0:2:0:0: 221 | 224,244,33846,2,0,P|206:284|219:339,1,85,0|2,3:2|1:2,0:2:0:0: 222 | 356,191,34153,1,8,1:2:0:0: 223 | 344,106,34308,1,0,3:2:0:0: 224 | 341,84,34384,1,0,3:2:0:0: 225 | 338,63,34461,5,4,0:2:0:0: 226 | 238,142,34615,1,0,0:2:0:0: 227 | 356,191,34769,1,8,1:2:0:0: 228 | 456,112,34923,1,0,0:2:0:0: 229 | 475,237,35076,1,0,1:2:0:0: 230 | 254,269,35230,1,0,3:2:0:0: 231 | 254,269,35307,1,8,1:2:0:0: 232 | 254,269,35384,1,8,1:2:0:0: 233 | 338,63,35538,5,2,1:2:0:0: 234 | 373,314,35846,1,0,1:2:0:0: 235 | 254,269,36000,1,8,1:2:0:0: 236 | 135,314,36153,1,4,1:0:0:0: 237 | 135,314,36461,1,0,1:2:0:0: 238 | 102,286,36538,1,0,1:2:0:0: 239 | 90,245,36615,1,0,1:2:0:0: 240 | 103,204,36692,1,0,1:2:0:0: 241 | 133,174,36769,1,0,1:2:0:0: 242 | 174,163,36846,1,0,1:2:0:0: 243 | 214,176,36923,5,4,1:0:0:0: 244 | 214,176,37538,1,0,0:2:0:0: 245 | 293,207,37846,1,0,0:2:0:0: 246 | 281,123,38153,2,0,B|303:85|303:85|337:71|337:71|365:27,2,127.5,2|0|0,0:2|0:2|0:2,0:2:0:0: 247 | 293,207,39384,6,0,B|271:245|271:245|237:259|237:259|209:303,2,127.5,2|0|0,0:2|0:2|0:2,0:2:0:0: 248 | 360,155,40615,1,2,0:2:0:0: 249 | 214,175,41076,1,0,0:2:0:0: 250 | 68,155,41538,1,0,0:2:0:0: 251 | 68,155,41846,5,0,0:2:0:0: 252 | 19,224,42153,2,0,P|7:265|25:314,2,85,0|0|0,0:2|0:2|0:2,0:2:0:0: 253 | 68,155,43076,2,0,B|111:155|111:155|144:135|144:135|196:135,2,127.5,2|0|0,0:2|0:2|0:2,0:2:0:0: 254 | 7,94,44307,5,2,0:2:0:0: 255 | 256,40,44769,1,2,0:2:0:0: 256 | 179,283,45230,1,2,0:2:0:0: 257 | 179,283,45538,6,0,L|270:272,1,85,2|0,1:2|0:2,0:2:0:0: 258 | 379,367,46000,2,0,L|288:356,1,85,8|0,0:3|0:2,0:2:0:0: 259 | 347,214,46461,2,0,L|396:219,1,42.5,2|0,3:2|0:2,0:2:0:0: 260 | 449,157,46769,5,4,1:0:0:0: 261 | 423,75,46923,1,0,0:2:0:0: 262 | 366,137,47076,1,0,1:2:0:0: 263 | 449,157,47230,1,0,0:2:0:0: 264 | 340,56,47384,2,0,L|193:70,1,118.999996368408,2|0,1:2|1:2,0:2:0:0: 265 | 135,75,47846,1,0,0:2:0:0: 266 | 49,85,48000,5,0,1:2:0:0: 267 | 83,7,48153,1,0,0:2:0:0: 268 | 135,75,48307,2,0,L|119:152,1,59.4999981842042,2|0,1:2|0:2,0:2:0:0: 269 | 97,215,48615,1,0,1:2:0:0: 270 | 168,262,48769,2,0,L|184:185,1,59.4999981842042,8|0,1:2|1:2,0:2:0:0: 271 | 241,304,49076,2,0,L|254:246,1,59.4999981842042,8|0,1:2|1:2,0:2:0:0: 272 | 272,161,49384,5,2,0:2:0:0: 273 | 355,179,49538,2,0,L|342:237,1,59.4999981842042,0|0,1:2|0:2,0:2:0:0: 274 | 326,322,49846,2,0,P|386:344|448:328,1,118.999996368408,2|0,1:2|1:2,0:2:0:0: 275 | 497,270,50307,1,2,0:2:0:0: 276 | 355,179,50461,6,0,L|280:189,1,59.4999981842042,2|0,1:2|0:2,0:2:0:0: 277 | 237,123,50769,1,2,1:2:0:0: 278 | 212,205,50923,1,0,0:2:0:0: 279 | 140,128,51076,1,10,1:2:0:0: 280 | 212,205,51230,1,0,1:2:0:0: 281 | 89,235,51384,1,8,1:2:0:0: 282 | 212,205,51538,1,0,1:2:0:0: 283 | 169,349,51692,5,4,1:0:0:0: 284 | 258,328,51846,1,0,0:2:0:0: 285 | 345,357,52000,1,8,1:2:0:0: 286 | 434,336,52154,1,0,1:2:0:0: 287 | 371,269,52307,1,0,1:2:0:0: 288 | 345,357,52461,1,0,3:2:0:0: 289 | 461,248,52615,1,0,1:2:0:0: 290 | 308,202,52769,1,8,1:2:0:0: 291 | 371,269,52923,5,0,0:2:0:0: 292 | 425,92,53076,1,0,1:2:0:0: 293 | 245,135,53230,1,8,1:2:0:0: 294 | 269,237,53384,5,0,3:2:0:0: 295 | 449,196,53537,1,2,3:2:0:0: 296 | 322,61,53692,2,0,L|345:158,1,76.4999976654053,8|0,1:2|3:2,0:2:0:0: 297 | 371,269,54000,1,0,1:2:0:0: 298 | 449,196,54153,6,0,L|431:121,1,76.4999976654053,4|0,1:0|0:2,0:2:0:0: 299 | 371,269,54461,2,0,L|353:194,1,76.4999976654053,0|0,1:2|0:2,0:2:0:0: 300 | 269,237,54769,2,0,L|251:162,1,76.4999976654053,0|0,1:2|0:2,0:2:0:0: 301 | 191,310,55076,1,8,1:2:0:0: 302 | 182,272,55152,1,8,1:2:0:0: 303 | 173,235,55230,2,0,L|155:160,1,76.4999976654053,10|0,1:2|0:2,0:2:0:0: 304 | 155,160,56692,6,0,P|218:113|325:141,1,170,4|0,1:0|1:2,0:2:0:0: 305 | 372,175,57192,1,0,0:2:0:0: 306 | 383,91,57358,1,4,3:0:0:0: 307 | 294,209,57525,2,0,L|309:302,1,85,2|0,0:2|1:2,0:2:0:0: 308 | 159,377,57858,6,0,L|144:284,1,85,2|4,0:2|3:0,0:2:0:0: 309 | 294,209,58192,2,0,L|279:302,1,85,2|0,0:2|1:2,0:2:0:0: 310 | 432,369,58525,2,0,P|485:291|448:217,1,170,2|2,0:2|0:2,0:2:0:0: 311 | 379,201,59025,1,0,1:2:0:0: 312 | 379,201,59192,1,0,0:2:0:0: 313 | 294,209,59358,6,0,P|333:131|416:125,1,170,4|0,3:0|1:2,0:2:0:0: 314 | 464,186,59858,1,0,0:2:0:0: 315 | 379,201,60025,1,4,3:0:0:0: 316 | 300,49,60192,2,0,L|212:33,1,85,2|0,0:2|1:2,0:2:0:0: 317 | 23,190,60525,6,0,L|111:174,1,85,2|4,0:2|3:0,0:2:0:0: 318 | 121,90,60858,2,0,L|33:106,1,85,2|0,0:0|1:0,0:0:0:0: 319 | 14,273,61191,2,0,L|209:237,1,170,2|0,0:0|0:0,0:0:0:0: 320 | 205,74,61691,1,2,1:2:0:0: 321 | 121,90,61858,1,0,0:0:0:0: 322 | 177,154,62025,6,0,L|280:171,1,85,4|0,1:0|0:0,0:0:0:0: 323 | 205,74,62358,2,0,L|388:104,1,170,2|4,1:2|3:0,0:0:0:0: 324 | 352,19,62858,2,0,L|455:36,1,85,2|0,0:0|1:0,0:0:0:0: 325 | 457,115,63191,1,2,0:0:0:0: 326 | 335,230,63358,6,0,L|232:213,1,85,4|0,3:0|0:0,0:0:0:0: 327 | 307,310,63691,2,0,L|123:279,1,170,2|4,1:2|3:0,0:0:0:0: 328 | 160,365,64191,2,0,L|57:348,1,85,2|0,0:0|1:0,0:0:0:0: 329 | 55,269,64524,1,2,0:0:0:0: 330 | 192,129,64691,6,0,L|209:232,1,85,4|0,3:0|0:0,0:0:0:0: 331 | 222,296,65025,1,2,1:2:0:0: 332 | 307,310,65191,2,0,L|273:109,1,170,0|0,0:0|0:0,0:0:0:0: 333 | 246,63,65691,1,0,1:0:0:0: 334 | 192,129,65858,1,0,0:0:0:0: 335 | 331,76,66025,5,4,1:0:0:0: 336 | 363,154,66191,1,0,0:0:0:0: 337 | 278,142,66358,1,0,1:0:0:0: 338 | 414,86,66525,1,0,3:2:0:0: 339 | 433,76,66608,1,0,3:0:0:0: 340 | 452,67,66691,1,4,3:0:0:0: 341 | 396,230,66859,1,0,3:2:0:0: 342 | 395,251,66942,1,0,3:0:0:0: 343 | 393,272,67025,1,0,1:0:0:0: 344 | 278,142,67191,1,0,3:0:0:0: 345 | 260,130,67274,1,0,3:0:0:0: 346 | 243,118,67358,6,0,P|172:98|86:154,1,170,4|0,1:0|1:0,0:0:0:0: 347 | 60,222,67858,1,0,0:0:0:0: 348 | 144,211,68025,1,4,3:0:0:0: 349 | 112,289,68191,2,0,L|87:375,1,85,2|0,0:0|1:0,0:0:0:0: 350 | 423,370,68525,6,0,L|399:288,1,85,2|4,0:0|3:0,0:0:0:0: 351 | 314,298,68858,2,0,L|337:216,1,85,2|0,0:0|1:0,0:0:0:0: 352 | 499,363,69191,2,0,L|475:281,1,85,2|4,0:0|3:0,0:0:0:0: 353 | 243,272,69525,2,0,L|266:190,1,85,2|0,0:0|1:0,0:0:0:0: 354 | 430,99,69858,1,0,0:0:0:0: 355 | 430,99,70025,6,0,L|380:276,1,170,4|0,3:0|1:0,0:0:0:0: 356 | 358,343,70525,1,0,0:0:0:0: 357 | 300,280,70691,1,4,3:0:0:0: 358 | 274,361,70858,1,2,0:0:0:0: 359 | 217,297,71025,1,0,1:0:0:0: 360 | 383,262,71191,6,0,L|410:163,1,85,2|4,0:0|3:0,0:0:0:0: 361 | 194,215,71525,2,0,L|221:313,1,85,2|0,0:0|1:0,0:0:0:0: 362 | 303,159,71858,2,0,L|330:60,1,85,2|4,0:0|3:0,0:0:0:0: 363 | 55,123,72192,2,0,L|82:221,1,85,2|0,0:0|1:0,0:0:0:0: 364 | 102,286,72525,1,2,0:0:0:0: 365 | 19,266,72691,5,4,1:0:0:0: 366 | 160,224,72858,1,0,0:0:0:0: 367 | 281,307,73025,2,0,P|359:346|450:335,1,170,2|4,1:2|3:0,0:0:0:0: 368 | 491,271,73525,2,0,L|473:161,1,85,2|0,0:0|1:0,0:0:0:0: 369 | 443,64,73858,1,2,0:0:0:0: 370 | 360,160,74024,5,4,3:0:0:0: 371 | 249,257,74191,1,0,0:0:0:0: 372 | 221,112,74358,2,0,P|157:64|60:78,1,170,2|4,1:2|3:0,0:0:0:0: 373 | 22,141,74858,2,0,L|43:250,1,85,2|0,0:0|1:0,0:0:0:0: 374 | 58,307,75191,1,2,0:0:0:0: 375 | 265,340,75358,6,0,L|244:231,1,85,4|0,3:0|0:0,0:0:0:0: 376 | 231,173,75691,1,0,1:0:0:0: 377 | 168,231,75858,1,2,0:0:0:0: 378 | 344,366,76025,2,0,L|323:257,1,85,4|2,3:0|0:0,0:0:0:0: 379 | 312,200,76358,1,2,1:2:0:0: 380 | 392,227,76525,1,2,0:0:0:0: 381 | 248,256,76691,5,2,1:2:0:0: 382 | 392,227,76858,1,0,3:0:0:0: 383 | 411,234,76941,1,0,3:0:0:0: 384 | 431,241,77025,1,0,1:0:0:0: 385 | 293,117,77192,1,0,3:0:0:0: 386 | 289,97,77275,1,0,3:0:0:0: 387 | 285,76,77359,1,0,1:0:0:0: 388 | 248,256,77525,1,0,3:0:0:0: 389 | 232,269,77608,1,0,3:0:0:0: 390 | 216,283,77692,1,0,1:0:0:0: 391 | 312,200,77858,1,0,3:0:0:0: 392 | 312,200,77941,1,0,3:0:0:0: 393 | 312,200,78025,5,4,1:0:0:0: 394 | 215,92,78192,1,0,1:0:0:0: 395 | 359,61,78358,1,0,1:0:0:0: 396 | 335,281,78525,5,4,1:0:0:0: 397 | 134,72,78692,1,0,1:0:0:0: 398 | 416,0,78859,1,0,1:0:0:0: 399 | 297,118,79025,5,4,1:0:0:0: 400 | 256,192,79108,12,6,80691,0:0:0:0: 401 | -------------------------------------------------------------------------------- /slider/example_data/beatmaps/AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario (monstrata) [sheela's Very Hard].osu: -------------------------------------------------------------------------------- 1 | osu file format v14 2 | 3 | [General] 4 | AudioFilename: tatoe.mp3 5 | AudioLeadIn: 0 6 | PreviewTime: 6538 7 | Countdown: 0 8 | SampleSet: Normal 9 | StackLeniency: 0.7 10 | Mode: 0 11 | LetterboxInBreaks: 0 12 | WidescreenStoryboard: 0 13 | 14 | [Editor] 15 | DistanceSpacing: 1.4 16 | BeatDivisor: 4 17 | GridSize: 4 18 | TimelineZoom: 1.8 19 | 20 | [Metadata] 21 | Title:MIIRO vs. Ai no Scenario 22 | TitleUnicode:海色 vs. アイのシナリオ 23 | Artist:AKINO from bless4 & CHiCO with HoneyWorks 24 | ArtistUnicode:AKINO from bless4 & CHiCO with HoneyWorks 25 | Creator:monstrata 26 | Version:sheela's Very Hard 27 | Source: 28 | Tags:kyshiro sukinathan ktgster pishifat smoothie world walaowey toybot sheela901 yuii- Sharkie みいろ tv size opening kantai collection kancolle fleet girls magic kaito 1412 まじっく快斗1412 艦隊これくしょん -艦これ- 29 | BeatmapID:724212 30 | BeatmapSetID:325158 31 | 32 | [Difficulty] 33 | HPDrainRate:5.5 34 | CircleSize:4 35 | OverallDifficulty:6.5 36 | ApproachRate:8 37 | SliderMultiplier:1.4 38 | SliderTickRate:1 39 | 40 | [Events] 41 | //Background and Video events 42 | 0,0,"miiro_no_scenario.png",0,0 43 | //Break Periods 44 | //Storyboard Layer 0 (Background) 45 | //Storyboard Layer 1 (Fail) 46 | //Storyboard Layer 2 (Pass) 47 | //Storyboard Layer 3 (Foreground) 48 | //Storyboard Sound Samples 49 | 50 | [TimingPoints] 51 | 0,307.692307692308,4,2,1,60,1,0 52 | 1230,-133.333333333333,4,2,1,60,0,0 53 | 3692,-133.333333333333,4,1,1,60,0,0 54 | 7230,-100,4,1,1,60,0,0 55 | 17230,-133.333333333333,4,2,1,45,0,0 56 | 27076,-100,4,1,1,60,0,0 57 | 36923,-133.333333333333,4,2,1,45,0,0 58 | 46769,-100,4,2,1,60,0,0 59 | 55692,333.333333333333,4,2,1,45,1,0 60 | 56692,333.333333333333,4,1,1,70,1,1 61 | 67191,-100,4,1,1,70,0,0 62 | 67275,-100,4,2,1,70,0,0 63 | 67358,-100,4,1,1,70,0,1 64 | 78025,-100,4,1,1,70,0,0 65 | 79025,-100,4,1,1,50,0,0 66 | 80691,-100,4,1,1,50,0,0 67 | 68 | 69 | [Colours] 70 | Combo1 : 0,64,128 71 | Combo2 : 0,255,255 72 | Combo3 : 128,0,255 73 | Combo4 : 192,192,192 74 | 75 | [HitObjects] 76 | 131,160,1230,6,0,P|182:182|248:160,1,105.000004005432,6|0,0:0|0:0,0:0:0:0: 77 | 284,124,1692,1,0,0:0:0:0: 78 | 336,72,1846,2,0,L|394:64,1,52.5000020027161,2|0,0:0|0:0,0:0:0:0: 79 | 439,149,2153,2,0,L|386:141,1,52.5000020027161,0|0,0:0|0:0,0:0:0:0: 80 | 323,232,2461,6,0,P|351:227|397:242,2,52.5000020027161,2|0|2,0:0|0:0|0:0,0:0:0:0: 81 | 257,266,2923,2,0,P|231:269|205:264,2,52.5000020027161,0|2|0,0:0|0:0|0:0,0:0:0:0: 82 | 236,195,3384,1,2,0:0:0:0: 83 | 236,195,3692,2,0,B|218:148|218:148|228:122|228:122|219:89|219:89|233:61|223:28,2,157.500006008148,6|0|2,0:2|0:0|2:2,0:0:0:0: 84 | 182,285,4923,6,0,L|174:346,2,52.5000020027161,0|2|2,2:0|2:0|2:0,0:0:0:0: 85 | 261,264,5384,6,0,L|253:325,2,52.5000020027161,0|2|2,2:0|2:0|2:0,0:0:0:0: 86 | 341,245,5846,6,0,L|333:306,2,52.5000020027161,0|2|2,2:0|2:0|2:0,0:0:0:0: 87 | 421,226,6307,6,0,L|413:287,2,52.5000020027161,0|2|2,2:0|2:0|2:0,0:0:0:0: 88 | 376,18,7230,6,0,P|345:60|373:154,1,140,4|2,0:0|0:3,0:0:0:0: 89 | 490,85,7692,2,0,L|420:86,1,70,8|0,0:0|0:0,0:0:0:0: 90 | 259,133,8000,2,0,P|253:94|257:46,1,70,0|0,0:0|0:0,0:0:0:0: 91 | 178,12,8307,1,8,0:0:0:0: 92 | 114,76,8461,1,0,0:0:0:0: 93 | 25,113,8615,6,0,L|31:44,2,70,2|0|8,0:2|0:0|0:0,0:0:0:0: 94 | 98,170,9076,2,0,P|136:160|213:187,1,105,2|0,0:2|0:0,0:0:0:0: 95 | 222,200,9384,2,0,P|274:211|293:212,1,70,2|8,0:2|0:0,0:0:0:0: 96 | 338,98,9692,6,0,L|332:268,1,140,4|2,0:0|0:3,0:0:0:0: 97 | 417,272,10153,2,0,P|468:264|513:274,1,70,8|0,0:0|0:0,0:0:0:0: 98 | 380,354,10461,2,0,P|345:355|311:347,1,70,2|0,0:2|0:0,0:0:0:0: 99 | 241,287,10769,1,8,0:0:0:0: 100 | 173,348,10923,1,0,0:0:0:0: 101 | 102,291,11076,6,0,L|30:282,2,70,2|0|8,0:2|0:0|0:0,0:0:0:0: 102 | 71,187,11538,2,0,P|114:195|168:152,1,105,2|0,0:2|0:0,0:0:0:0: 103 | 186,131,11846,2,0,L|179:60,1,70,0|8,0:0|0:0,0:0:0:0: 104 | 302,75,12153,6,0,L|295:233,1,140,4|2,0:0|0:3,0:0:0:0: 105 | 275,304,12615,2,0,P|316:305|354:287,1,70,8|0,0:0|0:0,0:0:0:0: 106 | 389,212,12923,1,2,0:2:0:0: 107 | 463,262,13076,1,0,0:0:0:0: 108 | 478,128,13230,6,0,P|432:112|339:149,2,140,8|2|8,0:0|0:2|0:0,0:0:0:0: 109 | 419,193,14000,2,0,L|435:284,1,70,2|2,0:2|0:3,0:0:0:0: 110 | 380,361,14307,2,0,P|352:337|350:226,1,140,0|2,0:0|0:2,0:0:0:0: 111 | 320,207,14692,1,2,0:2:0:0: 112 | 320,207,14769,6,0,L|243:204,1,70,8|2,0:0|0:2,0:0:0:0: 113 | 174,121,15076,2,0,L|243:118,1,70,8|2,0:0|0:2,0:0:0:0: 114 | 318,65,15384,1,8,0:0:0:0: 115 | 406,125,15538,2,0,P|459:97|455:6,1,140,2|2,0:2|0:2,0:0:0:0: 116 | 318,65,16000,6,0,P|278:48|238:47,1,70,8|0,0:2|0:0,0:0:0:0: 117 | 154,187,16307,2,0,P|171:147|172:107,1,70,8|0,0:0|0:0,0:0:0:0: 118 | 51,205,16615,1,10,0:0:0:0: 119 | 51,205,16769,1,10,0:0:0:0: 120 | 137,354,17230,6,0,P|168:341|246:363,1,105.000004005432,2|0,0:0|0:0,0:0:0:0: 121 | 292,307,17692,1,2,0:0:0:0: 122 | 292,307,17846,2,0,L|354:313,1,52.5000020027161,0|0,0:0|0:0,0:0:0:0: 123 | 415,292,18153,2,0,L|477:298,1,52.5000020027161,0|2,0:3|0:0,0:0:0:0: 124 | 409,206,18461,6,0,P|373:183|368:117,1,105.000004005432,0|2,0:0|0:0,0:0:0:0: 125 | 414,70,18923,2,0,L|294:67,1,105.000004005432,0|0,0:0|0:0,0:0:0:0: 126 | 236,76,19384,1,0,0:0:0:0: 127 | 164,95,19538,1,0,0:0:0:0: 128 | 131,161,19692,6,0,P|123:259|124:275,1,105.000004005432,2|0,0:0|0:0,0:0:0:0: 129 | 165,325,20153,1,2,0:0:0:0: 130 | 236,308,20307,1,0,0:0:0:0: 131 | 306,328,20461,1,0,0:0:0:0: 132 | 371,295,20615,2,0,L|435:294,1,52.5000020027161,0|2,0:0|0:0,0:0:0:0: 133 | 485,204,20923,6,0,L|469:84,1,105.000004005432,0|0,0:0|0:0,0:0:0:0: 134 | 393,146,21384,2,0,L|377:26,1,105.000004005432,0|0,0:0|0:0,0:0:0:0: 135 | 290,70,21846,2,0,P|262:69|227:73,1,52.5000020027161,2|0,0:0|0:0,0:0:0:0: 136 | 164,127,22153,6,0,P|186:93|155:18,1,105.000004005432,2|2,0:0|0:0,0:0:0:0: 137 | 105,73,22615,1,0,0:0:0:0: 138 | 89,150,22769,2,0,P|108:185|130:196,1,52.5000020027161,2|0,0:0|0:0,0:0:0:0: 139 | 184,243,23076,2,0,P|166:262|142:271,1,52.5000020027161,0|2,0:0|0:0,0:0:0:0: 140 | 237,181,23384,6,0,P|261:212|246:293,1,105.000004005432,0|0,0:0|0:0,0:0:0:0: 141 | 276,346,23846,2,0,P|278:302|324:254,1,105.000004005432,2|0,0:0|0:0,0:0:0:0: 142 | 392,252,24307,1,0,0:0:0:0: 143 | 460,277,24461,1,2,0:0:0:0: 144 | 468,170,24615,6,0,L|458:61,1,105.000004005432,0|0,0:0|0:0,0:0:0:0: 145 | 368,124,25076,2,0,P|310:108|252:118,1,105.000004005432,2|0,0:0|0:0,0:0:0:0: 146 | 199,80,25538,1,2,0:0:0:0: 147 | 131,108,25692,1,0,0:0:0:0: 148 | 92,198,25846,6,0,L|89:282,2,70.0000026702882,2|0|0,1:2|0:0|0:0,0:0:0:0: 149 | 201,149,26461,6,0,L|198:65,2,70.0000026702882,0|0|0,1:0|0:0|0:0,0:0:0:0: 150 | 302,231,27076,6,0,L|305:147,1,70.0000026702882,4|0,0:0|0:0,0:0:0:0: 151 | 366,57,27384,2,0,P|397:118|375:189,1,140,8|2,0:0|0:2,0:0:0:0: 152 | 424,263,27846,1,0,0:0:0:0: 153 | 379,342,28000,1,8,0:0:0:0: 154 | 292,313,28153,6,0,P|220:293|145:323,1,140,2|0,0:3|0:0,0:0:0:0: 155 | 79,356,28615,1,8,0:0:0:0: 156 | 79,356,28769,2,0,L|58:218,1,140,0|0,0:0|0:0,0:0:0:0: 157 | 77,128,29230,1,8,0:0:0:0: 158 | 159,86,29384,6,0,P|209:86|235:80,1,70,6|2,0:0|0:2,0:0:0:0: 159 | 303,169,29692,2,0,P|253:169|227:163,1,70,0|8,0:0|0:0,0:0:0:0: 160 | 180,246,30000,1,0,0:0:0:0: 161 | 227,330,30153,1,2,3:2:0:0: 162 | 320,308,30307,2,0,L|394:312,1,70,0|8,0:0|0:0,0:0:0:0: 163 | 472,268,30615,6,0,P|482:230|452:116,1,140,2|2,0:3|0:3,0:0:0:0: 164 | 403,64,31076,1,8,0:0:0:0: 165 | 223,33,31384,2,0,L|148:39,1,70,2|0,0:2|3:0,0:0:0:0: 166 | 113,121,31692,2,0,L|38:127,1,70,8|0,0:0|0:0,0:0:0:0: 167 | 7,231,32000,6,0,P|39:209|140:240,1,140,4|8,0:0|0:0,0:0:0:0: 168 | 72,299,32461,1,0,0:0:0:0: 169 | 197,291,32615,2,0,P|215:257|220:221,1,70,2|0,3:2|0:0,0:0:0:0: 170 | 282,136,32923,2,0,P|288:170|305:200,1,70,8|2,0:0|0:2,0:0:0:0: 171 | 416,241,33230,5,2,0:3:0:0: 172 | 416,241,33384,1,0,0:0:0:0: 173 | 469,168,33538,2,0,L|468:98,1,70,8|0,0:0|0:0,0:0:0:0: 174 | 402,34,33846,1,0,0:0:0:0: 175 | 304,45,34000,2,0,B|263:52|263:52|205:41,1,70,0|8,3:0|0:0,0:0:0:0: 176 | 144,40,34307,1,2,0:2:0:0: 177 | 144,40,34384,1,0,0:0:0:0: 178 | 144,40,34461,6,0,P|115:86|147:164,1,140,4|8,0:0|0:0,0:0:0:0: 179 | 224,205,34923,1,0,0:0:0:0: 180 | 308,177,35076,2,0,L|383:175,1,70,2|2,0:3|0:2,0:0:0:0: 181 | 445,264,35384,1,8,0:0:0:0: 182 | 445,264,35538,6,0,B|418:292|418:292|377:283|377:283|340:308|304:306,1,140,2|2,0:3|3:2,0:0:0:0: 183 | 246,320,36000,1,8,0:0:0:0: 184 | 147,344,36153,6,0,L|132:269,1,70,6|0,0:2|0:0,0:0:0:0: 185 | 160,170,36461,2,0,L|112:162,2,35,2|0|0,3:2|0:0|0:0,0:0:0:0: 186 | 265,212,36769,1,0,0:0:0:0: 187 | 265,212,36846,1,0,0:0:0:0: 188 | 265,212,36923,6,0,P|288:193|285:113,1,105.000004005432,4|0,0:0|0:0,0:0:0:0: 189 | 165,47,37538,2,0,L|224:42,1,52.5000020027161,2|0,2:0|2:0,0:0:0:0: 190 | 291,46,37846,2,0,L|358:49,1,52.5000020027161,2|0,2:0|2:0,0:0:0:0: 191 | 409,80,38153,6,0,L|417:208,1,105.000004005432,2|0,2:0|2:0,0:0:0:0: 192 | 325,251,38615,2,0,L|333:123,1,105.000004005432,2|0,2:0|2:0,0:0:0:0: 193 | 255,124,39076,1,2,2:0:0:0: 194 | 255,124,39230,1,2,2:0:0:0: 195 | 173,76,39384,6,0,P|158:118|186:192,1,105.000004005432,2|0,2:0|2:0,0:0:0:0: 196 | 211,253,39846,2,0,B|156:246|156:246|97:253,1,105.000004005432,2|0,2:0|2:0,0:0:0:0: 197 | 35,268,40307,1,2,2:0:0:0: 198 | 220,342,40615,6,0,P|263:324|286:217,2,157.500006008148,2|2|2,2:0|2:0|2:0,0:0:0:0: 199 | 103,192,41846,6,0,B|136:186|136:186|176:189|176:189|222:185,1,105.000004005432,2|2,2:0|2:0,0:0:0:0: 200 | 343,98,42461,2,0,B|310:92|310:92|270:95|270:95|224:91,1,105.000004005432,2|2,2:0|2:0,0:0:0:0: 201 | 165,80,42923,1,0,2:0:0:0: 202 | 93,92,43076,6,0,P|84:139|110:201,1,105.000004005432,2|0,2:0|2:0,0:0:0:0: 203 | 189,230,43538,2,0,L|301:229,1,105.000004005432,2|0,2:0|2:0,0:0:0:0: 204 | 356,268,44000,1,2,2:0:0:0: 205 | 417,307,44153,1,2,2:0:0:0: 206 | 472,258,44307,6,0,P|476:212|470:142,1,105.000004005432,2|0,2:0|2:0,0:0:0:0: 207 | 376,83,44769,2,0,P|371:135|375:187,1,105.000004005432,2|0,2:0|2:0,0:0:0:0: 208 | 293,195,45230,2,0,L|293:160,2,35.0000013351441,2|0|0,2:0|0:0|0:0,0:0:0:0: 209 | 254,225,45538,6,0,P|205:213|140:220,1,105.000004005432,8|2,2:3|2:0,0:0:0:0: 210 | 49,274,46000,2,0,P|61:225|54:160,1,105.000004005432,8|0,0:3|0:0,0:0:0:0: 211 | 27,103,46461,1,4,0:3:0:0: 212 | 268,57,46769,6,0,B|327:67|327:67|439:60,1,140,4|2,0:0|0:3,0:0:0:0: 213 | 492,94,47230,1,0,0:0:0:0: 214 | 449,174,47384,2,0,P|443:231|449:256,1,70,2|0,0:0|0:0,0:0:0:0: 215 | 347,324,47692,2,0,P|353:267|347:242,1,70,2|0,0:3|0:0,0:0:0:0: 216 | 241,283,48000,6,0,L|96:282,1,140,2|2,0:0|0:3,0:0:0:0: 217 | 5,269,48461,1,0,0:0:0:0: 218 | 54,187,48615,1,2,0:0:0:0: 219 | 54,187,48769,1,4,2:0:0:0: 220 | 152,193,48923,2,0,P|199:189|223:187,1,70,2|12,0:0|0:0,0:0:0:0: 221 | 309,224,49230,6,0,P|274:184|279:95,1,140,0|2,0:0|0:3,0:0:0:0: 222 | 355,145,49692,1,0,0:0:0:0: 223 | 397,233,49846,2,0,P|390:275|291:317,1,140,2|2,0:0|0:3,0:0:0:0: 224 | 225,351,50307,1,0,0:0:0:0: 225 | 159,289,50461,6,0,L|83:285,1,70,2|0,0:0|0:0,0:0:0:0: 226 | 32,207,50769,2,0,L|101:203,1,70,8|0,0:3|0:0,0:0:0:0: 227 | 187,172,51076,1,12,0:3:0:0: 228 | 187,172,51230,1,0,0:0:0:0: 229 | 255,233,51384,2,0,P|290:237|328:232,1,70,0|2,0:0|3:2,0:0:0:0: 230 | 420,304,51692,6,0,P|443:263|418:163,1,140,4|12,2:0|0:3,0:0:0:0: 231 | 378,98,52153,1,0,0:0:0:0: 232 | 378,98,52307,1,2,3:3:0:0: 233 | 289,118,52461,2,0,P|223:123|204:119,1,70,2|2,0:0|0:3,0:0:0:0: 234 | 108,191,52769,2,0,P|142:189|177:195,1,70,12|10,0:3|0:0,0:0:0:0: 235 | 255,233,53076,5,2,0:0:0:0: 236 | 229,320,53230,2,0,P|267:329|334:256,1,140,8|10,0:3|0:0,0:0:0:0: 237 | 325,171,53692,2,0,B|348:174|375:183|375:183|455:135,1,140,12|2,0:3|0:3,0:0:0:0: 238 | 481,44,54153,5,12,0:3:0:0: 239 | 481,44,54307,1,2,0:0:0:0: 240 | 374,61,54461,2,0,L|274:58,1,70,0|10,0:3|0:3,0:0:0:0: 241 | 136,95,54769,2,0,L|206:98,1,70,0|6,0:3|0:3,0:0:0:0: 242 | 43,161,55076,1,2,0:0:0:0: 243 | 43,161,55153,1,2,0:0:0:0: 244 | 43,161,55230,1,2,2:0:0:0: 245 | 43,161,55692,6,0,L|20:307,2,140 246 | 43,161,56692,6,0,P|92:181|194:158,1,140,4|8,0:2|0:0,0:0:0:0: 247 | 233,97,57192,1,0,0:0:0:0: 248 | 312,141,57358,2,0,P|351:144|383:139,1,70,2|0,0:3|0:0,0:0:0:0: 249 | 456,86,57692,1,8,0:0:0:0: 250 | 494,186,57858,6,0,L|509:332,1,140,2|2,0:2|0:2,0:0:0:0: 251 | 421,302,58358,2,0,P|376:285|282:324,1,140,8|0,0:0|0:0,0:0:0:0: 252 | 227,377,58858,1,2,0:3:0:0: 253 | 227,377,59025,2,0,P|207:343|206:305,1,70,8|0,0:0|0:0,0:0:0:0: 254 | 264,218,59358,6,0,B|213:197|171:246|115:206,2,140,2|8|2,0:2|0:0|0:3,0:0:0:0: 255 | 325,286,60192,1,0,0:0:0:0: 256 | 400,236,60358,2,0,L|477:226,1,70,8|2,0:0|0:3,0:0:0:0: 257 | 474,123,60691,6,0,B|389:132|389:132|327:106,1,140,0|8,3:0|0:0,0:0:0:0: 258 | 256,63,61191,1,0,0:0:0:0: 259 | 173,110,61358,2,0,B|123:132|123:132|38:123,1,140,2|8,0:3|0:0,0:0:0:0: 260 | 62,217,61858,1,0,0:0:0:0: 261 | 182,227,62025,6,0,L|331:222,1,140,4|8,0:0|0:0,0:0:0:0: 262 | 445,314,62691,1,2,0:2:0:0: 263 | 445,314,62858,2,0,P|391:312|368:317,1,70,0|8,0:0|0:0,0:0:0:0: 264 | 292,358,63191,6,0,P|248:338|157:351,1,140,2|0,0:3|0:0,0:0:0:0: 265 | 75,313,63691,2,0,P|61:283|50:225,1,70,8|0,0:0|0:0,0:0:0:0: 266 | 54,155,64025,1,2,0:2:0:0: 267 | 54,155,64191,1,0,0:0:0:0: 268 | 141,123,64358,2,0,L|219:121,1,70,8|2,0:0|0:3,0:0:0:0: 269 | 308,160,64691,6,0,P|377:175|445:159,2,140,2|8|2,0:2|0:0|0:2,0:0:0:0: 270 | 255,14,65691,1,8,0:0:0:0: 271 | 255,14,65858,1,2,0:2:0:0: 272 | 170,48,66025,6,0,P|127:44|84:50,1,70,4|0,0:2|0:0,0:0:0:0: 273 | 62,153,66358,2,0,L|148:141,1,70,8|2,0:0|3:2,0:0:0:0: 274 | 173,162,66608,5,0,3:0:0:0: 275 | 173,162,66691,2,0,P|214:168|266:168,1,70,2|0,3:3|3:0,0:0:0:0: 276 | 287,161,66941,1,0,3:0:0:0: 277 | 287,161,67025,1,8,3:1:0:0: 278 | 251,295,67191,1,2,3:0:0:0: 279 | 251,295,67275,1,0,3:0:0:0: 280 | 251,295,67358,6,0,B|338:307|338:307|406:287,1,140,4|8,0:0|0:0,0:0:0:0: 281 | 467,248,67858,1,0,0:0:0:0: 282 | 467,158,68025,2,0,L|472:89,1,70,2|0,0:3|0:0,0:0:0:0: 283 | 380,11,68358,2,0,L|385:80,1,70,8|2,0:0|0:2,0:0:0:0: 284 | 278,131,68691,6,0,P|241:155|146:138,1,140,2|8,3:3|0:0,0:0:0:0: 285 | 209,71,69191,1,0,0:0:0:0: 286 | 209,71,69358,2,0,L|199:234,1,140,2|8,0:3|0:0,0:0:0:0: 287 | 107,334,70025,6,0,L|266:340,1,140,2|8,0:2|0:0,0:0:0:0: 288 | 335,315,70525,1,0,0:0:0:0: 289 | 335,315,70691,2,0,P|360:270|360:229,1,70,2|0,0:2|0:0,0:0:0:0: 290 | 246,201,71025,2,0,P|253:234|273:263,1,70,8|2,0:0|0:2,0:0:0:0: 291 | 329,176,71358,6,0,P|311:142|207:123,1,140,2|8,0:3|0:0,0:0:0:0: 292 | 132,148,71858,1,2,0:2:0:0: 293 | 132,148,72025,1,2,0:3:0:0: 294 | 83,224,72191,2,0,L|8:221,1,70,2|8,3:0|0:0,0:0:0:0: 295 | 122,316,72525,1,2,0:3:0:0: 296 | 122,316,72691,6,0,L|284:305,1,140,4|8,0:0|0:0,0:0:0:0: 297 | 352,298,73191,1,0,0:0:0:0: 298 | 308,217,73358,2,0,P|348:210|386:213,1,70,2|0,0:3|0:0,0:0:0:0: 299 | 458,139,73692,2,0,P|418:132|380:135,1,70,8|2,0:0|0:3,0:0:0:0: 300 | 268,109,74025,6,0,B|224:114|224:114|120:95,1,140,4|8,0:0|0:0,0:0:0:0: 301 | 41,75,74525,1,0,0:0:0:0: 302 | 28,170,74691,2,0,L|27:245,1,70,2|0,0:3|0:0,0:0:0:0: 303 | 119,220,75025,2,0,L|118:295,1,70,8|2,0:0|0:3,0:0:0:0: 304 | 211,335,75358,6,0,P|258:343|329:280,2,140,2|8|2,0:2|0:0|0:3,0:0:0:0: 305 | 243,249,76191,1,2,2:0:0:0: 306 | 217,161,76358,2,0,L|295:156,1,70,8|2,0:0|0:2,0:0:0:0: 307 | 174,83,76691,6,0,L|96:78,1,70,8|0,0:0|0:0,0:0:0:0: 308 | 245,16,77025,1,8,0:0:0:0: 309 | 245,16,77108,1,0,0:0:0:0: 310 | 245,16,77191,1,0,0:0:0:0: 311 | 339,63,77358,2,0,P|385:52|418:55,1,70,8|0,0:0|0:0,0:0:0:0: 312 | 285,151,77691,2,0,P|239:162|206:159,1,70,8|0,0:0|0:0,0:0:0:0: 313 | 329,251,78025,6,0,P|375:239|464:261,1,140,2|4,0:3|0:3,0:0:0:0: 314 | 294,359,78525,2,0,P|228:380|159:368,1,140,2|4,0:3|0:3,0:0:0:0: 315 | 227,220,79025,1,4,0:0:0:0: 316 | 256,192,79108,12,0,80691,0:0:0:0: 317 | -------------------------------------------------------------------------------- /slider/example_data/beatmaps/Remo Prototype[CV Hanamori Yumiri] - Sendan Life (Narcissu) [Easy].osu: -------------------------------------------------------------------------------- 1 | osu file format v14 2 | 3 | [General] 4 | AudioFilename: life.mp3 5 | AudioLeadIn: 0 6 | PreviewTime: 53580 7 | Countdown: 0 8 | SampleSet: Soft 9 | StackLeniency: 0.7 10 | Mode: 0 11 | LetterboxInBreaks: 0 12 | WidescreenStoryboard: 1 13 | 14 | [Editor] 15 | DistanceSpacing: 1 16 | BeatDivisor: 2 17 | GridSize: 4 18 | TimelineZoom: 0.4999998 19 | 20 | [Metadata] 21 | Title:Sendan Life 22 | TitleUnicode:センダンライフ 23 | Artist:Remo Prototype[CV: Hanamori Yumiri] 24 | ArtistUnicode:リモ Prototype[CV:花守ゆみり] 25 | Creator:Narcissu 26 | Version:Easy 27 | Source:ガラスの花と壊す世界 28 | Tags:Little CloudSplash16 Crystal vocaloid Chukka やしきん yashikin Glass no Hana to Kowasu Sekai GARAKOWA Restore the World Vitreous Flower Destroy the World 29 | BeatmapID:896390 30 | BeatmapSetID:411894 31 | 32 | [Difficulty] 33 | HPDrainRate:3 34 | CircleSize:3 35 | OverallDifficulty:3 36 | ApproachRate:4 37 | SliderMultiplier:1.05 38 | SliderTickRate:1 39 | 40 | [Events] 41 | //Background and Video events 42 | 0,0,"BG.png",0,0 43 | //Break Periods 44 | //Storyboard Layer 0 (Background) 45 | //Storyboard Layer 1 (Fail) 46 | //Storyboard Layer 2 (Pass) 47 | //Storyboard Layer 3 (Foreground) 48 | //Storyboard Sound Samples 49 | 50 | [TimingPoints] 51 | 6664,264.31718061674,4,2,2,60,1,0 52 | 6664,-200,4,2,2,60,0,0 53 | 11950,-200,4,2,2,70,0,0 54 | 20408,-200,4,2,2,60,0,0 55 | 37324,-200,4,2,2,40,0,0 56 | 45650,-200,4,2,2,60,0,0 57 | 54241,-200,4,2,2,70,0,1 58 | 71157,-200,4,2,2,60,0,0 59 | 60 | 61 | [Colours] 62 | Combo1 : 255,128,255 63 | Combo2 : 128,255,255 64 | Combo3 : 255,255,128 65 | Combo4 : 128,128,255 66 | 67 | [HitObjects] 68 | 256,264,7721,5,0,1:0:0:0: 69 | 432,324,8646,2,0,L|420:208,1,105,0|0,1:0|1:0,0:0:0:0: 70 | 456,92,9835,2,0,P|404:112|336:108,1,105,0|0,1:0|1:0,0:0:0:0: 71 | 304,52,10760,2,0,L|172:40,1,131.25,0|0,1:0|1:0,0:0:0:0: 72 | 80,92,11950,6,0,P|68:140|84:204,1,105,4|0,1:0|1:0,0:0:0:0: 73 | 172,244,13007,2,0,L|180:348,1,105,0|0,1:0|1:0,0:0:0:0: 74 | 272,296,14064,2,0,P|320:284|376:292,1,105,0|0,1:0|1:0,0:0:0:0: 75 | 464,348,15122,1,0,1:0:0:0: 76 | 472,244,15650,1,0,1:0:0:0: 77 | 388,180,16179,6,0,L|392:72,1,105,0|0,1:0|1:0,0:0:0:0: 78 | 288,60,17236,2,0,L|284:168,1,105,0|0,1:0|1:0,0:0:0:0: 79 | 192,112,18293,2,0,P|140:108|84:136,1,105,0|0,1:0|1:0,0:0:0:0: 80 | 40,188,19219,2,0,L|32:320,1,131.25,4|2,1:0|0:0,0:0:0:0: 81 | 132,348,20408,6,0,B|168:324|168:324|340:316,1,210,4|0,1:0|3:0,0:0:0:0: 82 | 428,360,21994,1,0,0:0:0:0: 83 | 504,288,22523,2,0,P|516:236|504:172,1,105,2|2,3:2|0:0,0:0:0:0: 84 | 428,120,23580,2,0,L|304:120,1,105,2|0,3:2|0:0,0:0:0:0: 85 | 252,44,24637,6,0,P|160:24|48:72,1,210,2|2,3:2|3:2,0:0:0:0: 86 | 40,168,26223,1,0,0:0:0:0: 87 | 140,204,26752,2,0,P|156:252|144:316,1,105,2|2,3:2|0:0,0:0:0:0: 88 | 48,269,27809,2,0,P|32:221|44:157,1,105,0|8,3:0|0:0,0:0:0:0: 89 | 128,112,28866,6,0,P|232:114|320:56,1,210,4|2,1:0|3:2,0:0:0:0: 90 | 424,64,30452,1,0,0:0:0:0: 91 | 500,136,30981,2,0,L|508:244,1,105,0|2,3:0|0:0,0:0:0:0: 92 | 408,272,32038,2,0,L|400:164,1,105,2|0,3:2|0:0,0:0:0:0: 93 | 304,208,33095,6,0,L|88:200,1,210,2|2,3:2|3:2,0:0:0:0: 94 | 20,276,34681,1,2,0:0:0:0: 95 | 100,348,35210,2,0,L|216:336,1,105,0|2,3:0|0:0,0:0:0:0: 96 | 284,268,36267,1,0,0:0:0:0: 97 | 376,316,36796,1,2,0:0:0:0: 98 | 476,280,37324,6,0,P|508:212|500:120,2,157.5,2|0|8,3:2|3:0|0:0,0:0:0:0: 99 | 412,196,39439,2,0,P|386:125|315:65,2,157.5,0|0|8,3:0|3:0|0:0,0:0:0:0: 100 | 368,292,41553,6,0,B|324:316|324:316|256:320,1,105,0|0,3:0|0:0,0:0:0:0: 101 | 168,352,42611,2,0,L|60:344,1,105,0|0,3:0|3:0,0:0:0:0: 102 | 44,240,43668,2,0,P|56:164|20:88,2,157.5,0|0|8,3:0|3:0|0:0,0:0:0:0: 103 | 104,292,45650,6,0,L|248:296,1,131.25,4|2,0:1|3:2,0:0:0:0: 104 | 312,368,46840,2,0,P|344:308|328:256,1,105,2|0,3:2|3:0,0:0:0:0: 105 | 288,212,47765,2,0,L|292:76,1,131.25,6|2,0:0|3:2,0:0:0:0: 106 | 392,48,48954,2,0,L|400:168,1,105,4|0,3:1|3:0,0:0:0:0: 107 | 468,192,49879,6,0,P|488:264|464:324,1,131.25,4|2,0:0|3:2,0:0:0:0: 108 | 372,276,51069,2,0,L|264:284,1,105,2|0,3:2|3:0,0:0:0:0: 109 | 192,356,52126,2,0,B|148:340|148:340|100:352|100:352|48:344|48:344|8:348,1,183.75,2|4,1:2|1:2,0:0:0:0: 110 | 100,248,53712,1,8,0:0:0:0: 111 | 0,212,54241,6,0,P|72:148|184:184,1,210,4|0,1:0|0:0,0:0:0:0: 112 | 204,276,55826,1,2,3:2:0:0: 113 | 284,208,56355,2,0,L|288:92,1,105,2|2,3:2|3:2,0:0:0:0: 114 | 356,24,57412,2,0,P|408:12|464:24,1,105,2|2,3:2|3:2,0:0:0:0: 115 | 412,116,58470,5,2,3:2:0:0: 116 | 476,200,58998,1,2,3:2:0:0: 117 | 396,268,59527,2,0,P|392:312|412:360,2,78.75,2|2|10,3:2|3:2|0:0,0:0:0:0: 118 | 296,228,60849,2,0,L|192:232,1,105,10|10,0:0|0:0,0:0:0:0: 119 | 180,336,61906,2,0,L|76:344,1,105,10|10,0:0|0:0,0:0:0:0: 120 | 28,320,62699,6,0,P|4:224|32:116,1,210,4|0,1:0|3:0,0:0:0:0: 121 | 112,52,64285,1,2,3:2:0:0: 122 | 192,120,64813,2,0,P|244:120|292:100,1,105,2|2,3:2|3:2,0:0:0:0: 123 | 356,16,65871,2,0,L|472:12,1,105,2|2,3:2|3:2,0:0:0:0: 124 | 452,116,66928,6,0,L|464:208,2,78.75,2|2|2,1:2|1:2|1:2,0:0:0:0: 125 | 356,72,68249,1,0,1:0:0:0: 126 | 268,132,68778,2,0,P|284:248|244:332,1,210,2|8,1:2|0:0,0:0:0:0: 127 | 196,308,70100,2,0,L|84:312,1,105,0|8,1:0|0:0,0:0:0:0: 128 | 24,232,71157,6,0,P|4:184|8:116,1,105,4|0,1:0|1:0,0:0:0:0: 129 | 76,56,72214,2,0,L|188:60,1,105,0|0,1:0|1:0,0:0:0:0: 130 | 280,24,73271,2,0,P|328:12|384:20,1,105,0|0,1:0|1:0,0:0:0:0: 131 | 448,104,74329,1,0,1:0:0:0: 132 | 448,208,74857,1,0,1:0:0:0: 133 | 356,264,75386,6,0,L|364:376,1,105,0|0,1:0|1:0,0:0:0:0: 134 | 260,340,76443,2,0,L|252:228,1,105,0|0,1:0|1:0,0:0:0:0: 135 | 196,148,77500,2,0,P|148:136|88:152,1,105,0|0,1:0|1:0,0:0:0:0: 136 | 40,208,78426,2,0,L|36:348,1,131.25,4|2,1:0|0:0,0:0:0:0: 137 | 136,308,79615,5,4,0:0:0:0: 138 | -------------------------------------------------------------------------------- /slider/example_data/beatmaps/Remo Prototype[CV Hanamori Yumiri] - Sendan Life (Narcissu) [Little's Hard].osu: -------------------------------------------------------------------------------- 1 | osu file format v14 2 | 3 | [General] 4 | AudioFilename: life.mp3 5 | AudioLeadIn: 0 6 | PreviewTime: 53580 7 | Countdown: 0 8 | SampleSet: Soft 9 | StackLeniency: 0.7 10 | Mode: 0 11 | LetterboxInBreaks: 0 12 | WidescreenStoryboard: 1 13 | 14 | [Editor] 15 | DistanceSpacing: 1.5 16 | BeatDivisor: 4 17 | GridSize: 4 18 | TimelineZoom: 1.5 19 | 20 | [Metadata] 21 | Title:Sendan Life 22 | TitleUnicode:センダンライフ 23 | Artist:Remo Prototype[CV: Hanamori Yumiri] 24 | ArtistUnicode:リモ Prototype[CV:花守ゆみり] 25 | Creator:Narcissu 26 | Version:Little's Hard 27 | Source:ガラスの花と壊す世界 28 | Tags:Little CloudSplash16 Crystal vocaloid Chukka やしきん yashikin Glass no Hana to Kowasu Sekai GARAKOWA Restore the World Vitreous Flower Destroy the World 29 | BeatmapID:899533 30 | BeatmapSetID:411894 31 | 32 | [Difficulty] 33 | HPDrainRate:5.5 34 | CircleSize:4 35 | OverallDifficulty:6.2 36 | ApproachRate:7.8 37 | SliderMultiplier:1.1 38 | SliderTickRate:1 39 | 40 | [Events] 41 | //Background and Video events 42 | 0,0,"BG.png",0,0 43 | //Break Periods 44 | //Storyboard Layer 0 (Background) 45 | //Storyboard Layer 1 (Fail) 46 | //Storyboard Layer 2 (Pass) 47 | //Storyboard Layer 3 (Foreground) 48 | //Storyboard Sound Samples 49 | 50 | [TimingPoints] 51 | 6664,264.31718061674,4,2,1,60,1,0 52 | 11950,-100,4,2,1,70,0,0 53 | 20408,-100,4,2,1,60,0,0 54 | 37324,-125,4,2,1,40,0,0 55 | 37589,-125,4,3,1,40,0,0 56 | 37655,-125,4,2,1,40,0,0 57 | 38382,-125,4,3,1,40,0,0 58 | 38448,-125,4,2,1,40,0,0 59 | 39703,-125,4,3,1,40,0,0 60 | 39769,-125,4,2,1,40,0,0 61 | 39967,-125,4,3,1,40,0,0 62 | 40034,-125,4,2,1,40,0,0 63 | 41818,-125,4,3,1,40,0,0 64 | 41884,-125,4,2,1,40,0,0 65 | 42875,-125,4,3,1,40,0,0 66 | 42941,-125,4,2,1,40,0,0 67 | 43932,-125,4,3,1,40,0,0 68 | 43998,-125,4,2,1,40,0,0 69 | 45650,-100,4,2,1,60,0,0 70 | 54241,-100,4,2,1,70,0,1 71 | 67192,-100,4,3,1,70,0,1 72 | 67258,-100,4,2,1,70,0,1 73 | 71157,-100,4,2,1,60,0,0 74 | 75 | 76 | [Colours] 77 | Combo1 : 255,128,255 78 | Combo2 : 128,255,255 79 | Combo3 : 255,255,128 80 | Combo4 : 128,128,255 81 | 82 | [HitObjects] 83 | 165,67,7721,5,0,1:0:0:0: 84 | 204,256,7985,1,0,1:0:0:0: 85 | 275,75,8249,1,0,1:0:0:0: 86 | 257,172,8382,1,0,1:0:0:0: 87 | 68,212,8646,5,0,1:0:0:0: 88 | 257,172,8910,1,0,1:0:0:0: 89 | 76,102,9174,1,0,1:0:0:0: 90 | 204,256,9439,1,0,1:0:0:0: 91 | 204,256,9571,2,0,P|250:227|304:231,1,110,8|0,0:1|1:0,0:0:0:0: 92 | 466,336,10100,5,0,1:0:0:0: 93 | 396,156,10363,1,0,1:0:0:0: 94 | 452,238,10496,1,0,1:0:0:0: 95 | 272,308,10760,5,0,1:0:0:0: 96 | 452,238,11025,1,0,1:0:0:0: 97 | 272,308,11289,1,0,1:0:0:0: 98 | 272,308,11421,2,0,P|226:279|172:283,1,110,8|2,0:1|0:0,0:0:0:0: 99 | 172,282,11950,6,0,L|180:172,1,110,4|8,1:0|0:0,0:0:0:0: 100 | 268,36,12478,2,0,L|276:145,1,110,0|8,1:0|0:0,0:0:0:0: 101 | 324,212,12875,1,0,1:0:0:0: 102 | 324,212,13007,6,0,B|368:231|387:202|431:218,1,110,0|8,1:0|0:0,0:0:0:0: 103 | 500,264,13404,1,0,0:0:0:0: 104 | 500,264,13536,2,0,P|501:292|493:318,1,55,0|0,1:0|1:0,0:0:0:0: 105 | 432,218,13800,2,0,P|431:190|439:164,1,55,8|0,0:0|1:0,0:0:0:0: 106 | 484,95,14064,6,0,P|436:120|384:106,1,110,0|8,1:0|0:0,0:0:0:0: 107 | 228,156,14593,2,0,P|180:131|128:145,1,110,0|8,1:0|0:0,0:0:0:0: 108 | 68,200,14989,1,0,1:0:0:0: 109 | 68,200,15122,6,0,L|76:309,1,110,0|8,1:0|0:0,0:0:0:0: 110 | 144,356,15518,1,0,0:0:0:0: 111 | 144,356,15650,2,0,P|171:357|197:349,1,55,0|0,1:0|1:0,0:0:0:0: 112 | 274,324,15915,2,0,P|302:321|328:329,1,55,8|0,0:0|1:0,0:0:0:0: 113 | 412,328,16179,6,0,P|437:280|423:228,1,110,0|8,1:0|0:0,0:0:0:0: 114 | 280,176,16708,2,0,P|225:184|171:175,1,110,0|8,1:0|0:0,0:0:0:0: 115 | 100,136,17104,1,0,1:0:0:0: 116 | 100,136,17236,6,0,L|96:26,1,110,0|8,1:0|0:0,0:0:0:0: 117 | 260,52,17765,2,0,P|237:67|210:73,1,55,0|0,1:0|1:0,0:0:0:0: 118 | 230,154,18029,2,0,P|253:169|280:176,1,55,8|0,0:0|1:0,0:0:0:0: 119 | 351,135,18293,6,0,P|361:189|337:237,1,110,0|8,1:0|0:0,0:0:0:0: 120 | 180,288,18822,2,0,L|108:276,2,55,0|0|8,1:0|1:0|0:0,0:0:0:0: 121 | 247,336,19219,6,0,P|299:317|352:326,1,110,4|0,1:0|1:0,0:0:0:0: 122 | 424,288,19615,2,0,P|433:262|432:234,1,55,8|0,0:0|1:0,0:0:0:0: 123 | 384,168,19879,2,0,P|391:83|439:153,1,220,2|4,0:0|1:0,0:0:0:0: 124 | 436,156,20672,5,10,0:0:0:0: 125 | 432,160,20937,2,0,L|313:151,1,110,2|8,0:0|0:0,0:0:0:0: 126 | 188,243,21465,2,0,P|137:262|87:242,1,110,2|8,3:2|0:0,0:0:0:0: 127 | 44,172,21862,2,0,L|56:48,1,110,2|0,3:2|0:0,0:0:0:0: 128 | 54,62,22258,1,10,3:2:0:0: 129 | 220,84,22523,6,0,P|246:87|274:83,1,55,2|2,3:2|0:0,0:0:0:0: 130 | 352,64,22787,1,10,0:0:0:0: 131 | 219,209,23051,2,0,P|244:219|272:223,1,55,2|2,0:0|3:2,0:0:0:0: 132 | 352,224,23315,1,10,0:0:0:0: 133 | 352,224,23580,2,0,P|369:275|350:325,1,110,2|8,3:2|0:0,0:0:0:0: 134 | 272,352,23976,2,0,L|162:355,1,110,2|0,3:2|3:0,0:0:0:0: 135 | 80,356,24373,1,10,0:0:0:0: 136 | 12,204,24637,6,0,B|24:172|24:172|17:96,1,110,2|10,3:2|0:0,0:0:0:0: 137 | 160,12,25166,2,0,B|148:44|148:44|154:119,1,110,2|8,0:0|0:0,0:0:0:0: 138 | 320,116,25694,2,0,P|360:112|400:168,1,110,2|10,3:2|0:0,0:0:0:0: 139 | 368,240,26091,2,0,L|252:232,1,110,2|2,3:2|3:2,0:0:0:0: 140 | 192,280,26487,1,8,0:0:0:0: 141 | 332,368,26752,6,0,L|339:313,1,55,2|0,3:2|0:0,0:0:0:0: 142 | 312,236,27016,2,0,L|304:181,1,55,10|0,0:0|3:2,0:0:0:0: 143 | 352,116,27280,2,0,P|304:141|252:127,1,110,2|10,0:0|0:0,0:0:0:0: 144 | 168,124,27677,2,0,L|160:233,2,110,2|2|2,0:0|0:0|0:0,0:0:0:0: 145 | 172,40,28338,1,8,0:0:0:0: 146 | 28,120,28602,1,8,0:0:0:0: 147 | 180,180,28866,6,0,P|232:166|279:191,1,110,4|10,1:0|0:0,0:0:0:0: 148 | 416,284,29395,2,0,L|424:168,1,110,2|10,0:0|0:0,0:0:0:0: 149 | 368,20,29923,2,0,P|338:64|345:117,1,110,2|10,3:2|0:0,0:0:0:0: 150 | 334,199,30320,2,0,L|279:191,1,55,2|0,3:2|0:0,0:0:0:0: 151 | 240,264,30584,1,2,3:2:0:0: 152 | 240,264,30716,2,0,L|294:271,1,55,8|2,0:0|0:0,0:0:0:0: 153 | 156,252,30981,5,0,0:0:0:0: 154 | 124,173,31245,1,10,0:0:0:0: 155 | 176,105,31509,1,2,0:0:0:0: 156 | 260,116,31774,1,10,0:0:0:0: 157 | 292,194,32038,6,0,P|328:212|404:192,1,110,2|10,3:2|0:0,0:0:0:0: 158 | 476,184,32434,2,0,L|465:293,1,110,2|2,3:2|3:2,0:0:0:0: 159 | 404,348,32831,2,0,P|377:340|350:339,1,55,10|2,0:0|0:0,0:0:0:0: 160 | 268,348,33095,5,2,3:2:0:0: 161 | 116,288,33360,1,10,0:0:0:0: 162 | 56,344,33492,1,0,3:0:0:0: 163 | 116,288,33624,2,0,P|123:234|104:182,1,110,2|10,0:0|0:0,0:0:0:0: 164 | 27,75,34152,2,0,P|77:97|130:86,1,110,2|10,3:2|0:0,0:0:0:0: 165 | 212,92,34549,2,0,P|261:70|314:81,1,110,2|0,3:2|3:0,0:0:0:0: 166 | 396,80,34945,2,0,L|403:25,1,55,10|2,0:0|0:0,0:0:0:0: 167 | 456,136,35210,5,0,3:0:0:0: 168 | 364,272,35474,2,0,P|311:261|265:289,1,110,10|2,0:0|0:0,0:0:0:0: 169 | 188,260,35871,2,0,L|191:205,1,55,2|8,3:2|0:0,0:0:0:0: 170 | 252,152,36135,2,0,P|199:162|153:134,1,110,2|2,3:2|3:2,0:0:0:0: 171 | 75,164,36532,2,0,L|78:218,1,55,0|2,0:0|3:2,0:0:0:0: 172 | 84,300,36796,1,2,0:0:0:0: 173 | 240,352,37060,1,2,3:2:0:0: 174 | 240,352,37192,1,0,3:0:0:0: 175 | 240,352,37324,6,0,P|295:320|359:331,1,132,2|8,3:2|0:1,0:0:0:0: 176 | 404,204,38117,2,0,L|272:215,1,132,0|0,3:0|3:0,0:0:0:0: 177 | 184,116,38910,2,0,L|180:203,1,88,8|0,0:1|3:0,0:0:0:0: 178 | 168,292,39439,6,0,P|113:325|53:305,2,132,0|8|0,3:0|0:1|3:0,0:0:0:0: 179 | 144,208,40496,2,0,L|118:172,2,44,0|0|0,0:0|3:0|0:0,0:0:0:0: 180 | 228,227,41025,2,0,P|239:186|230:143,1,88,8|0,0:1|3:0,0:0:0:0: 181 | 168,80,41553,6,0,P|227:105|287:84,1,132,0|8,3:0|0:1,0:0:0:0: 182 | 324,56,42082,1,0,0:0:0:0: 183 | 412,68,42346,1,0,3:0:0:0: 184 | 412,68,42611,2,0,B|406:100|406:100|415:199,1,132,0|8,3:0|0:1,0:0:0:0: 185 | 419,244,43139,1,0,0:0:0:0: 186 | 344,292,43404,1,0,3:0:0:0: 187 | 344,292,43668,6,0,P|285:265|227:291,1,132,0|8,3:0|0:1,0:0:0:0: 188 | 96,284,44461,1,0,3:0:0:0: 189 | 96,284,44725,2,0,P|80:244|90:202,1,88,0|0,0:0|0:0,0:0:0:0: 190 | 156,144,45254,2,0,P|198:152|240:140,1,88,8|8,0:1|0:1,0:0:0:0: 191 | 320,120,45650,6,0,L|323:229,1,110,4|2,0:1|3:2,0:0:0:0: 192 | 368,300,46047,2,0,L|422:305,1,55,10|2,0:0|0:0,0:0:0:0: 193 | 292,328,46311,2,0,L|237:322,1,55,2|2,3:2|3:2,0:0:0:0: 194 | 156,312,46575,1,10,0:0:0:0: 195 | 39,196,46840,6,0,P|87:170|139:184,1,110,2|10,3:2|0:0,0:0:0:0: 196 | 219,164,47236,2,0,P|231:139|233:111,1,55,2|0,0:0|3:0,0:0:0:0: 197 | 200,244,47501,2,0,P|202:271|213:296,1,55,2|8,3:2|0:0,0:0:0:0: 198 | 288,332,47765,6,0,L|397:329,1,110,6|2,0:0|3:2,0:0:0:0: 199 | 480,324,48161,1,2,0:0:0:0: 200 | 492,244,48293,1,2,0:0:0:0: 201 | 416,172,48426,2,0,L|412:226,1,55,2|2,3:2|3:2,0:0:0:0: 202 | 332,248,48690,2,0,L|328:193,1,55,2|2,0:0|0:0,0:0:0:0: 203 | 284,124,48954,6,0,B|236:108|192:128|192:128|176:122,1,110,4|8,3:1|0:0,0:0:0:0: 204 | 96,140,49351,2,0,P|88:166|89:193,1,55,2|0,0:0|3:0,0:0:0:0: 205 | 156,240,49615,2,0,P|163:266|162:293,1,55,2|8,3:2|0:0,0:0:0:0: 206 | 101,348,49879,6,0,P|148:374|201:365,1,110,4|0,0:0|3:0,0:0:0:0: 207 | 248,296,50276,2,0,L|304:296,1,55,10|2,0:0|0:0,0:0:0:0: 208 | 384,296,50540,1,2,3:2:0:0: 209 | 476,160,50804,1,10,0:0:0:0: 210 | 500,240,50937,1,2,0:0:0:0: 211 | 476,160,51069,6,0,B|448:144|448:144|370:144,1,110,2|10,3:2|0:0,0:0:0:0: 212 | 288,144,51465,1,2,0:0:0:0: 213 | 128,108,51730,2,0,P|116:83|114:55,2,55,2|10|2,3:2|3:2|0:0,0:0:0:0: 214 | 184,168,52126,5,2,1:2:0:0: 215 | 68,284,52390,1,2,1:2:0:0: 216 | 184,168,52655,1,2,1:2:0:0: 217 | 68,284,52919,1,2,3:2:0:0: 218 | 141,326,53051,6,0,B|168:328|192:320|192:320|196:328|196:328|220:320|244:325,1,110,4|0,1:2|0:0,0:0:0:0: 219 | 316,284,53448,2,0,P|361:254|413:266,2,110,2|8|8,0:0|0:0|0:0,0:0:0:0: 220 | 475,320,54241,6,0,P|495:269|480:217,1,110,4|10,1:0|0:0,0:0:0:0: 221 | 348,119,54769,2,0,P|293:128|239:121,1,110,2|10,0:0|0:0,0:0:0:0: 222 | 156,120,55166,2,0,P|129:128|107:143,1,55,2|0,0:0|0:0,0:0:0:0: 223 | 64,213,55430,1,2,0:0:0:0: 224 | 64,213,55562,2,0,L|68:273,1,55,8|2,0:0|0:0,0:0:0:0: 225 | 120,332,55826,2,0,P|152:312|228:324,1,110,2|10,0:0|0:0,0:0:0:0: 226 | 384,340,56355,6,0,P|408:304|396:228,1,110,2|10,3:2|0:0,0:0:0:0: 227 | 288,120,56884,2,0,L|291:229,1,110,2|8,3:2|0:0,0:0:0:0: 228 | 252,299,57280,2,0,P|225:292|198:293,1,55,2|0,0:0|0:0,0:0:0:0: 229 | 70,262,57545,2,0,P|97:263|124:256,1,55,2|8,3:2|0:0,0:0:0:0: 230 | 192,212,57809,1,2,0:0:0:0: 231 | 192,212,57941,2,0,L|190:157,1,55,2|2,3:2|3:2,0:0:0:0: 232 | 118,61,58205,2,0,L|120:116,1,55,10|0,0:0|0:0,0:0:0:0: 233 | 204,76,58470,6,0,P|236:56|312:68,1,110,2|10,3:2|0:0,0:0:0:0: 234 | 432,168,58998,1,2,3:2:0:0: 235 | 327,294,59263,1,10,0:0:0:0: 236 | 327,294,59527,2,0,P|295:274|219:286,1,110,2|8,3:2|0:0,0:0:0:0: 237 | 144,276,59923,2,0,P|132:248|132:212,1,55,2|0,3:2|0:0,0:0:0:0: 238 | 208,76,60320,1,10,0:0:0:0: 239 | 52,132,60584,5,0,0:0:0:0: 240 | 212,180,60849,2,0,L|321:169,1,110,10|0,0:0|0:0,0:0:0:0: 241 | 412,308,61377,1,10,0:0:0:0: 242 | 412,308,61509,2,0,P|380:328|304:316,1,110,0|2,0:0|0:0,0:0:0:0: 243 | 240,276,61906,1,10,0:0:0:0: 244 | 240,276,62038,1,10,0:0:0:0: 245 | 132,292,62170,2,0,P|109:276|93:253,1,55,10|10,0:0|1:2,0:0:0:0: 246 | 28,204,62434,2,0,P|30:176|42:151,1,55,10|2,1:2|1:2,0:0:0:0: 247 | 100,92,62699,6,0,B|128:88|128:88|180:96|180:96|208:92,1,110,4|10,1:0|0:0,0:0:0:0: 248 | 368,52,63227,2,0,P|324:76|312:144,1,110,2|10,3:2|0:0,0:0:0:0: 249 | 356,200,63624,2,0,P|364:236|360:268,1,55,2|0,0:2|0:0,0:0:0:0: 250 | 316,320,63888,2,0,P|288:320|256:332,1,55,2|8,0:0|0:0,0:0:0:0: 251 | 180,336,64152,1,2,0:0:0:0: 252 | 180,336,64285,2,0,P|127:330|90:291,1,110,2|10,3:2|0:0,0:0:0:0: 253 | 204,172,64813,6,0,L|313:179,1,110,2|10,3:2|0:0,0:0:0:0: 254 | 428,60,65342,2,0,B|400:56|400:56|348:64|348:64|320:60,1,110,2|10,3:2|0:0,0:0:0:0: 255 | 244,92,65738,2,0,L|191:75,1,55,6|0,0:0|0:0,0:0:0:0: 256 | 128,132,66003,2,0,L|75:115,1,55,2|10,3:2|0:0,0:0:0:0: 257 | 204,172,66267,1,0,0:0:0:0: 258 | 204,172,66399,2,0,P|223:222|206:272,1,110,2|10,3:2|0:0,0:0:0:0: 259 | 52,332,66928,6,0,P|109:277|185:299,1,165,2|2,1:2|1:2,0:0:0:0: 260 | 432,288,67721,2,0,P|389:254|335:255,2,110,2|0|0,1:2|0:0|0:0,0:0:0:0: 261 | 280,352,68514,1,0,1:0:0:0: 262 | 220,196,68778,1,2,0:0:0:0: 263 | 384,220,69042,6,0,P|341:253|287:252,1,110,0|8,0:0|0:0,0:0:0:0: 264 | 124,228,69571,2,0,P|166:194|220:196,1,110,8|8,0:0|0:0,0:0:0:0: 265 | 316,176,69967,1,0,0:0:0:0: 266 | 316,176,70100,2,0,L|324:60,1,110,0|0,1:0|1:0,0:0:0:0: 267 | 160,36,70628,2,0,L|162:63,3,27.5,8|0|8|0,0:0|0:0|0:0|0:0,0:0:0:0: 268 | 188,96,70893,2,0,L|185:123,3,27.5,8|0|8|0,0:0|0:0|0:0|0:0,0:0:0:0: 269 | 164,156,71157,6,0,P|140:172|56:160,1,110,4|8,1:0|0:0,0:0:0:0: 270 | 24,240,71553,1,0,0:0:0:0: 271 | 24,240,71686,2,0,L|30:294,1,55,0|0,1:0|1:0,0:0:0:0: 272 | 108,320,71950,2,0,L|114:265,1,55,8|0,0:0|1:0,0:0:0:0: 273 | 192,240,72214,6,0,P|216:224|300:236,1,110,0|8,1:0|0:0,0:0:0:0: 274 | 332,156,72610,1,0,0:0:0:0: 275 | 332,156,72743,2,0,L|325:101,1,55,0|0,1:0|1:0,0:0:0:0: 276 | 248,76,73007,2,0,L|241:130,1,55,8|0,0:0|1:0,0:0:0:0: 277 | 196,200,73271,6,0,L|215:308,1,110,0|8,1:0|0:0,0:0:0:0: 278 | 288,348,73668,1,0,0:0:0:0: 279 | 288,348,73800,2,0,P|314:338|341:335,1,55,0|0,1:0|1:0,0:0:0:0: 280 | 476,336,74064,2,0,P|449:333|424:324,1,55,8|0,0:0|1:0,0:0:0:0: 281 | 372,260,74329,6,0,L|352:151,1,110,0|8,1:0|0:0,0:0:0:0: 282 | 280,111,74726,1,0,0:0:0:0: 283 | 280,111,74858,2,0,P|254:120|227:123,1,55,0|0,1:0|0:0,0:0:0:0: 284 | 91,123,75122,2,0,P|118:125|143:135,1,55,8|0,0:0|1:0,0:0:0:0: 285 | 195,199,75386,6,0,P|198:253|165:296,1,110,0|8,1:0|0:0,0:0:0:0: 286 | 84,312,75782,1,0,0:0:0:0: 287 | 84,312,75915,2,0,L|67:259,1,55,0|0,1:0|1:0,0:0:0:0: 288 | 91,123,76179,2,0,L|107:175,1,55,8|0,0:0|1:0,0:0:0:0: 289 | 196,256,76443,6,0,P|247:272|296:251,1,110,0|8,1:0|0:0,0:0:0:0: 290 | 344,184,76839,1,0,0:0:0:0: 291 | 380,260,76972,2,0,L|364:312,1,55,0|0,1:0|1:0,0:0:0:0: 292 | 243,196,77236,2,0,L|227:144,1,55,8|0,0:0|1:0,0:0:0:0: 293 | 340,76,77501,6,0,B|352:112|352:112|344:184,1,110,0|8,1:0|0:0,0:0:0:0: 294 | 302,261,77897,1,0,0:0:0:0: 295 | 302,261,78029,2,0,L|310:317,2,55,0|0|8,1:0|1:0|0:0,0:0:0:0: 296 | 243,196,78426,6,0,P|199:176|123:196,1,110,4|0,1:0|1:0,0:0:0:0: 297 | 59,188,78822,2,0,P|43:165|38:138,1,55,8|0,0:0|1:0,0:0:0:0: 298 | 103,256,79086,2,0,P|97:282|82:305,1,55,2|2,0:0|0:0,0:0:0:0: 299 | 139,185,79351,5,2,0:0:0:0: 300 | 247,233,79483,1,2,0:0:0:0: 301 | 199,341,79615,1,4,0:0:0:0: 302 | -------------------------------------------------------------------------------- /slider/example_data/beatmaps/Remo Prototype[CV Hanamori Yumiri] - Sendan Life (Narcissu) [Normal].osu: -------------------------------------------------------------------------------- 1 | osu file format v14 2 | 3 | [General] 4 | AudioFilename: life.mp3 5 | AudioLeadIn: 0 6 | PreviewTime: 53580 7 | Countdown: 0 8 | SampleSet: Soft 9 | StackLeniency: 0.7 10 | Mode: 0 11 | LetterboxInBreaks: 0 12 | WidescreenStoryboard: 1 13 | 14 | [Editor] 15 | DistanceSpacing: 1.2 16 | BeatDivisor: 2 17 | GridSize: 4 18 | TimelineZoom: 0.7999998 19 | 20 | [Metadata] 21 | Title:Sendan Life 22 | TitleUnicode:センダンライフ 23 | Artist:Remo Prototype[CV: Hanamori Yumiri] 24 | ArtistUnicode:リモ Prototype[CV:花守ゆみり] 25 | Creator:Narcissu 26 | Version:Normal 27 | Source:ガラスの花と壊す世界 28 | Tags:Little CloudSplash16 Crystal vocaloid Chukka やしきん yashikin Glass no Hana to Kowasu Sekai GARAKOWA Restore the World Vitreous Flower Destroy the World 29 | BeatmapID:895006 30 | BeatmapSetID:411894 31 | 32 | [Difficulty] 33 | HPDrainRate:4 34 | CircleSize:3.5 35 | OverallDifficulty:5 36 | ApproachRate:6 37 | SliderMultiplier:1 38 | SliderTickRate:1 39 | 40 | [Events] 41 | //Background and Video events 42 | 0,0,"BG.png",0,0 43 | //Break Periods 44 | //Storyboard Layer 0 (Background) 45 | //Storyboard Layer 1 (Fail) 46 | //Storyboard Layer 2 (Pass) 47 | //Storyboard Layer 3 (Foreground) 48 | //Storyboard Sound Samples 49 | 50 | [TimingPoints] 51 | 6664,264.31718061674,4,2,1,60,1,0 52 | 7721,-133.333333333333,4,2,1,60,0,0 53 | 11950,-125,4,2,1,70,0,0 54 | 19483,-125,4,3,1,70,0,0 55 | 19615,-125,4,2,1,70,0,0 56 | 20408,-133.333333333333,4,2,1,60,0,0 57 | 21994,-133.333333333333,4,3,1,60,0,0 58 | 22126,-133.333333333333,4,2,1,60,0,0 59 | 32567,-133.333333333333,4,3,1,60,0,0 60 | 32699,-133.333333333333,4,2,1,60,0,0 61 | 37324,-133.333333333333,4,2,1,40,0,0 62 | 37589,-133.333333333333,4,3,1,40,0,0 63 | 37721,-133.333333333333,4,2,1,40,0,0 64 | 38382,-133.333333333333,4,3,1,40,0,0 65 | 38514,-133.333333333333,4,2,1,40,0,0 66 | 39703,-133.333333333333,4,3,1,40,0,0 67 | 39835,-133.333333333333,4,2,1,40,0,0 68 | 40496,-133.333333333333,4,3,1,40,0,0 69 | 40628,-133.333333333333,4,2,1,40,0,0 70 | 41818,-133.333333333333,4,3,1,40,0,0 71 | 41950,-133.333333333333,4,2,1,40,0,0 72 | 42082,-133.333333333333,4,3,1,40,0,0 73 | 42214,-133.333333333333,4,2,1,40,0,0 74 | 42875,-133.333333333333,4,3,1,40,0,0 75 | 43007,-133.333333333333,4,2,1,40,0,0 76 | 43139,-133.333333333333,4,3,1,40,0,0 77 | 43271,-133.333333333333,4,2,1,40,0,0 78 | 43932,-133.333333333333,4,3,1,40,0,0 79 | 44064,-133.333333333333,4,2,1,40,0,0 80 | 44725,-133.333333333333,4,3,1,40,0,0 81 | 44857,-133.333333333333,4,2,1,40,0,0 82 | 45650,-133.333333333333,4,2,1,60,0,0 83 | 45915,-133.333333333333,4,3,1,60,0,0 84 | 46047,-133.333333333333,4,2,1,60,0,0 85 | 48029,-133.333333333333,4,3,1,60,0,0 86 | 48161,-133.333333333333,4,2,1,60,0,0 87 | 50144,-133.333333333333,4,3,1,60,0,0 88 | 50276,-133.333333333333,4,2,1,60,0,0 89 | 53315,-133.333333333333,4,3,1,60,0,0 90 | 53448,-133.333333333333,4,2,1,60,0,0 91 | 54241,-125,4,2,1,70,0,1 92 | 57545,-125,4,3,1,70,0,1 93 | 57677,-125,4,2,1,70,0,1 94 | 60056,-125,4,3,1,70,0,1 95 | 60188,-125,4,2,1,70,0,1 96 | 61113,-125,4,3,1,70,0,1 97 | 61245,-125,4,2,1,70,0,1 98 | 61641,-125,4,3,1,70,0,1 99 | 61774,-125,4,2,1,70,0,1 100 | 66003,-125,4,3,1,70,0,1 101 | 66135,-125,4,2,1,70,0,1 102 | 67985,-125,4,3,1,70,0,1 103 | 68117,-125,4,2,1,70,0,1 104 | 69042,-125,4,3,1,70,0,1 105 | 69175,-125,4,2,1,70,0,1 106 | 69571,-125,4,3,1,70,0,1 107 | 69703,-125,4,2,1,70,0,1 108 | 71157,-125,4,2,1,60,0,0 109 | 78690,-125,4,3,1,60,0,0 110 | 78822,-125,4,2,1,60,0,0 111 | 112 | 113 | [Colours] 114 | Combo1 : 255,128,255 115 | Combo2 : 128,255,255 116 | Combo3 : 255,255,128 117 | Combo4 : 128,128,255 118 | 119 | [HitObjects] 120 | 72,296,7721,6,0,B|148:308|148:308|268:276,1,187.500007152558,0|0,1:0|1:0,0:0:0:0: 121 | 336,320,8646,2,0,L|424:324,2,75.0000028610231,0|0|0,1:0|1:0|1:0,0:0:0:0: 122 | 332,228,9439,1,0,1:0:0:0: 123 | 332,228,9571,1,8,0:1:0:0: 124 | 420,216,9835,6,0,P|456:148|428:24,1,187.500007152558,0|0,1:0|1:0,0:0:0:0: 125 | 356,80,10760,2,0,B|208:84|208:84|168:60,1,187.500007152558,0|8,1:0|0:1,0:0:0:0: 126 | 100,112,11686,1,2,0:0:0:0: 127 | 28,48,11950,6,0,P|4:120|60:200,1,160,4|0,1:0|1:0,0:0:0:0: 128 | 136,204,12743,1,8,0:0:0:0: 129 | 76,280,13007,2,0,L|68:380,1,80,0|8,1:0|0:0,0:0:0:0: 130 | 164,376,13536,2,0,L|172:276,1,80,0|8,1:0|0:0,0:0:0:0: 131 | 256,256,14064,6,0,L|432:268,1,160,0|0,1:0|1:0,0:0:0:0: 132 | 496,212,14857,1,8,0:0:0:0: 133 | 408,172,15122,2,0,P|396:132|400:80,1,80,0|8,1:0|0:0,0:0:0:0: 134 | 476,40,15650,2,0,P|488:80|484:132,1,80,0|8,1:0|0:0,0:0:0:0: 135 | 396,94,16179,6,0,L|228:86,1,160,0|0,1:0|1:0,0:0:0:0: 136 | 164,24,16972,1,8,0:0:0:0: 137 | 72,44,17236,2,0,P|40:116|60:212,1,160,0|0,1:0|1:0,0:0:0:0: 138 | 128,252,18029,1,8,0:0:0:0: 139 | 208,200,18293,6,0,L|308:196,1,80,0|8,1:0|0:0,0:0:0:0: 140 | 352,268,18822,2,0,L|436:276,1,80,0|8,1:0|0:0,0:0:0:0: 141 | 472,252,19219,2,0,P|492:200|472:124,1,120,4|8,1:0|0:0,0:0:0:0: 142 | 396,96,19879,1,2,0:0:0:0: 143 | 300,112,20144,1,2,0:0:0:0: 144 | 232,52,20408,6,0,P|156:40|80:76,1,150.000005722046,4|2,1:0|0:0,0:0:0:0: 145 | 36,140,21201,1,8,0:0:0:0: 146 | 100,204,21465,2,0,P|104:268|72:336,2,112.500004291535,2|2|10,1:3|3:2|0:2,0:0:0:0: 147 | 36,140,22523,6,0,L|32:44,1,75.0000028610231,2|10,3:2|0:0,0:0:0:0: 148 | 120,40,23051,2,0,L|124:132,1,75.0000028610231,2|10,0:0|0:0,0:0:0:0: 149 | 208,144,23580,2,0,P|284:124|368:148,1,150.000005722046,2|0,3:2|0:0,0:0:0:0: 150 | 396,216,24373,1,10,0:0:0:0: 151 | 472,168,24637,6,0,L|476:16,2,150.000005722046,2|2|2,3:2|0:0|3:2,0:0:0:0: 152 | 396,216,25959,1,10,0:0:0:0: 153 | 476,260,26223,2,0,P|488:300|480:348,1,75.0000028610231,0|8,0:0|0:0,0:0:0:0: 154 | 400,308,26752,5,2,3:2:0:0: 155 | 316,272,27016,2,0,L|232:268,1,75.0000028610231,10|2,0:0|0:0,0:0:0:0: 156 | 180,336,27545,2,0,L|100:340,1,75.0000028610231,8|0,0:0|3:0,0:0:0:0: 157 | 24,296,28073,2,0,P|12:264|16:212,2,75.0000028610231,8|8|8,0:0|0:0|0:0,0:0:0:0: 158 | 100,248,28866,6,0,P|116:176|88:76,1,150.000005722046,4|2,1:0|0:0,0:0:0:0: 159 | 156,28,29659,1,10,0:0:0:0: 160 | 232,76,29923,2,0,P|272:80|332:60,1,75.0000028610231,2|10,3:2|0:0,0:0:0:0: 161 | 388,32,30452,2,0,P|396:72|384:120,1,75.0000028610231,0|8,0:0|0:0,0:0:0:0: 162 | 480,120,30981,6,0,B|468:164|468:164|476:276,1,150.000005722046,2|2,3:2|0:0,0:0:0:0: 163 | 400,320,31774,1,10,0:0:0:0: 164 | 324,272,32038,2,0,L|328:148,2,112.500004291535,2|2|10,3:2|3:2|0:0,0:0:0:0: 165 | 256,332,33095,6,0,P|184:344|104:308,1,150.000005722046,2|2,3:2|0:0,0:0:0:0: 166 | 48,252,33888,1,10,0:0:0:0: 167 | 104,184,34152,2,0,L|100:80,1,75.0000028610231,2|10,3:2|0:0,0:0:0:0: 168 | 164,44,34681,2,0,L|256:48,1,75.0000028610231,2|10,0:0|0:0,0:0:0:0: 169 | 300,116,35210,6,0,P|380:116|452:64,2,150.000005722046,0|2|0,3:0|0:0|0:0,0:0:0:0: 170 | 236,180,36531,1,0,0:0:0:0: 171 | 320,208,36796,2,0,P|336:244|328:308,1,75.0000028610231,10|2,0:0|3:2,0:0:0:0: 172 | 248,268,37324,6,0,P|196:296|176:376,1,112.500004291535,2|8,3:2|0:1,0:0:0:0: 173 | 52,284,38117,2,0,L|48:172,1,112.500004291535,0|0,3:0|3:0,0:0:0:0: 174 | 152,88,38910,2,0,L|148:180,1,75.0000028610231,8|0,0:1|3:0,0:0:0:0: 175 | 236,136,39439,6,0,L|356:132,1,112.500004291535,0|8,3:0|0:1,0:0:0:0: 176 | 444,36,40232,2,0,L|324:32,1,112.500004291535,0|0,3:0|3:0,0:0:0:0: 177 | 388,156,41025,2,0,L|396:240,1,75.0000028610231,8|0,0:1|3:0,0:0:0:0: 178 | 468,284,41553,6,0,P|420:316|340:296,2,112.500004291535,0|8|0,0:0|0:1|0:0,0:0:0:0: 179 | 395,230,42611,2,0,P|339:227|294:258,2,112.500004291535,0|8|0,3:0|0:1|3:0,0:0:0:0: 180 | 468,284,43668,6,0,P|484:232|448:152,1,112.500004291535,0|8,3:0|0:1,0:0:0:0: 181 | 364,92,44461,2,0,L|240:96,1,112.500004291535,0|0,3:0|3:0,0:0:0:0: 182 | 124,48,45254,2,0,P|128:88|104:136,1,75.0000028610231,8|8,0:1|0:1,0:0:0:0: 183 | 76,140,45650,6,0,L|68:264,1,112.500004291535,4|10,0:1|0:0,0:0:0:0: 184 | 160,252,46311,2,0,L|168:344,1,75.0000028610231,2|10,3:2|0:0,0:0:0:0: 185 | 252,356,46840,2,0,B|264:320|264:320|272:220,1,112.500004291535,2|2,3:2|0:0,0:0:0:0: 186 | 212,176,47501,1,2,3:2:0:0: 187 | 256,100,47765,6,0,P|312:84|388:108,1,112.500004291535,6|2,0:0|0:0,0:0:0:0: 188 | 432,32,48426,2,0,P|452:68|452:120,1,75.0000028610231,2|2,3:2|0:0,0:0:0:0: 189 | 408,176,48954,2,0,L|416:312,1,112.500004291535,4|2,3:1|0:0,0:0:0:0: 190 | 344,344,49615,1,2,3:2:0:0: 191 | 268,292,49879,6,0,L|124:288,1,112.500004291535,4|10,0:0|0:0,0:0:0:0: 192 | 88,352,50540,2,0,P|68:320|64:272,1,75.0000028610231,2|10,3:2|0:0,0:0:0:0: 193 | 112,208,51069,2,0,L|116:116,1,75.0000028610231,2|10,3:2|0:0,0:0:0:0: 194 | 204,156,51597,2,0,L|201:81,1,75.0000028610231,2|10,0:0|3:2,0:0:0:0: 195 | 292,92,52126,6,0,B|280:4,2,75.0000028610231,2|2|2,1:2|1:2|1:2,0:0:0:0: 196 | 380,112,52919,1,2,3:2:0:0: 197 | 380,112,53051,2,0,B|388:148|388:148|380:232,1,112.500004291535,4|0,1:2|0:0,0:0:0:0: 198 | 452,276,53712,1,8,0:0:0:0: 199 | 452,364,53976,1,8,0:0:0:0: 200 | 368,320,54241,6,0,P|288:312|208:348,1,160,4|2,1:0|0:0,0:0:0:0: 201 | 120,328,55034,1,10,0:0:0:0: 202 | 180,256,55298,2,0,P|188:216|180:164,1,80,0|8,0:0|0:0,0:0:0:0: 203 | 112,116,55826,2,0,L|48:108,2,40,2|2|10,0:0|0:0|0:0,0:0:0:0: 204 | 180,48,56355,6,0,L|348:40,1,160,2|2,3:2|3:2,0:0:0:0: 205 | 432,60,57148,1,8,0:0:0:0: 206 | 432,60,57280,2,0,B|416:100|416:100|424:204,1,120,2|8,0:0|0:0,0:0:0:0: 207 | 488,244,57941,2,0,L|500:304,2,40,2|2|10,3:2|3:2|0:0,0:0:0:0: 208 | 396,264,58470,5,2,3:2:0:0: 209 | 304,288,58734,1,10,0:0:0:0: 210 | 248,212,58998,1,2,3:2:0:0: 211 | 152,224,59263,1,10,0:0:0:0: 212 | 208,300,59527,2,0,P|144:316|68:280,2,120,2|2|10,3:2|3:2|0:0,0:0:0:0: 213 | 72,164,60849,6,0,L|75:44,1,120,10|2,0:0|0:0,0:0:0:0: 214 | 112,72,61377,2,0,P|172:76|232:48,1,120,10|2,0:0|0:0,0:0:0:0: 215 | 268,76,61906,2,0,L|356:72,2,80,10|10|10,0:0|0:0|0:0,0:0:0:0: 216 | 232,164,62699,6,0,L|408:168,1,160,4|2,1:0|3:2,0:0:0:0: 217 | 456,240,63492,1,10,0:0:0:0: 218 | 408,320,63756,2,0,P|372:332|320:324,1,80,0|8,3:0|0:0,0:0:0:0: 219 | 260,264,64284,2,0,L|196:256,2,40,2|2|10,3:2|3:2|0:0,0:0:0:0: 220 | 328,196,64813,6,0,P|344:124|316:24,1,160,2|2,3:2|3:2,0:0:0:0: 221 | 232,68,65606,1,10,0:0:0:0: 222 | 232,68,65738,2,0,B|196:52|196:52|96:48,1,120,6|10,0:0|0:0,0:0:0:0: 223 | 36,104,66399,1,2,3:2:0:0: 224 | 20,200,66663,1,10,0:0:0:0: 225 | 92,260,66928,6,0,P|152:248|228:272,1,120,2|2,1:2|1:2,0:0:0:0: 226 | 324,344,67721,2,0,P|404:328|448:256,1,160,2|2,1:2|1:2,0:0:0:0: 227 | 356,100,68778,6,0,P|372:177|348:264,2,160,2|8|8,0:0|0:0|0:0,0:0:0:0: 228 | 268,136,70100,2,0,L|172:128,1,80,0|0,1:0|1:0,0:0:0:0: 229 | 104,88,70628,2,0,P|74:161|83:250,1,160,8|4,0:0|1:0,0:0:0:0: 230 | 152,304,71421,5,8,0:0:0:0: 231 | 244,272,71686,2,0,L|352:276,1,80,0|8,1:0|0:0,0:0:0:0: 232 | 392,340,72214,2,0,P|412:308|412:244,1,80,0|8,1:0|0:0,0:0:0:0: 233 | 496,212,72743,2,0,P|497:174|465:118,1,80,0|8,1:0|0:0,0:0:0:0: 234 | 396,94,73271,6,0,L|236:83,1,160,0|0,1:0|1:0,0:0:0:0: 235 | 156,32,74064,1,8,0:0:0:0: 236 | 96,108,74329,2,0,L|100:188,1,80,0|8,1:0|0:0,0:0:0:0: 237 | 16,232,74857,2,0,P|4:272|8:324,1,80,0|8,1:0|0:0,0:0:0:0: 238 | 96,284,75386,6,0,P|176:272|255:291,1,160,0|0,1:0|1:0,0:0:0:0: 239 | 324,356,76179,1,8,0:0:0:0: 240 | 412,320,76443,2,0,P|444:248|424:152,1,160,0|0,1:0|1:0,0:0:0:0: 241 | 348,120,77236,1,8,0:0:0:0: 242 | 268,176,77500,6,0,L|188:179,1,80,0|8,1:0|0:0,0:0:0:0: 243 | 152,88,78029,2,0,L|72:80,1,80,0|8,1:0|0:0,0:0:0:0: 244 | 48,120,78426,2,0,P|68:172|56:233,1,120,4|8,1:0|0:0,0:0:0:0: 245 | 20,324,79086,2,0,L|104:320,1,80,2|2,0:0|0:0,0:0:0:0: 246 | 184,272,79615,5,4,0:0:0:0: 247 | -------------------------------------------------------------------------------- /slider/example_data/beatmaps/Sambomaster - Sekai wa Sore wo Ai to Yobunda ze (ZZT the Fifth) [Normal].osu: -------------------------------------------------------------------------------- 1 | osu file format v3 2 | 3 | [General] 4 | AudioFilename: Sekai wa sore wo ai to yobundaze.mp3 5 | AudioHash: 5757fbf61d5d1be7cb92f22dfa2b282f 6 | 7 | [Metadata] 8 | Title:Sekai wa Sore wo Ai to Yobunda ze 9 | Artist:Sambomaster 10 | Creator:ZZT the Fifth 11 | Version:Normal 12 | 13 | [Difficulty] 14 | HPDrainRate:7 15 | CircleSize:5 16 | OverallDifficulty:5 17 | SliderMultiplier: 1.8 18 | SliderTickRate: 2 19 | 20 | [Events] 21 | 2,87604,104163 22 | 2,151410,164377 23 | 2,43442,55991 24 | 25 | [TimingPoints] 26 | 1600,422.554676258993 27 | 28 | [HitObjects] 29 | 128,304,16811,1,0, 30 | 192,304,17023,1,0, 31 | 256,304,17234,1,0, 32 | 368,304,17657,2,0,B|368:304|416:304|448:256|480:240|480:208|480:140,1,176 33 | 432,96,18290,1,0, 34 | 432,96,18502,1,0, 35 | 352,144,18819,1,0, 36 | 256,144,19136,1,0, 37 | 352,304,19981,5,0, 38 | 384,240,20192,1,0, 39 | 320,240,20403,1,0, 40 | 256,240,20614,1,0, 41 | 144,240,21037,2,0,B|144:240|96:240|64:192|32:176|32:144|31:79,1,176 42 | 80,32,21671,1,0, 43 | 192,128,22093,1,0, 44 | 352,280,23572,6,0,B|352:280|336:288|320:304|288:320|256:336|224:320|192:304|176:288|160:272,2,176 45 | 320,224,24629,1,0, 46 | 192,224,25051,1,0, 47 | 344,304,26742,5,0, 48 | 288,344,26953,1,0, 49 | 224,344,27164,1,0, 50 | 176,304,27375,1,0, 51 | 160,144,27798,2,0,B|160:144|172:83|198:48|233:39|272:49|302:59|312:64,1,176 52 | 352,96,28432,2,0,B|352:96|360:112|360:128|360:136|352:176|328:192|306:206|256:226|192:224|178:204|152:192,1,264 53 | 224,152,29277,1,0, 54 | 128,304,30333,5,0, 55 | 192,304,30544,1,0, 56 | 256,304,30756,1,0, 57 | 368,304,31178,2,0,B|368:304|416:304|448:256|480:240|480:208|480:159,1,176 58 | 432,96,31812,1,0, 59 | 352,144,32235,1,0, 60 | 256,144,32657,1,0, 61 | 352,304,33502,5,0, 62 | 384,240,33714,1,0, 63 | 320,240,33925,1,0, 64 | 256,240,34136,1,0, 65 | 144,240,34559,2,0,B|144:240|96:240|64:192|32:176|32:144|31:81,1,176 66 | 80,32,35193,1,0, 67 | 192,128,35615,1,0, 68 | 352,296,37094,6,0,B|352:296|336:304|320:320|288:336|256:352|224:336|192:320|176:304|160:288,1,176 69 | 224,256,37728,1,0, 70 | 288,256,37939,1,0, 71 | 256,203,38150,1,0, 72 | 256,32,38573,1,0, 73 | 352,320,40475,6,4,B|352:320|317:336|256:336|192:336|160:320,1,176 74 | 144,256,41108,1,4, 75 | 216,256,41320,1,0, 76 | 296,256,41531,1,0, 77 | 368,256,41742,1,4, 78 | 432,160,42165,2,4,B|432:160|408:104|384:80|328:40|280:16|280:16,1,176 79 | 224,40,42799,2,4,B|224:40|233:36|185:60|129:100|105:124|81:180,1,176 80 | 96,224,57165,5,4, 81 | 32,160,57377,2,4,B|32:160|48:112|80:80|128:48|184:24,1,176 82 | 192,192,58222,1,6, 83 | 256,192,58433,1,6, 84 | 320,192,58644,1,6, 85 | 480,160,59067,2,4,B|480:160|464:112|432:80|384:48|328:24,1,176 86 | 256,32,59701,1,4, 87 | 96,224,60546,5,4, 88 | 32,160,60757,2,4,B|32:160|48:112|80:80|128:48|184:24,1,176 89 | 192,192,61602,1,2, 90 | 256,192,61814,1,2, 91 | 320,192,62025,1,6, 92 | 480,160,62447,2,4,B|480:160|464:112|432:80|384:48|328:24,1,176 93 | 256,32,63081,1,4, 94 | 224,160,63504,6,0,B|224:160|192:160|128:128,1,88 95 | 80,96,63926,1,4, 96 | 54,258,64349,2,4,B|54:258|92:256|144:288,1,88 97 | 200,304,64771,1,4, 98 | 288,160,65194,2,4,B|288:160|320:160|384:128,1,88 99 | 432,104,65617,1,4, 100 | 457,258,66039,2,4,B|457:258|418:259|367:288,1,88 101 | 304,304,66462,1,4, 102 | 48,136,67518,6,4,B|48:136|32:192|32:304|40:328,1,176 103 | 192,352,68363,1,4, 104 | 256,352,68574,1,4, 105 | 320,352,68786,1,4, 106 | 376,304,68997,2,6,B|376:304|368:264|328:184|304:176|264:168|248:168|224:176|192:192|168:208|160:216,1,264 107 | 120,168,69842,2,6,B|120:168|168:136|256:104|300:110|392:152,1,264 108 | 480,160,70898,6,6,B|480:160|464:112|432:80|384:48|328:24,1,176 109 | 320,192,71744,1,2, 110 | 256,192,71955,1,2, 111 | 192,192,72166,1,2, 112 | 32,160,72589,2,6,B|32:160|48:112|80:80|128:48|192:16,1,176 113 | 256,32,73223,1,6, 114 | 480,160,74279,6,6,B|480:160|464:112|432:80|384:48|320:16,1,176 115 | 320,192,75124,1,2, 116 | 256,192,75335,1,2, 117 | 192,192,75547,1,2, 118 | 32,160,75969,2,6,B|32:160|48:112|80:80|128:48|192:16,1,176 119 | 256,32,76603,1,6, 120 | 288,160,77026,6,4,B|288:160|320:160|384:128,1,88 121 | 432,96,77448,1,4, 122 | 457,258,77871,2,4,B|457:258|405:264|367:288,1,88 123 | 312,304,78293,1,4, 124 | 224,160,78716,2,4,B|224:160|192:160|128:128,1,88 125 | 80,104,79138,1,4, 126 | 54,258,79561,2,4,B|54:258|100:261|144:288,1,88 127 | 208,304,79983,1,4, 128 | 432,264,81040,6,4,B|432:264|416:280|366:308|295:330,2,132 129 | 256,192,82096,1,4, 130 | 256,24,82519,1,4, 131 | 328,192,82941,2,6,B|328:192|328:200|328:208|328:224|320:240|312:248|296:264|272:272|248:272|216:272|192:264|176:248|168:216|168:176|192:144|200:128|224:120|264:120|292:120|313:144,1,352 132 | 256,192,84420,12,0,87378 133 | 168,224,105337,1,0, 134 | 168,224,105548,1,4, 135 | 168,224,105759,1,4, 136 | 32,216,106182,2,0,B|32:216|32:240|40:272|48:304|64:336|88:352|136:360|152:360,2,176 137 | 104,144,107449,1,0, 138 | 104,144,107661,1,4, 139 | 344,224,108717,5,0, 140 | 344,224,108928,1,4, 141 | 344,224,109140,1,4, 142 | 480,216,109562,2,0,B|480:216|480:240|472:272|464:304|448:336|424:352|376:360|360:360,2,176 143 | 376,296,110830,1,0, 144 | 376,296,111041,1,4, 145 | 168,160,112098,5,0, 146 | 168,160,112309,1,4, 147 | 168,160,112520,1,4, 148 | 32,168,112943,2,0,B|32:168|32:144|40:112|48:80|64:48|88:32|136:24|152:24,2,176 149 | 104,240,114210,1,0, 150 | 104,240,114422,1,4, 151 | 376,160,115478,5,0, 152 | 376,160,115689,1,4, 153 | 376,160,115901,1,4, 154 | 376,25,116323,2,0,B|376:25|376:24|424:32|448:48|464:80|472:112|480:144|480:168,1,180 155 | 376,240,117168,1,0, 156 | 312,224,117379,1,4, 157 | 256,192,117591,1,4, 158 | 96,224,118013,5,4, 159 | 32,160,118225,2,4,B|32:160|48:112|80:80|128:48|184:24,3,180 160 | 144,192,119915,1,4, 161 | 216,192,120126,1,4, 162 | 296,192,120337,1,4, 163 | 368,192,120549,1,4, 164 | 256,192,121605,12,0,123929 165 | 80,96,124774,1,4, 166 | 50,252,125197,2,4,B|50:252|100:260|142:282,1,90 167 | 200,304,125619,1,4, 168 | 288,160,126042,2,4,B|288:160|320:160|384:128,1,90 169 | 432,104,126464,1,4, 170 | 457,258,126887,2,4,B|457:258|411:260|367:288,1,90 171 | 304,304,127310,1,4, 172 | 48,136,128366,6,4,B|48:136|32:192|32:304|40:328,1,180 173 | 192,352,129211,1,4, 174 | 256,352,129422,1,4, 175 | 320,352,129634,1,4, 176 | 376,304,129845,2,6,B|376:304|368:264|328:184|304:176|264:168|248:168|224:176|192:192|168:208|160:216,1,270 177 | 120,168,130690,2,6,B|120:168|168:136|256:104|280:112|392:152,1,270 178 | 480,160,131746,6,6,B|480:160|464:112|432:80|384:48|328:24,3,180 179 | 368,192,133437,1,6, 180 | 296,192,133648,1,4, 181 | 216,192,133859,1,4, 182 | 144,192,134070,1,6, 183 | 32,224,135127,6,6,B|32:224|48:272|80:304|128:336|184:360,3,180 184 | 144,192,136817,1,6, 185 | 216,192,137028,1,4, 186 | 296,192,137240,1,4, 187 | 368,192,137451,1,6, 188 | 256,192,137873,12,0,140831 189 | 432,264,141888,6,6,B|432:264|416:280|320:320|296:320,2,135 190 | 256,192,142944,1,4, 191 | 256,24,143367,1,4, 192 | 328,192,143789,2,6,B|328:192|328:200|328:208|328:224|320:240|312:248|296:264|272:272|248:272|216:272|192:264|176:248|168:216|168:176|192:144|200:128|224:120|264:120|280:120|296:136,1,360 193 | 80,264,145268,6,6,B|80:264|96:280|192:320|216:320,2,135 194 | 256,192,146324,1,4, 195 | 256,192,146536,1,4, 196 | 192,192,146748,2,0,B|192:192|192:208|208:240|224:256|240:264|272:264|296:264|320:240|328:208|328:176|320:152|280:128,1,264 197 | 256,192,147803,12,0,151606 198 | 288,64,165551,1,4, 199 | 336,112,165762,1,4, 200 | 384,160,165973,1,4, 201 | 384,224,166185,1,4, 202 | 224,320,166818,1,4, 203 | 176,272,167030,1,4, 204 | 128,224,167241,1,4, 205 | 128,160,167452,1,4, 206 | 256,160,168086,5,2, 207 | 288,224,168297,1,0, 208 | 224,224,168509,1,2, 209 | 224,64,168931,5,4, 210 | 176,112,169142,1,4, 211 | 128,160,169354,1,4, 212 | 128,224,169565,1,4, 213 | 288,320,170199,1,4, 214 | 336,272,170410,1,4, 215 | 384,224,170621,1,4, 216 | 384,160,170833,1,4, 217 | 256,160,171466,5,2, 218 | 224,224,171678,1,0, 219 | 288,224,171889,1,2, 220 | 256,192,172312,12,0,174213 221 | 224,64,175481,1,0, 222 | 288,64,175692,1,4, 223 | 336,112,175903,1,4, 224 | 384,160,176115,1,4, 225 | 384,224,176326,1,4, 226 | 336,272,176537,1,4, 227 | 288,320,176748,1,4, 228 | 224,320,176960,1,4, 229 | 176,272,177171,1,4, 230 | 128,224,177382,1,4, 231 | 128,160,177594,1,4, 232 | 176,112,177805,1,4, 233 | 224,64,178016,1,4, 234 | 416,224,178861,5,4, 235 | 448,160,179072,2,4,B|448:160|432:112|400:80|352:48|296:24,2,180 236 | 384,160,180129,1,0, 237 | 320,160,180340,1,0, 238 | 288,224,180551,1,0, 239 | 224,224,180763,1,0, 240 | 256,160,180974,1,0, 241 | 256,96,181185,1,0, 242 | 256,32,181397,1,4, 243 | 96,224,182242,5,4, 244 | 64,160,182453,2,4,B|64:160|80:112|112:80|160:48|216:24,2,180 245 | 128,160,183509,1,0, 246 | 192,160,183721,1,0, 247 | 224,224,183932,1,0, 248 | 288,224,184143,1,0, 249 | 256,160,184354,1,0, 250 | 256,96,184566,1,0, 251 | 256,32,184777,1,4, 252 | 336,160,185200,5,0, 253 | 392,120,185411,1,0, 254 | 456,88,185622,1,4, 255 | 456,296,186045,1,0, 256 | 400,264,186256,1,0, 257 | 336,296,186467,1,4, 258 | 176,160,186890,1,0, 259 | 120,120,187101,1,0, 260 | 56,88,187312,1,4, 261 | 56,296,187735,1,0, 262 | 112,264,187946,1,0, 263 | 176,296,188157,1,4, 264 | 352,304,189214,6,4,B|352:304|336:312|320:328|288:344|256:360|224:344|192:328|176:312|160:296,2,180 265 | 320,248,190270,1,0, 266 | 256,272,190481,1,0, 267 | 192,248,190693,1,4, 268 | 320,152,191115,1,0, 269 | 256,152,191327,1,0, 270 | 192,152,191538,1,4, 271 | 256,56,191960,1,0, 272 | 256,56,192172,1,4, 273 | 64,160,192594,6,6,B|64:160|80:112|112:80|160:48|216:24,2,180 274 | 128,160,193651,1,0, 275 | 192,160,193862,1,2, 276 | 224,224,194073,1,0, 277 | 288,224,194284,1,2, 278 | 256,160,194496,1,2, 279 | 256,96,194707,1,2, 280 | 256,32,194918,1,6, 281 | 448,160,195975,6,6,B|448:160|432:112|400:80|352:48|296:24,2,180 282 | 384,160,197032,1,0, 283 | 320,160,197242,1,2, 284 | 288,224,197454,1,0, 285 | 224,224,197665,1,2, 286 | 256,160,197876,1,2, 287 | 256,96,198087,1,0, 288 | 256,32,198299,1,4, 289 | 176,160,198721,5,0, 290 | 120,120,198933,1,0, 291 | 56,88,199144,1,6, 292 | 56,296,199566,1,0, 293 | 112,264,199778,1,0, 294 | 176,296,199989,1,6, 295 | 336,160,200411,1,0, 296 | 392,120,200623,1,0, 297 | 456,88,200834,1,6, 298 | 456,296,201257,1,0, 299 | 400,264,201468,1,0, 300 | 336,296,201679,1,6, 301 | 80,264,202736,6,4,B|80:264|96:280|192:320|216:320,2,135 302 | 256,192,203792,1,4, 303 | 256,24,204214,1,4, 304 | 384,128,204637,5,4, 305 | 320,160,204848,1,0, 306 | 256,128,205060,1,4, 307 | 192,160,205271,1,0, 308 | 128,128,205482,1,4, 309 | 336,304,206116,6,0,B|336:304|288:320|256:320|224:320|176:304,2,135 310 | 336,160,207172,1,0, 311 | 336,160,207384,1,0, 312 | 368,96,207595,2,4,B|368:96|408:113|456:145|488:177|504:225,2,180 313 | 224,160,208862,1,0, 314 | 224,160,209073,1,4, 315 | 432,264,209497,6,4,B|432:264|416:280|320:320|296:320,2,135 316 | 256,192,210554,1,4, 317 | 256,24,210976,1,4, 318 | 128,128,211398,5,4, 319 | 192,160,211609,1,0, 320 | 256,128,211820,1,4, 321 | 320,160,212032,1,0, 322 | 384,128,212243,1,4, 323 | 256,192,212877,12,0,215835 324 | -------------------------------------------------------------------------------- /slider/example_data/beatmaps/__init__.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | from slider import Beatmap 4 | 5 | 6 | def example_beatmap(name): 7 | """Load one of the example beatmaps. 8 | 9 | Parameters 10 | ---------- 11 | name : str 12 | The name of the example file to open. 13 | """ 14 | return Beatmap.from_path(Path(__file__).parent / name) 15 | 16 | 17 | _sendan_life_versions = frozenset( 18 | { 19 | "Easy", 20 | "Normal", 21 | "Little's Hard", 22 | "Little's Insane", 23 | "Extra", 24 | "Crystal's Garakowa", 25 | } 26 | ) 27 | 28 | 29 | def sendan_life(version="Crystal's Garakowa"): 30 | """Load a version of the Sendan Life beatmap. 31 | 32 | Parameters 33 | ---------- 34 | version : str 35 | The version to load. 36 | 37 | Returns 38 | ------- 39 | sendan_life : Beatmap 40 | The beatmap object. 41 | """ 42 | if version not in _sendan_life_versions: 43 | raise ValueError( 44 | f"unknown version {version}, options: {set(_sendan_life_versions)}" 45 | ) 46 | 47 | return example_beatmap( 48 | f"Remo Prototype[CV Hanamori Yumiri] - Sendan Life (Narcissu)" 49 | f" [{version}].osu" 50 | ) 51 | 52 | 53 | _ai_no_scenario_versions = frozenset( 54 | { 55 | "Beginner", 56 | "Extra", 57 | "Hard", 58 | "ktgster's Insane", 59 | "Kyshiro's Extra", 60 | "Nathan's Insane", 61 | "Normal", 62 | "pishi's Extra", 63 | "Sharkie's Insane", 64 | "sheela's Very Hard", 65 | "Smoothie World's Extra", 66 | "Super Beginner", 67 | "Tatoe", 68 | "toybot's Insane", 69 | "Ultra Beginner", 70 | "Walao's Advanced", 71 | "Yuistrata's Easy", 72 | } 73 | ) 74 | 75 | 76 | def miiro_vs_ai_no_scenario(version="Tatoe"): 77 | """Load a version of the MIIRO vs. Ai no Scenario beatmap. 78 | 79 | Parameters 80 | ---------- 81 | version : str 82 | The version to load. 83 | 84 | Returns 85 | ------- 86 | sendan_life : Beatmap 87 | The beatmap object. 88 | """ 89 | if version not in _ai_no_scenario_versions: 90 | raise ValueError( 91 | f"unknown version {version}, options:" f" {set(_ai_no_scenario_versions)}" 92 | ) 93 | 94 | return example_beatmap( 95 | f"AKINO from bless4 & CHiCO with HoneyWorks - MIIRO vs. Ai no Scenario" 96 | f" (monstrata) [{version}].osu" 97 | ) 98 | -------------------------------------------------------------------------------- /slider/example_data/collections/__init__.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | from slider import CollectionDB 4 | 5 | 6 | def example_collection(name): 7 | """Load one of the example collection dbs. 8 | 9 | Parameters 10 | ---------- 11 | name : str 12 | The name of the example file to open. 13 | """ 14 | return CollectionDB.from_path(Path(__file__).parent / name) 15 | 16 | 17 | def test_db(): 18 | """Load the testing collection db. 19 | 20 | Returns 21 | ------- 22 | test_db : CollectionDB 23 | The collection db object. 24 | """ 25 | return example_collection("test.db") 26 | -------------------------------------------------------------------------------- /slider/example_data/collections/test.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llllllllll/slider/2f4437ac002e7eb6e2d0ae6dfc2da04e9fb82075/slider/example_data/collections/test.db -------------------------------------------------------------------------------- /slider/game_mode.py: -------------------------------------------------------------------------------- 1 | from enum import IntEnum, unique 2 | 3 | 4 | @unique 5 | class GameMode(IntEnum): 6 | """The various game modes in osu!.""" 7 | 8 | standard = 0 9 | taiko = 1 10 | ctb = 2 11 | mania = 3 12 | -------------------------------------------------------------------------------- /slider/library.py: -------------------------------------------------------------------------------- 1 | from functools import lru_cache 2 | from hashlib import md5 3 | import os 4 | import pathlib 5 | import sqlite3 6 | import sys 7 | import logging 8 | 9 | import requests 10 | 11 | from .beatmap import Beatmap 12 | from .cli import maybe_show_progress 13 | 14 | 15 | if sys.platform.startswith("win"): 16 | 17 | def sanitize_filename(name): 18 | for invalid_character in r':*?"\/|<>': 19 | name = name.replace(invalid_character, "") 20 | return name 21 | 22 | else: 23 | 24 | def sanitize_filename(name): 25 | return name.replace("/", "") 26 | 27 | 28 | sanitize_filename.__doc__ = """\ 29 | Sanitize a filename so that it is safe to write to the filesystem. 30 | 31 | Parameters 32 | ---------- 33 | name : str 34 | The name of the file without the directory. 35 | 36 | Returns 37 | ------- 38 | sanitized_name : str 39 | The name with invalid characters stripped out. 40 | """ 41 | 42 | 43 | class Library: 44 | """A library of beatmaps backed by a local directory. 45 | 46 | Parameters 47 | ---------- 48 | path : path-like 49 | The path to a local library directory. 50 | cache : int, optional 51 | The amount of beatmaps to cache in memory. This uses 52 | :func:`functools.lru_cache`, and if set to None will cache everything. 53 | download_url : str, optional 54 | The default location to download beatmaps from. 55 | """ 56 | 57 | DEFAULT_DOWNLOAD_URL = "https://osu.ppy.sh/osu" 58 | DEFAULT_CACHE_SIZE = 2048 59 | 60 | def __init__( 61 | self, path, *, cache=DEFAULT_CACHE_SIZE, download_url=DEFAULT_DOWNLOAD_URL 62 | ): 63 | self.path = path = pathlib.Path(path) 64 | 65 | self._cache_size = cache 66 | self._read_beatmap = lru_cache(cache)(self._raw_read_beatmap) 67 | self._db = db = sqlite3.connect(str(path / ".slider.db")) 68 | with db: 69 | db.execute( 70 | """\ 71 | CREATE TABLE IF NOT EXISTS beatmaps ( 72 | md5 BLOB PRIMARY KEY, 73 | id INT, 74 | path TEXT UNIQUE NOT NULL 75 | ) 76 | """, 77 | ) 78 | self._download_url = download_url 79 | 80 | def copy(self): 81 | """Create a copy suitable for use in a new thread. 82 | 83 | Returns 84 | ------- 85 | Library 86 | The new copy. 87 | """ 88 | return type(self)( 89 | self.path, 90 | cache=self._cache_size, 91 | download_url=self._download_url, 92 | ) 93 | 94 | def close(self): 95 | """Close any resources used by this library.""" 96 | self._read_beatmap.cache_clear() 97 | self._db.close() 98 | 99 | def __enter__(self): 100 | return self 101 | 102 | def __exit__(self, *exc_info): 103 | self.close() 104 | 105 | @staticmethod 106 | def _osu_files(path, recurse): 107 | """An iterator of ``.osu`` filepaths in a directory. 108 | 109 | Parameters 110 | ---------- 111 | path : path-like 112 | The directory to search in. 113 | recurse : bool 114 | Recursively search ``path``? 115 | 116 | Yields 117 | ------ 118 | path : str 119 | The path to a ``.osu`` file. 120 | """ 121 | if recurse: 122 | for directory, _, filenames in os.walk(path): 123 | for filename in filenames: 124 | if filename.endswith(".osu"): 125 | yield pathlib.Path(os.path.join(directory, filename)) 126 | else: 127 | for entry in os.scandir(directory): 128 | path = entry.path 129 | if path.endswith(".osu"): 130 | yield pathlib.Path(path) 131 | 132 | @classmethod 133 | def create_db( 134 | cls, 135 | path, 136 | *, 137 | recurse=True, 138 | cache=DEFAULT_CACHE_SIZE, 139 | download_url=DEFAULT_DOWNLOAD_URL, 140 | show_progress=False, 141 | skip_exceptions=False, 142 | ): 143 | """Create a Library from a directory of ``.osu`` files. 144 | 145 | Parameters 146 | ---------- 147 | path : path-like 148 | The path to the directory to read. 149 | recurse : bool, optional 150 | Recursively search for beatmaps? 151 | cache : int, optional 152 | The amount of beatmaps to cache in memory. This uses 153 | :func:`functools.lru_cache`, and if set to None will cache 154 | everything. 155 | download_url : str, optional 156 | The default location to download beatmaps from. 157 | show_progress : bool, optional 158 | Display a progress bar? 159 | 160 | Notes 161 | ----- 162 | Moving the underlying ``.osu`` files invalidates the library. If this 163 | happens, just re-run ``create_db`` again. 164 | """ 165 | path = pathlib.Path(path) 166 | db_path = path / ".slider.db" 167 | try: 168 | # ensure the db is cleared 169 | os.remove(db_path) 170 | except FileNotFoundError: 171 | pass 172 | 173 | self = cls(path, cache=cache, download_url=download_url) 174 | write_to_db = self._write_to_db 175 | 176 | progress = maybe_show_progress( 177 | self._osu_files(path, recurse=recurse), 178 | show_progress, 179 | label="Processing beatmaps: ", 180 | item_show_func=lambda p: "Done!" if p is None else str(p.stem), 181 | ) 182 | with self._db, progress as it: 183 | for path in it: 184 | with open(path, "rb") as f: 185 | data = f.read() 186 | 187 | try: 188 | beatmap = Beatmap.parse(data.decode("utf-8-sig")) 189 | except Exception as e: 190 | if skip_exceptions: 191 | logging.exception(f'Failed to parse "{path}"') 192 | continue 193 | raise ValueError( 194 | f'Failed to parse "{path}". ' 195 | "Use --skip-exceptions to skip this file and continue." 196 | ) from e 197 | 198 | write_to_db(beatmap, data, path) 199 | 200 | return self 201 | 202 | def beatmap_cached(self, *, beatmap_id=None, beatmap_md5=None): 203 | """Whether we have the given beatmap cached. 204 | 205 | Parameters 206 | ---------- 207 | beatmap_id : int 208 | The id of the beatmap to look for. 209 | beatmap_md5 : str 210 | The md5 hash of the beatmap to look for. 211 | 212 | Returns 213 | ------- 214 | bool 215 | Whether we have the given beatmap cached. 216 | """ 217 | with self._db: 218 | if beatmap_id is not None: 219 | path_query = self._db.execute( 220 | "SELECT 1 FROM beatmaps WHERE id = ? LIMIT 1", 221 | (beatmap_id,), 222 | ) 223 | else: 224 | path_query = self._db.execute( 225 | "SELECT 1 FROM beatmaps WHERE md5 = ? LIMIT 1", 226 | (beatmap_md5,), 227 | ) 228 | 229 | path = path_query.fetchone() 230 | return bool(path) 231 | 232 | @staticmethod 233 | def _raw_read_beatmap(self, *, beatmap_id=None, beatmap_md5=None): 234 | """Function for opening beatmaps from disk. 235 | 236 | This handles both cases to only require a single lru cache. 237 | 238 | Notes 239 | ----- 240 | This is a ``staticmethod`` to avoid a cycle from self to the lru_cache 241 | back to self. 242 | """ 243 | with self._db: 244 | if beatmap_id is not None: 245 | key = beatmap_id 246 | path_query = self._db.execute( 247 | "SELECT path FROM beatmaps WHERE id = ?", 248 | (beatmap_id,), 249 | ) 250 | else: 251 | key = beatmap_md5 252 | path_query = self._db.execute( 253 | "SELECT path FROM beatmaps WHERE md5 = ?", 254 | (beatmap_md5,), 255 | ) 256 | 257 | path = path_query.fetchone() 258 | if path is None: 259 | raise KeyError(key) 260 | 261 | (path,) = path 262 | # Make path relative to the root path. We save paths relative to 263 | # ``self.path`` so a library can be relocated without requiring a 264 | # rebuild 265 | return Beatmap.from_path(self.path / path) 266 | 267 | def lookup_by_id(self, beatmap_id, *, download=False, save=False): 268 | """Retrieve a beatmap by its beatmap id. 269 | 270 | Parameters 271 | ---------- 272 | beatmap_id : int or str 273 | The id of the beatmap to lookup. 274 | 275 | Returns 276 | ------- 277 | beatmap : Beatmap 278 | The beatmap with the given id. 279 | download : bool. optional 280 | Download the map if it doesn't exist. 281 | save : bool, optional 282 | If the lookup falls back to a download, should the result be saved? 283 | 284 | Raises 285 | ------ 286 | KeyError 287 | Raised when the given id is not in the library. 288 | """ 289 | try: 290 | return self._read_beatmap(self, beatmap_id=beatmap_id) 291 | except KeyError: 292 | if not download: 293 | raise 294 | return self.download(beatmap_id, save=save) 295 | 296 | def lookup_by_md5(self, beatmap_md5): 297 | """Retrieve a beatmap by its md5 hash. 298 | 299 | Parameters 300 | ---------- 301 | beatmap_md5 : bytes 302 | The md5 hash of the beatmap to lookup. 303 | 304 | Returns 305 | ------- 306 | beatmap : Beatmap 307 | The beatmap with the given md5 hash. 308 | 309 | Raises 310 | ------ 311 | KeyError 312 | Raised when the given md5 hash is not in the library. 313 | """ 314 | return self._read_beatmap(self, beatmap_md5=beatmap_md5) 315 | 316 | def beatmap_from_path(self, path, copy=False): 317 | """Returns a beatmap from a file on disk. 318 | 319 | Parameters 320 | ---------- 321 | path : str or pathlib.Path 322 | The path to the file to create the beatmap from. 323 | copy : bool 324 | Should the file be copied to the library's beatmap directory? 325 | 326 | Returns 327 | ------- 328 | beatmap : Beatmap 329 | The beatmap represented by the given file. 330 | """ 331 | data_bytes = open(path, "rb").read() 332 | data = data_bytes.decode("utf-8-sig") 333 | beatmap = Beatmap.parse(data) 334 | 335 | if copy: 336 | self.save(data_bytes, beatmap=beatmap) 337 | 338 | return beatmap 339 | 340 | def save(self, data, *, beatmap=None): 341 | """Save raw data for a beatmap at a given location. 342 | 343 | Parameters 344 | ---------- 345 | data : bytes 346 | The unparsed beatmap data. 347 | beatmap : Beatmap, optional 348 | The parsed beatmap. If not provided, the raw data will be parsed. 349 | 350 | Returns 351 | ------- 352 | beatmap : Beatmap 353 | The parsed beatmap. 354 | """ 355 | if beatmap is None: 356 | beatmap = Beatmap.parse(data.decode("utf-8-sig")) 357 | 358 | path = self.path / sanitize_filename( 359 | f"{beatmap.artist} - " 360 | f"{beatmap.title} " 361 | f"({beatmap.creator})" 362 | f"[{beatmap.version}]" 363 | f".osu" 364 | ) 365 | with open(path, "wb") as f: 366 | f.write(data) 367 | 368 | with self._db: 369 | self._write_to_db(beatmap, data, path) 370 | return beatmap 371 | 372 | def delete(self, beatmap, *, remove_file=True): 373 | """Remove a beatmap from the library. 374 | 375 | Parameters 376 | ---------- 377 | beatmap : Beatmap 378 | The beatmap to delete. 379 | remove_file : bool, optional 380 | Remove the .osu file from disk. 381 | """ 382 | with self._db: 383 | if remove_file: 384 | paths = self._db.execute( 385 | "SELECT path FROM beatmaps WHERE id = ?", 386 | (beatmap.beatmap_id,), 387 | ) 388 | for (path,) in paths: 389 | os.unlink(path) 390 | 391 | self._db.execute( 392 | "DELETE FROM beatmaps WHERE id = ?", 393 | (beatmap.beatmap_id,), 394 | ) 395 | 396 | def _write_to_db(self, beatmap, data, path): 397 | """Write data to the database. 398 | 399 | Parameters 400 | ---------- 401 | beatmap : Beatmap 402 | The beatmap being stored. 403 | data : bytes 404 | The raw data for the beatmap 405 | path : str 406 | The path to save 407 | """ 408 | # save paths relative to ``self.path`` so a library can be relocated 409 | # without requiring a rebuild 410 | path = path.relative_to(self.path) 411 | beatmap_md5 = md5(data).hexdigest() 412 | beatmap_id = beatmap.beatmap_id 413 | 414 | try: 415 | self._db.execute( 416 | "INSERT INTO beatmaps VALUES (?,?,?)", 417 | (beatmap_md5, beatmap_id, str(path)), 418 | ) 419 | except sqlite3.IntegrityError: 420 | # ignore duplicate beatmaps 421 | pass 422 | 423 | def download(self, beatmap_id, *, save=False): 424 | """Download a beatmap. 425 | 426 | Parameters 427 | ---------- 428 | beatmap_id : int or str 429 | The id of the beatmap to download. 430 | save : bool, optional 431 | Save the beatmap to disk? 432 | 433 | Returns 434 | ------- 435 | beatmap : Beatmap 436 | The downloaded beatmap. 437 | """ 438 | beatmap_response = requests.get(f"{self._download_url}/{beatmap_id}") 439 | beatmap_response.raise_for_status() 440 | 441 | data = beatmap_response.content 442 | beatmap = Beatmap.parse(data.decode("utf-8-sig")) 443 | 444 | if save: 445 | self.save(data, beatmap=beatmap) 446 | 447 | return beatmap 448 | 449 | @property 450 | def md5s(self): 451 | """All of the beatmap hashes that this has downloaded.""" 452 | return tuple(md5 for md5, in self._db.execute("SELECT md5 FROM beatmaps")) 453 | 454 | @property 455 | def ids(self): 456 | """All of the beatmap ids that this has downloaded.""" 457 | return tuple( 458 | int(id_) 459 | for id_, in self._db.execute("SELECT id FROM beatmaps") 460 | if id_ is not None 461 | ) 462 | -------------------------------------------------------------------------------- /slider/mod.py: -------------------------------------------------------------------------------- 1 | from collections import namedtuple 2 | 3 | from .bit_enum import BitEnum 4 | 5 | 6 | class Mod(BitEnum): 7 | """The mods in osu!""" 8 | 9 | no_fail = 1 10 | easy = 1 << 1 11 | no_video = 1 << 2 # not a mod anymore 12 | hidden = 1 << 3 13 | hard_rock = 1 << 4 14 | sudden_death = 1 << 5 15 | double_time = 1 << 6 16 | relax = 1 << 7 17 | half_time = 1 << 8 18 | nightcore = 1 << 9 # always used with double_time 19 | flashlight = 1 << 10 20 | autoplay = 1 << 11 21 | spun_out = 1 << 12 22 | relax2 = 1 << 13 # same as autopilot 23 | auto_pilot = 1 << 13 # same as relax2 24 | perfect = 1 << 14 25 | key4 = 1 << 15 26 | key5 = 1 << 16 27 | key6 = 1 << 17 28 | key7 = 1 << 18 29 | key8 = 1 << 19 30 | fade_in = 1 << 20 31 | random = 1 << 21 32 | last_mod = 1 << 22 # same as cinema 33 | cinema = 1 << 22 # same as last_mod 34 | target_practice = 1 << 23 35 | key9 = 1 << 24 36 | coop = 1 << 25 37 | key1 = 1 << 26 38 | key3 = 1 << 27 39 | key2 = 1 << 28 40 | scoreV2 = 1 << 29 41 | 42 | @classmethod 43 | def parse(cls, cs): 44 | """Parse a mod mask out of a list of shortened mod names. 45 | 46 | Parameters 47 | ---------- 48 | cs : str 49 | The mod string. 50 | 51 | Returns 52 | ------- 53 | mod_mask : int 54 | The mod mask. 55 | """ 56 | if len(cs) % 2 != 0: 57 | raise ValueError(f"malformed mods: {cs!r}") 58 | 59 | cs = cs.lower() 60 | mapping = { 61 | "ez": cls.easy, 62 | "hr": cls.hard_rock, 63 | "ht": cls.half_time, 64 | "dt": cls.double_time, 65 | "hd": cls.hidden, 66 | "fl": cls.flashlight, 67 | "so": cls.spun_out, 68 | "nf": cls.no_fail, 69 | } 70 | 71 | mod = 0 72 | for n in range(0, len(cs), 2): 73 | try: 74 | mod |= mapping[cs[n : n + 2]] 75 | except KeyError: 76 | raise ValueError(f"unknown mod: {cs[n:n + 2]!r}") 77 | 78 | return mod 79 | 80 | 81 | def ar_to_ms(ar): 82 | """Convert an approach rate value to milliseconds of time that an element 83 | appears on the screen before being hit. 84 | 85 | Parameters 86 | ---------- 87 | ar : float 88 | The approach rate. 89 | 90 | Returns 91 | ------- 92 | milliseconds : float 93 | The number of milliseconds that an element appears on the screen before 94 | being hit at the given approach rate. 95 | 96 | See Also 97 | -------- 98 | :func:`slider.mod.ms_to_ar` 99 | """ 100 | # NOTE: The formula for ar_to_ms is different for ar >= 5 and ar < 5 101 | # see: https://osu.ppy.sh/wiki/Song_Setup#Approach_Rate 102 | if ar >= 5: 103 | return 1950 - (ar * 150) 104 | else: 105 | return 1800 - (ar * 120) 106 | 107 | 108 | def ms_to_ar(ms): 109 | """Convert milliseconds to hit an element into an approach rate value. 110 | 111 | Parameters 112 | ---------- 113 | ms : float 114 | The number of milliseconds that an element appears on the screen before 115 | being hit. 116 | 117 | Returns 118 | ------- 119 | ar : float 120 | The approach rate value that produces the given millisecond value. 121 | 122 | See Also 123 | -------- 124 | :func:`slider.mod.ar_to_ms` 125 | """ 126 | # NOTE: The formula for ar_to_ms is different for ar >= 5 and ar < 5 127 | # see: https://osu.ppy.sh/wiki/Song_Setup#Approach_Rate 128 | ar = (ms - 1950) / -150 129 | if ar < 5: 130 | # the ar lines cross at 5 but we use a different formula for the slower 131 | # approach rates. 132 | return (ms - 1800) / -120 133 | return ar 134 | 135 | 136 | def circle_radius(cs): 137 | """Compute the ``CS`` attribute into a circle radius in osu! pixels. 138 | 139 | Parameters 140 | ---------- 141 | cs : float 142 | The circle size. 143 | 144 | Returns 145 | ------- 146 | radius : float 147 | The radius in osu! pixels. 148 | """ 149 | return (512 / 16) * (1 - 0.7 * (cs - 5) / 5) 150 | 151 | 152 | class HitWindows(namedtuple("HitWindows", "hit_300, hit_100, hit_50")): 153 | """Times to hit an object at various accuracies 154 | 155 | Parameters 156 | ---------- 157 | hit_300 : int 158 | The maxumium number of milliseconds away from exactly on time a hit 159 | can be to still be a 300 160 | hit_100 : int 161 | The maxumium number of milliseconds away from exactly on time a hit 162 | can be to still be a 100 163 | hit_50 : int 164 | The maxumium number of milliseconds away from exactly on time a hit 165 | can be to still be a 50 166 | 167 | Notes 168 | ----- 169 | A hit further than the ``hit_50`` value away from the time of a hit object 170 | is a miss. 171 | """ 172 | 173 | 174 | def od_to_ms(od): 175 | """Convert an overall difficulty value into milliseconds to hit an object at 176 | various accuracies. 177 | 178 | Parameters 179 | ---------- 180 | od : float 181 | The overall difficulty. 182 | 183 | Returns 184 | ------- 185 | hw : HitWindows 186 | A namedtuple of numbers of milliseconds to hit an object at different 187 | accuracies. 188 | """ 189 | return HitWindows( 190 | hit_300=(159 - 12 * od) / 2, 191 | hit_100=(279 - 16 * od) / 2, 192 | hit_50=(399 - 20 * od) / 2, 193 | ) 194 | 195 | 196 | def od_to_ms_300(od): 197 | """Convert an overall difficulty value into milliseconds to hit an object at 198 | maximum accuracy. 199 | 200 | Parameters 201 | ---------- 202 | od : float 203 | The overall difficulty. 204 | 205 | Returns 206 | ------- 207 | ms : float 208 | The number of milliseconds to hit an object at maximum accuracy. 209 | 210 | See Also 211 | -------- 212 | :func:`slider.mod.ms_300_to_od` 213 | """ 214 | return 79.5 - 6 * od 215 | 216 | 217 | def ms_300_to_od(ms): 218 | """Convert the milliseconds to score a 300 into an OD value. 219 | 220 | Parameters 221 | ---------- 222 | ms : float 223 | The length of the 300 window in milliseconds. 224 | 225 | Returns 226 | ------- 227 | od : float 228 | The OD value that produces a 300 window of length ``ms``. 229 | 230 | See Also 231 | -------- 232 | :func:`slider.mod.od_to_ms_300` 233 | """ 234 | return (ms - 79.5) / -6 235 | -------------------------------------------------------------------------------- /slider/position.py: -------------------------------------------------------------------------------- 1 | from collections import namedtuple 2 | import numpy as np 3 | 4 | 5 | class Position(namedtuple("Position", "x y")): 6 | """A position on the osu! screen. 7 | 8 | Parameters 9 | ---------- 10 | x : int or float 11 | The x coordinate in the range. 12 | y : int or float 13 | The y coordinate in the range. 14 | 15 | Notes 16 | ----- 17 | The visible region of the osu! standard playfield is [0, 512] by [0, 384]. 18 | Positions may fall outside of this range for slider curve control points. 19 | """ 20 | 21 | x_max = 512 22 | y_max = 384 23 | 24 | def __eq__(self, other): 25 | return self.x == other.x and self.y == other.y 26 | 27 | 28 | class Point(namedtuple("Point", "x y offset")): 29 | """A position and time on the osu! screen. 30 | 31 | Parameters 32 | ---------- 33 | x : int or float 34 | The x coordinate in the range. 35 | y : int or float 36 | The y coordinate in the range. 37 | offset : timedelta 38 | The time 39 | 40 | Notes 41 | ----- 42 | The visible region of the osu! standard playfield is [0, 512] by [0, 384]. 43 | Positions may fall outside of this range for slider curve control points. 44 | """ 45 | 46 | 47 | def distance(start, end): 48 | return np.sqrt((start.x - end.x) ** 2 + (start.y - end.y) ** 2) 49 | -------------------------------------------------------------------------------- /slider/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/llllllllll/slider/2f4437ac002e7eb6e2d0ae6dfc2da04e9fb82075/slider/tests/__init__.py -------------------------------------------------------------------------------- /slider/tests/test_beatmap.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | import slider.example_data.beatmaps 4 | import slider.beatmap 5 | import slider.curve 6 | from slider.position import Position 7 | from datetime import timedelta 8 | from math import isclose 9 | 10 | 11 | @pytest.fixture 12 | def beatmap(): 13 | return slider.example_data.beatmaps.miiro_vs_ai_no_scenario("Tatoe") 14 | 15 | 16 | def test_parse_beatmap_format_v3(): 17 | # v3 is a very old beatmap version. We just want to make sure it doesn't 18 | # error, see #79 and #87 on github. 19 | slider.example_data.beatmaps.example_beatmap( 20 | "Sambomaster - Sekai wa Sore wo Ai to Yobunda ze (ZZT the Fifth) " 21 | "[Normal].osu" 22 | ) 23 | 24 | 25 | def test_version(beatmap): 26 | assert beatmap.format_version == 14 27 | 28 | 29 | def test_display_name(beatmap): 30 | assert beatmap.display_name == ( 31 | "AKINO from bless4 & CHiCO with HoneyWorks - MIIRO " 32 | "vs. Ai no Scenario [Tatoe]" 33 | ) 34 | 35 | 36 | def test_parse_section_general(beatmap): 37 | assert beatmap.audio_filename == "tatoe.mp3" 38 | assert beatmap.audio_lead_in == timedelta() 39 | assert beatmap.preview_time == timedelta(milliseconds=6538) 40 | assert not beatmap.countdown 41 | assert beatmap.sample_set == "Normal" 42 | assert beatmap.stack_leniency == 0.7 43 | assert beatmap.mode == 0 44 | assert not beatmap.letterbox_in_breaks 45 | assert not beatmap.widescreen_storyboard 46 | 47 | 48 | def test_parse_section_editor(beatmap): 49 | assert beatmap.distance_spacing == 1.1 50 | assert beatmap.beat_divisor == 6 51 | assert beatmap.grid_size == 4 52 | assert beatmap.timeline_zoom == 1.8 53 | 54 | 55 | def test_parse_section_metadata(beatmap): 56 | assert beatmap.title == "MIIRO vs. Ai no Scenario" 57 | assert beatmap.title_unicode == "海色 vs. アイのシナリオ" 58 | assert beatmap.artist == "AKINO from bless4 & CHiCO with HoneyWorks" 59 | assert beatmap.artist_unicode == ("AKINO from bless4 & CHiCO with HoneyWorks") 60 | assert beatmap.creator == "monstrata" 61 | assert beatmap.version == "Tatoe" 62 | assert beatmap.source == "" 63 | assert beatmap.tags == [ 64 | "kyshiro", 65 | "sukinathan", 66 | "ktgster", 67 | "pishifat", 68 | "smoothie", 69 | "world", 70 | "walaowey", 71 | "toybot", 72 | "sheela901", 73 | "yuii-", 74 | "Sharkie", 75 | "みいろ", 76 | "tv", 77 | "size", 78 | "opening", 79 | "kantai", 80 | "collection", 81 | "kancolle", 82 | "fleet", 83 | "girls", 84 | "magic", 85 | "kaito", 86 | "1412", 87 | "まじっく快斗1412", 88 | "艦隊これくしょん", 89 | "-艦これ-", 90 | ] 91 | assert beatmap.beatmap_id == 735272 92 | assert beatmap.beatmap_set_id == 325158 93 | 94 | 95 | def test_parse_section_difficulty(beatmap): 96 | assert beatmap.hp_drain_rate == 6.5 97 | assert beatmap.circle_size == 4 98 | assert beatmap.overall_difficulty == 9 99 | assert beatmap.approach_rate == 9.5 100 | assert beatmap.slider_multiplier == 1.8 101 | assert beatmap.slider_tick_rate == 1 102 | 103 | 104 | def test_parse_section_timing_points(beatmap): 105 | # currently only checking the first timing point 106 | timing_points_0 = beatmap.timing_points[0] 107 | assert timing_points_0.offset == timedelta() 108 | assert isclose(timing_points_0.ms_per_beat, 307.692307692308) 109 | assert timing_points_0.meter == 4 110 | # sample_set and sample_type omitted, see #56 111 | assert timing_points_0.volume == 60 112 | # inherited is not in class parameter 113 | assert timing_points_0.kiai_mode == 0 114 | 115 | 116 | def test_parse_section_hit_objects(beatmap): 117 | # Only hit object 0 tested for now 118 | hit_objects_0 = beatmap.hit_objects(stacking=False)[0] 119 | assert hit_objects_0.position == Position(x=243, y=164) 120 | assert hit_objects_0.time == timedelta(milliseconds=1076) 121 | # Hit object note `type` is done by subclassing HitObject 122 | assert isinstance(hit_objects_0, slider.beatmap.Slider) 123 | assert hit_objects_0.new_combo 124 | assert not hit_objects_0.combo_skip 125 | # Slider specific parameters 126 | assert hit_objects_0.end_time == timedelta(milliseconds=1178) 127 | assert hit_objects_0.hitsound == 0 128 | assert isinstance(hit_objects_0.curve, slider.curve.Linear) 129 | assert hit_objects_0.curve.points == [ 130 | Position(x=243, y=164), 131 | Position(x=301, y=175), 132 | ] 133 | assert round(hit_objects_0.curve.req_length) == 45 134 | assert isclose(hit_objects_0.length, 45.0000017166138) 135 | assert hit_objects_0.ticks == 2 136 | assert isclose(hit_objects_0.num_beats, 0.3333333460489903) 137 | assert hit_objects_0.tick_rate == 1.0 138 | assert isclose(hit_objects_0.ms_per_beat, 307.692307692308) 139 | assert hit_objects_0.edge_sounds == [2, 0] 140 | assert hit_objects_0.edge_additions == ["0:0", "0:0"] 141 | assert hit_objects_0.addition == "0:0:0:0:" 142 | 143 | 144 | def test_hit_objects_stacking(): 145 | hit_objects = [ 146 | slider.beatmap.Circle( 147 | Position(128, 128), timedelta(milliseconds=x * 10), hitsound=1 148 | ) 149 | for x in range(10) 150 | ] 151 | 152 | beatmap = slider.Beatmap( 153 | format_version=14, 154 | audio_filename="audio.mp3", 155 | audio_lead_in=timedelta(), 156 | preview_time=timedelta(), 157 | countdown=False, 158 | sample_set="soft", 159 | stack_leniency=1, 160 | mode=0, 161 | letterbox_in_breaks=False, 162 | widescreen_storyboard=False, 163 | bookmarks=[0], 164 | distance_spacing=1, 165 | beat_divisor=1, 166 | grid_size=1, 167 | timeline_zoom=1, 168 | title="title", 169 | title_unicode="title", 170 | artist="artist", 171 | artist_unicode="artist", 172 | creator="creator", 173 | version="1.0", 174 | source="source", 175 | tags=["tags"], 176 | beatmap_id=0, 177 | beatmap_set_id=0, 178 | hp_drain_rate=5, 179 | circle_size=5, 180 | overall_difficulty=5, 181 | approach_rate=5, 182 | slider_multiplier=1, 183 | slider_tick_rate=1, 184 | timing_points=[], 185 | hit_objects=hit_objects, 186 | ) 187 | radius = slider.beatmap.circle_radius(5) 188 | stack_offset = radius / 10 189 | 190 | for i, ob in enumerate(reversed(beatmap.hit_objects(stacking=True))): 191 | assert ob.position.y == 128 - (i * stack_offset) 192 | 193 | 194 | def test_hit_objects_hard_rock(beatmap): 195 | # Only hit object 0 tested for now 196 | hit_objects_hard_rock_0 = beatmap.hit_objects(hard_rock=True, stacking=False)[0] 197 | assert hit_objects_hard_rock_0.position == Position(x=243, y=220) 198 | assert hit_objects_hard_rock_0.curve.points == [ 199 | Position(x=243, y=220), 200 | Position(x=301, y=209), 201 | ] 202 | 203 | 204 | def test_legacy_slider_end(): 205 | beatmap = slider.example_data.beatmaps.miiro_vs_ai_no_scenario() 206 | 207 | # lazer uses float values for the duration of sliders instead of ints as in 208 | # this library. This means we'll have some rounding errors against the 209 | # expected position of the last tick. `leniency` is the number of pixels of 210 | # rounding error to allow. 211 | # See 212 | # https://github.com/llllllllll/slider/pull/106#issuecomment-1399583672. 213 | def test_slider(slider_, expected_last_tick_pos, end_pos, leniency=2): 214 | assert isinstance(slider_, slider.beatmap.Slider) 215 | expected_x = expected_last_tick_pos.x 216 | expected_y = expected_last_tick_pos.y 217 | 218 | last_tick_true = slider_.true_tick_points[-1] 219 | 220 | # make sure the last tick is where we expect it to be 221 | assert abs(last_tick_true.x - expected_x) <= leniency 222 | assert abs(last_tick_true.y - expected_y) <= leniency 223 | 224 | last_tick = slider_.tick_points[-1] 225 | 226 | # Make sure the actual sliderends didnt get changed 227 | assert abs(last_tick.x - end_pos.x) <= leniency 228 | assert abs(last_tick.y - end_pos.y) <= leniency 229 | 230 | objects = beatmap.hit_objects() 231 | 232 | slider1 = objects[0] 233 | # last tick positions from lazer (and then rounding). See 234 | # https://github.com/llllllllll/slider/pull/106#issuecomment-1399583672. 235 | expected_last_tick_pos1 = Position(x=271, y=169) 236 | # actual ending of this slider 237 | end_pos1 = Position(x=287, y=172) 238 | 239 | # check another slider in the map as well (the slider at 20153ms). 240 | td = timedelta(milliseconds=20153) 241 | slider2 = beatmap.closest_hitobject(td) 242 | expected_last_tick_pos2 = Position(x=196, y=110) 243 | end_pos2 = Position(x=202, y=95) 244 | 245 | test_slider(slider1, expected_last_tick_pos1, end_pos1) 246 | test_slider(slider2, expected_last_tick_pos2, end_pos2) 247 | 248 | 249 | def test_closest_hitobject(): 250 | beatmap = slider.example_data.beatmaps.miiro_vs_ai_no_scenario("Beginner") 251 | hit_object1 = beatmap.hit_objects()[4] 252 | hit_object2 = beatmap.hit_objects()[5] 253 | hit_object3 = beatmap.hit_objects()[6] 254 | 255 | middle_t = timedelta(milliseconds=11076 - ((11076 - 9692) / 2)) 256 | 257 | assert hit_object1.time == timedelta(milliseconds=8615) 258 | assert hit_object2.time == timedelta(milliseconds=9692) 259 | assert hit_object3.time == timedelta(milliseconds=11076) 260 | 261 | assert beatmap.closest_hitobject(timedelta(milliseconds=8615)) == hit_object1 262 | assert beatmap.closest_hitobject(timedelta(milliseconds=(8615 - 30))) == hit_object1 263 | assert beatmap.closest_hitobject(middle_t) == hit_object2 264 | assert beatmap.closest_hitobject(middle_t, side="right") == hit_object3 265 | 266 | 267 | def test_ar(beatmap): 268 | assert beatmap.ar() == 9.5 269 | 270 | 271 | def test_bpm_min(beatmap): 272 | assert beatmap.bpm_min() == 180 273 | 274 | 275 | def test_bpm_max(beatmap): 276 | assert beatmap.bpm_max() == 195 277 | 278 | 279 | def test_cs(beatmap): 280 | assert beatmap.cs() == 4 281 | 282 | 283 | def test_hp(beatmap): 284 | assert beatmap.hp() == 6.5 # issue #57 285 | 286 | 287 | def test_od(beatmap): 288 | assert beatmap.od() == 9 289 | 290 | 291 | def test_pack(beatmap): 292 | # Pack the beatmap and parse it again to see if there is difference. 293 | packed_str = beatmap.pack() 294 | packed = slider.Beatmap.parse(packed_str) 295 | # Since sections like Colours and Events are currently omitted by 296 | # ``Beatmap.parse``, these sections will be missing in .osu files 297 | # written back from parsed Beatmaps. Fortunately, without these 298 | # sections, rewritten .osu can still be recognized by osu! client. 299 | beatmap_attrs = [ 300 | # General section fields 301 | "audio_filename", 302 | "audio_lead_in", 303 | "preview_time", 304 | "countdown", 305 | "sample_set", 306 | "stack_leniency", 307 | "mode", 308 | "letterbox_in_breaks", 309 | "widescreen_storyboard", 310 | # Editor section fields 311 | "distance_spacing", 312 | "beat_divisor", 313 | "grid_size", 314 | "timeline_zoom", 315 | "bookmarks", 316 | # Metadata section fields 317 | "title", 318 | "title_unicode", 319 | "artist", 320 | "artist_unicode", 321 | "creator", 322 | "version", 323 | "source", 324 | "tags", 325 | "beatmap_id", 326 | "beatmap_set_id", 327 | # Difficulty section fields 328 | "hp_drain_rate", 329 | "circle_size", 330 | "overall_difficulty", 331 | "approach_rate", 332 | "slider_multiplier", 333 | "slider_tick_rate", 334 | ] 335 | hitobj_attrs = [ 336 | "position", 337 | "time", 338 | "new_combo", 339 | "combo_skip", 340 | "hitsound", 341 | "addition", 342 | ] 343 | slider_attrs = [ 344 | "end_time", 345 | "hitsound", 346 | "repeat", 347 | "length", 348 | "ticks", 349 | "num_beats", 350 | "tick_rate", 351 | "ms_per_beat", 352 | "edge_sounds", 353 | "edge_additions", 354 | "addition", 355 | ] 356 | timing_point_attrs = [ 357 | "offset", 358 | "ms_per_beat", 359 | "meter", 360 | "sample_type", 361 | "sample_set", 362 | "volume", 363 | "kiai_mode", 364 | ] 365 | 366 | def check_attrs(object1, object2, attr_list): 367 | for attr in attr_list: 368 | assert getattr(object1, attr) == getattr(object2, attr) 369 | 370 | def check_curve(curve1, curve2): 371 | assert type(curve1) is type(curve2) 372 | assert curve1.req_length == curve2.req_length 373 | for point1, point2 in zip(curve1.points, curve2.points): 374 | assert point1 == point2 375 | 376 | check_attrs(beatmap, packed, beatmap_attrs) 377 | 378 | # check hit objects 379 | assert len(beatmap._hit_objects) == len(packed._hit_objects) 380 | for hitobj1, hitobj2 in zip(beatmap._hit_objects, packed._hit_objects): 381 | assert type(hitobj1) is type(hitobj2) 382 | check_attrs(hitobj1, hitobj2, hitobj_attrs) 383 | 384 | if isinstance(hitobj1, slider.beatmap.Slider): 385 | check_attrs(hitobj1, hitobj2, slider_attrs) 386 | check_curve(hitobj1.curve, hitobj2.curve) 387 | elif isinstance(hitobj1, (slider.beatmap.Spinner, slider.beatmap.HoldNote)): 388 | # spinners / hold notes have an additional attribute `end_time` 389 | assert hitobj1.end_time == hitobj2.end_time 390 | # circles has no additional attributes beyond `hitobj_attrs` 391 | 392 | # check timing points 393 | assert len(beatmap.timing_points) == len(packed.timing_points) 394 | for tp1, tp2 in zip(beatmap.timing_points, packed.timing_points): 395 | check_attrs(tp1, tp2, timing_point_attrs) 396 | # make sure both timing points are either inherited or uninherited 397 | assert (tp1.parent is not None) == (tp2.parent is not None) 398 | -------------------------------------------------------------------------------- /slider/tests/test_collection.py: -------------------------------------------------------------------------------- 1 | import slider.example_data.collections 2 | 3 | 4 | def test_collection_simple(): 5 | collection_db = slider.example_data.collections.test_db() 6 | assert collection_db.version == 20190410 7 | assert collection_db.num_collections == 2 8 | 9 | col0, col1 = collection_db.collections 10 | assert col0.num_beatmaps == 3 11 | assert col0.md5_hashes == [ 12 | "8a67f16f3c440fa3805c14652306dfe8", 13 | "7b231749a908b6d17163dc3f42143774", 14 | "2af0646c72dee92c89649620e4cdb162", 15 | ] 16 | 17 | assert col1.num_beatmaps == 1 18 | assert col1.md5_hashes == ["637227d9965d5e0ba72c92a27826f5b3"] 19 | -------------------------------------------------------------------------------- /slider/tests/test_utils.py: -------------------------------------------------------------------------------- 1 | import slider.utils 2 | 3 | 4 | def test_accuracy(): 5 | assert slider.utils.accuracy(1, 0, 0, 0) == 1.0 6 | assert round(slider.utils.accuracy(0, 1, 0, 0), 4) == 0.3333 7 | assert round(slider.utils.accuracy(0, 0, 1, 0), 4) == 0.1667 8 | assert slider.utils.accuracy(0, 0, 0, 1) == 0.0 9 | assert round(slider.utils.accuracy(982, 100, 43, 14), 4) == 0.8977 10 | -------------------------------------------------------------------------------- /slider/utils.py: -------------------------------------------------------------------------------- 1 | from functools import lru_cache 2 | import datetime 3 | 4 | 5 | class lazyval: 6 | """Decorator to lazily compute and cache a value.""" 7 | 8 | def __init__(self, fget): 9 | self._fget = fget 10 | self._name = None 11 | 12 | def __set_name__(self, owner, name): 13 | self._name = name 14 | 15 | def __get__(self, instance, owner): 16 | if instance is None: 17 | return self 18 | 19 | value = self._fget(instance) 20 | vars(instance)[self._name] = value 21 | return value 22 | 23 | def __set__(self, instance, value): 24 | vars(instance)[self._name] = value 25 | 26 | 27 | class no_default: 28 | """Sentinel type; this should not be instantiated. 29 | 30 | This type is used so functions can tell the difference between no argument 31 | passed and an explicit value passed even if ``None`` is a valid value. 32 | 33 | Notes 34 | ----- 35 | This is implemented as a type to make functions which use this as a default 36 | argument serializable. 37 | """ 38 | 39 | def __new__(cls): 40 | raise TypeError("cannot create instances of sentinel type") 41 | 42 | 43 | memoize = lru_cache(None) 44 | 45 | 46 | def accuracy(count_300, count_100, count_50, count_miss): 47 | """Calculate osu! standard accuracy from discrete hit counts. 48 | 49 | Parameters 50 | ---------- 51 | count_300 : int 52 | The number of 300's hit. 53 | count_100 : int 54 | The number of 100's hit. 55 | count_50 : int 56 | The number of 50's hit. 57 | count_miss : int 58 | The number of misses 59 | 60 | Returns 61 | ------- 62 | accuracy : float 63 | The accuracy in the range [0, 1] 64 | """ 65 | points_of_hits = count_300 * 300 + count_100 * 100 + count_50 * 50 66 | total_hits = count_300 + count_100 + count_50 + count_miss 67 | return points_of_hits / (total_hits * 300) 68 | 69 | 70 | def orange(_start_or_stop, *args): 71 | """Range for arbitrary objects. 72 | 73 | Parameters 74 | ---------- 75 | start, stop, step : any 76 | Arguments like :func:`range`. 77 | 78 | Yields 79 | ------ 80 | value : any 81 | The values in the range ``[start, stop)`` with a step of ``step``. 82 | 83 | Notes 84 | ----- 85 | ``o`` stands for object. 86 | """ 87 | if not args: 88 | start = 0 89 | stop = _start_or_stop 90 | step = 1 91 | elif len(args) == 1: 92 | start = _start_or_stop 93 | stop = args[0] 94 | step = 1 95 | elif len(args) == 2: 96 | start = _start_or_stop 97 | stop, step = args 98 | else: 99 | raise TypeError( 100 | "orange takes from 1 to 3 positional arguments but" 101 | f" {len(args) + 1} were given", 102 | ) 103 | 104 | while start < stop: 105 | yield start 106 | start += step 107 | 108 | 109 | # consume_* helper functions to read osu! binary files 110 | 111 | 112 | def consume_byte(buffer): 113 | result = buffer[0] 114 | del buffer[0] 115 | return result 116 | 117 | 118 | def consume_short(buffer): 119 | result = int.from_bytes(buffer[:2], "little") 120 | del buffer[:2] 121 | return result 122 | 123 | 124 | def consume_int(buffer): 125 | result = int.from_bytes(buffer[:4], "little") 126 | del buffer[:4] 127 | return result 128 | 129 | 130 | def consume_long(buffer): 131 | result = int.from_bytes(buffer[:8], "little") 132 | del buffer[:8] 133 | return result 134 | 135 | 136 | def consume_uleb128(buffer): 137 | result = 0 138 | shift = 0 139 | while True: 140 | byte = consume_byte(buffer) 141 | result |= (byte & 0x7F) << shift 142 | if (byte & 0x80) == 0: 143 | break 144 | shift += 7 145 | 146 | return result 147 | 148 | 149 | def consume_string(buffer): 150 | mode = consume_byte(buffer) 151 | if mode == 0: 152 | return None 153 | if mode != 0x0B: 154 | raise ValueError( 155 | f"unknown string start byte: {hex(mode)}, expected 0 or 0x0b", 156 | ) 157 | byte_length = consume_uleb128(buffer) 158 | data = buffer[:byte_length] 159 | del buffer[:byte_length] 160 | return data.decode("utf-8") 161 | 162 | 163 | _windows_epoch = datetime.datetime(1, 1, 1) 164 | 165 | 166 | def consume_datetime(buffer): 167 | windows_ticks = consume_long(buffer) 168 | return _windows_epoch + datetime.timedelta(microseconds=windows_ticks / 10) 169 | --------------------------------------------------------------------------------