public void DrawSpectrum( Rect r, bool useLogScale, float[] data, float dBRange, float samplerate, float colR, float colG, float colB, float colA, float gainOffsetDB) { var xscale = ((data.Length - 2) * 2.0f) / samplerate; var yscale = 1.0f / dBRange; AudioCurveRendering.DrawCurve( r, delegate(float x) { var f = GUIHelpers.MapNormalizedFrequency(x, samplerate, useLogScale, true) * xscale; var i = (int)Math.Floor(f); var h = data[i] + ((data[i + 1] - data[i]) * (f - i)); var mag = h > 0.0 ? (20.0f * Math.Log10(h)) + gainOffsetDB : -120.0; return((float)(yscale * mag)); }, new Color(colR, colG, colB, colA) ); }
private void DrawCurve( Rect r, float[] curve, float yscale, Color col, // ReSharper disable once UnusedParameter.Local float labeloffset, float wetLevel, float gain) { float xscale = curve.Length - 2; var maxval = 0.0f; for (var n = 0; n < curve.Length; n++) { maxval = Mathf.Max(maxval, Mathf.Abs(curve[n])); } yscale *= maxval > 0.0f ? gain / maxval : 0.0f; AudioCurveRendering.DrawSymmetricFilledCurve( r, delegate(float x, out Color color) { var f = Mathf.Clamp(x * xscale, 0.0f, xscale); var i = (int)Mathf.Floor(f); color = new Color(col.r, col.g, col.b, col.a * wetLevel); return((curve[i] + ((curve[i + 1] - curve[i]) * (f - i))) * yscale); } ); }
private void DrawFilterCurve( Rect r, float[] coeffs, float lowGain, float midGain, float highGain, Color color, bool filled, double samplerate, double magScale) { double wm = -2.0 * 3.1415926 / samplerate; AudioCurveRendering.AudioCurveEvaluator d = delegate(float x) { MathHelpers.ComplexD w = MathHelpers.ComplexD.Exp(wm * GUIHelpers.MapNormalizedFrequency((double)x, samplerate, useLogScale, true)); MathHelpers.ComplexD lpf = MathHelpers.ComplexD.Pow((w * (w * coeffs[0] + coeffs[1]) + coeffs[2]) / (w * (w * coeffs[3] + coeffs[4]) + 1.0f), filterOrder); MathHelpers.ComplexD bpf1 = MathHelpers.ComplexD.Pow((w * (w * coeffs[5] + coeffs[6]) + coeffs[7]) / (w * (w * coeffs[8] + coeffs[9]) + 1.0f), filterOrder); MathHelpers.ComplexD bpf2 = MathHelpers.ComplexD.Pow((w * (w * coeffs[10] + coeffs[11]) + coeffs[12]) / (w * (w * coeffs[13] + coeffs[14]) + 1.0f), filterOrder); MathHelpers.ComplexD hpf = MathHelpers.ComplexD.Pow((w * (w * coeffs[15] + coeffs[16]) + coeffs[17]) / (w * (w * coeffs[18] + coeffs[19]) + 1.0f), filterOrder); double h = (lpf * lowGain).Mag2() + (bpf1 * bpf2 * midGain).Mag2() + (hpf * highGain).Mag2(); double mag = masterGain + 10.0 * Math.Log10(h); return((float)(mag * magScale)); }; if (filled) { AudioCurveRendering.DrawFilledCurve(r, d, color); } else { AudioCurveRendering.DrawCurve(r, d, color); } }
public void DrawFilterCurve( Rect r, float[] coeffs, bool lowGain, bool midGain, bool highGain, Color color, bool useLogScale, bool filled, double masterGain, double samplerate, double magScale) { double wm = -2.0f * 3.1415926 / samplerate; ComplexD one = new ComplexD(1.0f, 0.0f); AudioCurveRendering.AudioCurveEvaluator d = delegate(float x) { ComplexD w = ComplexD.Exp(wm * GUIHelpers.MapNormalizedFrequency((double)x, samplerate, useLogScale, true)); ComplexD hl = (!lowGain) ? one : (w * (w * coeffs[0] + coeffs[1]) + coeffs[2]) / (w * (w * coeffs[3] + coeffs[4]) + 1.0f); ComplexD hp = (!midGain) ? one : (w * (w * coeffs[5] + coeffs[6]) + coeffs[7]) / (w * (w * coeffs[8] + coeffs[9]) + 1.0f); ComplexD hh = (!highGain) ? one : (w * (w * coeffs[10] + coeffs[11]) + coeffs[12]) / (w * (w * coeffs[13] + coeffs[14]) + 1.0f); ComplexD h = hh * hp * hl; double mag = masterGain + 10.0 * Math.Log10(h.Mag2()); return((float)(mag * magScale)); }; if (filled) { AudioCurveRendering.DrawFilledCurve(r, d, color); } else { AudioCurveRendering.DrawCurve(r, d, color); } }
public void DrawControl(IAudioEffectPlugin plugin, Rect r, float samplerate) { r = AudioCurveRendering.BeginCurveFrame(r); if (Event.current.type == EventType.Repaint) { float blend = plugin.IsPluginEditableAndEnabled() ? 1.0f : 0.5f; int numsamples = (int)r.width; float[] imp1; plugin.GetFloatBuffer("Impulse0", out imp1, numsamples); float[] imp2; plugin.GetFloatBuffer("Impulse1", out imp2, numsamples); float wet; plugin.GetFloatParameter("Wet", out wet); wet *= 0.01f; float gain; plugin.GetFloatParameter("Gain", out gain); gain = Mathf.Pow(10.0f, gain * 0.05f); float useSample; plugin.GetFloatParameter("Use Sample", out useSample); m_Impulse1Color.a = m_Impulse2Color.a = blend; var r2 = new Rect(r.x, r.y, r.width, r.height * 0.5f); DrawCurve(r2, imp1, 1.0f, m_Impulse1Color, 90, wet, gain); r2.y += r2.height; DrawCurve(r2, imp2, 1.0f, m_Impulse2Color, 150, wet, gain); string name = "Impulse: " + Marshal.PtrToStringAnsi(ConvolutionReverb_GetSampleName((int)useSample)); GUIHelpers.DrawText(r2.x + 5, r2.y - 5, r2.width, name, Color.white); } AudioCurveRendering.EndCurveFrame(); }
private void DrawCurve(Rect r, float[] curve, float yscale, Color c0, Color c1, Color c2, Color c3, float labeloffset, float rofs, float ofs, float wlen, float rwlen, float shape) { float xscale = curve.Length - 2; float maxval = 0.0f; for (int n = 0; n < curve.Length; n++) { maxval = Mathf.Max(maxval, Mathf.Abs(curve[n])); } yscale *= (maxval > 0.0f) ? (1.0f / maxval) : 0.0f; float transition = 0.5f * (wlen + rwlen) / shape, mix = 0.7f; float transitionScale = (transition > 0.0f) ? (1.0f / transition) : 0.0f; AudioCurveRendering.DrawSymmetricFilledCurve( r, delegate(float x, out Color color) { color = c0; float f = Mathf.Clamp(x * xscale, 0.0f, xscale); int i = (int)Mathf.Floor(f); float y = (curve[i] + (curve[i + 1] - curve[i]) * (f - i)) * yscale; x -= ofs; if (x >= -rofs) { if (x < 0.0f) { color = Color.Lerp(color, c3, mix); } if (x + rofs < transition) { y *= (x + rofs) * transitionScale; } else if (x < wlen + rwlen && x > wlen + rwlen - transition) { y *= (wlen + rwlen - x) * transitionScale; } if (x < wlen) { color = Color.Lerp(color, c1, mix); } else if (x < wlen + rwlen) { color = Color.Lerp(color, c2, mix); } else { color.a *= 0.4f; } } else { color.a *= 0.4f; } return(y); } ); }
public void Update(Rect rect, Color color, System.Func <float, float> Evaluate) { waveformStartTime = EditorGUILayout.Slider("Start", waveformStartTime, 0, duration); waveformLength = EditorGUILayout.Slider("Period", waveformLength, 0, duration); waveformStartTime = Mathf.Min(duration - waveformLength, waveformStartTime); Rect r = AudioCurveRendering.BeginCurveFrame(rect); AudioCurveRendering.DrawCurve(r, (t) => Evaluate(waveformStartTime + (t * waveformLength)), color); AudioCurveRendering.EndCurveFrame(); }
public void drawWaveform(Rect rect, int channel, Vector2 visibleRange) { var minX = rect.x + rect.width * visibleRange.x; var maxX = rect.x + rect.width * visibleRange.y; var visibleRect = new Rect(minX, rect.y, maxX - minX, rect.height); AudioCurveRendering.AudioMinMaxCurveAndColorEvaluator dlg = delegate(float x, out Color col, out float minValue, out float maxValue) { col = Color.yellow; x = Mathf.InverseLerp(rect.xMin, rect.xMax, Mathf.Lerp(minX, maxX, x)); var divisions = Mathf.FloorToInt(rect.width); var groupIndex = Mathf.Clamp(Mathf.FloorToInt(x * divisions), min: 0, max: divisions - 1); minMaxInInterval(groupIndex, divisions, channel, out minValue, out maxValue); }; AudioCurveRendering.DrawMinMaxFilledCurve(visibleRect, dlg); }
public void DrawSpectrum(Rect r, bool useLogScale, float[] data, float dB_range, float samplerate, float col_r, float col_g, float col_b, float col_a, float gainOffset_dB) { float xscale = (float)(data.Length - 2) * 2.0f / samplerate; float yscale = 1.0f / dB_range; AudioCurveRendering.DrawCurve( r, delegate(float x) { double f = GUIHelpers.MapNormalizedFrequency((double)x, samplerate, useLogScale, true) * xscale; int i = (int)Math.Floor(f); double h = data[i] + (data[i + 1] - data[i]) * (f - i); double mag = (h > 0.0) ? (20.0f * Math.Log10(h) + gainOffset_dB) : -120.0; return((float)(yscale * mag)); }, new Color(col_r, col_g, col_b, col_a)); }
protected override void OnDataDetailGUI() { InitAudioSource(); DropDownField("Output Target", ref _selectedItem.LegacySound.OutputTarget, SoundOutTypeStrings, SoundOutTypeValues); SliderField("Volume", ref _selectedItem.LegacySound.Volume, -100, 100); SliderField("Balance", ref _selectedItem.LegacySound.Balance, -100, 100); SliderField("Fade (Rear->Front)", ref _selectedItem.LegacySound.Fade, -100, 100); EditorGUILayout.Space(); var wfx = _selectedItem.LegacySound.Wfx; if (_selectedItem.LegacySound.AudioClip != null) { GUILayout.Label($"Length : {_selectedItem.LegacySound.AudioClip.length} s, Channels : {wfx.Channels}, BPS : {wfx.BitsPerSample}, Freq : {wfx.SamplesPerSec}"); if (GUILayout.Button(new GUIContent() { image = EditorGUIUtility.IconContent("PlayButton").image })) { _audioSource.transform.position = _selectedSoundPos; _audioSourceComp.volume = (_selectedItem.LegacySound.Volume + 100) / 200.0f; _audioSourceComp.panStereo = _selectedItem.LegacySound.Balance / 100.0f; _audioSourceComp.clip = _selectedItem.LegacySound.AudioClip; _audioSourceComp.Play(); } EditorGUILayout.Space(); Rect curveRect = GUILayoutUtility.GetLastRect(); curveRect.x += 10.0f; curveRect.y += curveRect.height; curveRect.width -= 20.0f; curveRect.height = 100.0f; Rect r = AudioCurveRendering.BeginCurveFrame(curveRect); AudioCurveRendering.DrawCurve(r, x => _audioSamples[(int)((_audioSamples.Length - 1) * x + 0.5f)], Color.green); AudioCurveRendering.EndCurveFrame(); } else { _selectedItem.LegacySound.AudioClip = (AudioClip)EditorGUILayout.ObjectField(_selectedItem.LegacySound.AudioClip, typeof(AudioClip), false); } }
private void DrawCurve( Rect r, float[] curve, float yoffset, float yscale, Color col, float labeloffset) { var numsamples = curve.Length - 1; // the last sample in buffer is counter for how much we could read var transitionPixels = 30.0f; var x0 = 1.0f - (curve[numsamples] / curve.Length); var xr = transitionPixels / r.width; float xscale = numsamples - 2; var thr_dB = -120.0f; var thr_lin = 20.0f * Mathf.Pow(10.0f, thr_dB * 0.05f); col.a /= xr; float peakVal = -100000.0f, peakPos = -1000000.0f; AudioCurveRendering.DrawFilledCurve( r, delegate(float x, out Color color) { var f = Mathf.Clamp(x * xscale, 0.0f, xscale); color = col; color.a = col.a * Mathf.Clamp(x - x0, 0, xr); var i = (int)Mathf.Floor(f); var mag = curve[i] + ((curve[i + 1] - curve[i]) * (f - i)); var mag_dB = mag < thr_lin ? thr_dB : 20.0f * Mathf.Log10(mag); var pos = (mag_dB - yoffset) * yscale; peakVal = Mathf.Max(peakVal, mag_dB); peakPos = Mathf.Max(peakPos, pos); return(pos); } ); peakPos = r.y + (r.height * (0.5f - (0.5f * peakPos))); if ((peakPos >= r.y) && (peakPos <= (r.y + r.height))) { var col2 = new Color(col.r, col.g, col.b, 0.7f); GUIHelpers.DrawLine(r.x, peakPos, r.x + r.width, peakPos, col2); GUIHelpers.DrawText((r.x + labeloffset) - 30, peakPos + 6, 60, string.Format("{0:F1} dB", peakVal), col2); } }
private void DrawCurve(Rect r, Func <float, int> toIndex) { AudioCurveRendering.DrawSymmetricFilledCurve( r, (float t, out Color col) => { col = Orange; int i = toIndex(t) / downSampleTo; return(i >= downSampledData.Length ? 0 : downSampledData[i]); } ); AudioCurveRendering.DrawSymmetricFilledCurve( r, (float t, out Color col) => { col = MidYellow; int i = toIndex(t); return(i >= sampleData.Length ? 0 : sampleData[i]); } ); }
private void DrawCurve(Rect r, float[] curve, float yscale, Color col, float labeloffset, float wetLevel, float gain) { float xscale = curve.Length - 2; float maxval = 0.0f; for (int n = 0; n < curve.Length; n++) { maxval = Mathf.Max(maxval, Mathf.Abs(curve[n])); } yscale *= (maxval > 0.0f) ? (gain / maxval) : 0.0f; AudioCurveRendering.DrawSymmetricFilledCurve( r, delegate(float x, out Color color) { float f = Mathf.Clamp(x * xscale, 0.0f, xscale); int i = (int)Mathf.Floor(f); color = new Color(col.r, col.g, col.b, col.a * wetLevel); return((curve[i] + (curve[i + 1] - curve[i]) * (f - i)) * yscale); } ); }
static void DoRenderPreview(AudioClip clip, Rect rect) { var samples = new float[clip.samples]; clip.GetData(samples, 0); AudioCurveRendering.AudioCurveAndColorEvaluator dlg = delegate(float x, out Color color) { color = curveColor; if (clip.samples <= 0) { return(0); } var p = Mathf.FloorToInt(Mathf.Clamp(x * (clip.samples - 1), 0.0f, clip.samples - 1)); return(samples[p]); }; rect = AudioCurveRendering.BeginCurveFrame(rect); AudioCurveRendering.DrawSymmetricFilledCurve(rect, dlg); AudioCurveRendering.EndCurveFrame(); }
private void DrawSpectrum(Event e) { float height = 10 * EditorGUIUtility.singleLineHeight; Rect r = EditorGUILayout.GetControlRect(true, height); r.width -= rightMargin; DrawDataTicks(r); r = AudioCurveRendering.BeginCurveFrame(r); AudioCurveRendering.DrawFilledCurve(r, EvaluateCurve, AudioCurveRendering.kAudioOrange); DrawFrequencyTicks(r); HandleEvent(r, e); if (IsFocus) { DrawSelected(r); } AudioCurveRendering.EndCurveFrame(); }
public void DrawFilterCurve( Rect r, float[] coeffs, Color color, int numModes, bool useLogScale, bool filled, double samplerate, double magScale) { var wm = (-2.0f * 3.1415926) / samplerate; var zero = new ComplexD(0.0f, 0.0f); var one = new ComplexD(1.0f, 0.0f); AudioCurveRendering.AudioCurveEvaluator d = delegate(float x) { var w = ComplexD.Exp(wm * GUIHelpers.MapNormalizedFrequency(x, samplerate, useLogScale, true)); var h = zero; var num = numModes * 3; for (var n = 0; n < num; n += 3) { h += (coeffs[n] * (one - (w * w))) / ((w * ((w * coeffs[n + 2]) + coeffs[n + 1])) + 1.0); } var mag = 10.0 * Math.Log10(h.Mag2()); return((float)(mag * magScale)); }; if (filled) { AudioCurveRendering.DrawFilledCurve(r, d, color); } else { AudioCurveRendering.DrawCurve(r, d, color); } }
public void DrawControl(IAudioEffectPlugin plugin, Rect r, float samplerate) { Event evt = Event.current; int controlID = GUIUtility.GetControlID(FocusType.Passive); EventType evtType = evt.GetTypeForControl(controlID); r = AudioCurveRendering.BeginCurveFrame(r); if (Event.current.type == EventType.Repaint) { float blend = plugin.IsPluginEditableAndEnabled() ? 1.0f : 0.5f; int numsamples = (int)r.width; float port; plugin.GetFloatParameter(portName, out port); string name = "Port: " + port; GUIHelpers.DrawText(r.x + 5, r.y + 5, r.width, name, Color.white); } AudioCurveRendering.EndCurveFrame(); }
public static void DrawWaveForm(AudioClip clip, int channel, Rect position, float start, float length) { if (minMaxData != null && clip == storedClip) { var curveColor = new Color(255 / 255f, 168 / 255f, 7 / 255f); int numChannels = clip.channels; int numSamples = Mathf.FloorToInt(minMaxData.Length / (2f * numChannels) * (length / clip.length)); AudioCurveRendering.DrawMinMaxFilledCurve( position, delegate(float x, out Color col, out float minValue, out float maxValue) { col = curveColor; float p = Mathf.Clamp(x * (numSamples - 2), 0.0f, numSamples - 2); int i = (int)Mathf.Floor(p); float s = (start / clip.length) * Mathf.FloorToInt(minMaxData.Length / (2 * numChannels) - 2); int si = (int)Mathf.Floor(s); int offset1 = Mathf.Clamp(((i + si) * numChannels + channel) * 2, 0, minMaxData.Length - 2); int offset2 = Mathf.Clamp(offset1 + numChannels * 2, 0, minMaxData.Length - 2); minValue = Mathf.Min(minMaxData[offset1 + 1], minMaxData[offset2 + 1]); maxValue = Mathf.Max(minMaxData[offset1 + 0], minMaxData[offset2 + 0]); if (minValue > maxValue) { float tmp = minValue; minValue = maxValue; maxValue = tmp; } } ); return; } // If execution has reached this point, the waveform data needs generating var path = AssetDatabase.GetAssetPath(clip); if (path == null) { return; } var importer = AssetImporter.GetAtPath(path); if (importer == null) { return; } var assembly = Assembly.GetAssembly(typeof(AssetImporter)); if (assembly == null) { return; } var type = assembly.GetType("UnityEditor.AudioUtil"); if (type == null) { return; } var audioUtilGetMinMaxData = type.GetMethod("GetMinMaxData"); if (audioUtilGetMinMaxData == null) { return; } storedClip = clip; minMaxData = audioUtilGetMinMaxData.Invoke(null, new object[] { importer }) as float[]; if (minMaxData == null) { return; } DrawWaveForm(clip, channel, position, start, length); }
private void DrawCurve( Rect r, float[] curve, float yscale, Color c0, Color c1, Color c2, Color c3, // ReSharper disable once UnusedParameter.Local float labeloffset, float rofs, float ofs, float wlen, float rwlen, float shape) { float xscale = curve.Length - 2; var maxval = 0.0f; for (var n = 0; n < curve.Length; n++) { maxval = Mathf.Max(maxval, Mathf.Abs(curve[n])); } yscale *= maxval > 0.0f ? 1.0f / maxval : 0.0f; float transition = (0.5f * (wlen + rwlen)) / shape, mix = 0.7f; var transitionScale = transition > 0.0f ? 1.0f / transition : 0.0f; AudioCurveRendering.DrawSymmetricFilledCurve( r, delegate(float x, out Color color) { color = c0; var f = Mathf.Clamp(x * xscale, 0.0f, xscale); var i = (int)Mathf.Floor(f); var y = (curve[i] + ((curve[i + 1] - curve[i]) * (f - i))) * yscale; x -= ofs; if (x >= -rofs) { if (x < 0.0f) { color = Color.Lerp(color, c3, mix); } if ((x + rofs) < transition) { y *= (x + rofs) * transitionScale; } else if ((x < (wlen + rwlen)) && (x > ((wlen + rwlen) - transition))) { y *= ((wlen + rwlen) - x) * transitionScale; } if (x < wlen) { color = Color.Lerp(color, c1, mix); } else if (x < (wlen + rwlen)) { color = Color.Lerp(color, c2, mix); } else { color.a *= 0.4f; } } else { color.a *= 0.4f; } return(y); } ); }
public bool DrawControl(IAudioEffectPlugin plugin, Rect r, float samplerate) { var evt = Event.current; var controlID = GUIUtility.GetControlID(FocusType.Passive); var evtType = evt.GetTypeForControl(controlID); r = AudioCurveRendering.BeginCurveFrame(r); var thr = 4.0f; var changed = false; var x = evt.mousePosition.x - r.x; if ((evtType == EventType.MouseDown) && r.Contains(evt.mousePosition) && (evt.button == 0)) { var lf = (float)GUIHelpers.MapNormalizedFrequency(lowFreq, samplerate, useLogScale, false) * r.width; var hf = (float)GUIHelpers.MapNormalizedFrequency(highFreq, samplerate, useLogScale, false) * r.width; dragOperation = DragOperation.Mid; if (x < (lf + thr)) { dragOperation = DragOperation.Low; } else if (x > (hf - thr)) { dragOperation = DragOperation.High; } GUIUtility.hotControl = controlID; EditorGUIUtility.SetWantsMouseJumping(1); evt.Use(); } else if ((evtType == EventType.MouseDrag) && (GUIUtility.hotControl == controlID)) { if ((dragOperation == DragOperation.Low) || (dragOperation == DragOperation.Mid)) { lowFreq = Mathf.Clamp( (float)GUIHelpers.MapNormalizedFrequency( GUIHelpers.MapNormalizedFrequency(lowFreq, samplerate, useLogScale, false) + (evt.delta.x / r.width), samplerate, useLogScale, true ), 10.0f, highFreq ); } if (dragOperation == DragOperation.Low) { lowGain = Mathf.Clamp(lowGain - (evt.delta.y * 0.5f), -100.0f, 100.0f); } if (dragOperation == DragOperation.Mid) { midGain = Mathf.Clamp(midGain - (evt.delta.y * 0.5f), -100.0f, 100.0f); } if ((dragOperation == DragOperation.Mid) || (dragOperation == DragOperation.High)) { highFreq = Mathf.Clamp( (float)GUIHelpers.MapNormalizedFrequency( GUIHelpers.MapNormalizedFrequency(highFreq, samplerate, useLogScale, false) + (evt.delta.x / r.width), samplerate, useLogScale, true ), lowFreq, samplerate * 0.5f ); } if (dragOperation == DragOperation.High) { highGain = Mathf.Clamp(highGain - (evt.delta.y * 0.5f), -100.0f, 100.0f); } changed = true; evt.Use(); } else if ((evtType == EventType.MouseUp) && (evt.button == 0) && (GUIUtility.hotControl == controlID)) { GUIUtility.hotControl = 0; EditorGUIUtility.SetWantsMouseJumping(0); evt.Use(); } if (Event.current.type == EventType.Repaint) { var blend = plugin.IsPluginEditableAndEnabled() ? 1.0f : 0.5f; // Mark bands (low, medium and high bands) var lowColor = new Color(0.0f, 0.0f, 0.0f, blend); var midColor = new Color(0.5f, 0.5f, 0.5f, blend); var highColor = new Color(1.0f, 1.0f, 1.0f, blend); DrawBandSplitMarker( plugin, r, (float)GUIHelpers.MapNormalizedFrequency(lowFreq, samplerate, useLogScale, false) * r.width, thr, (GUIUtility.hotControl == controlID) && ((dragOperation == DragOperation.Low) || (dragOperation == DragOperation.Mid)), lowColor ); DrawBandSplitMarker( plugin, r, (float)GUIHelpers.MapNormalizedFrequency(highFreq, samplerate, useLogScale, false) * r.width, thr, (GUIUtility.hotControl == controlID) && ((dragOperation == DragOperation.High) || (dragOperation == DragOperation.Mid)), highColor ); const float dbRange = 40.0f; const float magScale = 1.0f / dbRange; float[] liveData; plugin.GetFloatBuffer("LiveData", out liveData, 6); float[] coeffs; plugin.GetFloatBuffer("Coeffs", out coeffs, 20); if (GUIUtility.hotControl == controlID) { DrawFilterCurve( r, coeffs, dragOperation == DragOperation.Low ? Mathf.Pow(10.0f, 0.05f * lowGain) : 0.0f, dragOperation == DragOperation.Mid ? Mathf.Pow(10.0f, 0.05f * midGain) : 0.0f, dragOperation == DragOperation.High ? Mathf.Pow(10.0f, 0.05f * highGain) : 0.0f, new Color(1.0f, 1.0f, 1.0f, 0.2f * blend), true, samplerate, magScale ); } DrawFilterCurve( r, coeffs, Mathf.Pow(10.0f, 0.05f * lowGain) * liveData[0], 0.0f, 0.0f, lowColor, false, samplerate, magScale ); DrawFilterCurve( r, coeffs, 0.0f, Mathf.Pow(10.0f, 0.05f * midGain) * liveData[1], 0.0f, midColor, false, samplerate, magScale ); DrawFilterCurve( r, coeffs, 0.0f, 0.0f, Mathf.Pow(10.0f, 0.05f * highGain) * liveData[2], highColor, false, samplerate, magScale ); DrawFilterCurve( r, coeffs, Mathf.Pow(10.0f, 0.05f * lowGain) * liveData[0], Mathf.Pow(10.0f, 0.05f * midGain) * liveData[1], Mathf.Pow(10.0f, 0.05f * highGain) * liveData[2], ScaleAlpha(AudioCurveRendering.kAudioOrange, 0.5f), false, samplerate, magScale ); DrawFilterCurve( r, coeffs, Mathf.Pow(10.0f, 0.05f * lowGain), Mathf.Pow(10.0f, 0.05f * midGain), Mathf.Pow(10.0f, 0.05f * highGain), AudioCurveRendering.kAudioOrange, false, samplerate, magScale ); if (showSpectrum) { var specLen = (int)r.width; float[] spec; plugin.GetFloatBuffer("InputSpec", out spec, specLen); DrawSpectrum(r, useLogScale, spec, dbRange, samplerate, 0.3f, 1.0f, 0.3f, 0.5f * blend, 0.0f); plugin.GetFloatBuffer("OutputSpec", out spec, specLen); DrawSpectrum(r, useLogScale, spec, dbRange, samplerate, 1.0f, 0.3f, 0.3f, 0.5f * blend, 0.0f); } GUIHelpers.DrawFrequencyTickMarks(r, samplerate, useLogScale, new Color(1.0f, 1.0f, 1.0f, 0.3f * blend)); } AudioCurveRendering.EndCurveFrame(); return(changed); }
public bool DrawControl(IAudioEffectPlugin plugin, Rect r, float samplerate) { Event evt = Event.current; int dragControlID = GUIUtility.GetControlID(FocusType.Passive); r = AudioCurveRendering.BeginCurveFrame(r); float windowMin, windowMax, windowDef; plugin.GetFloatParameterInfo("Window", out windowMin, out windowMax, out windowDef); float yscaleMin, yscaleMax, yscaleDef; plugin.GetFloatParameterInfo("YScale", out yscaleMin, out yscaleMax, out yscaleDef); float yoffsetMin, yoffsetMax, yoffsetDef; plugin.GetFloatParameterInfo("YOffset", out yoffsetMin, out yoffsetMax, out yoffsetDef); float window; plugin.GetFloatParameter("Window", out window); float yscale; plugin.GetFloatParameter("YScale", out yscale); float yoffset; plugin.GetFloatParameter("YOffset", out yoffset); float blend = plugin.IsPluginEditableAndEnabled() ? 1.0f : 0.5f; switch (evt.GetTypeForControl(dragControlID)) { case EventType.MouseDown: if (evt.button == 0 && r.Contains(evt.mousePosition) && GUIUtility.hotControl == 0) { GUIUtility.hotControl = dragControlID; evt.Use(); } break; case EventType.MouseUp: if (evt.button == 0 && GUIUtility.hotControl == dragControlID) { GUIUtility.hotControl = 0; evt.Use(); } break; case EventType.MouseDrag: if (GUIUtility.hotControl == dragControlID) { window = Mathf.Clamp(window + evt.delta.x * 0.1f, windowMin, windowMax); if (evt.shift) { yoffset = Mathf.Clamp(yoffset - (0.5f * evt.delta.y / yscale), yoffsetMin, yoffsetMax); } else { yscale = Mathf.Clamp(yscale - evt.delta.y * 0.01f, yscaleMin, yscaleMax); } plugin.SetFloatParameter("Window", window); plugin.SetFloatParameter("YScale", yscale); plugin.SetFloatParameter("YOffset", yoffset); evt.Use(); } break; case EventType.ScrollWheel: if (r.Contains(evt.mousePosition)) { window = Mathf.Clamp(window + evt.delta.x * 0.1f, windowMin, windowMax); yoffset = Mathf.Clamp(yoffset - (0.5f * evt.delta.y / yscale), yoffsetMin, yoffsetMax); plugin.SetFloatParameter("Window", window); plugin.SetFloatParameter("YScale", yscale); plugin.SetFloatParameter("YOffset", yoffset); evt.Use(); } break; case EventType.Repaint: { float yscaleDraw = yscale * 0.05f; // Background grid and values Color lineColor = new Color(0, 0, 0, 0.2f); Color textColor = new Color(1.0f, 1.0f, 1.0f, 0.3f * blend); GUIHelpers.DrawDbTickMarks(r, yoffset, yscaleDraw, textColor, lineColor); GUIHelpers.DrawTimeTickMarks(r, window, textColor, lineColor); // Curves int numsamples = (int)r.width; float[] mcurve; plugin.GetFloatBuffer("MomentaryRMS", out mcurve, numsamples); float[] scurve; plugin.GetFloatBuffer("ShortTermRMS", out scurve, numsamples); float[] icurve; plugin.GetFloatBuffer("IntegratedRMS", out icurve, numsamples); DrawCurve(r, mcurve, yoffset, yscaleDraw, new Color(1.0f, 0.0f, 0.0f, blend * 0.5f), 90); DrawCurve(r, scurve, yoffset, yscaleDraw, new Color(0.0f, 1.0f, 0.0f, blend * 0.3f), 150); DrawCurve(r, icurve, yoffset, yscaleDraw, new Color(0.0f, 0.0f, 1.0f, blend * 0.3f), 210); } break; } AudioCurveRendering.EndCurveFrame(); return(false); }
public override void OnInspectorGUI() { serializedObject.Update(); EditorGUILayout.PropertyField(serializedObject.FindProperty("id"), true); EditorGUILayout.PropertyField(serializedObject.FindProperty("displayNames"), true); EditorGUILayout.PropertyField(serializedObject.FindProperty("resourcePath"), true); if (serializedObject.targetObject is MusicEntry) { var musicEntry = serializedObject.targetObject as MusicEntry; if (musicEntry.resourcePath != path) { path = musicEntry.resourcePath; audioClip = Resources.Load <AudioClip>(path); if (audioClip != null) { sampleData = null; audioLooper.clip = audioClip; audioSource.clip = audioClip; } } if (sampleData == null && GUILayout.Button("Load waveform (takes a while)")) { var assetPath = AssetDatabase.GetAssetPath(audioClip); var audioImporter = AssetImporter.GetAtPath(assetPath) as AudioImporter; var prevSetting = audioImporter.defaultSampleSettings; var newSetting = audioImporter.defaultSampleSettings; audioImporter.forceToMono = true; newSetting.loadType = AudioClipLoadType.DecompressOnLoad; audioImporter.defaultSampleSettings = newSetting; AssetDatabase.ImportAsset(assetPath); sampleData = new float[audioClip.samples]; audioClip.LoadAudioData(); audioClip.GetData(sampleData, 0); downSampleTo = audioClip.frequency / 60; downSampledData = new float[(int)Math.Ceiling(1.0f * audioClip.samples / downSampleTo)]; for (int i = 0; i < sampleData.Length; i += downSampleTo) { float ssum = 0; int j; for (j = i; j < sampleData.Length && j < i + downSampleTo; j++) { ssum += sampleData[j] * sampleData[j]; } float rms = (float)Math.Sqrt(ssum / (j - i)); downSampledData[i / downSampleTo] = rms; } audioImporter.forceToMono = false; audioImporter.defaultSampleSettings = prevSetting; AssetDatabase.ImportAsset(assetPath); } if (audioClip != null) { GUILayout.Label("Loop Begin Sample", EditorStyles.boldLabel); SerializedProperty sp1 = serializedObject.FindProperty("loopBeginSample"); sp1.intValue = EditorGUILayout.IntSlider(sp1.intValue, 0, audioClip.samples); sp1.intValue = EditorGUILayout.IntField("fine adjust", sp1.intValue); sp1.intValue = sp1.intValue / 100 * 100 + EditorGUILayout.IntField("fine adjust mod 100", sp1.intValue % 100); GUILayout.Label("Loop End Sample", EditorStyles.boldLabel); SerializedProperty sp2 = serializedObject.FindProperty("loopEndSample"); sp2.intValue = EditorGUILayout.IntSlider(sp2.intValue, 0, audioClip.samples); sp2.intValue = EditorGUILayout.IntField("fine adjust", sp2.intValue); sp2.intValue = sp2.intValue / 100 * 100 + EditorGUILayout.IntField("fine adjust mod 100", sp2.intValue % 100); GUILayout.Label("Preview Loopback Point", EditorStyles.boldLabel); previewSecondsBefore = EditorGUILayout.IntSlider("Play at ? seconds before loop", previewSecondsBefore, 0, 20); int previewBeforeSample = previewSecondsBefore * audioClip.frequency; int previewBeginSample = musicEntry.loopEndSample - previewBeforeSample; int pos1 = audioLooper.currentAudioSource?.timeSamples ?? 0; if (sampleData != null) { Rect r = AudioCurveRendering.BeginCurveFrame(GUILayoutUtility.GetRect(1, 10000, 100, 100)); DrawCurve( r, t => t < 0.5 ? previewBeginSample + (int)(t / 0.5 * previewBeforeSample) : musicEntry.loopBeginSample + (int)((t - 0.5) / 0.5 * previewBeforeSample) ); EditorGUI.DrawRect( new Rect( r.x + r.width / 2, r.y, 1, r.height ), Color.blue ); EditorGUI.DrawRect( new Rect( r.x + (pos1 > previewBeginSample ? (r.width / 2 * (pos1 - previewBeginSample) / previewBeforeSample) : (r.width / 2 + r.width / 2 * (pos1 - musicEntry.loopBeginSample) / previewBeforeSample)), r.y, 1, r.height ), Color.red ); AudioCurveRendering.EndCurveFrame(); } EditorGUI.BeginDisabledGroup(true); EditorGUILayout.IntSlider(pos1, 0, audioClip.samples); EditorGUI.EndDisabledGroup(); bool btn1 = GUILayout.Button($"Loop, play at loopEndSample - {previewSecondsBefore}s"); if (sampleData != null) { Rect r = AudioCurveRendering.BeginCurveFrame(GUILayoutUtility.GetRect(1, 10000, 100, 100)); DrawCurve( r, t => previewBeginSample + (int)(t / 0.5 * previewBeforeSample) ); EditorGUI.DrawRect( new Rect( r.x + r.width / 2 * (audioSource.timeSamples - previewBeginSample) / previewBeforeSample, r.y, 1, r.height ), Color.red ); EditorGUI.DrawRect( new Rect( r.x + r.width / 2, r.y, 1, r.height ), Color.blue ); AudioCurveRendering.EndCurveFrame(); } EditorGUI.BeginDisabledGroup(true); EditorGUILayout.IntSlider(audioSource.timeSamples, 0, audioClip.samples); EditorGUI.EndDisabledGroup(); bool btn2 = GUILayout.Button($"No Loop, play at loopEndSample - {previewSecondsBefore}s"); bool btn3 = GUILayout.Button("Play Both"); if (btn1 || btn3) { EditorApplication.update -= Update; EditorApplication.update += Update; audioLooper.musicEntry = musicEntry; audioLooper.SetProgress(previewBeginSample); } if (btn2 || btn3) { EditorApplication.update -= Update; EditorApplication.update += Update; audioSource.timeSamples = previewBeginSample; audioSource.Play(); } if (GUILayout.Button("Stop Both")) { EditorApplication.update -= Update; audioLooper.Stop(); audioSource.Stop(); } } } serializedObject.ApplyModifiedProperties(); }
public bool DrawControl(IAudioEffectPlugin plugin, Rect r, float samplerate) { var evt = Event.current; var controlID = GUIUtility.GetControlID(FocusType.Passive); var evtType = evt.GetTypeForControl(controlID); r = AudioCurveRendering.BeginCurveFrame(r); var thr = 4.0f; var changed = false; var x = evt.mousePosition.x - r.x; if ((evtType == EventType.MouseDown) && r.Contains(evt.mousePosition) && (evt.button == 0)) { var lf = (float)GUIHelpers.MapNormalizedFrequency(_lowFreq, samplerate, _useLogScale, false) * r.width; var mf = (float)GUIHelpers.MapNormalizedFrequency(_midFreq, samplerate, _useLogScale, false) * r.width; var hf = (float)GUIHelpers.MapNormalizedFrequency(_highFreq, samplerate, _useLogScale, false) * r.width; var ld = Mathf.Abs(x - lf); var md = Mathf.Abs(x - mf); var hd = Mathf.Abs(x - hf); var d = ld; dragOperation = DragOperation.Low; if (md < d) { d = md; dragOperation = DragOperation.Mid; } if (hd < d) { d = hd; dragOperation = DragOperation.High; } GUIUtility.hotControl = controlID; EditorGUIUtility.SetWantsMouseJumping(1); evt.Use(); } else if ((evtType == EventType.MouseDrag) && (GUIUtility.hotControl == controlID)) { switch (dragOperation) { case DragOperation.Low: _lowFreq = Mathf.Clamp( (float)GUIHelpers.MapNormalizedFrequency( GUIHelpers.MapNormalizedFrequency(_lowFreq, samplerate, _useLogScale, false) + (evt.delta.x / r.width), samplerate, _useLogScale, true ), 10.0f, samplerate * 0.5f ); if (evt.shift) { _lowQ = Mathf.Clamp(_lowQ - (evt.delta.y * 0.05f), 0.01f, 10.0f); } else { _lowGain = Mathf.Clamp(_lowGain - (evt.delta.y * 0.5f), -100.0f, 100.0f); } break; case DragOperation.Mid: _midFreq = Mathf.Clamp( (float)GUIHelpers.MapNormalizedFrequency( GUIHelpers.MapNormalizedFrequency(_midFreq, samplerate, _useLogScale, false) + (evt.delta.x / r.width), samplerate, _useLogScale, true ), 10.0f, samplerate * 0.5f ); if (evt.shift) { _midQ = Mathf.Clamp(_midQ - (evt.delta.y * 0.05f), 0.01f, 10.0f); } else { _midGain = Mathf.Clamp(_midGain - (evt.delta.y * 0.5f), -100.0f, 100.0f); } break; case DragOperation.High: _highFreq = Mathf.Clamp( (float)GUIHelpers.MapNormalizedFrequency( GUIHelpers.MapNormalizedFrequency(_highFreq, samplerate, _useLogScale, false) + (evt.delta.x / r.width), samplerate, _useLogScale, true ), 10.0f, samplerate * 0.5f ); if (evt.shift) { _highQ = Mathf.Clamp(_highQ - (evt.delta.y * 0.05f), 0.01f, 10.0f); } else { _highGain = Mathf.Clamp(_highGain - (evt.delta.y * 0.5f), -100.0f, 100.0f); } break; } changed = true; evt.Use(); } else if ((evtType == EventType.MouseUp) && (evt.button == 0) && (GUIUtility.hotControl == controlID)) { GUIUtility.hotControl = 0; EditorGUIUtility.SetWantsMouseJumping(0); evt.Use(); } if (Event.current.type == EventType.Repaint) { var blend = plugin.IsPluginEditableAndEnabled() ? 1.0f : 0.5f; // Mark bands (low, medium and high bands) DrawBandSplitMarker( plugin, r, (float)GUIHelpers.MapNormalizedFrequency(_lowFreq, samplerate, _useLogScale, false) * r.width, thr, (GUIUtility.hotControl == controlID) && (dragOperation == DragOperation.Low), new Color(0, 0, 0, blend) ); DrawBandSplitMarker( plugin, r, (float)GUIHelpers.MapNormalizedFrequency(_midFreq, samplerate, _useLogScale, false) * r.width, thr, (GUIUtility.hotControl == controlID) && (dragOperation == DragOperation.Mid), new Color(0.5f, 0.5f, 0.5f, blend) ); DrawBandSplitMarker( plugin, r, (float)GUIHelpers.MapNormalizedFrequency(_highFreq, samplerate, _useLogScale, false) * r.width, thr, (GUIUtility.hotControl == controlID) && (dragOperation == DragOperation.High), new Color(1.0f, 1.0f, 1.0f, blend) ); const float dbRange = 40.0f; const float magScale = 1.0f / dbRange; float[] coeffs; plugin.GetFloatBuffer("Coeffs", out coeffs, 15); // Draw filled curve DrawFilterCurve( r, coeffs, true, true, true, ScaleAlpha(AudioCurveRendering.kAudioOrange, blend), _useLogScale, false, _masterGain, samplerate, magScale ); if (GUIUtility.hotControl == controlID) { DrawFilterCurve( r, coeffs, dragOperation == DragOperation.Low, dragOperation == DragOperation.Mid, dragOperation == DragOperation.High, new Color(1.0f, 1.0f, 1.0f, 0.2f * blend), _useLogScale, true, _masterGain, samplerate, magScale ); } if (_showSpectrum) { var specLen = (int)r.width; float[] spec; plugin.GetFloatBuffer("InputSpec", out spec, specLen); DrawSpectrum(r, _useLogScale, spec, dbRange, samplerate, 0.3f, 1.0f, 0.3f, 0.5f * blend, 0.0f); plugin.GetFloatBuffer("OutputSpec", out spec, specLen); DrawSpectrum(r, _useLogScale, spec, dbRange, samplerate, 1.0f, 0.3f, 0.3f, 0.5f * blend, 0.0f); } GUIHelpers.DrawFrequencyTickMarks(r, samplerate, _useLogScale, new Color(1.0f, 1.0f, 1.0f, 0.3f * blend)); } AudioCurveRendering.EndCurveFrame(); return(changed); }
public bool DrawControl(IAudioEffectPlugin plugin, Rect r, float samplerate) { r = AudioCurveRendering.BeginCurveFrame(r); if (Event.current.type == EventType.Repaint) { var blend = plugin.IsPluginEditableAndEnabled() ? 1.0f : 0.5f; float window; plugin.GetFloatParameter("Window", out window); window *= samplerate; if (window > samplerate) { window = samplerate; } float[] corr; var numsamples = (int)window; plugin.GetFloatBuffer("Correlation", out corr, 2 * numsamples); numsamples = corr.Length; var cx = r.x + (r.width * 0.5f); var cy = r.y + (r.height * 0.5f); coord1[0].Set(r.x, r.y + (r.height * 0.5f), 0); coord1[1].Set(r.x + r.width, r.y + (r.height * 0.5f), 0); coord2[0].Set(r.x + (r.width * 0.5f), r.y, 0); coord2[1].Set(r.x + (r.width * 0.5f), r.y + r.height, 0); var w = (2.0f * 3.1415926f) / (circle.Length - 1); var cr = r.height * 0.4f; for (var n = 0; n < circle.Length; n++) { circle[n].Set(cx + (cr * Mathf.Cos(n * w)), cy + (cr * Mathf.Sin(n * w)), 0); } float scale; plugin.GetFloatParameter("Scale", out scale); scale *= cr; var lineTint = 0.5f; UnityEditor.Handles.color = new Color(lineTint, lineTint, lineTint, 0.75f); UnityEditor.Handles.DrawAAPolyLine(2.0f, coord1.Length, coord1); UnityEditor.Handles.DrawAAPolyLine(2.0f, coord2.Length, coord2); UnityEditor.Handles.DrawAAPolyLine(2.0f, circle.Length, circle); HandleUtilityWrapper.handleWireMaterial.SetPass(0); GL.Begin(GL.LINES); var col1 = AudioCurveRendering.kAudioOrange; var col2 = Color.yellow; col1.a = blend; col2.a = 0.0f; var cs = 1.0f / ((numsamples / 2) - 1); for (var n = 0; n < (numsamples / 2); n++) { var px = cx + (scale * corr[n * 2]); var py = cy - (scale * corr[(n * 2) + 1]); if ((px >= r.x) && (py >= r.y) && (px < (r.x + r.width)) && (py < (r.y + r.height))) { GL.Color(Color.Lerp(col1, col2, n * cs)); GL.Vertex3(px, py - 1.0f, 0.0f); GL.Vertex3(px, py, 0.0f); } } GL.End(); } AudioCurveRendering.EndCurveFrame(); return(false); }
public void DrawControl(IAudioEffectPlugin plugin, Rect r, float samplerate) { Event evt = Event.current; int controlID = GUIUtility.GetControlID(FocusType.Passive); EventType evtType = evt.GetTypeForControl(controlID); r = AudioCurveRendering.BeginCurveFrame(r); if (evtType == EventType.MouseDown && r.Contains(evt.mousePosition) && evt.button == 0) { float ofs, rofs; plugin.GetFloatParameter(DragParams[(int)DragOperation.Offset], out ofs); plugin.GetFloatParameter(DragParams[(int)DragOperation.RandomOffset], out rofs); float x = r.x + r.width * (ofs - rofs); float mindist = Mathf.Abs(x - evt.mousePosition.x); dragOperation = DragOperation.RandomOffset; x = r.x; for (DragOperation i = DragOperation.Offset; i <= DragOperation.RandomWindowLen; i++) { float value; plugin.GetFloatParameter(DragParams[(int)i], out value); x += r.width * value; float dx = Mathf.Abs(x - evt.mousePosition.x); if (dx < mindist) { mindist = dx; dragOperation = i; } } GUIUtility.hotControl = controlID; EditorGUIUtility.SetWantsMouseJumping(1); evt.Use(); } if (evtType == EventType.MouseDrag && GUIUtility.hotControl == controlID) { if (dragOperation != DragOperation.None) { float value; plugin.GetFloatParameter(DragParams[(int)dragOperation], out value); value = Mathf.Clamp(value + ((dragOperation == DragOperation.RandomOffset) ? -evt.delta.x : evt.delta.x) * 0.001f, 0.0f, 1.0f); plugin.SetFloatParameter(DragParams[(int)dragOperation], value); evt.Use(); } } else if (evtType == EventType.MouseUp && GUIUtility.hotControl == controlID) { dragOperation = DragOperation.None; GUIUtility.hotControl = 0; EditorGUIUtility.SetWantsMouseJumping(0); evt.Use(); } else if (Event.current.type == EventType.Repaint) { float blend = plugin.IsPluginEditableAndEnabled() ? 1.0f : 0.5f; int numsamples = (int)r.width; float[] wave1; plugin.GetFloatBuffer("Waveform0", out wave1, numsamples); float[] wave2; plugin.GetFloatBuffer("Waveform1", out wave2, numsamples); float ofs; plugin.GetFloatParameter(DragParams[(int)DragOperation.Offset], out ofs); float rofs; plugin.GetFloatParameter(DragParams[(int)DragOperation.RandomOffset], out rofs); float wlen; plugin.GetFloatParameter(DragParams[(int)DragOperation.WindowLen], out wlen); float rwlen; plugin.GetFloatParameter(DragParams[(int)DragOperation.RandomWindowLen], out rwlen); float shape; plugin.GetFloatParameter("Shape", out shape); float useSample; plugin.GetFloatParameter("Use Sample", out useSample); m_Wave1Color.a = blend; m_Wave2Color.a = blend; m_Wave3Color.a = blend; m_Wave4Color.a = blend; var r2 = new Rect(r.x, r.y, r.width, r.height * 0.5f); DrawCurve(r2, wave1, 1.0f, m_Wave1Color, m_Wave2Color, m_Wave3Color, m_Wave4Color, 90, rofs, ofs, wlen, rwlen, shape); r2.y += r2.height; DrawCurve(r2, wave2, 1.0f, m_Wave1Color, m_Wave2Color, m_Wave3Color, m_Wave4Color, 150, rofs, ofs, wlen, rwlen, shape); float x1 = r.x + r.width * (ofs - rofs); float x2 = r.x + r.width * ofs; float x3 = x2 + r.width * wlen; float x4 = x3 + r.width * rwlen; GUIHelpers.DrawLine(x1, r.y, x1, r.y + r.height, m_Wave1Color); GUIHelpers.DrawLine(x2, r.y, x2, r.y + r.height, m_Wave2Color); GUIHelpers.DrawLine(x3, r.y, x3, r.y + r.height, m_Wave3Color); GUIHelpers.DrawLine(x4, r.y, x4, r.y + r.height, m_Wave4Color); string name = "Sample: " + Marshal.PtrToStringAnsi(Granulator_GetSampleName((int)useSample)); GUIHelpers.DrawText(r2.x + 5, r2.y - 5, r2.width, name, Color.white); } AudioCurveRendering.EndCurveFrame(); }
public bool DrawControl(IAudioEffectPlugin plugin, Rect r, float samplerate) { Event evt = Event.current; int controlID = GUIUtility.GetControlID(FocusType.Passive); EventType evtType = evt.GetTypeForControl(controlID); r = AudioCurveRendering.BeginCurveFrame(r); if (Event.current.type == EventType.Repaint) { float blend = plugin.IsPluginEditableAndEnabled() ? 1.0f : 0.5f; const float dbRange = 40.0f; const float magScale = 1.0f / dbRange; float showSpectrum; plugin.GetFloatParameter("ShowSpectrum", out showSpectrum); if (showSpectrum >= 0.5f) { blend *= 0.5f; } bool useLogScale = false; float numModes = 0; if (plugin.GetFloatParameter("Num modes", out numModes) && numModes > 0 && numModes < 1000) { float[] coeffs; if (plugin.GetFloatBuffer("Coeffs", out coeffs, (int)numModes * 3) && coeffs != null) { // Draw filled curve DrawFilterCurve( r, coeffs, ScaleAlpha(AudioCurveRendering.kAudioOrange, blend), (int)numModes, useLogScale, false, samplerate, magScale); GUIHelpers.DrawFrequencyTickMarks(r, samplerate, useLogScale, new Color(1.0f, 1.0f, 1.0f, 0.3f * blend)); } } if (showSpectrum >= 0.5f) { float spectrumOffset; plugin.GetFloatParameter("SpectrumOffset", out spectrumOffset); int specLen = (int)r.width; float[] spec; plugin.GetFloatBuffer("InputSpec", out spec, specLen); DrawSpectrum(r, useLogScale, spec, dbRange, samplerate, 0.3f, 1.0f, 0.3f, 0.5f * blend, spectrumOffset); plugin.GetFloatBuffer("OutputSpec", out spec, specLen); DrawSpectrum(r, useLogScale, spec, dbRange, samplerate, 1.0f, 0.3f, 0.3f, 0.5f * blend, spectrumOffset); } } AudioCurveRendering.EndCurveFrame(); return(false); }
public bool DrawControl(IAudioEffectPlugin plugin, Rect r, float samplerate, int channel) { r = AudioCurveRendering.BeginCurveFrame(r); if (Event.current.type == EventType.Repaint) { float blend = plugin.IsPluginEditableAndEnabled() ? 1.0f : 0.5f; float window, scale, mode; plugin.GetFloatParameter("Window", out window); plugin.GetFloatParameter("Scale", out scale); plugin.GetFloatParameter("Mode", out mode); float[] buffer; int numsamples = (mode >= 1.0f) ? maxspeclen : (int)(window * samplerate); plugin.GetFloatBuffer("Channel" + channel.ToString(), out buffer, numsamples); numsamples = buffer.Length; if (mode < 2.0f) { Color lineColor = new Color(1.0f, 0.5f, 0.2f, blend); if (mode >= 1.0f) { scale *= 0.1f; AudioCurveRendering.DrawFilledCurve(r, delegate(float x) { float f = Mathf.Clamp(x * (numsamples - 2) * window * 0.5f, 0, numsamples - 2); int i = (int)Mathf.Floor(f); float s1 = 20.0f * Mathf.Log10(buffer[i] + 0.0001f); float s2 = 20.0f * Mathf.Log10(buffer[i + 1] + 0.0001f); return((s1 + (s2 - s1) * (f - i)) * scale); }, lineColor); GUIHelpers.DrawFrequencyTickMarks(r, samplerate * window * 0.5f, false, Color.red); GUIHelpers.DrawDbTickMarks(r, 1.0f / scale, scale, Color.red, new Color(1.0f, 0.0f, 0.0f, 0.25f)); } else { AudioCurveRendering.DrawCurve(r, delegate(float x) { return(scale * buffer[(int)Mathf.Floor(x * (numsamples - 2))]); }, lineColor); GUIHelpers.DrawTimeTickMarks(r, window, Color.red, new Color(1.0f, 0.0f, 0.0f, 0.25f)); } } else { scale *= 0.1f; for (int i = 0; i < maxspeclen; i++) { float v = 20.0f * Mathf.Log10(buffer[i] + 0.0001f) * scale; spec[i] = new Color( Mathf.Clamp(v * 4.0f - 1.0f, 0.0f, 1.0f), Mathf.Clamp(v * 4.0f - 2.0f, 0.0f, 1.0f), 1.0f - Mathf.Clamp(Mathf.Abs(v * 4.0f - 1.0f), 0.0f, 1.0f) * Mathf.Clamp(4.0f - 4.0f * v, 0.0f, 1.0f), 1.0f); } if (spectex[channel] == null) { spectex[channel] = new Texture2D(maxspeclen, scopeheight); } specpos[channel] = (specpos[channel] + 1) % scopeheight; spectex[channel].SetPixels(0, specpos[channel], maxspeclen, 1, spec); spectex[channel].Apply(); Color oldColor = GUI.color; GUI.color = new Color(1.0f, 1.0f, 1.0f, blend); Rect r2 = new Rect(r.x, r.y + specpos[channel], r.width / (window * 0.5f), scopeheight); GUI.DrawTexture(r2, spectex[channel], ScaleMode.StretchToFill, false, 1.0f); r2.y -= scopeheight; GUI.DrawTexture(r2, spectex[channel], ScaleMode.StretchToFill, false, 1.0f); GUI.color = oldColor; GUIHelpers.DrawFrequencyTickMarks(r, samplerate * window * 0.5f, false, Color.red); } } AudioCurveRendering.EndCurveFrame(); return(false); }