<< Chapter < Page | Chapter >> Page > |
.....
Listing 11 . The class named ToneMono. |
---|
/*File ToneMono.java
Copyright 2014, R.G.BaldwinRevised 08/22/14
This class that can be used to create a melody consisting of a single puresinusoidal tone at 1000 Hz.
The class introduces the use of ByteBuffer.******************************************************************************/
import java.io.*;import java.nio.*;
import java.util.*;public class ToneMono extends AudioSignalGenerator02{public ToneMono(AudioFormatParameters01 audioParams,
String[]args,
byte[]melody){
super(audioParams,args,melody);}//end constructor
//-------------------------------------------------------------------------////This method generates a three-second pure sinusoidal tone. A 1000 Hz tone// is emitted with equal amplitude from the left and right speakers. It is
// interesting to compare this sound with the sound of a square wave with// the same fundamental frequency.
byte[]getMelody(){
//Recall that the default is channels=1 for monaural.System.out.println("audioParams.channels = " + audioParams.channels);//Each channel requires two 8-bit bytes per 16-bit sample.
int bytesPerSampPerChan = 2;//Override the default sample rate. Allowable sample rates are 8000,11025,// 16000,22050,44100 samples per second.
audioParams.sampleRate = 8000.0F;// Set the length of the melody in secondsdouble lengthInSeconds = 3.0;//Set the frequency of the tone.
double freq = 1000.0;//Create an output data array sufficient to contain the tone// 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);//Prepare a ByteBuffer for usebyteBuffer = 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 array.
for(int cnt = 0; cnt<sampLength; cnt++){
//Compute the time in seconds for this sample.double time = cnt/audioParams.sampleRate;
//Deposit audio data for both channels in mono.byteBuffer.putShort((short)(8000*Math.sin(2*Math.PI*freq*time)));
}//end for loopreturn melody;}//end method getMelody
//-------------------------------------------------------------------------//}//end class ToneMono
//===========================================================================// |
.....
Listing 12 . The class named TonesStereo. |
---|
/*File TonesStereo.java
Copyright 2014, R.G.BaldwinRevised 08/19/14
This class that can be used to create a melody consisting of two tones atdifferent frequencies emitted from the left and right stereo speakers.
******************************************************************************/import java.io.*;
import java.nio.*;import java.util.*;
public class TonesStereo extends AudioSignalGenerator02{public TonesStereo(AudioFormatParameters01 audioParams,String[] args,byte[] melody){super(audioParams,args,melody);
}//end constructor//-------------------------------------------------------------------------////This method generates a pair of three-second tones in stereo.
//A 261.63 (middle-C) tone is emitted from the left speaker and a higher// frequency tone is emitted from the right speaker.
byte[]getMelody(){
//Set the audio parameters to stereo overriding the default value.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 sample rate. Allowable sample rates are 8000,11025,// 16000,22050,44100 samples per second.
audioParams.sampleRate = 8000.0F;// Set the length of the melody in secondsdouble lengthInSeconds = 3.0;//Set the primary tone frequency.
double freq = 261.63;//middle C//Create an output data array sufficient to contain the tone// 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);//Prepare a ByteBuffer for usebyteBuffer = 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 array.
for(int cnt = 0; cnt<sampLength; cnt++){
//Compute the time in seconds for this sample.double time = cnt/audioParams.sampleRate;
//Deposit audio data for the first (left) channelbyteBuffer.putShort((short)(8000*Math.sin(2*Math.PI*freq*time)));//Deposit audio data at a different frequency in the second (right)
// channel.byteBuffer.putShort((short)(8000*Math.sin(2*Math.PI*freq*time*2.2)));
}//end for loopreturn melody;}//end method getMelody
//-------------------------------------------------------------------------//}//end class TonesStereo
//===========================================================================// |
Notification Switch
Would you like to follow the 'Accessible objected-oriented programming concepts for blind students using java' conversation and receive update notifications?