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)
                );
        }
示例#2
0
        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);
        }
    }
示例#5
0
    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();
    }
示例#6
0
    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);
        }
            );
    }
示例#7
0
        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();
        }
示例#8
0
    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);
            }
        }
示例#11
0
        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);
            }
        }
示例#12
0
 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]);
     }
         );
 }
示例#13
0
    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);
        }
            );
    }
示例#14
0
        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);
            }
        }
示例#17
0
    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();
    }
示例#18
0
        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);
            }
                );
        }
示例#20
0
        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);
    }
示例#22
0
        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);
        }
示例#25
0
    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();
    }
示例#26
0
    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);
    }