avatar Kisaragi Hiu

Discovering Racket through making a osu! skin

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.