<< Chapter < Page | Chapter >> Page > |
In order to eliminate pops and clicks caused by abrupt frequency changes in the audio signal, the amplitude of each pulse is scaled by a triangular (rooftop) function that has a value that is zero at both ends and 1.0 in the center with a linear progression from the center to the ends in both directions.
Four complete cycles of the 0.5 Hz sinusoid are represented by the 32 pulses in the 8-second melody.
Listing 2 shows the beginning of the overridden getMelody method. (Recall that an abstract version of this method is inherited from the class named AudioSignalGenerator02 .
Listing 2 . Beginning of the getMelody method. |
---|
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 center frequency. Audio pulses will be generated above and// below this frequency to represent points on the graph of a
// sinusoidal function.double centerFreq = 261.63;//middle C//Create an output 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); |
Note the statement in Listing 2 that sets the value for channels to 2 for stereo. That is new in this module.
Also note the statement that sets the center frequency to 261.63 Hz. That is the pitch that represents zero amplitude in the audio graph of the sinusoidalfunction.
Otherwise, there is nothing new in Listing 2 .
Recall that I explained earlier that pulses that represent points on the positive lobe of the sinusoidal function are delivered to the left speaker.Pulses that represent points on the negative lobe of the sinusoidal function are delivered to the right speaker.
This is accomplished by scaling the audio values emitted by each speaker by a factor that is either zero or non zero. When scaled by zero, there is no audiooutput from a speaker. This makes it possible to switch the audio back and forth between the two speakers.
This is accomplished later using the variables that are declared in Listing 3 .
Listing 3 . Declare speaker volume variables. |
---|
double gain = 0.0;
double leftGain = 0.0;double rightGain = 0.0; |
Listing 4 continues with several miscellaneous operations. The embedded comments should be sufficient to explain these operations.
Listing 4 . Miscellaneous operations. |
---|
//Declare a variable that is used to control the frequency of each pulse.
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);//Set the length of each pulse in seconds and in samples.
double pulseLengthInSec = 0.25;//in secondsint pulseLengthInSamples = (int)(pulseLengthInSec*audioParams.sampleRate); |
Notification Switch
Would you like to follow the 'Accessible objected-oriented programming concepts for blind students using java' conversation and receive update notifications?