コード例 #1
0
        // Form1_SizeChanged

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            audio_bytes = (int)Bass.BASS_ChannelSeconds2Bytes(Audio_Stream, Interval / 1000.0);              // текущая длина аудиобуффера в байтах
            if (audio_bytes <= 0)
            {
                // при первом запуске когда нет проигрывателя
                e.Graphics.DrawString("Press right mouse button.", fnt1, Brushes.Yellow, this.ClientSize.Width / 2 - (64 + 16), this.ClientSize.Height / 2 - 16);
                return;
            }

            int Okno = 0;

            cic = Mcic [ResToIdx(Resample)];
            int samples = Bass.BASS_ChannelGetData(Audio_Stream, audiobuf, audio_bytes) / SAMPLE_BYTES;              // число самплов в аудиобуффере

            for (int i = 0, j = 0; i < samples; i++)
            {
                // нормализатор нуля
                float x = (float)audiobuf [j++];
                float y = (float)audiobuf [j++];
                x -= (Xnorm += (x - Xnorm) * 0.0001f);
                y -= (Ynorm += (y - Ynorm) * 0.0001f);

                if (cic.Decimate((int)x, (int)y))
                {
                    if (iFilter2 < 2)
                    {
                        Xbuf [Okno] = cic.X;
                        Ybuf [Okno] = cic.Y;
                    }
                    else
                    {
                        Xbuf [Okno] = (int)Xfir.Sim((double)cic.X);
                        Ybuf [Okno] = (int)Yfir.Sim((double)cic.Y);
                    }
                    Okno++;
                }
            }
            if (Okno == 0)
            {
                return;
            }

            // Коррелятор для пущего стробоскопического эффекта
            int    Okno34 = Okno * 3 / 4;
            int    ix = 0, iy = 0;
            double kx = 0.0f, ky = 0.0f;

            for (int i = 0; i < Okno / 4; i++)
            {
                double kxx = 0.0f, kyy = 0.0f;
                for (int j = 0, k = i; k < Okno34; j++, k++)
                {
                    kxx += Math.Abs(Xbuf [k] * Xkor [j]);
                    kyy += Math.Abs(Ybuf [k] * Ykor [j]);
                }
                if (kx < kxx)
                {
                    ix = i; kx = kxx;
                }
                if (ky < kyy)
                {
                    iy = i; ky = kyy;
                }
            }
            for (int i = 0; i < Okno34; i++)
            {
                Xbuf [i] = Xbuf [ix++];
                Ybuf [i] = Xbuf [iy++];
            }
            const double CORR_LEAK = 0.125;

            for (int i = 0; i < Okno34; i++)
            {
                Xkor [i] += (Math.Abs(Xbuf [i]) - Xkor [i]) * CORR_LEAK;                  // обучение интегратора коррелятора
                Ykor [i] += (Math.Abs(Ybuf [i]) - Ykor [i]) * CORR_LEAK;
            }
            Okno = Okno34;

            int Okno2 = Okno / 2;             // центр окна

            int    vcnt  = 0;
            double vsum2 = 0.0;

            double kf1 = Palitra;             // pct;
            double kf2 = Gamma * 0.1;
            double kf3 = Bright * 0.2;

            int sec = System.Environment.TickCount / 1000 / 15;             // раз в 15 сек

            if (bRotate)
            {
                alpha = -(System.Environment.TickCount & 16383) / 32768.0 * Math.PI;
                x0    = Math.Cos(alpha);
                y0    = Math.Sin(alpha);
                kf    = Math.Max(Math.Abs(x0 + y0), Math.Abs(x0 - y0));
                if (!bInside)
                {
                    kf = 1.0 / kf;
                }
            }
            else
            {
                alpha = 0.0;
                x0    = 1.0;
                y0    = 0.0;
                kf    = 1.0;
            }

            Graphics g     = e.Graphics;
            Bitmap   bmp1  = new Bitmap(Okno, Okno, g);
            var      Fbmp1 = new FastBitmap(bmp1);

            Color  color1 = new Color();
            double x1, y1, x2, y2;

            for (int x = 0; x < Okno; x++)
            {
                x1 = (double)(x - Okno2) / Okno2;
                for (int y = 0; y < Okno; y++)
                {
                    y1 = (double)(y - Okno2) / Okno2;

                    if (bSpiral)
                    {
                        int ir = (int)((x1 * x1 + y1 * y1) * DISTORTION / 2.0);
                        if (DISTORTION <= ir)
                        {
                            ir = DISTORTION - 1;
                        }
                        x2 = (Xrot [ir] * x1 + Yrot [ir] * y1);
                        y2 = (Xrot [ir] * y1 - Yrot [ir] * x1);
                    }
                    else
                    {
                        x2 = (x0 * x1 + y0 * y1);
                        y2 = (x0 * y1 - y0 * x1);
                    }

                    if (bDistortion)
                    {
                        int ir = (int)((x2 * x2 + y2 * y2) * DISTORTION / 2.0);
                        if (DISTORTION <= ir)
                        {
                            ir = DISTORTION - 1;
                        }
                        x2 *= DistortionTab [ir];
                        y2 *= DistortionTab [ir];
                    }

                    x2 = Okno2 + Okno2 * x2 * kf;
                    if ((0.0 <= x2) && (x2 < Okno))
                    {
                        y2 = Okno2 + Okno2 * y2 * kf;
                        if ((0.0 <= y2) && (y2 < Okno))
                        {
                            double v = Xbuf [(int)x2] + Ybuf [(int)y2];
                            if (ScreenLeak < 1.0)
                            {
                                v = Screen [x, y] += (v - Screen [x, y]) * ScreenLeak;
                            }
                            vsum2 += v * v; vcnt++;
                            if (0.0 < Power)
                            {
                                v /= Power;
                            }
                            if (bIsobar)
                            {
                                int va = (int)(v * 64.0 * Gamma) & 255;
                                int vb = ((sec & 1) == 0 ? va : -va & 255);
                                switch ((sec >> 1) % 6)
                                {
                                case 0: color1 = (0.0f < v ? Color.FromArgb(va, 0, 0) : Color.FromArgb(0, vb, 0)); break;

                                case 1: color1 = (0.0f < v ? Color.FromArgb(va, 0, 0) : Color.FromArgb(0, 0, vb)); break;

                                case 2: color1 = (0.0f < v ? Color.FromArgb(0, va, 0) : Color.FromArgb(0, 0, vb)); break;

                                case 3: color1 = (0.0f < v ? Color.FromArgb(0, va, 0) : Color.FromArgb(vb, 0, 0)); break;

                                case 4: color1 = (0.0f < v ? Color.FromArgb(0, 0, va) : Color.FromArgb(vb, 0, 0)); break;

                                case 5: color1 = (0.0f < v ? Color.FromArgb(0, 0, va) : Color.FromArgb(0, vb, 0)); break;
                                }
                            }
                            else
                            {
                                v      = Math.Abs(v);
                                color1 = TriColor(kf1 + v * kf2, v * kf3);
                            }
                            Fbmp1.SetNextPixel(color1);
                            continue;
                        }
                    }
                    Fbmp1.SetNextPixel(Color.Black);
                }
            }
            Fbmp1.Unlock();

            double pwr1 = 0.0;

            if (0 < vcnt)
            {
                pwr1   = Math.Sqrt(vsum2 / vcnt);
                Power += (pwr1 - Power) / PowerLeak;
                //bw.Write (BitConverter.GetBytes ((short)1000.0 * Power3), 0, sizeof (short));
            }

            //if (Power < pwr1)
            {
                Image img1 = bmp1;
                if (bStretch)
                {
                    g.DrawImage(img1, 0, 0, this.ClientSize.Width, this.ClientSize.Height);
                }
                else
                {
                    int side = Math.Min(this.ClientSize.Width, this.ClientSize.Height);
                    g.DrawImage(img1, (this.ClientSize.Width - side) / 2, (this.ClientSize.Height - side) / 2, side, side);
                }
                g.DrawLine(pen2, (int)(this.ClientSize.Width * fpos / flen), this.ClientSize.Height - PENW, 0, this.ClientSize.Height - PENW);
                img0 = img1;
            }

            //else if (img0 != null)
            //{
            //	if (bStretch)
            //	{
            //		g.DrawImage (img0, 0, 0, this.ClientSize.Width, this.ClientSize.Height);
            //	}
            //	else
            //	{
            //		int side = Math.Min (this.ClientSize.Width, this.ClientSize.Height);
            //		g.DrawImage (img0, (this.ClientSize.Width - side) / 2, (this.ClientSize.Height - side) / 2, side, side);
            //	}
            //	g.DrawLine (pen2, (int)(this.ClientSize.Width * fpos / flen), this.ClientSize.Height - PENW, 0, this.ClientSize.Height - PENW);
            //}
            //g.DrawString (String.Format ("{0}", palitra0), fnt1, Brushes.Yellow, 0.0f, 0.0f);
            //g.DrawString (String.Format ("{0} {1}", Okno, x2max), fnt1, Brushes.Yellow, 0.0f, 0.0f);

            // кривая искажений
            //if (0 < DistortionTab.Length)
            //{
            //	int x00 = 0;
            //	int y00 = (int)(DistortionTab [0] * this.ClientSize.Height * 0.5);
            //	for (int i = 1; i < DistortionTab.Length; i++)
            //	{
            //		int x11 = this.ClientSize.Width * i / DistortionTab.Length;
            //		int y11 = (int)(DistortionTab [i] * this.ClientSize.Height * 0.5);
            //		g.DrawLine (Pens.Yellow, x00, y00, x11, y11);
            //		x00 = x11;
            //		y00 = y11;
            //	}
            //}
        }