Flower Trip

Last edited: 18 November 2016, 11:06PM


Flower Trip was the 2016 spring quarter beatmap project of osu! UCI. I no longer led these club projects since I was graduated, but I participated in a smaller role. This song features an original instrumental made by a friend of mine from the Video Game Development Club at UCI, as well as an original background, storyboard, and mapping.


So to be honest I probably didn't have the purest of best intentions going into this project. All I wanted to do on this beatmap was to make a particular effect for the storyboard, and the rest of the project I didn't really care about. I didn't really concern myself with the project's progress or individual statuses of people. Well, that's not entirely true. I did badger mostly Royce about some things, though not very seriously I would say.

I just wanted to hand off the reigns of the beatmap project to someone else and step away from management of the club. I think it's important that the club is able to self sustain itself in the future and not need me to guide it along. But with kind of the shabby shape that this map ended up in, things aren't looking exactly bright. Hopefully with the new year coming, things will revitalize themselves and better projects will come.

There were a host of problems that cropped up. Royce, the official leader of the project, is partial to blame. He could have done a better job keeping tabs on people and checking on their progress. He's not really a confrontational guy, so maybe that's what's holding him back a lot of times. With people not pushed to do their work, the whole team started to slack.

Motivation seemed to fall across the board when we didn't really have clear week to week goals to keep track of and didn't know the status of what Adi, in particular, was doing. We began pushing a lot of tasks back until we finally tried to salvage whatever we could. By the end, I think everyone was left mostly "uninspired" to do anything and lost the gunghoness that we started off with earlier.

Okay, so let's talk about the start of the project. The last quarter of the club, winter quarter, was a pretty slow period. We didn't have that many ongoing events, and in particular, there was no beatmap project, of which I personally was pretty sad about. So because of that, I urged Royce to head up a project in spring quarter, and that was how this project came to be.

Since we had some moderate success with Wes producing in the past, I thought I'd try and look for another producer see if he/she wanted to make a song for us. Really though, there was only one other guy besides Wes I knew that actually made music in his past time, and that was Adi. I talked to him about our beatmap projects a while ago, and he said he was definitely interested. When I spoke to him again about a project over spring, he was still available and signed onboard.

This quarter we also had a few high school students occasionally visit the club. They surprisingly had a good amount of mapping experience behind them. Unfortunately, one thing led to another, and they didn't end up helping us out in the end. Their problems were pretty similar to the ones I mentioned above, lack of motivation and uninspiration. Plus, they were young high school students, so to be honest I didn't expect any serious commitments on their side and was ready to be let down.

Welp, I would say most our problems boiled down to the fact that we didn't really like what Adi made for us. Granted, he's not the most-most experienced with producing music, and on top of that we wanted him to make something that was out of his comfort zone. His experience is mostly with I would say slower and more ambient music, but that obviously didn't apply well to osu!, which stresses something a lot faster and vibrant.

He ran into problems similar to Wes' issues. Making something at 180 BPM or around that range was difficult for him. His first complete song draft was a fairly simple beat. I didn't think it was particularly very catchy or interesting, and I probably should have said something early on. But no one gave any feedback to him at the time and the entire team went quiet. Maybe it was the fact that we were trying to be nice or something, but something definitely should have been said.

Meanwhile, many of our other sections couldn't realistically get to work since we weren't sure if the music was complete yet. Eventually, after badgering Royce and giving Adi some feedback myself, after a lot of time we eventually corresponded back with Adi. I'd say he agreed with our points and was willing to make some changes, but after more time passed I think because of lack of communication and more difficulty on his part, he never actually updated the song. And by then it was the end of the quarter.

It's kind of unfortunate we ended the project on a somewhat sour note. Because of our difficulties working with Adi and Wes, I don't think the club will consider working with music producers from scratch anymore in the future. Unless if the song was made beforehand and has the approval of everyone, I can foresee some hiccups. It might take forever for the song to be made, only to have to end up changed again, and by then everybody's tasks are pushed way too far back.

So the maps and song parts were the weakest sections of this project. The only map that actually made it to the end was a mania map thrown together by Royce. I think it looks complete, but I'm pretty sure he isn't particularly proud of the quality. But hey, at least it's something. Meanwhile, Kevin and I finished up our respective sections to a pretty good degree I would say.

Kevin worked on the background of the map. The idea for his artwork came from the name of the song, Flower Trip. We didn't actually decide the title until maybe halfway into the quarter. That was something that Adi eventually came up with, along with his roommates I believe. I thought it was a pretty interesting idea, and it helped solidify Kevin's work and perhaps some storyboarding work in the future.

I think Kevin did a fitting job. The background's definitely pretty trippy and has some nice colorful flowers. I like the swirl effect he added. At the time, we joked that we should have drawn a tulip and called the song 2Lip2Furious. Eventually that got put in as Royce's map difficulty name.

As for my role, I from the very start just wanted to do a very specific storyboard effect. I was interested in trying to work with 3D in osu! so I wanted to make something that would have cool 3D visuals. Eventually, I decided on making a 3D spectrum. This was a good way for me to further what I learned from making spectrums in my previous project with Royce, Age quod agis.

The actual implementation was somewhat harder than I expected. I think a lot of it was just the fact I too lost quite a bit of motivation working on the project and got side tracked playing hours of ARAM or something. But eventually I did get back to work, and I'm pretty happy with the results I ended up with.

My first task was to port the music analysis class out of my previous project and into a standalone project. This allows it to be something more portable and usable for the future rather than something that has to be manually reconfigured each time. Obviously, this changed the output it gave out. Rather than spitting something directly to the storyboard, it now prints more generalized data to a file: a bar ID along with the bar's associated lengths each time frame.

I also made some additional updates and optimizations. The biggest one was probably calculating frequency band indices within the code. What this means is that given a start frequency band, an end frequency band, and a number of requested divisions, it will programatically find the correct indices in the resulting FFT bins. This is a little tricker to implement on first glance because the indices increase logarithmically. Additionally, I switched my kiss FFT function to only use real numbers, which is noted to be much faster.

Oh yeah, as also an offhand note, I think for my next project I'm definitely going to do a lot more testing and make test cases. This is something I rarely do since my projects haven't been that big, but I'm definitely starting to suffer and lose track of what's going on. Visually verifying changes can only go so far and debugging can be very tedious.

The actual making of the 3D parts took a bit of reading up on. I did take an intro to graphics class in college so I had a bit of understanding of the math behind it, but I needed to brush up on a lot of material as well. I'm pretty sure I did everything the correct way in here, using 3D matrices to multiply and rotate/scale/translate my vectors. I made my Vector3 and matrix classes from scratch, which was a little bit painful.

I did simplify a few things. All I needed to be able to do was represent points and lines in 3D space, as that's all that's required for a 3D spectrum of boxes. The camera is orthographic, so I didn't need to go as far as projection. Doing anything more complex than that may be a stretch on osu!'s limits. Even my small project with 16 bars expanding and shrinking over a 2 minute song led to something like a 15 MB storyboard file, so I needed to be careful.

Originally I was just going to make a static, non-moving spectrum, but as a challenge to myself and since I had some more time, I decided to try rotating the spectrum around its axes. This popped up a few more problems. The biggest one was probably how I calculated cross products. I used (0, 1, 0) as the base for many of these calculations, but this ran into some errors when what the base was crossed with was also (0, 1, 0). There were a quite a few edge cases that I made hack solutions for.

Additionally, what stumped me for some time was the conversion from 3D to 2D. All my 3D calculations were made with (0, 0, 0) in the center. osu!'s coordinates had (0, 0) at the top left corner, which meant also that the y axis was flipped. Very confusing when you have to go back and forth.

I touched on it before, but optimization was a delicate process. Each bar had 12 sprites corresponding to it. These were the 8 lines representing the bar's 2 square faces and 4 additional length-wide connecting lines. Every, I believe, 150 milliseconds or so, these 12 sprites had to be rotated, moved, and scaled accordingly. You can imagine how this would create a very bloated storyboard file. I had to increase the time frame a bit and lower the number of bars in order to fit osu!'s regulations.

I'm probably missing a few points, but that's pretty much the gist of my work. My last change was to do some color and fading to make the spectrum a little less bland. Following Kevin's background colors, the spectrums fade from red to purple over the course of the 2 minute song. I was planning on then passing this storyboard off to Clayton and for him to add some more parts to the storyboard, but... he never got to that.

So that's pretty much my part and the most of the project. My storyboard's a little bland with just a blank black background, but I think the spectrum by itself is plenty cool enough. Overall, I'm happy things are over with. I badgered Royce for a while to upload and close this project fully, and I'm happy at least that's done with. I have some new ideas for the future, and I'll be hopefully working on a some new storyboards over summer once I've settled down at work.

A random low quality video I made for the team showcasing the storyboard