Question: Play a simple song Write a program called PlaySimpleChords to play a sequence of chords represented as notes in text. Write the program so that
Play a simple song
Write a program called PlaySimpleChords to play a sequence of chords represented as notes in text.
Write the program so that it:
Declares and creates a symbol table using the algs31.BinarySearchST class;
Reads in a file notes_frequencies.txt where each line is a pair of strings separated by whitespace. The first string is the name of a musical note and the second a double value that is its sound frequency as found on a piano. For example, the note A4 is paired with the frequency 440 and the note C4 with the frequency 261.626. As each line is read, an entry is made in the symbol table where the note name is the key and the frequency is the value.
Reads in a chord file, where each line contains two note names and a duration in seconds, separated by whitespace. A sample file is sample_simple_chords.txt, which plays a set of C chords for half a second.
Both the notes and frequencies file and the chord file should be placed into the Eclipse data directory and, as in the previous program, read in using StdIn and the fromFile method.
To process a text file where each line contains a fixed set of data fields:
1. Use the method readLine in the StdIn class, which returns a string;
2. Split the string into an array of strings using the instance method split in the String class;
3. Convert the numeric strings into numeric values using the method parseDouble in the Double class.
To play each chord, place into your program and call this method:
public static void playChord(double duration, double... frequencies) { final int sliceCount = (int) (StdAudio.SAMPLE_RATE * duration); final double[] slices = new double[sliceCount+1]; for (int i = 0; i <= sliceCount; i++) { for (double frequency: frequencies) { slices[i] += Math.sin(2 * Math.PI * i * frequency / StdAudio.SAMPLE_RATE); } slices[i] /= frequencies.length; } StdAudio.play(slices); } For example, if your two frequency variables are frequency1 and frequency2, you can call the above method with the line playChord(duration, frequency1, frequency2);.
You will also have to import stdlib.StdAudio.
notes_frequencies.txt
A0 27.5 A#0 29.1353 B0 30.8677 C1 32.7032 C#1 34.6479 D1 36.7081 D#1 38.8909 E1 41.2035 F1 43.6536 F#1 46.2493 G1 48.9995 G#1 51.913 A1 55 A#1 58.2705 B1 61.7354 C2 65.4064 C#2 69.2957 D2 73.4162 D#2 77.7817 E2 82.4069 F2 87.3071 F#2 92.4986 G2 97.9989 G#2 103.826 A2 110 A#2 116.541 B2 123.471 C3 130.813 C#3 138.591 D3 146.832 D#3 155.563 E3 164.814 F3 174.614 F#3 184.997 G3 195.998 G#3 207.652 A3 220 A#3 233.082 B3 246.942 C4 261.626 C#4 277.183 D4 293.665 D#4 311.127 E4 329.628 F4 349.228 F#4 369.994 G4 391.995 G#4 415.305 A4 440 A#4 466.164 B4 493.883 C5 523.251 C#5 554.365 D5 587.33 D#5 622.254 E5 659.255 F5 698.456 F#5 739.989 G5 783.991 G#5 830.609 A5 880 A#5 932.328 B5 987.767 C6 1046.5 C#6 1108.73 D6 1174.66 D#6 1244.51 E6 1318.51 F6 1396.91 F#6 1479.98 G6 1567.98 G#6 1661.22 A6 1760 A#6 1864.66 B6 1975.53 C7 2093 C#7 2217.46 D7 2349.32 D#7 2489.02 E7 2637.02 F7 2793.83 F#7 2959.96 G7 3135.96 G#7 3322.44 A7 3520 A#7 3729.31 B7 3951.07 C8 4186.01
sample_simple_chords.txt
C1 C2 0.5 C2 C3 0.5 C3 C4 0.5 C4 C5 0.5 C5 C6 0.5 C6 C7 0.5 C7 C8 0.5
Step by Step Solution
There are 3 Steps involved in it
Get step-by-step solutions from verified subject matter experts
