Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

Pythonによる音響音楽信号処理:クロスフェード自動生成 (2)フェードイン・フェードアウト関数

概要

本記事では、クロスフェードで用いるフェードイン・フェードアウト関数の具体例を紹介します。

フェードイン・フェードアウト関数の設計

クロスフェードにおいて、フェードイン・フェードアウト関数は前後の楽曲をスムーズに(シームレス)に繋げる役割を担います。この関数は、以下の3条件を満たすような関数を選ぶのが一般的となっています。

f:id:Kurene:20181019153115p:plain

ここで、0≦x≦1であり、クロスフェード区間を表しています。また、f(x)がフェードアウト関数、f(1-x)がフェードイン関数を表しています。

(1a)と(1b)は、それぞれゲイン、パワー値の和が一定(=1)となるような条件であり、2つの楽曲の音量を連続的にクロスフェードさせることを意図してます。

なお、フェードイン・フェードアウト関数 f(x) によってクロスフェードする2つの楽曲の音量は同じと仮定しています。もし片方の楽曲の音圧が明らかに大きい場合、この条件のクロスフェードでは違和感が生じる場合があります。

以下では、Audacityクロスフェードで選択可能な3つの関数を紹介します。

関数の例

直線 f(x)=x

ゲインに対してリニアにクロスフェードします。1つの楽曲の先端・終端をフェードイン・フェードアウトしたいときにはよく使われている印象です(Audacityのフェードイン、フェードアウトなど)。

ただし、音量に対して人間の聴感は対数的であるため、クロスフェードでは以下の2つの関数の方がよく使われます。

f:id:Kurene:20181019153410p:plain

f:id:Kurene:20181019153404p:plain

コサイン関数 f(x)=cos(x・π/2)

(1b)の条件でのクロスフェードであり、人間の聴感的には自然なクロスフェードを実現できます。
f:id:Kurene:20181019153705p:plain

f:id:Kurene:20181019153657p:plain

平方根 f(x)=sqrt(x)

こちらも(1b)の条件でのクロスフェードです。コサインの場合と比べると、クロスフェードの開始・終了近辺で音量の変化量が大きい性質を持ちます。

f:id:Kurene:20181019153926p:plain

f:id:Kurene:20181019153937p:plain

フェードイン・フェードアウト関数の適用例

ある2曲に対して、Audaicityで上記3パターンのクロスフェードを適用した結果になります。順番は直線、コサイン、平方根です。


使用楽曲: 幻象アリス"Noctiflora"より、"Noctiflora", "Retrograde Amnesia"

結局、どれを使えばいいのか?

個人的にはコサイン関数をよく使いますが、自分の好みや、どんなクロスフェード音源を作りたいかによって自由に選んでよいと思います。

補足ですが、最初に挙げた条件を満たした関数を必ず選ばないと行けないわけではありません。この条件で関数を設計すれば、たいていの曲でまずまずの、音量的にシームレスな楽曲の接続ができるという認識でよいと思います。
つまり、クロスフェードしたい楽曲や区間選択によってはシームレスにつなぐ関数は最適化できる可能性があります。

また、音量的にシームレス的な接続であるかどうかという基準だけでなく、演出面を意識したクロスフェードも考えられます。具体的には、DJのようにエフェクト/フィルタをかけて次の楽曲に繋げるという方法があります。ライブやクラブの曲間を再現するようなイメージです。

より詳しい情報は、Equal power crossfade などのキーワードで検索してみてください。

参考:Equal power crossfades functions. | VI-CONTROL