<< Chapter < Page
  Accessible objected-oriented     Page 8 / 17
Chapter >> Page >
Listing 11 . Check for treble and bass clefs of different lengths.
if(trebleLengthInBeats != bassLengthInBeats){ System.out.println("Treble and bass are different lengths.");System.out.println("Will use the shorter of the two."); }//end if}//end if

Convert treble notes to amplitude values

With the exception of the last statement in Listing 12 , all the code in Listing 12 is very similar to code that you have seen before.

Listing 12 . Convert treble notes to amplitude values.
//Each channel requires two 8-bit bytes per 16-bit sample. int bytesPerSampPerChan = 2;//Override the default sampleRate of 16000.0F. Allowable sample rates// are 8000,11025,16000,22050, and 44100 samples per second. audioParams.sampleRate = 8000.0F;//Create an array of sufficient size to contain the treble melody. Treat // as mono at this point. May combine with bass melody later to create// a stereo output. Add an extra one-half second of capacity to deal with // possible round off error at the end.byte[] trebleMelody = new byte[(int)(audioParams.sampleRate/2 + trebleLengthInBeats* audioParams.sampleRate*bytesPerSampPerChan/beatsPerSec)]; System.out.println("trebleMelody.length = " + trebleMelody.length);//Prepare a ByteBuffer for use byteBuffer = ByteBuffer.wrap(trebleMelody);//Call a method that transforms the notes for the clef into an array of // amplitude values.makeMusic(trebleClef,beatsPerSec);

The last statement in Listing 12 calls a method named makeMusic passing the treble note data along with the value of beatsPerSec as parameters. The purpose of the makeMusic method is to transform the note data into an array of amplitude values that can be played or written into anaudio output file. This method is the most important part of the entire program. I will come back and dedicate quite a lot of time to it later.

Convert bass notes to amplitude values

Continuing with the getMelody method, Listing 13 does essentially the same thing with the bass clef data if a file containing bass clef data was specifiedas a command-line parameter.

Listing 13 . Convert bass notes to amplitude values.
//Process the bass clef if it exists. if(bassFileName != null){//Create an array of sufficient size to contain the bass melody. Treat // as mono at this point. Will combine with the trebleMelody later to // create a stereo output. Add an extra one-half second of capacity to// deal with possible round off error at the end. byte[]bassMelody = new byte[ (int)(audioParams.sampleRate/2 + bassLengthInBeats*audioParams.sampleRate*bytesPerSampPerChan/beatsPerSec)];System.out.println("bassMelody.length = " + bassMelody.length);//Prepare a ByteBuffer for use byteBuffer = ByteBuffer.wrap(bassMelody);//Call a method that transforms the notes for the clef into an array// of amplitude values. makeMusic(bassClef,beatsPerSec);

Populate and return the melody array with stereo data

Listing 14 continues the if statement that began at the top of Listing 13 , and is executed only if the user specified a bass data file on the command line.

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  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.

Notification Switch

Would you like to follow the 'Accessible objected-oriented programming concepts for blind students using java' conversation and receive update notifications?

Ask