Me gustaría crear un sistema de visualización de sonido usando el lenguaje C# y .NET Framework. Esto podría verse en la aplicación Winamp. ¿Tal vez existe una biblioteca gratuita o algunos artículos interesantes que describen cómo hacerlo? Ejemplo: alt text http://img44.imageshack.us/img44/9982/examplel.pngC# visualización de sonido
Respuesta
Puede probar estos enlaces
OpenVP (es una plataforma libre y de código abierto para el desarrollo de visualizaciones de música, escrito en C#), ver el OpenVP Screenshots.
Play and Visualize WAV Files using Managed Direct Sound
adiós.
Aquí hay una secuencia de comandos que calcula la FFT de cualquier sonido reproducido en la computadora con la API de WASAPI. Utiliza CPuntuacion y su WinformsVisualization ejemplo:
using CSCore;
using CSCore.SoundIn;
using CSCore.Codecs.WAV;
using WinformsVisualization.Visualization;
using CSCore.DSP;
using CSCore.Streams;
using System;
public class SoundCapture
{
public int numBars = 30;
public int minFreq = 5;
public int maxFreq = 4500;
public int barSpacing = 0;
public bool logScale = true;
public bool isAverage = false;
public float highScaleAverage = 2.0f;
public float highScaleNotAverage = 3.0f;
LineSpectrum lineSpectrum;
WasapiCapture capture;
WaveWriter writer;
FftSize fftSize;
float[] fftBuffer;
SingleBlockNotificationStream notificationSource;
BasicSpectrumProvider spectrumProvider;
IWaveSource finalSource;
public SoundCapture()
{
// This uses the wasapi api to get any sound data played by the computer
capture = new WasapiLoopbackCapture();
capture.Initialize();
// Get our capture as a source
IWaveSource source = new SoundInSource(capture);
// From https://github.com/filoe/cscore/blob/master/Samples/WinformsVisualization/Form1.cs
// This is the typical size, you can change this for higher detail as needed
fftSize = FftSize.Fft4096;
// Actual fft data
fftBuffer = new float[(int)fftSize];
// These are the actual classes that give you spectrum data
// The specific vars of lineSpectrum here aren't that important because they can be changed by the user
spectrumProvider = new BasicSpectrumProvider(capture.WaveFormat.Channels,
capture.WaveFormat.SampleRate, fftSize);
lineSpectrum = new LineSpectrum(fftSize)
{
SpectrumProvider = spectrumProvider,
UseAverage = true,
BarCount = numBars,
BarSpacing = 2,
IsXLogScale = false,
ScalingStrategy = ScalingStrategy.Linear
};
// Tells us when data is available to send to our spectrum
var notificationSource = new SingleBlockNotificationStream(source.ToSampleSource());
notificationSource.SingleBlockRead += NotificationSource_SingleBlockRead;
// We use this to request data so it actualy flows through (figuring this out took forever...)
finalSource = notificationSource.ToWaveSource();
capture.DataAvailable += Capture_DataAvailable;
capture.Start();
}
private void Capture_DataAvailable(object sender, DataAvailableEventArgs e)
{
finalSource.Read(e.Data, e.Offset, e.ByteCount);
}
private void NotificationSource_SingleBlockRead(object sender, SingleBlockReadEventArgs e)
{
spectrumProvider.Add(e.Left, e.Right);
}
~SoundCapture()
{
capture.Stop();
capture.Dispose();
}
public float[] barData = new float[20];
public float[] GetFFtData()
{
lock (barData)
{
lineSpectrum.BarCount = numBars;
if (numBars != barData.Length)
{
barData = new float[numBars];
}
}
if (spectrumProvider.IsNewDataAvailable)
{
lineSpectrum.MinimumFrequency = minFreq;
lineSpectrum.MaximumFrequency = maxFreq;
lineSpectrum.IsXLogScale = logScale;
lineSpectrum.BarSpacing = barSpacing;
lineSpectrum.SpectrumProvider.GetFftData(fftBuffer, this);
return lineSpectrum.GetSpectrumPoints(100.0f, fftBuffer);
}
else
{
return null;
}
}
public void ComputeData()
{
float[] resData = GetFFtData();
int numBars = barData.Length;
if (resData == null)
{
return;
}
lock (barData)
{
for (int i = 0; i < numBars && i < resData.Length; i++)
{
// Make the data between 0.0 and 1.0
barData[i] = resData[i]/100.0f;
}
for (int i = 0; i < numBars && i < resData.Length; i++)
{
if (lineSpectrum.UseAverage)
{
// Scale the data because for some reason bass is always loud and treble is soft
barData[i] = barData[i] + highScaleAverage * (float)Math.Sqrt(i/(numBars + 0.0f)) * barData[i];
}
else
{
barData[i] = barData[i] + highScaleNotAverage * (float)Math.Sqrt(i/(numBars + 0.0f)) * barData[i];
}
}
}
}
}
Entonces cuando se recupera la barData de un guión diferente se recomienda para bloquearlo primero desde este se modifica en un hilo separado.
No estoy seguro de dónde obtuve GetSpectrumPoints
ya que no parece estar en el Github Repo, pero aquí está. Simplemente pegue esto en ese archivo y mi código debería funcionar.
public float[] GetSpectrumPoints(float height, float[] fftBuffer)
{
SpectrumPointData[] dats = CalculateSpectrumPoints(height, fftBuffer);
float[] res = new float[dats.Length];
for (int i = 0; i < dats.Length; i++)
{
res[i] = (float)dats[i].Value;
}
return res;
}
He intentado utilizar su código de ejemplo, pero no parece que ['GetSpectrumPoints()' sea una función más] (https://github.com/filoe/cscore/blob/29410b12ae35321c4556b072c0711a8f289c0544/Samples/ WinformsVisualization/Visualization/LineSpectrum.cs # L10), y verificar el historial del repositorio git tampoco lo muestra. ¿Te importaría aclarar/actualizar tu respuesta? (* Estoy tratando de integrar la captura/procesamiento de audio en Windows con una aplicación de consola multiplataforma que maneja luces LED, los valores de datos de frecuencia de 0.0 a 1.0 bar son todo lo que necesita *) – Shane
@Shane ¡Lo siento! Agregué ese código ahora, espero que ayude – Phylliida
- 1. Capturar salida de sonido en C#
- 2. Sonido acordes en C#?
- 3. Visualización de código en C++
- 4. Visualización de código fuente C/C++?
- 5. Detección de sonido de palmada en C#
- 6. Obtener volumen de sonido principal en C#
- 7. Visualización del algoritmo para C#
- 8. Reconocimiento de patrón de sonido en Objective C/C (Mac)
- 9. Captura de sonido para análisis y visualización de frecuencias en Android
- 10. C# Software de visualización de clase/objeto
- 11. Visualización de gráfico dinámico simple para C++
- 12. Cómo crear un sonido desde cero C#
- 13. Comprueba si el sistema tiene sonido C#
- 14. Cómo reproducir un sonido en C#, .NET
- 15. Visualización de MP3 - PHP
- 16. Directorio portátil/biblioteca de visualización de archivos en C/C++
- 17. Captura de sonido desde la tarjeta de TV con C#
- 18. Generador simple de ondas de sonido con SDL en C++
- 19. Generación de sonido real de bajo nivel en C#?
- 20. Reproducción de sonido en C++ utilizando llamadas al sistema nativo?
- 21. Biblioteca de sonido C++ multiplataforma que no es GPL/LGPL?
- 22. Cómo poner en marcha sonido después de sonido en soundmanager2
- 23. ¿Buenas bibliotecas de sonido?
- 24. Sonido generador de Java
- 25. Reproducción de sonido Ruby
- 26. Audio/Visualización de voz
- 27. utilidad de visualización/mapeo de flujo de código C#?
- 28. Open Source C++ Biblioteca de visualización de datos
- 29. C Visualización de la estructura de datos del lenguaje
- 30. Visualización de contenido Flash en una aplicación WinForms de C#
Creo que será bueno para empezar, gracias. –