Development: CircusGalop & 윾이 & Codex
Korean documentation: README_KO.md
Double-click dist\BMS_Decalcomanie_Tool.exe, run_decalcomanie_tool.bat, or BMS_Decalcomanie_Tool.pyw, add BMS or osu!mania files, then click Convert to 10K decalcomanie.
The original files are not overwritten. By default, converted files are written beside each source file so existing relative BMS #WAVxx paths and osu AudioFilename paths still work. If you choose another output folder, make sure the referenced sound files are available from that folder too.
The GUI also has Copy selected osu decal notes to clipboard for selected .osu files. It copies only mirrored HitObject rows. Open random chart generator creates direct BMS or osu!mania files, copies generated osu!mania HitObject rows, or inserts a generated section into an existing .osu file. BMS output uses visible lanes in order from 11-15 then 21-25, with long-note lanes 51-55 then 61-65; osu output uses Mode: 3 and sets CircleSize to the key count.
- Keep original 5K lanes
11-15. - Copy the same note object IDs to the opposite side in reverse order:
11 -> 2512 -> 2413 -> 2314 -> 2215 -> 21
- Copy long-note lanes when enabled:
51 -> 6552 -> 6453 -> 6354 -> 6255 -> 61
- Set
#PLAYER 3by default so the output is treated as double play. - Replace or add the BMS key extension command as
#10K. - Do not copy or rename sound files. The output reuses the existing
#WAVxxkey-sound definitions and note IDs.
- Accept
.osufiles withMode: 3andCircleSize: 5. - Set
CircleSize:10. - Move the original 5K columns into the left half of the 10K field.
- Copy each hit object to the right half in reverse order.
- Preserve the rest of each hit-object line, including hold end times and hit-sample fields.
- Keep
AudioFilenameunchanged and append[10K Decal]to the difficultyVersion. - The clipboard action emits the same mirrored hit objects without the
.osufile sections, for manual text editing under[HitObjects].
python bms_decalcomanie_converter.py "path\to\chart.bms"
python bms_decalcomanie_converter.py "path\to\chart.osu"
python bms_decalcomanie_converter.py "path\to\folder" -o "path\to\output"The generator checks each selected key lane at a fixed beat interval and can write either BMS or osu!mania based on the output extension.
-
Key count: lane count from1to10. -
BMS key extension command:
4K-8Koutputs#4Kthrough#8K,9Koutputs no key extension command, and10Koutputs#10K. -
Generation count: how many beat-interval positions to roll. For example,256at0.25beat interval makes 16 measures of 16th-note positions. -
Minimum notes/beat: when greater than0, that many randomly chosen empty lanes per generated position cannot roll3a. If too many lanes are being held by long notes, enough2bkeeps are forced into1bends so the next position can still create the minimum. -
Maximum notes/beat: default10. When the number of empty lanes is greater than this value, the excess randomly chosen empty lanes are forced to3a. -
If
2along-note starts would leave too few free lanes for the next position, the excess2astarts are randomly converted into1asingle notes. -
Empty lane:
1a: create a single note, default weight252a: start a long note, default weight503a: create no note, default weight25
-
Holding long note:
1b: end the long note, default weight252b: keep holding, default weight75
Beat interval is in beats and must divide one 4-beat measure exactly, such as 1, 0.5, 0.25, or 1/8. The generator writes a silent WAV named _random_note_silence.wav beside the output if it does not already exist. BMS uses it as a key-sound; osu uses it as AudioFilename.
Use Generate random clipboard when you want raw .osu HitObject rows for manual text editing under [HitObjects]. Clipboard/file start time (ms) offsets the generated section before copying.
The osu! client does not reliably paste raw HitObject text as editor objects. For editor-section workflows, choose a target .osu file and click Apply random section to osu file. It inserts the generated rows at Clipboard/file start time (ms), sorts the [HitObjects] section by time, checks that CircleSize matches Key count, and writes a one-time .osu.bak backup beside the target file.
python bms_decalcomanie_converter.py --random-output "path\to\random_10k.bms" --bpm 150 --beat-interval 0.25 --measures 16
python bms_decalcomanie_converter.py --random-output "path\to\random_10k.osu" --bpm 150 --beat-interval 0.25 --measures 16
python bms_decalcomanie_converter.py --random-output "path\to\random_7k.osu" --keys 7 --generate-count 128
python bms_decalcomanie_converter.py --random-output "path\to\random_10k.osu" --keys 10 --generate-count 256 --min-notes-per-beat 2
python bms_decalcomanie_converter.py --random-output "path\to\random_10k.osu" --keys 10 --generate-count 256 --max-notes-per-beat 4build_exe.batThe EXE is written to dist\BMS_Decalcomanie_Tool.exe.
Options:
--no-player-3: leave#PLAYERunchanged.--no-ln: do not mirror long-note channels.--mirror-invisible: also mirror invisible channels31-35to45-41.--overwrite: overwrite the default output filename.--random-output: create a direct random BMS or osu!mania file.--keys: random output key count,1-10.--generate-count: number of beat-interval positions to generate. Alias:--note-count.--min-notes-per-beat: minimum notes to force per generated beat position.--max-notes-per-beat: maximum empty lanes allowed to roll non-3aper generated beat position. Default:10.--weight-single,--weight-ln-start,--weight-empty,--weight-ln-end,--weight-ln-keep: random generator weights.--seed: repeat a random generator result.--random-overwrite: allow overwriting an existing random output file.