Starting from:

$30

Programming Project: Frequencies of Musical Notes with Loops and Arrays

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



More products