<< Chapter < Page Chapter >> Page >

.....

Listing 7 . The class named FMSweep.
/*File FMSweep.java Copyright 2014, R.G.BaldwinRevised 08/19/14 This class can be used to create an 8-second stereo melody consisting of alinear frequency sweep with a linear pan between speakers. ******************************************************************************/import java.io.*; import java.nio.*;import java.util.*; public class FMSweep extends AudioSignalGenerator02{public FMSweep(AudioFormatParameters01 audioParams,String[] args,byte[] melody){super(audioParams,args,melody); }//end constructor//-------------------------------------------------------------------------////This method returns an array that will play an 8-second melody consisting // of a linear frequency-modulated sweep from a low frequency of middle-C// to a high frequency that is one octave above middle-C. During the // frequency sweep, the sound pans linearly from the left speaker to the// right speaker. //byte[] getMelody(){//Set channels to 2 for stereo overriding the default value of 1. audioParams.channels = 2;System.out.println("audioParams.channels = " + audioParams.channels); //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;// Specify the length of the melody in seconds. double lengthInSeconds = 8.0;//Set the low and high frequencies to cause the sweep to cover one full// octave. double lowFreq = 261.63;//middle Cdouble highFreq = 2*lowFreq; //Create an output data array of sufficient size to contain the melody at// "sampleRate" samples per second, "bytesPerSampPerChan" bytes per // sample per channel and "channels" channels.melody = new byte[(int)(lengthInSeconds*audioParams.sampleRate* bytesPerSampPerChan*audioParams.channels)]; System.out.println("melody.length = " + melody.length);//Set the overall gain to a value that is compatible with 16-bit audio// data. double gain = 8000.0;//Declare variables used to control the output volume on the left and // right speaker channels.double leftGain = 0.0; double rightGain = 0.0;//Declare a variable that is used to control the frequency. double freq = 0.0;//Prepare a ByteBuffer for use byteBuffer = ByteBuffer.wrap(melody);//Compute the number of audio samples in the melody. int sampLength = (int)(lengthInSeconds*audioParams.sampleRate);//Compute the audio sample values and deposit them in the output melody // array.for(int cnt = 0; cnt<sampLength; cnt++){ //Compute the time in seconds for this sample.double time = cnt/audioParams.sampleRate;//Compute the frequency for this iteration freq = lowFreq + (highFreq - lowFreq)*cnt/sampLength;//Adjust the left and right gain values to cause the sound to pan // linearly from the left speaker to the right speaker.rightGain = gain*1.0*cnt/sampLength; leftGain = gain*1.0-rightGain;//Compute scaled values and deposit them into the melody. byteBuffer.putShort((short)(leftGain*Math.sin(2*Math.PI*freq*time)));byteBuffer.putShort((short)(rightGain*Math.sin(2*Math.PI*freq*time))); }//end for loopreturn melody;}//end method getMelody //-------------------------------------------------------------------------//}//end class FMSweep //===========================================================================//

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