C# с открытым исходным кодом кодируют для представления формы сигнала?

При использовании Visual Studio (это могло бы работать в Eclipse также, но я никогда не пробовал), и Вы копируете & вставка в Microsoft Word (или любой другой продукт Microsoft) это вставит код в любом цвете, который имел Ваш IDE. Тогда просто необходимо скопировать текст из слова и в требуемое приложение, и это вставит как обогащенный текст.

я только видел эту работу через Visual Studio к другим продуктам Microsoft хотя, таким образом, я не знаю, будет ли это какая-либо справка.

36
задан MusiGenesis 27 January 2013 в 05:09
поделиться

3 ответа

Это максимально открытый исходный код:

public static void DrawNormalizedAudio(ref float[] data, PictureBox pb,
    Color color)
{
    Bitmap bmp;
    if (pb.Image == null)
    {
        bmp = new Bitmap(pb.Width, pb.Height);
    }
    else
    {
        bmp = (Bitmap)pb.Image;
    }

    int BORDER_WIDTH = 5;
    int width = bmp.Width - (2 * BORDER_WIDTH);
    int height = bmp.Height - (2 * BORDER_WIDTH);

    using (Graphics g = Graphics.FromImage(bmp))
    {
        g.Clear(Color.Black);
        Pen pen = new Pen(color);
        int size = data.Length;
        for (int iPixel = 0; iPixel < width; iPixel++)
        {
            // determine start and end points within WAV
            int start = (int)((float)iPixel * ((float)size / (float)width));
            int end = (int)((float)(iPixel + 1) * ((float)size / (float)width));
            float min = float.MaxValue;
            float max = float.MinValue;
            for (int i = start; i < end; i++)
            {
                float val = data[i];
                min = val < min ? val : min;
                max = val > max ? val : max;
            }
            int yMax = BORDER_WIDTH + height - (int)((max + 1) * .5 * height);
            int yMin = BORDER_WIDTH + height - (int)((min + 1) * .5 * height);
            g.DrawLine(pen, iPixel + BORDER_WIDTH, yMax, 
                iPixel + BORDER_WIDTH, yMin);
        }
    }
    pb.Image = bmp;
}

Эта функция выдаст что-то вроде этого:

enter image description here

Это принимает массив выборок в формате с плавающей запятой (где все значения выборки находятся в диапазоне от -1 до +1). Если ваши исходные данные на самом деле представлены в виде массива byte [], вам придется немного поработать, чтобы преобразовать их в float []. Дайте мне знать, если вам это тоже нужно.

Обновление : поскольку технически вопрос касается чего-то для рендеринга байтового массива, вот пара вспомогательных методов:

public float[] FloatArrayFromStream(System.IO.MemoryStream stream)
{
    return FloatArrayFromByteArray(stream.GetBuffer());
}

public float[] FloatArrayFromByteArray(byte[] input)
{
    float[] output = new float[input.Length / 4];
    for (int i = 0; i < output.Length; i++)
    {
        output[i] = BitConverter.ToSingle(input, i * 4);
    }
    return output;
}

Обновление 2 : Я забыл есть способ лучше сделать это:

public float[] FloatArrayFromByteArray(byte[] input)
{
    float[] output = new float[input.Length / 4];
    Buffer.BlockCopy(input, 0, output, 0, input.Length);
    return output;
}

Я так люблю для циклов, я думаю.

44
ответ дан 27 November 2019 в 05:51
поделиться

Я был поклонником ZedGraph в течение многих лет и использовал его для отображения всех видов данных в различных проектах.

Следующий пример графического кода показывает массив чисел двойной точности, варьирующийся от -1 до 1:

void DisplayWaveGraph(ZedGraphControl graphControl, double[] waveData)
{
    var pane = graphControl.GraphPane;
    pane.Chart.Border.IsVisible = false;
    pane.Chart.Fill.IsVisible = false;
    pane.Fill.Color = Color.Black;
    pane.Margin.All = 0;
    pane.Title.IsVisible = false;
    pane.XAxis.IsVisible = false;
    pane.XAxis.Scale.Max = waveData.Length - 1;
    pane.XAxis.Scale.Min = 0;
    pane.YAxis.IsVisible = false;
    pane.YAxis.Scale.Max = 1;
    pane.YAxis.Scale.Min = -1;
    var timeData = Enumerable.Range(0, waveData.Length)
                             .Select(i => (double) i)
                             .ToArray();
    pane.AddCurve(null, timeData, waveData, Color.Lime, SymbolType.None);
    graphControl.AxisChange();
}

Приведенный выше образец имитирует стиль звукового редактора, подавляя оси и изменяя цвета, чтобы получить следующее:

ZedGraph audio wave

3
ответ дан 27 November 2019 в 05:51
поделиться

В NAudio есть код для рисования звуковых сигналов как в WinForms, так и в WPF. Взгляните на демонстрационные проекты, чтобы узнать, как его использовать.

3
ответ дан 27 November 2019 в 05:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: