|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
package com.sun.media.sound; |
|
|
|
import java.io.ByteArrayOutputStream; |
|
import java.io.DataInputStream; |
|
import java.io.File; |
|
import java.io.IOException; |
|
import java.io.InputStream; |
|
import java.net.URL; |
|
|
|
import javax.sound.midi.InvalidMidiDataException; |
|
import javax.sound.midi.Soundbank; |
|
import javax.sound.midi.spi.SoundbankReader; |
|
import javax.sound.sampled.AudioInputStream; |
|
import javax.sound.sampled.AudioSystem; |
|
import javax.sound.sampled.UnsupportedAudioFileException; |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public final class AudioFileSoundbankReader extends SoundbankReader { |
|
|
|
public Soundbank getSoundbank(URL url) |
|
throws InvalidMidiDataException, IOException { |
|
try { |
|
AudioInputStream ais = AudioSystem.getAudioInputStream(url); |
|
Soundbank sbk = getSoundbank(ais); |
|
ais.close(); |
|
return sbk; |
|
} catch (UnsupportedAudioFileException e) { |
|
return null; |
|
} catch (IOException e) { |
|
return null; |
|
} |
|
} |
|
|
|
public Soundbank getSoundbank(InputStream stream) |
|
throws InvalidMidiDataException, IOException { |
|
stream.mark(512); |
|
try { |
|
AudioInputStream ais = AudioSystem.getAudioInputStream(stream); |
|
Soundbank sbk = getSoundbank(ais); |
|
if (sbk != null) |
|
return sbk; |
|
} catch (UnsupportedAudioFileException e) { |
|
} catch (IOException e) { |
|
} |
|
stream.reset(); |
|
return null; |
|
} |
|
|
|
public Soundbank getSoundbank(AudioInputStream ais) |
|
throws InvalidMidiDataException, IOException { |
|
try { |
|
byte[] buffer; |
|
if (ais.getFrameLength() == -1) { |
|
ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
|
byte[] buff = new byte[1024 |
|
- (1024 % ais.getFormat().getFrameSize())]; |
|
int ret; |
|
while ((ret = ais.read(buff)) != -1) { |
|
baos.write(buff, 0, ret); |
|
} |
|
ais.close(); |
|
buffer = baos.toByteArray(); |
|
} else { |
|
buffer = new byte[(int) (ais.getFrameLength() |
|
* ais.getFormat().getFrameSize())]; |
|
new DataInputStream(ais).readFully(buffer); |
|
} |
|
ModelByteBufferWavetable osc = new ModelByteBufferWavetable( |
|
new ModelByteBuffer(buffer), ais.getFormat(), -4800); |
|
ModelPerformer performer = new ModelPerformer(); |
|
performer.getOscillators().add(osc); |
|
|
|
SimpleSoundbank sbk = new SimpleSoundbank(); |
|
SimpleInstrument ins = new SimpleInstrument(); |
|
ins.add(performer); |
|
sbk.addInstrument(ins); |
|
return sbk; |
|
} catch (Exception e) { |
|
return null; |
|
} |
|
} |
|
|
|
public Soundbank getSoundbank(File file) |
|
throws InvalidMidiDataException, IOException { |
|
try { |
|
AudioInputStream ais = AudioSystem.getAudioInputStream(file); |
|
ais.close(); |
|
ModelByteBufferWavetable osc = new ModelByteBufferWavetable( |
|
new ModelByteBuffer(file, 0, file.length()), -4800); |
|
ModelPerformer performer = new ModelPerformer(); |
|
performer.getOscillators().add(osc); |
|
SimpleSoundbank sbk = new SimpleSoundbank(); |
|
SimpleInstrument ins = new SimpleInstrument(); |
|
ins.add(performer); |
|
sbk.addInstrument(ins); |
|
return sbk; |
|
} catch (UnsupportedAudioFileException e1) { |
|
return null; |
|
} catch (IOException e) { |
|
return null; |
|
} |
|
} |
|
} |