What is Growl Hero?

Growl Hero is a beta game that detects your Growls/Screams while you sing a metal song. Like Singstar/Rockband but it detects screams. It is a a free, open-source app for Mac (Linux version coming soon) developed by Uri Nieto as the final project for the course Music-256a, at CCRMA, Stanford University.

Why are you developing a software like Growl Hero?

Mostly because I love Growls/Screams. I love this kind of music. I also love videogames, and singing games are really good these days. However, I still haven't seen any singing game that detects Screams, and that would really make a different. So I decided to write one myself.

Why do I want Growl Hero if I already have Singstar/Rockband?

These two games detect your picth and tempo, but not how rough your voice is. Growl Hero adds this Growl/Scream detector. In Rockband you can sing a Metallica song in falsetto and it will tell you that you're doing great as long as you are on pitch and on time. That sucks. Finally Growl Hero is here to overcome this.

What types of Screams can Growl Hero detect?

Growl Hero can detect 3 different types of Screams/Growls:

FRY SCREAM: This scream is produced with the vocal folds vibrating at a random frequency, using a few amount of air. It usually sounds high pitched and it can be extremely long, though it doesn't have a fundamental frequency due to the big amount of noise.

GROWL: This scream is produced with the vocal tract vibrating at a random frequency, using a huge amount of air. It usually sounds low pitched, though it doesn't have a fundamental frequency due to the big amount of noise.

ROUGHNESS: This scream is produced with the vocal tract vibrating at a random frequency while singing in a pitched way. This scream has a strong fundamental frequency component, so it does have a pitch.

In the game you can hear some examples of these screams, and you can calibrate your own

I also suggest to watch my Tutorial Videos about how to Scream here

How to Install Growl Hero?

Decompress the GrowlHero.zip file

Go to the directory where you decompressed GrowlHero and type: make

Now you should have the binary ready for you. To play type: ./GrowlHero

How do I play?

Click on Play in the main menu. The song will start (in this pre-release there is only one song: My Curse by Killswitch Engage). Wait until the lyrics appear. If the lyrics lines are green, then the voice should be normal (no scream/growl). If the lyrics lines are red, then the scream you should be screaming is the Roughness Scream. If the lyrics lines are grey, then the scream should be the Growl Scream. Finally, if the lyrics lines are blue, then the scream should be the Fry Scream.

When you are doing fine, you will see a "rock on" icon on the upper-left corner of the screen, and your score will rise.

You will need a mic that doesn't get a lot of noise from the output (i.e. do not use the laptop mic, since it will get a lot of noise coming out of the speakers -or use headsets!-).

How do I calibrate Growl Hero?

Go to the Calibration Menu (from the main menu, click on Calibrate). There you will find the three different types of Screams/Growls. Click on one of these and start screaming to the microphone until the word "Alright" appears. To listen how this screams should sound like, press on the speaker icons.

It is strongly recommended to calibrate Growl Hero everytime you run the game.

How is the source code organized?

Growl Hero is a Glut application written in C++. In the main.cpp file you will find the main loop of the program. It reads all the files (sounds, transcription of the song and images), and stores it into memory and starts the glut main loop.

The game manly takes place in the Visual.cpp file. Every sample it reads the song and synchronizes it with its transcription (the transcription is found in a growl hero file .gh) and analyzes the signal and if it is good enough, the score will rise.

Many different objects and structures are used in Growl Hero. Here there is a list of the most relevant ones:

Features: A class to store a signal features. It can contain the Fry scream features, the Growl features, the current features, etc...

class Features {
public:
Features();

void extractFeatures(SAMPLE *buffer, SAMPLE *window);
void computeFlux( SAMPLE * prev, SAMPLE * curr);
void init();
void meanOfFeatures(Features *f);
void setGrowl();
void setFry();
void setRough();

static int getNote(double);

SAMPLE spectrum[GH_BUFFER_SIZE]; // Spectrum of the time domain signal
SAMPLE peak_spectrum[GH_BUFFER_SIZE]; // Peak Spectrum of the time domain signal
SAMPLE harmonic_spectrum[GH_BUFFER_SIZE]; // Harmonic Spectrum of the time domain signal

int nzeros; // Number of zero crossings in the time domain
float ampl; // Amplitude of the time domain signal
double pitch; // Pitch of the buffer (computed using YIN)
int note; // Note extracted from the pitch
float centroid; // Centroid of the spectrum
float mean; // Mean of the spectrum
float variance; // Variance of the spectrum
float std_dev; // Standard Deviation of the spectrum
float skewness; // Skewness of the spectrum
float noisiness;// Noisiness of the spectrum
double flux; // Flux of the current spectrum compared to the previous spectrum

bool empty; // If the features are empty or not

private:

void computeZeros(SAMPLE *buffer);
void computeAmpl(SAMPLE *buffer);
void computePitch(SAMPLE *buffer);
void computeNote();
void computeSpectrum(SAMPLE *buffer);
void computeCentroid(SAMPLE *buffer);
void computeMean(SAMPLE *buffer);
void computeVariance(SAMPLE *buffer);
void computeStdDev(SAMPLE *buffer);
void computeSkewness(SAMPLE *buffer);
void computePeakSpectrum(SAMPLE *buffer, float t);
void computeHarmonicSpectrum(SAMPLE *buffer, float t);
void computeNoisiness();

int countPeaks(SAMPLE *array, int buffer_size);

void meanOfBuffers(SAMPLE *buff1, SAMPLE *buff2);

};

Sound: A class to store read wave files in order to read them, play, stop them at any time. The sounds will be stored in the memory at all time and the waves will only be read once in the beginning of the application.

class Sound{
public:

Sound(int nsamp); // Creator with the number of samples of the sound
~Sound(); // Destructor
void play(); // play the sound
void stop(); // stop the sound
SAMPLE read(); // read one sample of the sound

SAMPLE *buffer; // the buffer that contains the whole sound
bool playing; // bool to know if the sound is being played

private:
int length; // lenght (in samples) of the sound
int index; // the next index to be read

};

Please, refer to the source code to get more info on this. There you will find loads of explanations to follow the source code.

What libraries does Growl Hero use?

Growl Hero makes use of different libraries:

wavIn: A simple library to read wav files by Dr Fred DePiero.

libxtract: A signal feature extraction library by Jamie Bullock.

Stk: Using the Threads methods of the STK by Perry R. Cook and Gary P. Scavone.

RtAudio: A library to with audio by Gary P. Scavone.

aubio: A simple library to perform the YIN algorithm by Paul Brossier.

fftw: Library to perform the FFT of a signal, used by libxtract.

Can I transcribe my own songs? I need to know how!

Yes you can! Take a look at the MyCurse.gh file. That's the transcription for the My Curse song. Just write your own file using the same format. Follow the format instructions you will find in the very same file.

What comes next?

A Linux Version and a Windows Version. Also adjust some screams, and add some more. Transcribe the whole My Curse song, and transcribe many more. Also work more on the visual side of the application. It'd also be cool to have some combos. And a World-Ranking. And a Multiplayer mode, ... Any help would be more than welcome!