/* * Copyright (C) 2011 in-somnia * * This file is part of JAAD. * * JAAD is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * JAAD 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 Lesser General * Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. * If not, see <http://www.gnu.org/licenses/>. */ package net.sourceforge.jaad.aac.ps; //mapping methods class Utils { static void remap34(int[][] out, int[][] in, int parCount, int envCount, boolean full) { int e; if(parCount==20||parCount==11) { for(e = 0; e<envCount; e++) { map20To34(out[e], in[e], full); } } else if(parCount==10||parCount==5) { for(e = 0; e<envCount; e++) { map10To34(out[e], in[e], full); } } else { //copy for(e = 0; e<in.length; e++) { System.arraycopy(in[e], 0, out[e], 0, in[e].length); } } } static void remap20(int[][] out, int[][] in, int parCount, int envCount, boolean full) { int e; if(parCount==34||parCount==17) { for(e = 0; e<envCount; e++) { map34To20(out[e], in[e], full); } } else if(parCount==10||parCount==5) { for(e = 0; e<envCount; e++) { map10To20(out[e], in[e], full); } } else { //copy for(e = 0; e<in.length; e++) { System.arraycopy(in[e], 0, out[e], 0, in[e].length); } } } private static void map20To34(int[] out, int[] in, boolean full) { if(full) { out[33] = in[19]; out[32] = in[19]; out[31] = in[18]; out[30] = in[18]; out[29] = in[18]; out[28] = in[18]; out[27] = in[17]; out[26] = in[17]; out[25] = in[16]; out[24] = in[16]; out[23] = in[15]; out[22] = in[15]; out[21] = in[14]; out[20] = in[14]; out[19] = in[13]; out[18] = in[12]; out[17] = in[11]; } out[16] = in[10]; out[15] = in[9]; out[14] = in[9]; out[13] = in[8]; out[12] = in[8]; out[11] = in[7]; out[10] = in[6]; out[9] = in[5]; out[8] = in[5]; out[7] = in[4]; out[6] = in[4]; out[5] = in[3]; out[4] = (in[2]+in[3])/2; out[3] = in[2]; out[2] = in[1]; out[1] = (in[0]+in[1])/2; out[0] = in[0]; } private static void map10To34(int[] out, int[] in, boolean full) { if(full) { out[33] = in[9]; out[32] = in[9]; out[31] = in[9]; out[30] = in[9]; out[29] = in[9]; out[28] = in[9]; out[27] = in[8]; out[26] = in[8]; out[25] = in[8]; out[24] = in[8]; out[23] = in[7]; out[22] = in[7]; out[21] = in[7]; out[20] = in[7]; out[19] = in[6]; out[18] = in[6]; out[17] = in[5]; out[16] = in[5]; } else out[16] = 0; out[15] = in[4]; out[14] = in[4]; out[13] = in[4]; out[12] = in[4]; out[11] = in[3]; out[10] = in[3]; out[9] = in[2]; out[8] = in[2]; out[7] = in[2]; out[6] = in[2]; out[5] = in[1]; out[4] = in[1]; out[3] = in[1]; out[2] = in[0]; out[1] = in[0]; out[0] = in[0]; } private static void map34To20(int[] out, int[] in, boolean full) { out[0] = (2*in[0]+in[1])/3; out[1] = (in[1]+2*in[2])/3; out[2] = (2*in[ 3]+in[4])/3; out[3] = (in[4]+2*in[5])/3; out[4] = (in[6]+in[7])/2; out[5] = (in[8]+in[9])/2; out[6] = in[10]; out[7] = in[11]; out[8] = (in[12]+in[13])/2; out[9] = (in[14]+in[15])/2; out[10] = in[16]; if(full) { out[11] = in[17]; out[12] = in[18]; out[13] = in[19]; out[14] = (in[20]+in[21])/2; out[15] = (in[22]+in[23])/2; out[16] = (in[24]+in[25])/2; out[17] = (in[26]+in[27])/2; out[18] = (in[28]+in[29]+in[30]+in[31])/4; out[19] = (in[32]+in[33])/2; } } private static void map10To20(int[] out, int[] in, boolean full) { int b; if(full) b = 9; else { b = 4; out[10] = 0; } while(b>=0) { out[2*b+1] = out[2*b] = in[b]; b--; } } static void map20To34Float(float[] f) { f[33] = f[19]; f[32] = f[19]; f[31] = f[18]; f[30] = f[18]; f[29] = f[18]; f[28] = f[18]; f[27] = f[17]; f[26] = f[17]; f[25] = f[16]; f[24] = f[16]; f[23] = f[15]; f[22] = f[15]; f[21] = f[14]; f[20] = f[14]; f[19] = f[13]; f[18] = f[12]; f[17] = f[11]; f[16] = f[10]; f[15] = f[9]; f[14] = f[9]; f[13] = f[8]; f[12] = f[8]; f[11] = f[7]; f[10] = f[6]; f[9] = f[5]; f[8] = f[5]; f[7] = f[4]; f[6] = f[4]; f[5] = f[3]; f[4] = (f[2]+f[3])*0.5f; f[3] = f[2]; f[2] = f[1]; f[1] = (f[0]+f[1])*0.5f; f[0] = f[0]; } static void map34To20Float(float[] f) { f[0] = (2*f[0]+f[1])*0.33333333f; f[1] = (f[1]+2*f[2])*0.33333333f; f[2] = (2*f[ 3]+f[4])*0.33333333f; f[3] = (f[4]+2*f[5])*0.33333333f; f[4] = (f[6]+f[7])*0.5f; f[5] = (f[8]+f[9])*0.5f; f[6] = f[10]; f[7] = f[11]; f[8] = (f[12]+f[13])*0.5f; f[9] = (f[14]+f[15])*0.5f; f[10] = f[16]; f[11] = f[17]; f[12] = f[18]; f[13] = f[19]; f[14] = (f[20]+f[21])*0.5f; f[15] = (f[22]+f[23])*0.5f; f[16] = (f[24]+f[25])*0.5f; f[17] = (f[26]+f[27])*0.5f; f[18] = (f[28]+f[29]+f[30]+f[31])*0.25f; f[19] = (f[32]+f[33])*0.5f; } static void deltaDecode(int[] pars, int parCount, int[] parsPrev, boolean time, boolean enabled, int stride, int min, int max) { int i; if(enabled) { if(time) { for(i = 0; i<parCount; i++) { pars[i] = parsPrev[i*stride]+pars[i]; pars[i] = Math.min(Math.max(pars[i], min), max); } } else { pars[0] = Math.min(Math.max(pars[0], min), max); for(i = 1; i<parCount; i++) { pars[i] = pars[i-1]+pars[i]; pars[i] = Math.min(Math.max(pars[i], min), max); } } } else { for(i = 0; i<parCount; i++) { pars[i] = 0; } } //coarse if(stride==2) { for(i = (parCount<<1)-1; i>0; i--) { pars[i] = pars[i>>1]; } } } static void deltaModuloDecode(int[] pars, int parCount, int[] parsPrev, boolean time, boolean enable) { int i; if(enable) { if(time) { for(i = 0; i<parCount; i++) { pars[i] = parsPrev[i]+pars[i]; pars[i] &= 7; } } else { pars[0] &= 7; for(i = 1; i<parCount; i++) { pars[i] = pars[i-1]+pars[i]; pars[i] &= 7; } } } else { for(i = 0; i<parCount; i++) { pars[i] = 0; } } } }