gt: 					for(int v = loVel;v<=hiVel;v++)
context: /*
   * Created on Sep 24, 2004
   *
   * Copyright (c) 2005 Peter Johan Salomonsen (http://www.petersalomonsen.com)
   * 
   * http://www.frinika.com
   * 
   * This file is part of Frinika.
   * 
   * Frinika is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * Frinika is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with Frinika; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  package com.frinika.synth.importers.soundfont;
  import java.io.*;
  
  import com.frinika.synth.synths.MySampler;
  import com.frinika.synth.synths.sampler.settings.sampledsoundsettingversions.SampledSound20050403;
  
  /**
   * @author Peter Johan Salomonsen
   *
   */
  public class SoundFontImporter {
  	FileInputStream fis;
  	long size;
  	
  	public short globalRelease;
  	
  	public File file;
  	INSTChunk inst;
  	IBAGChunk ibag;
  	IGENChunk igen;
  	IMODChunk imod;
  	SHDRChunk shdr;
  	Chunk chSmpl;
  	
  	int instrumentIndex;
  	
  	MySampler sampler;
  	
  	public SoundFontImporter(MySampler sampler)
  	{
  		this.sampler = sampler;
  	}
  
  	public void getSoundFont(File file) throws Exception
  	{
  		this.file = file;
  
          fis = new FileInputStream(file);
  		chSmpl = new Chunk(fis,"smpl");
  		fis.skip(chSmpl.length);
  	
  		new PHDRChunk(fis);
  		inst = new INSTChunk(fis);
  		ibag = new IBAGChunk(fis);
  		imod = new IMODChunk(fis);
  		igen = new IGENChunk(fis);
  		shdr = new SHDRChunk(fis);
  		
  		fis.close();
  	}
  	
  	public String[] getInstrumentNames()
  	{
  		return(inst.names);
  	}
  	
  	public void getInstrument(int InstrNo) throws Exception
  	{
  		instrumentIndex = InstrNo;
  		sampler.setInstrumentName(inst.names[InstrNo]);
  		int ibagIndex = inst.instBagNdx[InstrNo];
  		int nextIbagIndex = inst.instBagNdx[InstrNo+1];
  		//System.out.println("IBAG index: "+ibagIndex);
  		//System.out.println("Next IBAG index: "+nextIbagIndex);
  		
  		for(int z = ibagIndex;z<nextIbagIndex;z++)
  		{
  			//System.out.println("Zone: "+z);
  
  			int instGenNdx =ibag.instGenNdx[z]; 
  			int nextInstGenNdx =ibag.instGenNdx[z+1]; 
  			
  			//System.out.println("Gen index: "+instGenNdx);
  			//System.out.println("Next gen index: "+nextInstGenNdx);
  
  			int hiKey = 199;
  			int loKey = 0;
  			int hiVel = 127;
  			int loVel = 0;
  			int rootKey = -1;
  			int sampleRate = 0;
  			int loopStart = 0;
  			int loopEnd = 0;
  			int sampleMode = 0;
  			int fineTune = 0;
              int scaleTune = 100;
              int exclusiveClass = 0;
  			String sampleName = null;
  			
  			short[] sampleData = null;
  			int sampleType = 0;
  			
  			for(int n = instGenNdx;n<nextInstGenNdx;n++)
  			{
  				if(igen.sfGenOper[n]==38)
  				{
  					globalRelease = (short)igen.genAmount[n];
  				}
  				if(igen.sfGenOper[n]==43)
  				{
  					//System.out.println(n+" sfGenOper: "+igen.sfGenOper[n]);
  					//System.out.println(n+" genAmount: "+Integer.toHexString(igen.genAmount[n]));
  					//System.out.println(n+" hi key: "+(igen.genAmount[n] >> 8));
  					//System.out.println(n+" lo key: "+(igen.genAmount[n] & 0xff));
  					hiKey = igen.genAmount[n] >> 8;
  					loKey = igen.genAmount[n] & 0xff;
  				}
  				if(igen.sfGenOper[n]==44)
  				{
  					//System.out.println(n+" sfGenOper: "+igen.sfGenOper[n]);
  					//System.out.println(n+" genAmount: "+Integer.toHexString(igen.genAmount[n]));
  					//System.out.println(n+" hi vel: "+(igen.genAmount[n] >> 8));
  					//System.out.println(n+" lo vel: "+(igen.genAmount[n] & 0xff));
  					hiVel = igen.genAmount[n] >> 8;
  					loVel = igen.genAmount[n] & 0xff;
  				}
                  if(igen.sfGenOper[n]==56)
                  {
                      //System.out.println("scale tune: "+igen.genAmount[n]);
                      scaleTune = igen.genAmount[n];
                  }
                  if(igen.sfGenOper[n]==57)
                  {
                      System.out.println("exclusive: "+igen.genAmount[n]);
                      exclusiveClass = igen.genAmount[n];
                  }
                  if(igen.sfGenOper[n]==58)
  				{
  					//System.out.println("root key: "+igen.genAmount[n]);
  					rootKey = igen.genAmount[n];
  				}
  				if(igen.sfGenOper[n]==54)
  				{
  					sampleMode = igen.genAmount[n];
  				}
  				if(igen.sfGenOper[n]==52)
  				{
  					fineTune = (short)igen.genAmount[n];
  				}
  
  				if(igen.sfGenOper[n]==53)
  				{
  					//System.out.println(n+" sfGenOper: "+igen.sfGenOper[n]);
  					//System.out.println(n+" genAmount: "+Integer.toHexString(igen.genAmount[n]));
  //					System.out.println(n+" SampleName: "+shdr.names[igen.genAmount[n]]);
  					sampleRate = shdr.sampleRate[igen.genAmount[n]];
  					sampleType = shdr.sfSampleType[igen.genAmount[n]];
  					loopStart = shdr.sampleStartLoop[igen.genAmount[n]]-shdr.sampleStart[igen.genAmount[n]];
  					loopEnd = shdr.sampleEndLoop[igen.genAmount[n]]-shdr.sampleStart[igen.genAmount[n]];					
  
  					if(rootKey == -1)
  						rootKey = shdr.originalPitch[igen.genAmount[n]];
  					if(shdr.samples[igen.genAmount[n]] == null)
  					{
  						FileInputStream fis = new FileInputStream(file);
  						chSmpl = new Chunk(fis,"smpl");
  						sampleData = new short[shdr.sampleEnd[igen.genAmount[n]]
  											   -shdr.sampleStart[igen.genAmount[n]]];
  						fis.skip(shdr.sampleStart[igen.genAmount[n]]*2);
  						byte bSample[] = new byte[sampleData.length*2];
  				
  						fis.read(bSample);
  				
  						for(int sCount=0;sCount<bSample.length;sCount+=2)
  							sampleData[sCount/2] = (short)((0xff & bSample[sCount+0]) + ((0xff & bSample[sCount+1]) * 256));
  						fis.close();
  				
  						shdr.samples[igen.genAmount[n]] = sampleData;
  					}
  					else
  						 sampleData = shdr.samples[igen.genAmount[n]];
  					
  					sampleName = shdr.names[igen.genAmount[n]];
  				}
  			}
  			
  			/*
  			 * monoSample = 1, rightSample = 2, leftSample = 4, linkedSample = 8, RomMonoSample = 32769, RomRightSample = 32770
  			 * At this moment only support for type sampleType 1,2,4
  			 */
  			if(sampleData!=null && 
  					(sampleType==1 || 
  					 sampleType==2 ||
  					 sampleType==4))
  			{
  				for(int n = loKey;n<=hiKey; n++)
  				{
  