5


6

私は、C#言語と.NET Frameworkを使用して健全な視覚化システムを作りたいと思います。 これはWinampアプリケーションのように見えます。 たぶん無料の図書館やそれをどうやって行うかを説明しているいくつかの興味深い記事が存在しますか? 例: alt text http://img44.imageshack.us/img44/9982/examplel.png

2 回答


15


あなたはこれらのリンクを試すことができます

http://code.google.com/p/openvisualizationplatform/[OpenVP](C#で書かれた、音楽のビジュアライゼーションを開発するための無料のオープンソースプラットフォームです。)http://picasaweb.google.com/cdhowie/を参照してください。 OpenVPSスクリーンショット#[OpenVPスクリーンショット]。
http://www.codeproject.com/KB/audio-video/SoundViewer.aspx[C#のサウンドビジュアライザ]
http://www.codeproject.com/KB/audio-video/Circular_Buffers.aspx[Managed Direct Soundを使用してWAVファイルを再生および視覚化する]

さようなら。


2


これは、WASAPI APIを使用してコンピューターで再生されたサウンドのFFTを計算するスクリプトです。 CSCoreとその WinformsVisualizationの例を使用します。

CSCoreを使用する。 CSCore.SoundInを使用する。 CSCore.Codecs.WAVを使用する。 WinformsVisualization.Visualizationを使用します。 CSCore.DSPを使用する。 CSCore.Streamsを使用する。システムを使用する。

パブリッククラス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キャプチャ。 WaveWriterの作家。 FftSize fftSize; float [] fftBuffer;

SingleBlockNotificationStream notificationSource。

BasicSpectrumProvider spectrumProvider;

IWaveSource finalSource;

public SoundCapture(){

//これは、wasapi apiを使用して、コンピューターで再生されるサウンドデータを取得します。

capture.Initialize();

//キャプチャをソースとして取得IWaveSource source = new SoundInSource(キャプチャ);

// https://github.com/filoe/cscore/blob/master/Samples/WinformsVisualization/Form1.csから

//これは一般的なサイズです。必要に応じて、詳細を変更することができます。fftSize = FftSize.Fft4096;

//実際のfftデータfftBuffer = new float [(int)fftSize];

//これらはスペクトルデータを提供する実際のクラスです。// lineSpectrumの特定の変数は、ユーザーが変更できるため、あまり重要ではありません。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};

//いつデータがスペクトルに送信できるかを通知しますvar notificationSource = new SingleBlockNotificationStream(source.ToSampleSource());

notificationSource.SingleBlockRead = NotificationSource_SingleBlockRead;

//これは実際にデータが流れるようにデータを要求するために使用します(これを理解するには永遠にかかります...)finalSource = notificationSource.ToWaveSource();

capture.DataAvailable = Capture_DataAvailable; capture.Start(); }

private void Capture_DataAvailable(オブジェクトセンダ、DataAvailableEventArgs e){finalSource.Read(e.Data、e.Offset、e.ByteCount); }

private void NotificationSource_SingleBlockRead(オブジェクト送信側、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); lineSpectrum.GetSpectrumPoints(100.0f、fftBuffer)を返します。 } else {nullを返す。 }}

public void ComputeData(){

float [] resData = GetFFtData();

int numBars = barData.Length;

if(resData == null){return; }

lock(barData){for(int i = 0; i <numBars)

(int i = 0; i <numBars)

}}

別のスクリプトからbarDataを取得する場合は、別のスレッドで変更されるため、最初にロックすることをお勧めします。

https://github.com/filoe/cscore/blob/master/Samples/WinformsVisualization/Visualization/LineSpectrum.cs[Github Repo]に含まれていないようなので、私がどこで `GetSpectrumPoints`を得たのかわかりませんしかし、ここにあります。 これをそのファイルに貼り付けるだけで、私のコードは動作するはずです。
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; }

resを返します。 }