Home | History | Annotate | Download | only in audio
      1 /*
      2  * Copyright (c) 2009-2010 jMonkeyEngine
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions are
      7  * met:
      8  *
      9  * * Redistributions of source code must retain the above copyright
     10  *   notice, this list of conditions and the following disclaimer.
     11  *
     12  * * Redistributions in binary form must reproduce the above copyright
     13  *   notice, this list of conditions and the following disclaimer in the
     14  *   documentation and/or other materials provided with the distribution.
     15  *
     16  * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
     17  *   may be used to endorse or promote products derived from this software
     18  *   without specific prior written permission.
     19  *
     20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 
     33 package com.jme3.audio;
     34 
     35 import com.jme3.math.FastMath;
     36 
     37 /**
     38  * Audio environment, for reverb effects.
     39  * @author Kirill
     40  */
     41 public class Environment {
     42 
     43     private float airAbsorbGainHf   = 0.99426f;
     44     private float roomRolloffFactor = 0;
     45 
     46     private float decayTime         = 1.49f;
     47     private float decayHFRatio      = 0.54f;
     48 
     49     private float density           = 1.0f;
     50     private float diffusion         = 0.3f;
     51 
     52     private float gain              = 0.316f;
     53     private float gainHf            = 0.022f;
     54 
     55     private float lateReverbDelay   = 0.088f;
     56     private float lateReverbGain    = 0.768f;
     57 
     58     private float reflectDelay      = 0.162f;
     59     private float reflectGain       = 0.052f;
     60 
     61     private boolean decayHfLimit    = true;
     62 
     63     public static final Environment Garage, Dungeon, Cavern, AcousticLab, Closet;
     64 
     65     static {
     66         Garage = new Environment(1, 1, 1, 1, .9f, .5f, .751f, .0039f, .661f, .0137f);
     67         Dungeon = new Environment(.75f, 1, 1, .75f, 1.6f, 1, 0.95f, 0.0026f, 0.93f, 0.0103f);
     68         Cavern = new Environment(.5f, 1, 1, .5f, 2.25f, 1, .908f, .0103f, .93f, .041f);
     69         AcousticLab = new Environment(.5f, 1, 1, 1, .28f, 1, .87f, .002f, .81f, .008f);
     70         Closet = new Environment(1, 1, 1, 1, .15f, 1, .6f, .0025f, .5f, .0006f);
     71     }
     72 
     73     private static final float eaxDbToAmp(float eaxDb){
     74         float dB = eaxDb / 2000f;
     75         return FastMath.pow(10f, dB);
     76     }
     77 
     78     public Environment(){
     79     }
     80 
     81     public Environment(Environment source) {
     82         this.airAbsorbGainHf = source.airAbsorbGainHf;
     83         this.roomRolloffFactor = source.roomRolloffFactor;
     84         this.decayTime = source.decayTime;
     85         this.decayHFRatio = source.decayHFRatio;
     86         this.density = source.density;
     87         this.diffusion = source.diffusion;
     88         this.gain = source.gain;
     89         this.gainHf = source.gainHf;
     90         this.lateReverbDelay = source.lateReverbDelay;
     91         this.lateReverbGain = source.lateReverbGain;
     92         this.reflectDelay = source.reflectDelay;
     93         this.reflectGain = source.reflectGain;
     94         this.decayHfLimit = source.decayHfLimit;
     95     }
     96 
     97     public Environment(float density, float diffusion, float gain, float gainHf,
     98                        float decayTime, float decayHf, float reflGain,
     99                        float reflDelay, float lateGain, float lateDelay){
    100         this.decayTime = decayTime;
    101         this.decayHFRatio = decayHf;
    102         this.density = density;
    103         this.diffusion = diffusion;
    104         this.gain = gain;
    105         this.gainHf = gainHf;
    106         this.lateReverbDelay = lateDelay;
    107         this.lateReverbGain = lateGain;
    108         this.reflectDelay = reflDelay;
    109         this.reflectGain = reflGain;
    110     }
    111 
    112     public Environment(float[] e){
    113         if (e.length != 28)
    114             throw new IllegalArgumentException("Not an EAX preset");
    115 
    116         // skip env id
    117         // e[0]
    118         // skip room size
    119         // e[1]
    120 
    121 //        density = 0;
    122         diffusion = e[2];
    123         gain = eaxDbToAmp(e[3]); // convert
    124         gainHf = eaxDbToAmp(e[4]) / eaxDbToAmp(e[5]); // convert
    125         decayTime = e[6];
    126         decayHFRatio = e[7] / e[8];
    127         reflectGain = eaxDbToAmp(e[9]); // convert
    128         reflectDelay = e[10];
    129 
    130         // skip 3 pan values
    131         // e[11] e[12] e[13]
    132 
    133         lateReverbGain = eaxDbToAmp(e[14]); // convert
    134         lateReverbDelay = e[15];
    135 
    136         // skip 3 pan values
    137         // e[16] e[17] e[18]
    138 
    139         // skip echo time, echo damping, mod time, mod damping
    140         // e[19] e[20] e[21] e[22]
    141 
    142         airAbsorbGainHf = eaxDbToAmp(e[23]);
    143 
    144         // skip HF Reference and LF Reference
    145         // e[24] e[25]
    146 
    147         roomRolloffFactor = e[26];
    148 
    149         // skip flags
    150         // e[27]
    151     }
    152 
    153     public float getAirAbsorbGainHf() {
    154         return airAbsorbGainHf;
    155     }
    156 
    157     public void setAirAbsorbGainHf(float airAbsorbGainHf) {
    158         this.airAbsorbGainHf = airAbsorbGainHf;
    159     }
    160 
    161     public float getDecayHFRatio() {
    162         return decayHFRatio;
    163     }
    164 
    165     public void setDecayHFRatio(float decayHFRatio) {
    166         this.decayHFRatio = decayHFRatio;
    167     }
    168 
    169     public boolean isDecayHfLimit() {
    170         return decayHfLimit;
    171     }
    172 
    173     public void setDecayHfLimit(boolean decayHfLimit) {
    174         this.decayHfLimit = decayHfLimit;
    175     }
    176 
    177     public float getDecayTime() {
    178         return decayTime;
    179     }
    180 
    181     public void setDecayTime(float decayTime) {
    182         this.decayTime = decayTime;
    183     }
    184 
    185     public float getDensity() {
    186         return density;
    187     }
    188 
    189     public void setDensity(float density) {
    190         this.density = density;
    191     }
    192 
    193     public float getDiffusion() {
    194         return diffusion;
    195     }
    196 
    197     public void setDiffusion(float diffusion) {
    198         this.diffusion = diffusion;
    199     }
    200 
    201     public float getGain() {
    202         return gain;
    203     }
    204 
    205     public void setGain(float gain) {
    206         this.gain = gain;
    207     }
    208 
    209     public float getGainHf() {
    210         return gainHf;
    211     }
    212 
    213     public void setGainHf(float gainHf) {
    214         this.gainHf = gainHf;
    215     }
    216 
    217     public float getLateReverbDelay() {
    218         return lateReverbDelay;
    219     }
    220 
    221     public void setLateReverbDelay(float lateReverbDelay) {
    222         this.lateReverbDelay = lateReverbDelay;
    223     }
    224 
    225     public float getLateReverbGain() {
    226         return lateReverbGain;
    227     }
    228 
    229     public void setLateReverbGain(float lateReverbGain) {
    230         this.lateReverbGain = lateReverbGain;
    231     }
    232 
    233     public float getReflectDelay() {
    234         return reflectDelay;
    235     }
    236 
    237     public void setReflectDelay(float reflectDelay) {
    238         this.reflectDelay = reflectDelay;
    239     }
    240 
    241     public float getReflectGain() {
    242         return reflectGain;
    243     }
    244 
    245     public void setReflectGain(float reflectGain) {
    246         this.reflectGain = reflectGain;
    247     }
    248 
    249     public float getRoomRolloffFactor() {
    250         return roomRolloffFactor;
    251     }
    252 
    253     public void setRoomRolloffFactor(float roomRolloffFactor) {
    254         this.roomRolloffFactor = roomRolloffFactor;
    255     }
    256 }
    257