fa9e4066f08beec538e775443c5be79dd423fcabahrens/*
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
fa9e4066f08beec538e775443c5be79dd423fcabahrens * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * This code is free software; you can redistribute it and/or modify it
fa9e4066f08beec538e775443c5be79dd423fcabahrens * under the terms of the GNU General Public License version 2 only, as
fa9e4066f08beec538e775443c5be79dd423fcabahrens * published by the Free Software Foundation. Oracle designates this
fa9e4066f08beec538e775443c5be79dd423fcabahrens * particular file as subject to the "Classpath" exception as provided
fa9e4066f08beec538e775443c5be79dd423fcabahrens * by Oracle in the LICENSE file that accompanied this code.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * This code is distributed in the hope that it will be useful, but WITHOUT
fa9e4066f08beec538e775443c5be79dd423fcabahrens * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
fa9e4066f08beec538e775443c5be79dd423fcabahrens * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
fa9e4066f08beec538e775443c5be79dd423fcabahrens * version 2 for more details (a copy is included in the LICENSE file that
fa9e4066f08beec538e775443c5be79dd423fcabahrens * accompanied this code).
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * You should have received a copy of the GNU General Public License version
fa9e4066f08beec538e775443c5be79dd423fcabahrens * 2 along with this work; if not, write to the Free Software Foundation,
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
fa9e4066f08beec538e775443c5be79dd423fcabahrens *
fa9e4066f08beec538e775443c5be79dd423fcabahrens * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
fa9e4066f08beec538e775443c5be79dd423fcabahrens * or visit www.oracle.com if you need additional information or have any
6b90ca488b504d3422b169269c3a86ccad80322clling * questions.
fa9e4066f08beec538e775443c5be79dd423fcabahrens */
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensimport java.io.IOException;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensimport javax.sound.midi.*;
fa9e4066f08beec538e775443c5be79dd423fcabahrensimport javax.sound.sampled.*;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrensimport com.sun.media.sound.*;
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrenspublic class SoftTestUtils {
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens public AudioSynthesizer synth = new SoftSynthesizer();
fa9e4066f08beec538e775443c5be79dd423fcabahrens public AudioInputStream stream;
fa9e4066f08beec538e775443c5be79dd423fcabahrens public byte[] tmpbuffer = new byte[1024];
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens public static SF2Soundbank createTestSoundBank()
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens SF2Soundbank sf2 = new SF2Soundbank();
fa9e4066f08beec538e775443c5be79dd423fcabahrens AudioFormat format = new AudioFormat(44100, 16, 1, true, false);
fa9e4066f08beec538e775443c5be79dd423fcabahrens float[] data = new float[44100+1000];
fa9e4066f08beec538e775443c5be79dd423fcabahrens float fr = 440/format.getSampleRate();
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (int i = 0; i < data.length; i++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens data[i] = (float)Math.sin(i*fr*2*Math.PI);
fa9e4066f08beec538e775443c5be79dd423fcabahrens byte[] bdata = new byte[data.length*format.getFrameSize()];
fa9e4066f08beec538e775443c5be79dd423fcabahrens AudioFloatConverter.getConverter(format).toByteArray(data, bdata);
fa9e4066f08beec538e775443c5be79dd423fcabahrens SF2Sample sample = new SF2Sample(sf2);
fa9e4066f08beec538e775443c5be79dd423fcabahrens sample.setName("Test Sample");
fa9e4066f08beec538e775443c5be79dd423fcabahrens sample.setData(bdata);
fa9e4066f08beec538e775443c5be79dd423fcabahrens sample.setStartLoop(500);
fa9e4066f08beec538e775443c5be79dd423fcabahrens sample.setEndLoop(data.length - 500);
fa9e4066f08beec538e775443c5be79dd423fcabahrens sample.setSampleRate((long) format.getSampleRate());
fa9e4066f08beec538e775443c5be79dd423fcabahrens sample.setOriginalPitch(69);
fa9e4066f08beec538e775443c5be79dd423fcabahrens sf2.addResource(sample);
fa9e4066f08beec538e775443c5be79dd423fcabahrens SF2Layer layer = new SF2Layer(sf2);
fa9e4066f08beec538e775443c5be79dd423fcabahrens layer.setName("Test Layer");
fa9e4066f08beec538e775443c5be79dd423fcabahrens sf2.addResource(layer);
fa9e4066f08beec538e775443c5be79dd423fcabahrens SF2LayerRegion region = new SF2LayerRegion();
fa9e4066f08beec538e775443c5be79dd423fcabahrens region.putInteger(SF2Region.GENERATOR_SAMPLEMODES, 1);
fa9e4066f08beec538e775443c5be79dd423fcabahrens region.setSample(sample);
fa9e4066f08beec538e775443c5be79dd423fcabahrens layer.getRegions().add(region);
fa9e4066f08beec538e775443c5be79dd423fcabahrens SF2Instrument ins = new SF2Instrument(sf2);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ins.setName("Test Instrument");
fa9e4066f08beec538e775443c5be79dd423fcabahrens sf2.addInstrument(ins);
fa9e4066f08beec538e775443c5be79dd423fcabahrens SF2InstrumentRegion insregion = new SF2InstrumentRegion();
fa9e4066f08beec538e775443c5be79dd423fcabahrens insregion.setLayer(layer);
fa9e4066f08beec538e775443c5be79dd423fcabahrens ins.getRegions().add(insregion);
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens return sf2;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens public SoftTestUtils() throws Exception {
fa9e4066f08beec538e775443c5be79dd423fcabahrens stream = synth.openStream(null, null);
fa9e4066f08beec538e775443c5be79dd423fcabahrens synth.unloadAllInstruments(synth.getDefaultSoundbank());
fa9e4066f08beec538e775443c5be79dd423fcabahrens synth.loadAllInstruments(createTestSoundBank());
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens public void close() throws Exception {
fa9e4066f08beec538e775443c5be79dd423fcabahrens stream.close();
fa9e4066f08beec538e775443c5be79dd423fcabahrens stream = null;
fa9e4066f08beec538e775443c5be79dd423fcabahrens synth.close();
fa9e4066f08beec538e775443c5be79dd423fcabahrens synth = null;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens public void read(double seconds) throws IOException
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens int bufflen =
fa9e4066f08beec538e775443c5be79dd423fcabahrens stream.getFormat().getFrameSize() *
fa9e4066f08beec538e775443c5be79dd423fcabahrens (int)(stream.getFormat().getFrameRate() * seconds);
fa9e4066f08beec538e775443c5be79dd423fcabahrens while(bufflen != 0)
fa9e4066f08beec538e775443c5be79dd423fcabahrens {
fa9e4066f08beec538e775443c5be79dd423fcabahrens if(bufflen > 1024)
fa9e4066f08beec538e775443c5be79dd423fcabahrens bufflen -= stream.read(tmpbuffer,0,1024);
fa9e4066f08beec538e775443c5be79dd423fcabahrens else
fa9e4066f08beec538e775443c5be79dd423fcabahrens bufflen -= stream.read(tmpbuffer,0, bufflen);
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens public VoiceStatus findVoice(int channel, int note) {
fa9e4066f08beec538e775443c5be79dd423fcabahrens VoiceStatus[] v = synth.getVoiceStatus();
fa9e4066f08beec538e775443c5be79dd423fcabahrens for (int k = 0; k < v.length; k++)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if(v[k].active)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if(v[k].channel == channel)
fa9e4066f08beec538e775443c5be79dd423fcabahrens if(v[k].note == note)
fa9e4066f08beec538e775443c5be79dd423fcabahrens return v[k];
fa9e4066f08beec538e775443c5be79dd423fcabahrens return null;
fa9e4066f08beec538e775443c5be79dd423fcabahrens }
fa9e4066f08beec538e775443c5be79dd423fcabahrens
fa9e4066f08beec538e775443c5be79dd423fcabahrens}
fa9e4066f08beec538e775443c5be79dd423fcabahrens