Website powered by

Idol Hell Work

I worked as a UI Programmer, Audio Programmer, Sound Designer, and Composer for an indie game called Idol Hell.

- I worked closely with the Creative Director to make the audio in Ableton. I would receive feedback and iterate on the audio and once the audio was at a good spot, it would be tested in-game before iterating further. Most songs would take a week or two to fully finish, and audio would generally take a day. Though each would go through iterations after outside playtest feedback. The hardest thing about composing was keeping a cohesive sound, while also making distinct sounding stage and boss themes. Sound effects were generally harder to make right because they usually had to be super short stingers while staying distinct so the player can know what is happening while not looking at everything.

- For the programming side, I worked closely with our lead programmer to make sure everything was working together properly. The most impactful work I did was implementing the audio and music managers since we did not use an audio middleware like FMOD or WWise. However, I think if I were to remake it I would go about doing it differently. The current changing song with fading in and out is a bit convoluted, and had led to issues through most of the project. I would try to separate out those from each other and have a controller take care of it all. Also I don't know why I didn't create a struct for each song instead of having two related dictionaries. Another pain point was getting the dialogue waving to work. Really it was just understanding how text rendering and TextMeshPro worked.

- Lastly, I cannot show this with pictures, but I also am the one who manages the Steamworks backend and set up all of the store pages (main game, demo, soundtrack) and updates the depot with new builds.

The Release Trailer for my game Idol Hell

I worked on all of the sounds. They are all compiled here

Audio Manager for all of the SFX. We did not use a middleware, so I implemented everything myself

Audio Manager for all of the SFX. We did not use a middleware, so I implemented everything myself

Each sound contains these variables

Each sound contains these variables

The AudioManager uses a singleton pattern so it can exist between scenes. It also holds all of the sounds that can be played in the game

The AudioManager uses a singleton pattern so it can exist between scenes. It also holds all of the sounds that can be played in the game

Any script can queue audio to the AudioManager, and it will play it all non-duplicate sounds at the end of the frame. This way the same sound doesn't get played multiple times, which would create a very loud sound

Any script can queue audio to the AudioManager, and it will play it all non-duplicate sounds at the end of the frame. This way the same sound doesn't get played multiple times, which would create a very loud sound

Boss explosions get their own way to queue their sound because they play their sound multiple times over a random period of time

Boss explosions get their own way to queue their sound because they play their sound multiple times over a random period of time

Select songs from the soundtrack I composed

The MusicManager uses a singleton pattern as well, then it creates two dictionaries: one for each song's file and one for each song's volume with the key being the song's name

The MusicManager uses a singleton pattern as well, then it creates two dictionaries: one for each song's file and one for each song's volume with the key being the song's name

When called to change music, it changes to the song name provided, and can fade out the old song to some specified volume and fade in the new song

When called to change music, it changes to the song name provided, and can fade out the old song to some specified volume and fade in the new song

Then the song will play

Then the song will play

And if requested, it will fade out the old song

And if requested, it will fade out the old song

And fade in the new song

And fade in the new song

The music can also be stopped. Plus there are some functions to help reset the music when the scene is unloaded

The music can also be stopped. Plus there are some functions to help reset the music when the scene is unloaded

I also programmed the dialogue utilizing TextMeshPro, it's a pretty lengthy script so I will only show the most important parts

I also programmed the dialogue utilizing TextMeshPro, it's a pretty lengthy script so I will only show the most important parts

To get that wavy effect, we go to each character in each line of dialogue and add an offset. The offset is calculated by using sine on the y-axis. There's some customization, but then it's applied to the each of the four corners of the character

To get that wavy effect, we go to each character in each line of dialogue and add an offset. The offset is calculated by using sine on the y-axis. There's some customization, but then it's applied to the each of the four corners of the character

We can also effect the color, which we used to fade out the characters over time by changing the alpha in a coroutine

We can also effect the color, which we used to fade out the characters over time by changing the alpha in a coroutine

To actually type the text out, over time we set the number of visible characters higher and then display them. Every 3 characters we play the typewriter sound, so the player doesn't get fatigued by the sound

To actually type the text out, over time we set the number of visible characters higher and then display them. Every 3 characters we play the typewriter sound, so the player doesn't get fatigued by the sound

The Graze mechanic is when you get close to bullets to gain more points, signified by the music notes you collect

The Graze mechanic is when you get close to bullets to gain more points, signified by the music notes you collect

Grazing increases your multiplier and score, so when you collect the graze particles it multiplies your current multiplier with the particle score

Grazing increases your multiplier and score, so when you collect the graze particles it multiplies your current multiplier with the particle score

It uses a particle system that shoots out the particles and then brings them back to the player. When the particles collide with the player, it kills the particle and adds to the score. The multiplier is increased outside of this

It uses a particle system that shoots out the particles and then brings them back to the player. When the particles collide with the player, it kills the particle and adds to the score. The multiplier is increased outside of this

I also created an Audio Visualizer to fit into our Cyber aesthetic to actually match the audio spectrum of the song playing

I also created an Audio Visualizer to fit into our Cyber aesthetic to actually match the audio spectrum of the song playing

The audio spectrum data is gathered from the audio source that is sampled a number of times spread across the spectrum. Then it goes through and makes a bar corresponding to the bar parameters

The audio spectrum data is gathered from the audio source that is sampled a number of times spread across the spectrum. Then it goes through and makes a bar corresponding to the bar parameters