This page is optimized for mobile devices, if you would prefer the desktop version just click here

0.10 Jbs2060-a player piano simulator  (Page 12/17)

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.

Beginning of the method named makeMusic

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.

Process each array containing duration and note names in the ArrayList object

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 .

Process each sample

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

Process each piano key that is pressed

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.

<< Chapter < Page Page > Chapter >>

Read also:

OpenStax, Accessible objected-oriented programming concepts for blind students using java. OpenStax CNX. Sep 01, 2014 Download for free at https://legacy.cnx.org/content/col11349/1.17
Google Play and the Google Play logo are trademarks of Google Inc.
Jobilize.com uses cookies to ensure that you get the best experience. By continuing to use Jobilize.com web-site, you agree to the Terms of Use and Privacy Policy.