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); }
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; }
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); }