Cut the wave file:
double [] music = read("music.wav");
int start = 792478*2;
int end = 1118153*2;
double [] cutMusic = new double [end-start];
for(int i = start; i < end; i++)
{
cutMusic [i-start] = music[i];
}
save("cutMusic.wav", cutMusic); //from StdAudio library
Change the volume/amplitude:
int multiplier = 0.5; //how much you want to change the volume by
for(int i = 0; i < cutMusic.length;i++)
{
cutMusic[i] = multiplier * cutMusic[i];
}
Save the audio to a new wav file:
save("cutmusic.wav"), cutMusic); //from the StdAudio library
//converts the double array to a byte array
Join the two files:
ArrayList <File> joined = new ArrayList<>();
joined.add(new File("music.wav"));
joined.add(new File("cutMusic.wav"));
AudioFormat format = new AudioFormat(
/*AudioFormat.Encoding*/AudioFormat.Encoding.PCM_SIGNED
/*float sampleRate*/, sampleRate
/*int sampleSizeInBits*/, 16
/*int channels*/, 2
/*int frameSize*/, 4
/*float frameRate*/, 44100,
/*boolean bigEndian*/false
joinAudioFiles(format, joined, new File("joined.wav"));
//method needed is below
public static void joinAudioFiles(AudioFormat audioFormat,
java.util.List<File> audioFiles, File output) throws IOException,
UnsupportedAudioFileException {
output.getParentFile().mkdirs();
output.delete();
output.createNewFile();
List<AudioInputStream> audioInputStreams = new ArrayList<AudioInputStream>();
long totalFrameLength = 0;
for (File audioFile : audioFiles) {
AudioInputStream fileAudioInputStream = AudioSystem
.getAudioInputStream(audioFile);
audioInputStreams.add(fileAudioInputStream);
totalFrameLength += fileAudioInputStream.getFrameLength();
}
AudioInputStream sequenceInputStream = new AudioInputStream(
new SequenceInputStream(
Collections.enumeration(audioInputStreams)),
audioFormat, totalFrameLength);
AudioSystem.write(sequenceInputStream, AudioFileFormat.Type.WAVE,
output);
}