<< Chapter < Page | Chapter >> Page > |
A reference to the populated Hashtable object referred to by piano is returned when the for loop terminates at the bottom of Listing 18 .
Listing 18 also signals the end of the getPiano method and the end of the class named PlayerPiano01 . However, we aren't finished yet. We need to go back and examine the code in the method named makeMusic that we put on the back burner a little earlier.
The method named makeMusic begins in Listing 19 . This method transforms the notes for a clef into an array of amplitude values. This method doesn't know the difference between a treble clef and a bass clef.It is called once to transform the treble clef at the bottom of Listing 12 . It is called again to transform the bass clef in Listing 13 if the user provides a text file containing bass clef data.
Listing 19 . Beginning of the method named makeMusic. |
---|
void makeMusic(ArrayList clef,int beatsPerSec){
double gain = 4000.0;//Set the output volume to a reasonable level.//Get a hashtable that maps note names into note frequencies from A2
// through A7. Note that the name "X" is used to indicate a period of// silence or a rest, so it is appended onto the end of the hashtable with
// a frequency of 0.0.//Frequency values can be checked against
// http://www.phy.mtu.edu/~suits/notefreqs.html.Hashtable piano = getPiano();
piano.put("X",0.0);//Miscellaneous variables
double freq = 0;int beats = 0;
double scaleFactor = 0; |
Nothing in Listing 19 should require an explanation beyond the embedded comments.
Listing 20 shows the beginning of a while loop that uses an iterator to process each array containing duration and note names in the ArrayList object
Listing 20 . Process each array containing duration and note names in the ArrayList object. |
---|
Iterator iter = clef.iterator();
while(iter.hasNext()){//Get the next array containing duration and note names
String[]array = (String[])iter.next();//Get the duration of the note in beats
beats = Integer.parseInt(array[0]); |
The code in Listing 20 accesses the next array and then extracts the duration (in beats) from the array and stores it in the variable named beats .
Listing 21 shows the beginning of a for loop that is used to process each sample that makes up this note. The output sampling rate is constant. Therefore,notes with a short duration comprise fewer samples than notes with a long duration.
Listing 21 . Process each sample. |
---|
for(int cnt = 0; cnt<beats*audioParams.sampleRate/beatsPerSec; cnt++){
//Compute the time for this iteration to use when evaluating the// cosine function.
double time = cnt/audioParams.sampleRate;double sum = 0;//sum of values for this iteration |
Recall that a human piano player can press several keys simultaneous, as in (9,A3,C4,E4) at the end of Listing 30 . In this case, the piano player would press threekeys simultaneously on the piano keyboard and hold them down for nine beats.
Notification Switch
Would you like to follow the 'Accessible objected-oriented programming concepts for blind students using java' conversation and receive update notifications?