<< 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
//===========================================================================// |
Notification Switch
Would you like to follow the 'Accessible objected-oriented programming concepts for blind students using java' conversation and receive update notifications?