static void Round(SounderEffect e, int decimalPlaces)
        {
            e.flangerAmplitude   = (float)System.Math.Round(e.flangerAmplitude, decimalPlaces);
            e.flangerOffset      = (float)System.Math.Round(e.flangerOffset, decimalPlaces);
            e.flangerOffsetDelta = (float)System.Math.Round(e.flangerOffsetDelta, decimalPlaces);
            e.LFOAmplitude       = (float)System.Math.Round(e.LFOAmplitude, decimalPlaces);
            e.LFOFrequency       = (float)System.Math.Round(e.LFOFrequency, decimalPlaces);
            e.Q = (float)System.Math.Round(e.Q, decimalPlaces);

            e.AmplitudeData.attackAmplitude  = (float)System.Math.Round(e.AmplitudeData.attackAmplitude, decimalPlaces);
            e.AmplitudeData.attackTime       = (float)System.Math.Round(e.AmplitudeData.attackTime, decimalPlaces);
            e.AmplitudeData.decayTime        = (float)System.Math.Round(e.AmplitudeData.decayTime, decimalPlaces);
            e.AmplitudeData.sustainAmplitude = (float)System.Math.Round(e.AmplitudeData.sustainAmplitude, decimalPlaces);
            e.AmplitudeData.sustainTime      = (float)System.Math.Round(e.AmplitudeData.sustainTime, decimalPlaces);
            e.AmplitudeData.releaseTime      = (float)System.Math.Round(e.AmplitudeData.releaseTime, decimalPlaces);

            e.FrequencyData.range.min  = (float)System.Math.Round(e.FrequencyData.range.min, decimalPlaces);
            e.FrequencyData.range.max  = (float)System.Math.Round(e.FrequencyData.range.max, decimalPlaces);
            e.FrequencyData.frequency  = (float)System.Math.Round(e.FrequencyData.frequency, decimalPlaces);
            e.FrequencyData.delta      = (float)System.Math.Round(e.FrequencyData.delta, decimalPlaces);
            e.FrequencyData.deltaAccel = (float)System.Math.Round(e.FrequencyData.deltaAccel, decimalPlaces);

            for (int iii = 0; iii < e.FrequencyData.jumps.Length; iii++)
            {
                e.FrequencyData.jumps[iii].repeatTime = (float)System.Math.Round(e.FrequencyData.jumps[iii].repeatTime, decimalPlaces);
                e.FrequencyData.jumps[iii].start      = (float)System.Math.Round(e.FrequencyData.jumps[iii].start, decimalPlaces);
                e.FrequencyData.jumps[iii].value      = (float)System.Math.Round(e.FrequencyData.jumps[iii].value, decimalPlaces);
            }
        }
        public static SounderEffect Explosion()
        {
            SounderEffect e = ScriptableObject.CreateInstance <SounderEffect>();

            e.waveForm = Oscillator.WaveForm.Noise;

            e.AmplitudeData.attackTime       = RandomMulti(.0f, .01f, 3);
            e.AmplitudeData.attackAmplitude  = 1.0f;
            e.AmplitudeData.decayTime        = RandomMulti(.01f, .06f, 3);
            e.AmplitudeData.sustainAmplitude = .5f;
            e.AmplitudeData.sustainTime      = RandomMulti(.0f, .2f, 1);
            e.AmplitudeData.releaseTime      = RandomMulti(.1f, .5f, 3);

            e.FrequencyData.range     = new Range(0.0f, 1.0f);
            e.FrequencyData.frequency = RandomMulti(.01f, .04f, 2);

            if (RandomChance(.2f))
            {
                e.LFOForm      = GetRandomWaveForm();
                e.LFOAmplitude = RandomMulti(.05f, .1f, 2);
                e.LFOFrequency = RandomMulti(5.0f, 50.0f, 4);
            }

            if (RandomChance(.33f))
            {
                e.highPass = Random.Range(0, 200);
                e.Q        = Random.Range(.1f, 2.0f);
            }

            Round(e, 4);

            return(e);
        }
        public static SounderEffect Mutate(SounderEffect effect, float amount = .1f)
        {
            SounderEffect e = ScriptableObject.CreateInstance <SounderEffect>();

            e.Copy(effect);

            e.AmplitudeData.attackTime       += Random.Range(-amount, amount);
            e.AmplitudeData.attackAmplitude  += Random.Range(-amount, amount);
            e.AmplitudeData.decayTime        += Random.Range(-amount, amount);
            e.AmplitudeData.sustainAmplitude += Random.Range(-amount, amount);
            e.AmplitudeData.sustainTime      += Random.Range(-amount, amount);
            e.AmplitudeData.releaseTime      += Random.Range(-amount, amount);

            e.FrequencyData.frequency += Random.Range(-amount * 500.0f, amount * 500.0f);

            e.FrequencyData.delta      += Random.Range(-amount * 50.0f, amount * 50.0f);
            e.FrequencyData.deltaAccel += Random.Range(-amount * 10.0f, amount * 10.0f);

            if (e.LFOAmplitude > float.Epsilon)
            {
                if (amount > .5f)
                {
                    e.LFOForm = GetRandomWaveForm();
                }
                e.LFOAmplitude += Random.Range(-amount, amount);
                e.LFOFrequency += Random.Range(-amount * 50.0f, amount * 50.0f);
            }

            if (e.flangerAmplitude > float.Epsilon)
            {
                e.flangerAmplitude   += Random.Range(-amount, amount);
                e.flangerOffset      += Random.Range(-amount, amount);
                e.flangerOffsetDelta += Random.Range(-amount * 2.0f, amount * 2.0f);
            }

            if (e.phaseReset > .0f)
            {
                e.phaseReset += Random.Range(-amount, amount);
            }

            if (e.echoTime > .0f)
            {
                e.echoTime  += Random.Range(-amount, amount);
                e.echoValue += Random.Range(-amount, amount);
            }

            if (e.highPass > 0)
            {
                e.highPass += (int)Random.Range(-amount * 500.0f, amount * 500.0f);
            }
            if (e.lowPass > 0)
            {
                e.lowPass += (int)Random.Range(-amount * 500.0f, amount * 500.0f);
            }

            e.Q += Random.Range(-amount, amount);

            return(e);
        }
        public static SounderEffect Shoot()
        {
            SounderEffect e = ScriptableObject.CreateInstance <SounderEffect>();

            e.waveForm = GetRandomWaveForm(Oscillator.WaveForm.Sawtooth, Oscillator.WaveForm.HarmonicSaw, Oscillator.WaveForm.Square, Oscillator.WaveForm.HarmonicSquare);

            e.FrequencyData.range     = new Range(25.0f, 2000.0f);
            e.FrequencyData.frequency = RandomMulti(75.0f, 1000.0f, 2);

            if (e.FrequencyData.frequency < Random.Range(750.0f, 1250.0f))
            {
                e.FrequencyData.delta = RandomMulti(-500.0f, -100.0f, 2);
            }
            else
            {
                e.FrequencyData.deltaAccel = RandomMulti(-1000.0f, -500.0f, 4);
            }


            e.FrequencyData.curveType = GetRandomCurve(FrequencyData.CurveType.Slope, FrequencyData.CurveType.Linear, FrequencyData.CurveType.Linear, FrequencyData.CurveType.Linear, FrequencyData.CurveType.Linear, FrequencyData.CurveType.Linear);

            if (RandomChance(.5f))
            {
                e.AmplitudeData.attackTime       = .0f;
                e.AmplitudeData.attackAmplitude  = 1.0f;
                e.AmplitudeData.decayTime        = .0f;
                e.AmplitudeData.sustainAmplitude = 1.0f;
                e.AmplitudeData.sustainTime      = RandomMulti(.0f, .05f, 2);
                e.AmplitudeData.releaseTime      = RandomMulti(.05f, .15f, 2);
            }
            else
            {
                e.AmplitudeData.attackTime       = .0f;
                e.AmplitudeData.attackAmplitude  = 1.0f;
                e.AmplitudeData.decayTime        = RandomMulti(.001f, .005f, 5);
                e.AmplitudeData.sustainAmplitude = .5f;
                e.AmplitudeData.sustainTime      = RandomMulti(.0f, .025f, 2);
                e.AmplitudeData.releaseTime      = RandomMulti(.05f, .15f, 2);
            }


            if (RandomChance(.25f))
            {
                e.flangerAmplitude = RandomMulti(.1f, .25f, 4);
                if (RandomChance(.5f))
                {
                    e.flangerOffset = Random.Range(-1.0f, 1.0f);
                }
                else
                {
                    e.flangerOffsetDelta = RandomMulti(-10.0f, .0f, 4);
                }
            }

            Round(e, 2);

            return(e);
        }
示例#5
0
        public FrequencyEditor(SounderEffect e)
        {
            effect = e;
            data   = effect.FrequencyData;

            if (e.FrequencyData.jumps.Length < 1)
            {
                foldoutOpen = false;
            }
        }
        bool DrawPresets()
        {
            EditorGUILayout.Separator();
            SounderEffect preset = null;

            EditorGUILayout.LabelField("Presets");

            string[] presets = new string[] { "Shoot", "Pickup", "Hit", "Explosion", "Blip", "Click", "Tone", "Random" };

            int sel = GUILayout.SelectionGrid(-1, presets, 3);

            if (sel == 0)
            {
                preset = Presets.Shoot();
            }
            else if (sel == 1)
            {
                preset = Presets.Pickup();
            }
            else if (sel == 2)
            {
                preset = Presets.Hit();
            }
            else if (sel == 3)
            {
                preset = Presets.Explosion();
            }
            else if (sel == 4)
            {
                preset = Presets.Blip();
            }
            else if (sel == 5)
            {
                preset = Presets.Click();
            }
            else if (sel == 6)
            {
                preset = Presets.Tone();
            }
            else if (sel == 7)
            {
                preset = Presets.Randomize();
            }

            if (preset != null)
            {
                Undo.RecordObject(effect, "SounderEffect Preset " + presets[sel]);
                effect.Copy(preset);
                DestroyImmediate(preset);
                GUI.changed = true;

                return(true);
            }
            return(false);
        }
        public static SounderEffect Blip()
        {
            SounderEffect e = ScriptableObject.CreateInstance <SounderEffect>();

            e.waveForm = GetRandomWaveForm(Oscillator.WaveForm.Flow, Oscillator.WaveForm.HarmonicSaw, Oscillator.WaveForm.HarmonicSquare, Oscillator.WaveForm.HarmonicTriangle, Oscillator.WaveForm.Roll, Oscillator.WaveForm.Sawtooth, Oscillator.WaveForm.Sine, Oscillator.WaveForm.Square, Oscillator.WaveForm.Triangle);

            e.AmplitudeData.attackTime       = RandomMulti(.0f, .005f, 4);
            e.AmplitudeData.attackAmplitude  = 1.0f;
            e.AmplitudeData.decayTime        = .0f;
            e.AmplitudeData.sustainAmplitude = 1.0f;
            e.AmplitudeData.sustainTime      = RandomMulti(.005f, .01f, 4);
            e.AmplitudeData.releaseTime      = RandomMulti(.0f, .01f, 4);

            e.FrequencyData.range     = new Range(1.0f, 10000.0f);
            e.FrequencyData.frequency = RandomMulti(25.0f, 1000.0f, 1);

            e.FrequencyData.delta      = RandomMulti(0.0f, 20.0f, 3);
            e.FrequencyData.deltaAccel = RandomMulti(-5.0f, 5.0f, 1);

            e.FrequencyData.curveType = FrequencyData.CurveType.Linear;

            if (RandomChance(.5f))
            {
                e.FrequencyData.jumps = new FrequencyJump[1] {
                    new FrequencyJump()
                };
                e.FrequencyData.jumps[0].repeatTime = e.Duration * .5f;
                e.FrequencyData.jumps[0].value      = e.FrequencyData.frequency * Random.Range(.5f, 2.0f);
            }

            if (RandomChance(.5f))
            {
                e.LFOForm      = GetRandomWaveForm(Oscillator.WaveForm.Sine, Oscillator.WaveForm.Roll, Oscillator.WaveForm.Flow, Oscillator.WaveForm.Triangle, Oscillator.WaveForm.HarmonicTriangle);
                e.LFOAmplitude = RandomMulti(.25f, .5f, 2);
                e.LFOFrequency = RandomMulti(25f, 50f, 4);
            }

            if (RandomChance(.5f))
            {
                if (RandomChance(.5f))
                {
                    e.highPass = Random.Range(120, e.FrequencyData.frequency);
                }
                else
                {
                    e.lowPass = Random.Range(e.FrequencyData.frequency, 2000);
                }

                e.Q = Random.Range(.5f, 1.0f);
            }

            Round(e, 2);

            return(e);
        }
        public static SounderEffect Click()
        {
            SounderEffect e = ScriptableObject.CreateInstance <SounderEffect>();

            e.waveForm = GetRandomWaveForm();

            e.AmplitudeData.attackTime       = .0f;
            e.AmplitudeData.attackAmplitude  = 1.0f;
            e.AmplitudeData.decayTime        = .0f;
            e.AmplitudeData.sustainAmplitude = 1.0f;
            e.AmplitudeData.sustainTime      = .0f;
            e.AmplitudeData.releaseTime      = .005f;

            if (e.waveForm == Oscillator.WaveForm.Noise)
            {
                e.FrequencyData.range     = new Range(.0f, 20000.0f);
                e.FrequencyData.frequency = RandomMulti(.0025f, .01f, 2);
            }
            else
            {
                if (RandomChance(.5f))
                {
                    e.FrequencyData.range     = new Range(.0f, 20000.0f);
                    e.FrequencyData.frequency = RandomMulti(75.0f, 150.0f, 6);
                    if (RandomChance(.33f))
                    {
                        e.FrequencyData.delta = RandomMulti(50000.0f, 100000.0f, 6);
                    }
                }
                else
                {
                    e.FrequencyData.range     = new Range(.0f, 20000.0f);
                    e.FrequencyData.frequency = RandomMulti(750.0f, 1500.0f, 6);
                    e.FrequencyData.delta     = RandomMulti(-100000.0f, -50000.0f, 6);
                }
            }

            e.FrequencyData.curveType = FrequencyData.CurveType.Linear;

            if (RandomChance(.1f))
            {
                e.echoTime  = .004f;
                e.echoValue = .5f;
                e.echoCount = 3;
            }

            e.lowPass = Random.Range(100.0f, 10000.0f);
            e.Q       = .05f;

            Round(e, 2);

            return(e);
        }
        public static SounderEffect Pickup()
        {
            SounderEffect e = ScriptableObject.CreateInstance <SounderEffect>();

            e.waveForm = GetRandomWaveForm(Oscillator.WaveForm.Sine, Oscillator.WaveForm.HarmonicSaw, Oscillator.WaveForm.Triangle, Oscillator.WaveForm.HarmonicTriangle, Oscillator.WaveForm.Flow);

            e.AmplitudeData.attackTime       = RandomMulti(.005f, .02f, 3);
            e.AmplitudeData.attackAmplitude  = 1.0f;
            e.AmplitudeData.decayTime        = .0f;
            e.AmplitudeData.sustainAmplitude = 1.0f;
            e.AmplitudeData.sustainTime      = RandomMulti(.0f, .1f, 3);
            e.AmplitudeData.releaseTime      = RandomMulti(.05f, .15f, 3);

            e.FrequencyData.range     = new Range(20.0f, 5000.0f);
            e.FrequencyData.frequency = Random.Range(20.0f, 1000.0f);

            if (RandomChance(.0f))
            {
                e.FrequencyData.delta      = RandomMulti(0.0f, 50.0f, 10);
                e.FrequencyData.deltaAccel = Random.Range(-5.0f, 5.0f);

                e.FrequencyData.curveType = GetRandomCurve(FrequencyData.CurveType.Square, FrequencyData.CurveType.Hook);
            }
            else
            {
                FrequencyJump[] jumps = new FrequencyJump[1];
                for (int iii = 0; iii < jumps.Length; iii++)
                {
                    jumps[iii]            = new FrequencyJump();
                    jumps[iii].repeatTime = RandomMulti(.01f, .1f, iii + 1);
                    jumps[iii].value      = RandomMulti(1.0f, 50.0f, 2);
                }
                e.FrequencyData.jumps = jumps;

                e.FrequencyData.curveType = GetRandomCurve(FrequencyData.CurveType.Slope, FrequencyData.CurveType.Square, FrequencyData.CurveType.Square, FrequencyData.CurveType.Hook);
            }

            if (RandomChance(.25f))
            {
                e.echoTime  = Random.Range(e.Duration * .05f, e.Duration);
                e.echoValue = RandomMulti(.1f, .2f, 3);
            }

            if (RandomChance(.7f))
            {
                e.highPass = (int)(e.FrequencyData.frequency * Random.Range(.5f, 1.5f));
            }

            Round(e, 2);

            return(e);
        }
    /// <summary>Copies the data from other into this Effect</summary>
    public void Copy(SounderEffect other)
    {
        name = other.name;

        SampleRate = other.SampleRate;
        waveForm   = other.waveForm;

        amplitudeManualCurve = other.amplitudeManualCurve;
        frequencyManualCurve = other.frequencyManualCurve;

        flangerAmplitude   = other.flangerAmplitude;
        flangerOffset      = other.flangerOffset;
        flangerOffsetDelta = other.flangerOffsetDelta;

        LFOForm      = other.LFOForm;
        LFOAmplitude = other.LFOAmplitude;
        LFOFrequency = other.LFOFrequency;

        delay = other.delay;

        echoTime  = other.echoTime;
        echoValue = other.echoValue;
        echoCount = other.echoCount;

        lowPass  = other.lowPass;
        Q        = other.Q;
        highPass = other.highPass;

        AmplitudeData.Copy(other.AmplitudeData);
        FrequencyData.Copy(other.FrequencyData);

        if (amplitudeManualCurve)
        {
            amplitudeAniCurve = new AnimationCurve(other.amplitudeAniCurve.keys);
        }
        else
        {
            amplitudeAniCurve = null;
        }

        if (frequencyManualCurve)
        {
            frequencyAniCurve = new AnimationCurve(other.frequencyAniCurve.keys);
        }
        else
        {
            frequencyAniCurve = null;
        }
    }
        public static SounderEffect Hit()
        {
            SounderEffect e = ScriptableObject.CreateInstance <SounderEffect>();

            e.waveForm = GetRandomWaveForm();

            e.AmplitudeData.attackTime       = .0f;
            e.AmplitudeData.attackAmplitude  = 1.0f;
            e.AmplitudeData.decayTime        = .0f;
            e.AmplitudeData.sustainAmplitude = 1.0f;
            e.AmplitudeData.sustainTime      = .0f;
            e.AmplitudeData.releaseTime      = RandomMulti(.01f, .05f, 3);

            e.FrequencyData.range     = new Range(1.0f, 500.0f);
            e.FrequencyData.frequency = RandomMulti(25.0f, 125.0f, 4);

            e.FrequencyData.delta = RandomMulti(-500.0f, -250.0f, 2);

            e.FrequencyData.curveType = GetRandomCurve();

            if (RandomChance(.9f))
            {
                e.LFOForm      = Oscillator.WaveForm.Noise;
                e.LFOAmplitude = RandomMulti(.10f, .25f, 4);
                e.LFOFrequency = Random.Range(.01f, .1f);
            }
            else
            {
                e.LFOForm      = GetRandomWaveForm(Oscillator.WaveForm.HarmonicSaw, Oscillator.WaveForm.HarmonicSquare, Oscillator.WaveForm.HarmonicTriangle, Oscillator.WaveForm.Flow);
                e.LFOAmplitude = RandomMulti(.5f, 1.0f, 1);
                e.LFOFrequency = RandomMulti(25.0f, 50.0f, 4);
            }

            if (RandomChance(.33f))
            {
                e.echoTime  = e.AmplitudeData.releaseTime + Random.Range(-.01f, .05f);
                e.echoValue = RandomMulti(.1f, .2f, 3);
                e.echoCount = Random.Range(1, 4);;
            }


            Round(e, 2);

            return(e);
        }
 public bool ContainsSub(SounderEffect test)
 {
     if (SubEffects == null)
     {
         return(false);
     }
     if (SubEffects.Contains(test))
     {
         return(true);
     }
     for (int iii = 0; iii < SubEffects.Count; iii++)
     {
         if (SubEffects[iii] != null && SubEffects[iii].ContainsSub(test))
         {
             return(true);
         }
     }
     return(false);
 }
        public static SounderEffect Tone()
        {
            SounderEffect e = ScriptableObject.CreateInstance <SounderEffect>();

            e.waveForm = GetRandomWaveForm(Oscillator.WaveForm.Flow, Oscillator.WaveForm.HarmonicSaw, Oscillator.WaveForm.HarmonicSquare, Oscillator.WaveForm.HarmonicTriangle, Oscillator.WaveForm.Roll, Oscillator.WaveForm.Sawtooth, Oscillator.WaveForm.Sine, Oscillator.WaveForm.Square, Oscillator.WaveForm.Triangle);

            e.AmplitudeData.attackTime       = .05f;
            e.AmplitudeData.attackAmplitude  = 1.0f;
            e.AmplitudeData.decayTime        = .0f;
            e.AmplitudeData.sustainAmplitude = 1.0f;
            e.AmplitudeData.sustainTime      = RandomMulti(.15f, .5f, 4);
            e.AmplitudeData.releaseTime      = .05f;

            e.FrequencyData.range = new Range(20.0f, 10000.0f);

            e.FrequencyData.frequency = Random.Range(40.0f, 1200.0f);

            Round(e, 2);

            return(e);
        }
        void SubEffects()
        {
            subEffectsOpen = EditorGUILayout.Foldout(subEffectsOpen, new GUIContent("Sub Effects", "Extra effects mixed into the sound."));
            if (subEffectsOpen)
            {
                EditorGUI.indentLevel++;
                int count = EditorGUILayout.IntField(new GUIContent("Sub Effects Count", "You can add other SounderEffects here and it will mix them into the current one."), effect.SubEffects.Count);
                if (count != effect.SubEffects.Count)
                {
                    Undo.RecordObject(effect, "SounderEffect Sub Effects Count");
                }

                while (effect.SubEffects.Count > count)
                {
                    effect.SubEffects.RemoveAt(effect.SubEffects.Count - 1);
                }
                while (effect.SubEffects.Count < count)
                {
                    effect.SubEffects.Add(null);
                }

                for (int iii = 0; iii < effect.SubEffects.Count; iii++)
                {
                    SounderEffect temp = EditorGUILayout.ObjectField(new GUIContent("Sub Effect"),
                                                                     effect.SubEffects[iii], typeof(SounderEffect), true) as SounderEffect;
                    if (temp != effect.SubEffects[iii])
                    {
                        Undo.RecordObject(effect, "SounderEffect Sub Effect Changed");
                        effect.SubEffects[iii] = temp;
                    }

                    if (effect.SubEffects[iii] != null && effect.SubEffects[iii].ContainsSub(effect))
                    {
                        EditorUtility.DisplayDialog("Sounder", "Adding that SounderEffect as a subeffect would create a recursive effect which would enter an infinite loop.\nCannot create recursive effects.", "OK");
                        effect.SubEffects[iii] = null;
                    }
                }
                EditorGUI.indentLevel--;
            }
        }
        public static void CreateAsset()
        {
            string path = "Assets";

            foreach (UnityEngine.Object obj in Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets))
            {
                string tester = AssetDatabase.GetAssetPath(obj);
                if (System.IO.Directory.Exists(tester))
                {
                    path = tester;
                }
            }

            SounderEffect e        = CreateInstance <SounderEffect>();
            string        fileName = path + "/New Sounder Effect.asset";

            fileName = AssetDatabase.GenerateUniqueAssetPath(fileName);
            AssetDatabase.CreateAsset(e, fileName);

            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();

            Selection.activeObject = e;
        }
 public AmplitudeEditor(SounderEffect e)
 {
     effect = e;
 }
示例#17
0
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Minus) || Input.GetKeyDown(KeyCode.KeypadMinus))
        {
            Sounder.Player.Volume -= .1f;
        }
        if (Input.GetKeyDown(KeyCode.Equals) || Input.GetKeyDown(KeyCode.KeypadPlus) || Input.GetKeyDown(KeyCode.Plus))
        {
            Sounder.Player.Volume += .1f;
        }


        if (Input.GetKeyDown(KeyCode.Q))
        {
            if (playEffect != null)
            {
                playEffect.Play();
            }
            //Playing a SounderEffect is as simple as calling Play();
        }
        if (Input.GetKeyDown(KeyCode.W))
        {
            if (playEffect != null)
            {
                Sounder.Presets.Mutate(playEffect, .2f).Play();
            }
            //You don't need to hold on to a reference of a sounder effect(unless you're playing it looping)
            //Mutate creates a whole new effect. Calling play on it builds the audio clip and feeds it to the audio pool in Sounder.Player
        }
        if (Input.GetKeyDown(KeyCode.E))
        {
            if (localPlayEffect != null)
            {
                GetComponent <AudioSource>().clip = localPlayEffect.GetClip();
                GetComponent <AudioSource>().Play();
                //You can get the clip from a SounderEffect and play it using any AudioSource or do further processing on it
            }
        }

        if (Input.GetKeyDown(KeyCode.A))
        {
            if (loopEffect != null)
            {
                loopEffect.Play(true);
            }
            //If you play a SounderEffect looping it will continue to loop until you tell the SounderEffect or the audioSource to Stop();
        }
        if (Input.GetKeyUp(KeyCode.A))
        {
            if (loopEffect != null)
            {
                loopEffect.Stop();
            }
        }

        if (Input.GetKeyDown(KeyCode.Z))
        {
            if (createdByScript == null)
            {
                createdByScript = ScriptableObject.CreateInstance <SounderEffect>();
                createdByScript.AmplitudeData.attackTime       = .05f;
                createdByScript.AmplitudeData.decayTime        = .25f;
                createdByScript.AmplitudeData.sustainTime      = .4f;
                createdByScript.AmplitudeData.releaseTime      = .3f;
                createdByScript.AmplitudeData.sustainAmplitude = .5f;

                createdByScript.FrequencyData.frequency  = 440.0f;
                createdByScript.FrequencyData.deltaAccel = -660.0f;
            }
            createdByScript.Play();
            //You can create or modify SounderEffects in script
        }

        if (changeEffect == null)
        {
            return;
        }
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            changeEffect.FrequencyData.frequency = 100.0f;
            changeEffect.MakeClip();
            //MakeClipt forces Sounder to remake the clip even if it already exists.
            //Without this calling play would use a cached version of the sound if it exists
            changeEffect.Play();
        }
        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            changeEffect.FrequencyData.frequency = 200.0f;
            changeEffect.MakeClip();
            changeEffect.Play();
        }
        if (Input.GetKeyDown(KeyCode.Alpha3))
        {
            changeEffect.FrequencyData.frequency = 300.0f;
            changeEffect.MakeClip();
            changeEffect.Play();
        }
        if (Input.GetKeyDown(KeyCode.Alpha4))
        {
            changeEffect.FrequencyData.frequency = 400.0f;
            changeEffect.MakeClip();
            changeEffect.Play();
        }
        if (Input.GetKeyDown(KeyCode.Alpha5))
        {
            changeEffect.FrequencyData.frequency = 500.0f;
            changeEffect.MakeClip();
            changeEffect.Play();
        }
        if (Input.GetKeyDown(KeyCode.Alpha6))
        {
            changeEffect.FrequencyData.frequency = 600.0f;
            changeEffect.MakeClip();
            changeEffect.Play();
        }
        if (Input.GetKeyDown(KeyCode.Alpha7))
        {
            changeEffect.FrequencyData.frequency = 700.0f;
            changeEffect.MakeClip();
            changeEffect.Play();
        }
        if (Input.GetKeyDown(KeyCode.Alpha8))
        {
            changeEffect.FrequencyData.frequency = 800.0f;
            changeEffect.MakeClip();
            changeEffect.Play();
        }
        if (Input.GetKeyDown(KeyCode.Alpha9))
        {
            changeEffect.FrequencyData.frequency = 900.0f;
            changeEffect.MakeClip();
            changeEffect.Play();
        }
        if (Input.GetKeyDown(KeyCode.Alpha0))
        {
            changeEffect.FrequencyData.frequency = 1000.0f;
            changeEffect.MakeClip();
            changeEffect.Play();
        }
    }
        public override void OnInspectorGUI()
        {
            if (Application.isPlaying)
            {
                return;
            }

            MakePlayer();

            int sampleRate = EditorGUILayout.IntField(new GUIContent("Sample Rate", "Samples per second. Smaller values build faster larger values sound better."), effect.SampleRate);

            if (sampleRate > 50000)
            {
                sampleRate = 50000;
            }
            if (sampleRate > 1 && effect.SampleRate != sampleRate)
            {
                Undo.RecordObject(effect, "SounderEffect Sample Rate");
                effect.SampleRate = sampleRate;
            }


            Oscillator.WaveForm form = (Oscillator.WaveForm)EditorGUILayout.EnumPopup(new GUIContent("Waveform", "Waveform determines the base timbre of the sound."), effect.waveForm);
            if (form != effect.waveForm)
            {
                Undo.RecordObject(effect, "SounderEffect WaveForm");
                effect.waveForm = form;
            }

            #region WaveDraw
            Rect r = EditorGUILayout.BeginHorizontal();
            r.height = 48;

            if (waveTexture == null || GUI.changed || waveTexture.width != r.width)
            {
                if (waveTexture != null)
                {
                    DestroyImmediate(waveTexture);
                }
                waveTexture = WaveDrawer.TextureFromSamples(Oscillator.GetWaveTable(effect.waveForm), (int)r.width, (int)r.height);
            }
            EditorGUI.DrawPreviewTexture(r, waveTexture);

            EditorGUILayout.LabelField(new GUIContent(), GUILayout.Width(r.width), GUILayout.Height(r.height));
            EditorGUILayout.EndHorizontal();
            #endregion

            EditorGUILayout.Separator();

            float delay = EditorGUILayout.FloatField(new GUIContent("Delay", "Delay in seconds before starting"), effect.delay);
            if (delay < .0f)
            {
                delay = .0f;
            }

            if (delay != effect.delay)
            {
                Undo.RecordObject(effect, "SounderEffect Delay");
                effect.delay = delay;
            }

            EditorGUILayout.Separator();

            amplitudeEditor.DrawEditor();

            EditorGUILayout.Separator();

            frequencyEditor.DrawEditor();

            string saveHash = AssetDatabase.GetAssetPath(effect).GetHashCode().ToString();

            EditorGUILayout.Separator();
            float test = EditorGUILayout.Slider(new GUIContent("LFO Amplitude", "Amount the low frequency oscillator affects the sound."), effect.LFOAmplitude, .0f, 1.0f);
            if (test != effect.LFOAmplitude)
            {
                Undo.RecordObject(effect, "SounderEffect LFO Amplitude");
                effect.LFOAmplitude = test;
            }

            if (effect.LFOAmplitude > float.Epsilon)
            {
                Oscillator.WaveForm lfoForm = (Oscillator.WaveForm)EditorGUILayout.EnumPopup(new GUIContent("LFO Waveform", "Low Frequency Oscillator."), effect.LFOForm);
                if (lfoForm != effect.LFOForm)
                {
                    Undo.RecordObject(effect, "SounderEffect LFO WaveForm");
                    effect.LFOForm = lfoForm;
                }

                test = effect.LFOFrequency;
                GUIHelpers.RangedSlider(ref test, 100.0f, "LFO Frequency",
                                        "Frequency of the low frequency oscillator.", saveHash, false);
                if (test != effect.LFOFrequency)
                {
                    Undo.RecordObject(effect, "SounderEffect LFO Frequency");
                    effect.LFOFrequency = test;
                }
            }

            EditorGUILayout.Separator();
            test = EditorGUILayout.Slider(new GUIContent("Flanger Amplitude", "Resonates a copy of the sound."), effect.flangerAmplitude, .0f, 1.0f);
            if (test != effect.flangerAmplitude)
            {
                Undo.RecordObject(effect, "SounderEffect Flanger Amplitude");
                effect.flangerAmplitude = test;
            }
            if (effect.flangerAmplitude > float.Epsilon)
            {
                test = effect.flangerOffset;
                GUIHelpers.RangedSlider(ref test, 1.0f, "Flanger Offset", "Offset of the flanger, as a percent of the wavetable.", saveHash, false);
                if (test != effect.flangerOffset)
                {
                    Undo.RecordObject(effect, "SounderEffect Flanger Offset");
                    effect.flangerOffset = test;
                }

                test = effect.flangerOffsetDelta;
                GUIHelpers.RangedSlider(ref test, 25.0f, "Offset Delta", "Accellerate the flanger offset by this much.", saveHash, false);
                if (test != effect.flangerOffsetDelta)
                {
                    Undo.RecordObject(effect, "SounderEffect Flanger Offset Delta");
                    effect.flangerOffsetDelta = test;
                }
            }

            EditorGUILayout.Separator();
            test = EditorGUILayout.Slider(new GUIContent("Phase Reset", "Resets most variables to their starting values after this much time has passed."), effect.phaseReset, .0f, effect.Duration);
            if (test != effect.phaseReset)
            {
                Undo.RecordObject(effect, "SounderEffect Phase Reset");
                effect.phaseReset = test;
            }

            test = effect.echoTime;
            GUIHelpers.RangedSlider(ref test, 1.0f, "Echo Time", "Echoes the sound every echoTime seconds", saveHash, true);
            if (test != effect.echoTime)
            {
                Undo.RecordObject(effect, "SounderEffect Echo Time");
                effect.echoTime = test;
            }
            if (effect.echoTime > float.Epsilon)
            {
                test = EditorGUILayout.Slider(new GUIContent("Echo Value", "How loud the echo is as a percent of the original sound"), effect.echoValue, 0f, 1.0f);
                if (test != effect.echoValue)
                {
                    Undo.RecordObject(effect, "SounderEffect Echo Value");
                    effect.echoValue = test;
                }

                int itest = EditorGUILayout.IntSlider(new GUIContent("Echo Count", "How many times to echo. If less than 0 echoes until very quiet."), effect.echoCount, -1, 10);
                if (itest != effect.echoCount)
                {
                    Undo.RecordObject(effect, "SounderEffect Echo Count");
                    effect.echoCount = itest;
                }
            }

            EditorGUILayout.Separator();
            test = effect.highPass;
            GUIHelpers.RangedSlider(ref test, 8000.0f, "High Pass", "Frequencies lower than this are attenuated. Set to 0 to do nothing.", saveHash, true);
            if (test != effect.highPass)
            {
                Undo.RecordObject(effect, "SounderEffect High Pass");
                effect.highPass = test;
            }

            test = effect.lowPass;
            GUIHelpers.RangedSlider(ref test, 8000.0f, "Low Pass", "Frequencies higher than this are attenuated. Set to 0 to do nothing.", saveHash, true);
            if (test != effect.lowPass)
            {
                Undo.RecordObject(effect, "SounderEffect Low Pass");
                effect.lowPass = test;
            }

            test = effect.Q;
            GUIHelpers.RangedSlider(ref test, 10.0f, "Resonance", "Amount to attenuate outside frequencies.", saveHash, true);
            if (test != effect.Q)
            {
                Undo.RecordObject(effect, "SounderEffect Resonance");
                effect.Q = test;
            }
            EditorGUILayout.Separator();

            SubEffects();

            EditorGUILayout.Separator();

            GUILayout.BeginHorizontal();
            bool play = false;
            if (GUILayout.Button("Play"))
            {
                play = true;
            }
            EditorGUILayout.Separator();
            EditorGUIUtility.labelWidth = GUI.skin.label.CalcSize(new GUIContent("Play on Change")).x;
            playOnChange = EditorGUILayout.Toggle("Play on Change", playOnChange);
            EditorGUIUtility.labelWidth = GUI.skin.label.CalcSize(new GUIContent("Play Looping")).x;
            playLooping = EditorGUILayout.Toggle("Play Looping", playLooping);
            EditorGUIUtility.labelWidth = 0;

            if (GUILayout.Button("Save to .Wav"))
            {
                string path = "";
                try { path = Path.GetDirectoryName(AssetDatabase.GetAssetPath(effect)); } catch {}

                string wavName = EditorUtility.SaveFilePanel("Save sound to wav", path, effect.name, "wav");
                WavBuilder.WriteWav(wavName, effect.GetClip());
                AssetDatabase.Refresh();
            }
            GUILayout.EndHorizontal();


            play = play | DrawPresets();

            if (GUILayout.Button("Mutate"))
            {
                Undo.RecordObject(effect, "SounderEffect Mutate");

                SounderEffect se = Presets.Mutate(effect);
                effect.Copy(se);
                DestroyImmediate(se);
                play = true;
            }

            if (Event.current.type == EventType.ValidateCommand && Event.current.commandName.CompareTo("UndoRedoPerformed") == 0)
            {
                GUI.changed = true;
            }

            if (GUI.changed)
            {
                EditorUtility.SetDirty(effect);
                player.Stop();
                if (player.clip != null)
                {
                    DestroyImmediate(player.clip);
                }
                effect.MakeClip();

                if (effectTexture != null)
                {
                    DestroyImmediate(effectTexture);
                }
                effectTexture = null;
            }

            if (play || (GUI.changed && playOnChange))
            {
                player.clip   = effect.GetClip();
                player.volume = 1.0f;
                player.loop   = playLooping;
                player.Play();
            }
        }
        public static SounderEffect Randomize()
        {
            SounderEffect e = ScriptableObject.CreateInstance <SounderEffect>();

            e.waveForm = GetRandomWaveForm();

            e.AmplitudeData.attackTime       = Random.Range(.0f, 1.0f);
            e.AmplitudeData.attackAmplitude  = Random.Range(.0f, 1.0f);
            e.AmplitudeData.decayTime        = Random.Range(.0f, 1.0f);
            e.AmplitudeData.sustainAmplitude = Random.Range(.0f, 1.0f);
            e.AmplitudeData.sustainTime      = Random.Range(.0f, 1.0f);
            e.AmplitudeData.releaseTime      = Random.Range(.0f, 1.0f);

            e.FrequencyData.range     = new Range(1.0f, 20000.0f);
            e.FrequencyData.frequency = Random.Range(.0f, 20000.0f);

            e.FrequencyData.delta      = Random.Range(-100.0f, 100.0f);
            e.FrequencyData.deltaAccel = Random.Range(-10.0f, 10.0f);

            e.FrequencyData.curveType = GetRandomCurve();

            e.LFOForm      = GetRandomWaveForm();
            e.LFOAmplitude = Random.Range(.0f, 1.0f);
            e.LFOFrequency = Random.Range(.0f, 100.0f);

            e.flangerAmplitude   = Random.Range(.0f, 1.0f);
            e.flangerOffset      = Random.Range(-1.0f, 1.0f);
            e.flangerOffsetDelta = Random.Range(-10.0f, 10.0f);

            if (RandomChance(.25f))
            {
                e.phaseReset = Random.Range(.0f, e.Duration);
            }

            if (RandomChance(.1f))
            {
                e.echoTime  = RandomMulti(e.Duration * .05f, e.Duration * .2f, 6);
                e.echoValue = Random.Range(.2f, .75f);
                if (RandomChance(.2f))
                {
                    e.echoCount = -1;
                }
                else
                {
                    e.echoCount = Random.Range(1, 10);
                }
            }

            if (RandomChance(.15f))
            {
                if (RandomChance(.5f))
                {
                    e.highPass = Random.Range(0, 20000);
                }
                else
                {
                    e.lowPass = Random.Range(0, 20000);
                }

                e.Q = Random.Range(.0f, 5.0f);
            }


            Round(e, 4);

            return(e);
        }