スペクトル重心またはその他の手段による波形の着色


8

アップデート8

サービスにトラックをアップロードする必要があり、RekordBox 3の新しいリリースを見ることに不満があるオフラインのアプローチとより細かい解決策をもう一度検討することにしました:D

まだ非常にアルファ状態にありますが、有望に聞こえます:

ジョニック-グッドタイム

ここに画像の説明を入力してください

ここに画像の説明を入力してください

対数目盛もパレット調整もないことに注意してください。周波数からHSLへの生のマッピングのみです。

アイデア:波形レンダラーに、特定の位置の色を照会するカラープロバイダーが追加されました。上に表示されているものは、その位置の隣の1024サンプルのゼロ交差率を取得しています。

明らかに、堅牢なものになるまでにやるべきことがまだたくさんありますが、それは良い道のようです...

RekordBox 3から:

ここに画像の説明を入力してください

ここに画像の説明を入力してください

アップデート7

Update 3のように、私が採用する最後のフォーム

ここに画像の説明を入力してください

(カラー間のスムーズな移行を実現するために少しPhotoshopされています)

結論は、私は数ヶ月前だったが、それが悪いと思ってその結果を考慮しなかったX)

アップデート6

最近プロジェクトを発掘したので、ここで更新することを考えました:D

曲:シック-グッドタイムズ2001(ストーンブリッジクラブミックス)

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

IMOの方がはるかに優れており、ビートは一定の色などを持ちますが、最適化されていません。

どうやって ?

まだhttp://developer.echonest.com/docs/v4/_static/AnalyzeDocumentation.pdf(ページ6)

各セグメントについて:

public static int GetSegmentColorFromTimbre(Segment[] segments, Segment segment)
{
    var timbres = segment.Timbre;

    var avgLoudness = timbres[0];
    var avgLoudnesses = segments.Select(s => s.Timbre[0]).ToArray();
    double avgLoudnessNormalized = Normalize(avgLoudness, avgLoudnesses);

    var brightness = timbres[1];
    var brightnesses = segments.Select(s => s.Timbre[1]).ToArray();
    double brightnessNormalized = Normalize(brightness, brightnesses);

    ColorHSL hsl = new ColorHSL(brightnessNormalized, 1.0d, avgLoudnessNormalized);
    var i = hsl.ToInt32();
    return i;
}

public static double Normalize(double value, double[] values)
{
    var min = values.Min();
    var max = values.Max();
    return (value - min) / (max - min);
}

明らかに、ここに到達する前にさらに多くのコードが必要です(サービスへのアップロード、JSONの解析など)が、これはこのサイトのポイントではないため、上記の結果を得るために関連するものを投稿しています。

したがって、分析結果の最初の2つの関数を使用しています。確かに、他にも処理する必要がありますが、まだテストする必要があります。上記よりもクールなものが見つかったら、ここに戻って更新します。

いつものように、このトピックに関するヒントは大歓迎です。

アップデート5

調和級数を使用した勾配

ここに画像の説明を入力してください

カラースムージングは​​比率に敏感です。

アップデート4

0.08と0.02の値を持つアルファベータフィルターを使用して、ソースとスムージングされたカラーで発生するカラーリングを書き直しました。

ここに画像の説明を入力してください

ズームアウトすると少し良くなる

ここに画像の説明を入力してください

次のステップは素晴らしいカラーパレットを手に入れることです!

アップデート3

ここに画像の説明を入力してください

黄色は媒体を表します ここに画像の説明を入力してください

まだズームされていないときはそれほど良くありません。 ここに画像の説明を入力してください

(パレットにはいくつかの深刻な作業が必要です)

アップデート2

ピシェネットからの2番目の「音色」係数ヒントを使用した予備テスト ここに画像の説明を入力してください

アップデート1

EchoNestサービスからの分析結果を使用した予備テストです。うまく調整されていない(私のせい)ことに注意してください。ただし、上記のアプローチよりも一貫性があります。

ここに画像の説明を入力してください

この素晴らしいAPIの使用に興味がある人は、ここから始めてください:http : //developer.echonest.com/docs/v4/track.html#profile

また、これらの波形は3つの異なる曲を表しているため、これらの波形と混同しないでください。

最初の質問

これまでのところ、これは256サンプルのFFTを使用して各チャンクのスペクトル重心を計算した結果です。

計算の生の結果 ここに画像の説明を入力してください

いくつかのスムージングが適用されました(フォームを使用すると、見た目がはるかに良くなります) ここに画像の説明を入力してください

生成される波形 ここに画像の説明を入力してください

理想的には、これは次のようになります(Serato DJソフトウェアから取得)。 ここに画像の説明を入力してください

平均的な周波数が時間とともに変化するときに、オーディオを分割するために使用できるテクニック/アルゴリズムを知っていますか?(上の画像のように)


1
スペクトル重心を使用することで、あなたは正しい方向に進んでいると思います。色の分布を良くするには、結果の非線形マッピングが必要なだけかもしれません。現在、パレットの青/シアンセグメントのみが使用されているようです。
ピシェネット2013

1
疑似カラーアルゴリズムについて、または自動化された方法でオーディオをチャンクに分割することについての質問ですか?
ビョルンロシュ2013

@pichenettes:そう、私は対数目盛を使ってこの問題に取り組みます。
アイベ2013

1
これはまさに、freesound.orgが波形に色を付けるために使用するものです。彼らのspectral_centroidコードをください。私が本当に欲しいのは、オーディオスペクトルをカラースペクトルにマップすることです。これにより、低周波数は赤、高周波数は青、両方の組み合わせはマゼンタ、中間周波数は緑、ログスイープは虹、ホワイトノイズは白、ピンクノイズはピンクで、レッドノイズはレッドです。一方のスペクトルは線形で、もう一方はログであるため、方法を理解できません。:) flic.kr/p/7S8oHA
endolith

1
@Aybe:はい、ログスイープを虹のように見せる方法は知っていますが、ログ周波数間隔(比例幅バンド)で測定すると、ホワイトノイズにはフラットスペクトルではなく傾斜スペクトルがあるため、白色光は生成されません。 。ノイズの色の名前は一定の幅のバンド(線形間隔)に基づいていますが、トーンの知覚は対数の間隔(比例した幅バンド)に基づいています。機能させるときに、これで何をするつもりですか。
エンドリス2013年

回答:


4

最初に次のことを試すことができます(セグメンテーションなし)。

  • 信号を小さなチャンク(たとえば10msから50msの持続時間)で処理します。必要に応じて、信号を50%オーバーラップさせます。
  • 各チャンクのスペクトル重心を計算します。
  • スペクトル重心値に非線形関数を適用して、使用するパレットカラーの均一な分布を取得します。対数は良い出発点です。別のオプションは、最初にファイル全体の他のセントロイド値の分布を計算し、次にこの分布のパーセンタイル(CDF)に従って色を付けることです。この適応アプローチにより、パレットの各色が均等に使用されることが保証されます。欠点は、このアダプティブアプローチを使用すると、あるファイルで青でプロットされているものは、別のファイルで青でプロットされているものと同じように聞こえないことです。

Seratoがこれを行うか、実際にさらに1歩進んで信号をセグメント化しようとするかは、図からは明らかではありません。音楽信号に音符が存在する瞬間を知ることは、それらを同期するのに役立つため、それが驚くことではないかもしれません!手順は次のとおりです。

  • 信号の短期フーリエ変換(スペクトログラム)を計算します-短いオーバーラップセグメントでFFTを使用します(1024のFFTサイズまたは44.1kHzオーディオの2048で開始)。
  • 開始検出関数を計算します。このペーパーをご覧になることをお勧めします。提案されたアプローチは非常に効果的で、C ++の実装でさえ10行未満で済みます。Yaafe -asで実装を見つけることができますComplexDomainOnsetDetection
  • 開始検出機能でピークを検出して、音符の開始位置を取得します。
  • 検出されたオンセットで区切られたすべての時間セグメントでスペクトル重心を計算します(ウィンドウやゼロパッド、あるいはその両方を忘れないでください!)
  • そして、非線形マップを忘れないでください!Serato波形の各音符の間に現れるグラディエント効果は、人為的に生成される可能性があることに注意してください。

これが機能するようになったら、「ぶら下がっている果物」は、各セグメントの他のいくつかの特徴(瞬間、少数のMFCC ...)を計算し、これらの特徴ベクトルに対してk平均を実行し、色を決定することです。クラスタインデックスを使用するセグメント。Ravelliの論文のセクションIIを参照してください。


ソリューション2の作業を開始しました。幸い、私が使用しているサービス(EchoNest)は、分析で開始検出を提供しているので、すばらしいニュースであり、リアルタイムセーバーです。私が行った小さなテストで私の答えを更新しました、そしてそれは有望に見えます(それは本当に速くて汚いのでそれが適切に整列されていないことに注意してください)。大きな進歩を遂げたら、より良い結果を投稿します。ありがとうございました !
アイベ2013

1
その後、あなたは何もする必要がありません。EchoNest分析の2番目の「音色」係数は、重心に非常に関連しているため、実行する計算はありません(それらが基底でDC成分を取り除いた場合を除きます。この場合、最初の係数です)- 「ティンバー」ベクトルのビートまたはセグメントレベルの値を使用するだけです。
ピシェネット2013

1
EN分析の2番目の「音色」係数によって測定される「明るさ」は、スペクトルの重心に非常に関連しています(EchoNestアナライザーが知覚的な前処理(中耳フィルタリング、時間/周波数マスキング)ではなく、生のFFTをとります)。「ピッチ」ベクトルの最大ビンを使用したカラーコーディングは、非常に純粋なモノフォニックでメロディックな素材に役立ちますが、ドラムループにはあまり意味がありません。
ピシェネット2013

1
無制限?分析されたフレームの信号エネルギーによって制限されています...この機能では、トラック間でスケールを一定に保つ価値があると思います。私がやろうとしていること:非常に多様な数十の曲を集めて、価値の分布を感じます。必要に応じて、単純な非線形マップを適用して、よりガウスに見えるようにします。次に、平均を削除し、標準偏差で割ります。次にatanを適用して境界を設定します-クリッピングを発生させずに外れ値を1または10の10進に近づけます
ピシェネット2013年

1
波形が縮小されたら、個々のノート/ビートに色を付けるのではなく、バーやセクションなどの大きな要素に従って信号をセグメント化します。
ピシェネット2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.