In around March this year, I started trying to make my own osu! skin, or at least mix a skin for my own use. I started with the Emilia (Re:0) skin by Beatstatic, with a git repo to track my changes, and copied the hitcircles from Clear Skin Ultra 2.4 (I like its hitcircle design a lot).
Then I stumbled across a font made for the I script in Re:0 in April, and started wanting to learn the script for the sake of it. As part of the practice, I decided why not make osu!'s elements in the Re:0 writing system? So I made a new folder in my mix skin, then opened Blender to make the elements, because that's the only tool I was comfortable with using. (I've since learned to use Inkscape more.)
Making osu! skin elements with Blender is weird. I am putting multiple elements in the same file and adding a different camera for each of them, binding the cameras onto markers, and so I wondered if there's some way to render every marker and maybe name the output with the marker.
After a bit of Googling, I saw an answer by p2or
on StackExchange that fits my needs perfectly. (I added the first two comments.)
# by p2or on Blender StackExchange
# https://blender.stackexchange.com/questions/23121
import bpy
import os
# get the scene
scn = bpy.context.scene
# get the output path
output_path = scn.render.filepath
# iterate through markers and render
for k, m in scn.timeline_markers.items():
frame = m.frame
marker_name = m.name
scn.frame_set(frame)
scn.render.filepath = os.path.join(output_path, marker_name + ".jpg")
bpy.ops.render.render( write_still=True )
bpy.context.scene.render.filepath = output_path
With that, I was able to hack together a shell script to render all blend files. Blender also only allows one resolution per scene, so I had to write some post processing functions that resize some images for me, as well as a sort of interface to them through the file names.
Later in June, I decided to also cover the hitcircles and other elements, and eventually removed all assets not made by me. I also purged all of those out of the git repository; in hindsight, I actually regret that a bit. While refactoring that, I also wanted to do something about the ugly shell script, and I started looking around for different languages.
I thought about Xonsh, Python, scsh
, the oh
shell, and some others, but:
oh
: I don't really understand. At least not yet.- Python: I don't like doing shell script-y stuff in Python currently. Previously I had ported my
randomwallpaper
script to Python, and it didn't feel better than Bash. This is purely my issue. - Xonsh: Looks very interesting, but I got stuck trying to figure out how I should parse command line arguments.
scsh
: A full language + some shell-isms, sort of like Xonsh. Project feels kind of inactive though.
So I just gave up and stayed with Bash, and tried to improve the script further; but the "Scheme shell" idea seemed really interesting to me, so I decided to Google for "Scheme shell" and see what I'd get. Racket showed up in the results, and I met Racket for the first time. It actually looks great!
From there I started with the Quick Intro by Matthew Flatt, and am now trying to learn Racket. Along the way I have seen Pollen, and wrote a self introduction for school in it; and Frog, which I now build this blog with. I'm still very new — I'm not exactly trying hard on anything — but I have definitely stumbled across a very powerful tool.
About the osu! skin, it's now released as Retome (currently 0.4) on the osu! forum.