0

一日中、希望を持たずにこれを行う方法を探していました。MP3 再生機能を備えたプロジェクトを作成しており、このhttp://puu.sh/4lkMn.png ( Winamp) (ただし、バーでなくても問題ありません)

現在、オーディオの再生に WMP を使用していますが、WMP にはスペクトログラムをプロットする方法がありません。

有望と思われる NAudio の使用を調べました: http://naudio.codeplex.com/ 彼らはスペクトラム アナライザーのデモを持っていますが、そのデモのソースを提供していません。

NAudio を使用するこのhttp://wpfsvl.codeplex.com/も調べましたが、WinForms の代わりに WPF を使用し (私のプロジェクトは WinForms を使用しています)、WinForms に変換する方法がわかりません。

Google は .Net についてこれについてあまり多くの情報を持っていないようです。私が本当に必要としているのは、NAudio を実装したソースの実際の例だけですが、私が見つけることができたのは、サンプル ソースが「実際に利用可能になります。

..そして、彼らのデモの名前に「wpf」が含まれていることに気付きました。そのため、ソースが利用可能であっても、私にはできないWPFSVL実装に似ています。:(

4

2 に答える 2

0

変換元の例を見つけました。それはAudioVSTToolbox でした

これが私の結果です:http://puu.sh/4mWU8.png

(私はWinampのテーマをコピーしています:))

そのツールボックスからスペクトル アナライザーを動作させるために最低限必要なものは次のとおりです。

  • 「NAudio-Visualizing」フォルダのすべてのコンテンツ (必要な場合を除き、Waveform のものを除く)。
  • CommonUtils\ColorUtils.cs
  • CommonUtils\ExtendedGraphics.cs
  • CommonUtils\MathUtils.cs
  • CommonUtils\MidiUtils.cs
  • CommonUtils\Audio\NAudio\AudioUtilsNAudio.cs
  • CommonUtils\Audio\NAudio\NAudio.dll
  • CommonUtils\FFT\AudioAnalyzer.cs
  • CommonUtils\FFT\FFTWindows.cs
  • CommonUtils\FFT\LomontFFT.cs
  • CommonUtils\FFT\ExocortexDSP\Complex.cs
  • CommonUtils\FFT\ExocortexDSP\ComplexF.cs
  • CommonUtils\FFT\ExocortexDSP\Fourier.cs
  • CommonUtils\FFT\ExocortexDSP\FourierDirection.cs

VB .Net に変換する場合は、こちらのコンバーターを使用しました。ただし、すべてが正しく変換されるわけではありません。次の重要な修正が必要です。

  • MathUtilsクラス内のreturnすべてのYield return ...ステートメントから削除され、メソッドに追加Iteratorされます。
  • クラスをモジュールに変更してMathUtils、拡張機能のエラーを修正します。
  • Caseでステートメントを修正し...,Elseます。
  • ステートメントvarから削除します。For Each
  • ExtendedGraphicsクラスで、名前空間と競合するため、名前空間の名前System.Drawing.Extendedをに変更します。AudioSystem.Drawing.ExtendedSystem

私が個人的に行ったいくつかの変更:

  • NAudioEngineクラスでは、デフォルトで静的になるため、プロパティの値を 200 に変更しましたDesiredLatency

  • クラスでは、一時停止機能をフェードを使用するように変更しました。これNAudioEngineは、フェードがないと再開時に静的なバグが発生するように思われるためです。次の変更を行って、フェード (および追加のボリューム コントロール) を追加します。

フィールドを追加します。

    Private m_Volume As Single = 0.2F 'Desired default volume
    Private audioFileReader As AudioFileReader
    Private fadeInOut As FadeInOutSampleProvider
    Private m_fadeDuration As Integer = 250 'Desired fading duration

OpenFileメソッドで、Tryステートメント内のすべてを次のように変更します。

    waveOutDevice = New WaveOutEvent() With { _
        .DesiredLatency = definedLatency _
    }
    audioFileReader = New AudioFileReader(path)
    ActiveStream = DirectCast(audioFileReader, WaveStream)
    inputStream = New WaveChannel32(ActiveStream)

    fadeInOut = New FadeInOutSampleProvider(New WaveToSampleProvider(inputStream))
    audioFileReader.Volume = Volume()

    sampleAggregator = New SampleAggregator(m_fftDataSize)
    AddHandler inputStream.Sample, AddressOf inputStream_Sample
    waveOutDevice.Init(New SampleToWaveProvider(fadeInOut))

    ChannelLength = inputStream.TotalTime.TotalSeconds
    FileTag = TagLib.File.Create(path)
    GenerateWaveformData(path)
    CanPlay = True

Pause()メソッドで次のように変更waveOutDevice.Pause()しますfadeInOut.BeginFadeOut(fadeDuration())

Play()メソッド内、ステートメントCanPlay内:

    fadeInOut.BeginFadeIn(fadeDuration())
    waveOutDevice.Play()

グラフィックのスタイルをバーに変更するには、カスタム スペクトル アナライザー コントロールのコードで、 の既定値を に変更しPublic DoSpectrumGraph As Boolean = TrueますFalse。次に、その上のフィールドを変更して、必要に応じてバーのスタイルを設定できます。

領域ではEvent Overrides、色/描画方法を変更できます。

于 2013-09-09T11:43:05.853 に答える
0

あなたの質問に完全に答えるには十分なスペースがありません。残念ながら、ソース コードのある場所を知りません。私にできる最善のことは、あなたを正しい道に導くことです。他の誰かがより完全な答えを知っているかもしれません。

これは実際にはスペクトログラムではありませんが、スペクトル アナライザーは正しいかもしれません。単に「リアルタイム アナライザー」または RTA と呼ばれることもあります。

最初のステップは、信号を周波数帯域に分割することです。多くの人がそうしているように、FFT を使用してこれを行うことができます (これにより FFT の使用方法のアイデアが得られます) が、これはさまざまな理由から正しいアプローチではありません。

帯域が非常に少ないため、 2 次フィルターのバンクを使用してこの目標を達成できるはずです。最低周波数にはローパス、最高周波数にはハイパス、中間周波数にはバンドパス フィルターを使用します。周波数が対数になるようにフィルターの中心周波数を選択します。これらのものには、気になる場合に調べることができる標準的な頻度があります。

信号をバンドに分割したら、各バンドのピーク メーターでフォローアップします。

于 2013-09-07T21:57:29.083 に答える