import java.util.ArrayList; import jm.util.Write; public class HRTFRenderer { private String filename; private Node node; //private static int windowLength = 256; //private String hrtf_files = "db/cipic/CIPIC_hrtf_database/standard_hrir_database/subject_009/"; //private IHRIRLoader hrirLoaderCIPIC = new HRIRLoaderCIPIC(hrtf_files); private String hrtf_listen = "/home/lodsb/Downloads/listen/COMPENSATED/WAV/IRC_1002_C/"; private IHRIRLoader hrirLoaderListen = new HRIRLoaderListen(hrtf_listen, "IRC_1002_C_R0195"); private static IHRIRLoader hrirLoader; public boolean normalizeSum = false; public HRTFRenderer(Node listenerNode, String filename, boolean normalizeSum) { this.node = listenerNode; this.filename = filename; this.normalizeSum = normalizeSum; hrirLoader = hrirLoaderListen; } public static IHRIRLoader getHRIRRenderer() { return hrirLoader; } public void render() { ArrayList<Float>[] channels = node.getChannels(); System.out.println("Rendering "+channels.length+" channels of audio HRTF'd..."); float[] out = null; int channelNr = 0; for(ArrayList<Float> channel : channels) { // copy from arraylist float[] samples = new float[channel.size()]; int idx = 0; for(float sample: channel) { samples[idx] = sample; idx++; } // init sum buffer (left+right samples) if(out == null) { out = new float[samples.length*2]; } // setup loc+buf float[] azAndElev = node.azimuthAndElevation.get(channelNr); //azAndElev[0] = azAndElev[0] * 180.0f; //azAndElev[1] = azAndElev[1] * 180.0f; double[][][] ir = this.hrirLoader.getImpulseResponses(azAndElev[0],azAndElev[1]); HRTFConv hrtf = new HRTFConv(ir); float[] tmpRight = new float[samples.length]; float[] tmpLeft = new float[samples.length]; hrtf.process(samples, tmpLeft, tmpRight); for(int i = 0; i < tmpLeft.length; i++) { out[2*i] += tmpLeft[i]; out[2*i+1] += tmpRight[i]; } channelNr++; } if(normalizeSum == true) { // Normalize float max = Float.MIN_VALUE; for(int i= 0; i < out.length; i++) { if(out[i] > max) { max = out[i]; } } for(int i= 0; i < out.length; i++) { out[i] = out[i]/max; } } Write.audio(out, this.filename, 2, 44100, 32); } }