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; }
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); }
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); }
public void RegisterWaveForm(WaveForm waveForm) { var pack = new WavImagesPack(); images.TryAdd(waveForm, pack); }