Programming Project: Frequencies of Musical Notes with Loops and Arrays

CPSC-298-6 Programming in C++

Introduction

Loops and arrays provide tremendous power and help you to express programming

problems simply. In this assignment, you’ll revisit your program to compute the

frequencies of musical notes given a reference frequency. This time, you’ll compute the

frequencies and wavelengths of all the notes from the zero’th to the eighth octave; that is,

from note C0 to note B8. Even though you’re computing more values this time, you’ll

write far less code.

The Assignment

To compute the frequency of the note in octave ν (nu) and half step k, you’ll use the

following formula. The value ν will range from 0 to 8, inclusive, and the value of k from

0 to 11, inclusive.

fk,ν = fR × 2(ν)+ k/12

fR is the Reference Frequency, in this case 16.35 Hz (cycles per second), the Frequency of the note C in

octave 0, the “zero’th octave, (denoted by C0).

ν is the octave number (which ranges from 0 to 9 for our purposes)

k is the half-step (or semitone number) within the octave, it has values between 0 and 11 inclusive.

fk,ν is the frequency of the note in octave ν whose half-step within the octave is k. 1

Implement the formula in the form shown. Use the pow() function to compute 2 raised to

the ν + k /12. pow() can handle a fractional exponent. Be careful to use floating point

division and not integer division when computing ν + k /12.

For the wavelength, use the following formula:

Wk,v = c/ fk,ν

where

Wk,v is the wavelength, c is the speed of sound in air (at room temperature), and fk,ν is the

frequency.

The speed of sound in air at room temperature is (roughly) 345 meters per second (345

m/s) or 34500 centimeters per second. (Remember that there are 100 centimeters in a

meter.)

1 More technically, it is frequency of equal-tempered interval k in octave ν. The octaves are named in

the order of their appearance on a standard 88-key piano keyboard, beginning with octave 0 (or the

“zero’th octave”).

You’ll also use the following array of strings containing the names of all the notes whose

frequencies and wavelengths you’ll be displaying.

std::string a_strNotes[] = {

“C0”, “C#0”, “D0″,”D#0”, “E0”, “F0”, “F#0”, “G0”, “G#0”, “A0”, “A#0”, “B0”,

“C1”, “C#1”, “D1″,”D#1”, “E1”, “F1”, “F#1”, “G1”, “G#1”, “A1”, “A#1”, “B1”,

“C2”, “C#2”, “D2″,”D#2”, “E2”, “F2”, “F#2”, “G2”, “G#2”, “A2”, “A#2”, “B2”,

“C3”, “C#3”, “D3″,”D#3”, “E3”, “F3”, “F#3”, “G3”, “G#3”, “A3”, “A#3”, “B3”,

“C4”, “C#4”, “D4″,”D#4”, “E4”, “F4”, “F#4”, “G4”, “G#4”, “A4”, “A#4”, “B4”,

“C5”, “C#5”, “D5″,”D#5”, “E5”, “F5”, “F#5”, “G5”, “G#5”, “A5”, “A#5”, “B5”,

“C6”, “C#6”, “D6″,”D#6”, “E6”, “F6”, “F#6”, “G6”, “G#6”, “A6”, “A#6”, “B6”,

“C7”, “C#7”, “D7″,”D#7”, “E7”, “F7”, “F#7”, “G7”, “G#7”, “A7”, “A#7”, “B7”,

“C8”, “C#8”, “D8″,”D#8”, “E8”, “F8”, “F#8”, “G8”, “G#8”, “A8”, “A#8”, “B8”,

};

You’ll implement an outer for loop over ν, which ranges from 0 to 8, inclusive. Inside this

loop, you’ll implement an inner for loop that iterates over k from 0 to 11, inclusive.

const int k_nOctaves = 9; // Number of octaves to consider

const int k_nHalfTones = 12; // Number of Half-tones in an octave

std::string strNote;

for (int nu = 0; /* ?? */, /* ?? */)

{

for (int k = 0; /* ?? */, /* ?? */)

{

// Calculate frequency (f)

// ??

// Calculate wavelength (dWavelengthCentimeters)

// ??

// Select name for note (e.g. “C#0”) from array (assign to strNote)

// ?? (Need to compute offset into array based on nu and k)

strNote = a_strNotes[? expression in terms of nu and k ?];

std::cout << “Note: ” << strNote << “; nu: ” << nu << “; k: ” << k

<< “; frequency: ” << f << ” Hz; wavelength: ”

<< dWavelengthCentimeters << ” cm” << std::endl;

}

}

The question marks, /* ?? */ , indicate code that you need to complete.

Within the inner for loop you’ll print the name of the note, the values of nu (ν) and k, and

the computed frequency and wavelength of the note. You can use setw() and other

methods to improve the appearance of the output if you’d like.

When printing out the name of the note, such as “C#0”, you’ll need to access the array

element within the a_strNotes array correspond to nu (ν) and k. In the code fragment

above, strNote is a string variable that is assigned to the appropriate element within array

a_strNotes. But which one? The solution involves k_nHalfTones and may look similar to

the following, where o and O represent two different numeric operators such +, -, * and /.

The question mark represents something else – a mystery you’ll need to solve.

strNote = a_strNotes[? o nu O k];

The output of the program will appear similar to the following

The exact values for the frequencies and wavelengths are given in Appendix A.

What might have taken a page of code to write on the original assignment, can now be

done in just a few lines, and it covers all of the notes now too.

Appendix: Table of Musical Notes and their Frequencies