b i r d s o n g

Final Project | Music 256a | Holly Jachowski

birdsong is a single player voice-controlled game. Written in C++, the game's graphics are rendered with OpenGL and the game's audio is handled by RtAudio and dywapitchtrack, open source audio classes. Simple key commands allow program navigation (start game, pause, restart, quit, fullscreen). This is the first stage of the project.

The game is simple. You, the player, control the flight height of a bird who is looking to collect boxes (you'll find out why if you play). The longer the bird lives with each of its five lives, the more points it accumulates. With each box that the bird collects, more points are added to the score. But if you stop singing, the bird stops flying. If it hits the tree line or falls below the viewing window it will almost definitely lose a life. But don't worry, that's why there are five of them!

Download the project (includes README.txt) here: birdsong.zip

There are a couple of key commands the user can take advantage of:

f - toggle fullscreen on/off
q - quit program
s - start game
p - pause game
r - restart game


birdsong began with my desire to build a fun vocal jazz training game. Specific, I know. But I had this idea because I could not find any useful and available programs online to learn vocal jazz techniques. In addition, I have found many music theory training programs online to be fairly boring - always the same aesthetic over and over again. While I did not end up creating my entire initial idea, I was able to develop a game that is controlled by voice - ideally a singing one.

The design of my game is fairly simple. Building off of previous projects, I wrote one main file that includes the animation and audio processing. Animation was done with OpenGL and the audio classes used were RtAudio and dywapitchtrack, a dynamic wavelet algorithm pitch tracker provided online by Antoine Schmitt here. I then wrote two helper classes: Note and Entity (inspired by Ge's examples). I wrote Note in order to create an object in my main class that constantly updated information about the currently registered input frequency. That is, the Note object saves the frequency, associated note name, octave, and MIDI value. I wrote Entity to allow me to keep track of each object's position, in addition to checking if an object had been hit by the bird.

Improvements and Future Goals

In the future I would really like to improve the design of the program so that it is more efficient at implementing all the graphics, input sound analysis, and output sound. In the analysis of input sound, I have found my program to incorrectly assign octaves when the player sings the same pitch in the 4th and 5th octaves successively. Octave confusion would thus be another bug to check out - it might occur within a Note class method.

Future goals are simple when said, but there is a lot of work ahead in this area. Once I have improved structure, I would like to include output sound for educational and creative purposes. I also hope to implement training sequences (such as positioning boxes as the notes in specific broken chords), so that the user can have a more educational experience. This would involve creating stages of difficulty which would likely rely on learning blocks from jazz theory.