Пример #1
0
        public Point[] CalculateVisualPoints(WaveForm waveForm, double height)
        {
            var middleHeight = height / 2;

            double maxVal         = 0;
            var    averagedPoints = new List <double>();

            foreach (var point in Points)
            {
                var average = point - AverageFrequency;
                averagedPoints.Add(average);
                if (average != 0 && maxVal < Math.Abs(average))
                {
                    maxVal = Math.Abs(average);
                }
            }

            var step = Settings.RealToViewX(waveForm.Channels * 1000.0 * SamplesPerFrq /
                                            waveForm.SampleRate);

            var x      = step / 2;
            var points = new List <Point>();

            for (var i = 1; i < averagedPoints.Count; i++)
            {
                var point      = averagedPoints[i];
                var saturatedY = point / maxVal;
                var y          = middleHeight - saturatedY * middleHeight;
                if (y != height)
                {
                    if (y < 0 || y > height)
                    {
                        throw new Exception("error on draw frq");
                    }

                    points.Add(new Point(x, y));
                }

                x += step;
            }

            return(points.ToArray());
        }
 public ProjectLineContainer(ProjectLine projectLine, ImagesLibrary imagesLibrary, WavPlayer wavPlayer, string sampleName, WavImagesHash hash, int number)
 {
     ProjectLine        = projectLine;
     Number             = number;
     this.imagesLibrary = imagesLibrary;
     this.wavPlayer     = wavPlayer;
     this.hash          = hash;
     if (!string.IsNullOrEmpty(ProjectLine?.Recline?.Description))
     {
         viewName = $"{ProjectLine?.Recline?.Description} [{ProjectLine?.Recline?.Name}]";
     }
     else
     {
         viewName = ProjectLine?.Recline?.Name.Replace("_", " ");
     }
     WaveForm    = new WaveForm(sampleName);
     IsCompleted = ProjectLine.IsCompleted;
     IsEnabled   = ProjectLine.IsEnabled;
 }
Пример #3
0
        public void RequestLoadSpectrum(WaveForm waveForm, int height, WavImagesHash hash)
        {
            if (!waveForm.IsEnabled)
            {
                ClearWavformImages(waveForm);
                Console.WriteLine($"ImagesLibrary: failed to load spectrum {hash.Recline}");
                OnImageLoaded(waveForm);
                return;
            }

            Console.WriteLine($"ImagesLibrary: started load spectrum {hash.Recline}");
            images.TryGetValue(waveForm, out var pack);
            if (pack == null)
            {
                throw new Exception();
            }
            LoadSpectrum(pack, waveForm, ViewOptions);

            Console.WriteLine($"ImagesLibrary: finished load spectrum {hash.Recline}");
            OnImageLoaded(waveForm);
        }
Пример #4
0
        public Bitmap MakeSpectrogram(WaveForm waveForm, ViewOptions viewOptions)
        {
            if (!waveForm.IsEnabled)
            {
                return(null);
            }

            var reader = new WaveFileReader(waveForm.Path);

            var localSpectrumShift = viewOptions.SpectrumShift;
            var localSpectrumScale = viewOptions.SpectrumScale;
            var localQualityX      = viewOptions.SpectrumQualityX;
            var localQualityY      = viewOptions.SpectrumQualityY;

            var bufferLength = 128 * localQualityX;
            var buffer       = new byte[bufferLength];
            int bytesRecorded;
            var spectrogramData = new List <double[]>();
            var bytesCount      = reader.WaveFormat.BlockAlign;
            var waveData        = new float[reader.Length / bytesCount];

            var step = 0;

            while ((bytesRecorded = reader.Read(buffer, 0, bytesCount)) > 0)
            {
                // Converting the byte buffer in readable data
                float value;
                if (reader.WaveFormat.BitsPerSample == 16)
                {
                    value = BitConverter.ToInt16(buffer, 0) / ((float)Int16.MaxValue + 1);
                }
                else if (reader.WaveFormat.BitsPerSample == 32)
                {
                    value = BitConverter.ToInt32(buffer, 0) / ((float)Int32.MaxValue + 1);
                }
                else if (reader.WaveFormat.BitsPerSample == 64)
                {
                    value = BitConverter.ToInt64(buffer, 0) / ((float)Int64.MaxValue + 1);
                }
                else
                {
                    return(null);
                }
                if (step % reader.WaveFormat.Channels != 0)
                {
                    continue;
                }
                waveData[step] = value;
                step++;
            }

            var waveStep = bufferLength / localQualityY;

            for (var waveI = 0; waveI + bufferLength < waveData.Length; waveI += waveStep)
            {
                var waveBuffer = waveData.Skip(waveI).Take(bufferLength).ToArray();

                Complex[] tempbuffer = new Complex[waveBuffer.Length];

                for (int i = 0; i < tempbuffer.Length; i++)
                {
                    tempbuffer[i].X = (float)(waveBuffer[i] * FastFourierTransform.HammingWindow(i, waveBuffer.Length));
                }

                FastFourierTransform.FFT(true, (int)Math.Log(tempbuffer.Length, 2.0), tempbuffer);

                var fftOutput = new double[tempbuffer.Length / 2 - 1];
                for (int i = 0; i < fftOutput.Length; i++)
                {
                    var val = tempbuffer[i].X;
                    var pow = Math.Pow(val, 2);
                    var log = Math.Log(pow, 10);
                    fftOutput[i] = log;
                }
                spectrogramData.Add(fftOutput);
            }
            var spectrogramWidth  = spectrogramData.Count;
            var spectrogramHeight = spectrogramData[0].Length;

            /// create a bitmap we will work with
            Bitmap bitmap = new Bitmap(spectrogramWidth, spectrogramHeight, PixelFormat.Format8bppIndexed);

            ///modify the indexed palette
            ColorPalette pallette = bitmap.Palette;

            for (int i = 0; i < 256; i++)
            {
                pallette.Entries[i] = System.Drawing.Color.FromArgb(255 - i, 255, 0, 0);
            }
            bitmap.Palette = pallette;

            /// prepare to access data via the bitmapdata object
            BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
                                                    ImageLockMode.WriteOnly, bitmap.PixelFormat);

            /// create a byte array to reflect each pixel in the image
            byte[] pixels = new byte[bitmapData.Stride * bitmap.Height];

            /// fill pixel array with data
            for (int col = 0; col < spectrogramData.Count; col++)
            {
                for (int row = 0; row < spectrogramData[0].Length; row++)
                {
                    double pixelVal = Math.Pow(spectrogramData[col][row] * localSpectrumScale, 2);
                    pixelVal -= localSpectrumShift;
                    pixelVal  = Math.Max(0, pixelVal);
                    pixelVal  = Math.Min(255, pixelVal);

                    int bytePosition = (row) * bitmapData.Stride + col;
                    if (pixels.Length <= bytePosition)
                    {
                        break;
                    }
                    pixels[bytePosition] = (byte)(pixelVal);
                }
            }

            /// turn the byte array back into a bitmap
            Marshal.Copy(pixels, 0, bitmapData.Scan0, pixels.Length);
            bitmap.UnlockBits(bitmapData);

            reader.Close();
            reader.Dispose();

            spectrogramData.Clear();
            return(bitmap);
        }
Пример #5
0
        public void RegisterWaveForm(WaveForm waveForm)
        {
            var pack = new WavImagesPack();

            images.TryAdd(waveForm, pack);
        }