ぬうぱんの備忘録

技術系のメモとかいろいろ

作った曲一覧はこちら

DTM してたとおもったらいつのまにか python コード書いてた話

この記事は TUT Advent Calendar 2017 の 9 日目の記事です

adventar.org

前日は maggyotomo 氏の雑記帳 — 乗り鉄拠点としての豊橋の優位性です。 切符のはなしは普通に有益なライフハックだと思った。 突然弊社フロアが爆発消失して旅に出たくなる時が来たら参考にしますね。

話を始める前に

僕OBだし流石に今年はいいかな~~~~~とか思ってたんですけど、思いの外枠が埋まってなくてピンチらしいっていう話を聞いて急遽ブッこみました。

内容的にはここ一年ダラダラ取り組んでやっと解決したベース音の位相の微調整の話です。 「本人はめっちゃ頑張って調整したけど他人には全然分からない」系の話です。 内容的にはかなり地味。

(ちなみに間に合ってしまったのでメイドさん写真集は)キャンセルだ。

はじめに

とりあえずこれを聴いてほしい。

※解説用にベース波形を本来のものから差し替えてます&普通に未公開トラックなので正式リリース時にはまたちょっと変わってるよ。

前半が補正前、後半が補正後です。 前半はなんだかリズム感がヨレヨレですが、後半はそれがかなり緩和されているのがわかります。 特に、一番高いベース音の時、のズコーって感じがマシになってます。 君はこの微妙な違いを感じ取れる、いいね?

自分で聞いてて本当に改善してるのかわかんなくなってきたゾ。

ということで、このヨレヨレの原因と解決法を説明していきます。

原因を説明する前に…

前提知識をお話していきます。

まず、今回取り扱うのは UK Hardcore という音楽ジャンルでの「ベース」についてです。 UK Hardcore って言うのはこんな感じのジャンルです。

キックとベースがひたすら交互に鳴ってますね。 最近では正常な人間が聞くタイプの音楽では無いと囁かれています。

この UK Hardcore はクラブミュージックなので低音域を担うキックとベースの作り込みでノリのほとんどが決定します。 「低音=身体にズンドコ来る帯域」で、このズンドコ来る帯域を鳴らすのはキックとベースだけなので、ノリを支配してても全く不思議じゃないですね。

んで、このキックとべースの「キック→ベースの切り替わり」の部分に話をフォーカスします。 切り替わり部分の処理の仕方はいろいろあるんですが、僕は今のところ「キックがスパッと止まってベースがスパッと入ってくる」を採用しています。 EDM を BPM 170 に早回しした感じの UK Hardcore でよくある「良い感じにキックとベースがクロスフェードする」も大変よろしいんですが、こっちは今回のお話では取り扱いません。

最初に結果として示した曲もこのスパっと切り替わるタイプの作り方をしています。 このスパっと切り替わるキック&ベースのうちベースの方の涙ぐましい調整についてお話していきます。

何が原因でヨレヨレになるのか?

まずはこちらを御覧ください

f:id:NU_Pan:20171209215800p:plain

左側半分はキックの波形、右側半分はベースの波形です。 つまり「1拍」分の波形を可視化したものです。

さて、この画像の波形を人間が聞いた時、初めて「鳴った」と感じるタイミングをマークすると…

f:id:NU_Pan:20171209221904p:plain

キックは「まさに表拍の頭ちょうど」にアタックを感じますが、ベースは「裏拍の頭からちょっと遅れて」アタックを感じます。 何故かと言うと、ベース(というかノコギリ波)は鳴り始めたと感じるタイミング(アタックといいます)が「最初にガケが来たタイミング」に来るからなんです。

勘違いしてはいけないのは、ここまではそれほど大きな問題ではないということです。 もともと意図していた「アタック感がほしいタイミング」は裏拍の頭なので、「期待するものと実際のものがズレている」という点では良くないのは確かなんです。 ですが、別に人間の聞こえ方・感じ方として何も問題がないのなら、それは全くなんの問題でも無いんです(最終的に信じるべきは自分の耳や感覚です)。 実際、音程が一定なら違和感を感じることはなかったので、遅れること自体は``ここまでは''問題無いです。

ところがです、ベースの音程が変わると…

f:id:NU_Pan:20171209220612p:plain f:id:NU_Pan:20171209220626p:plain

ああ、音程によってアタックのタイミングが変わってしまっている…。

そう、これが全ての元凶です。 例示した曲はベースの音程がコロコロ変わるので、音程が変わる度にアタックのタイミングが変わってしまうのです。 タイミングが変わればノリが変わってしまいます。 つまり、2回か4回ベース音を聞いてノリを捕まえたと思ったら、すぐにノリが変わってしまうのです。 そりゃぁ気持ち良い訳がない。

どうなればヨレヨレにならないのか?

もちろん「ノコギリ波のガケが裏拍の頭丁度に来るようにする」のが解決法です。 とにかくこの1点に尽きます。

こんな感じになればいんです

f:id:NU_Pan:20171209221627p:plain

が、コレを実現するのは意外と簡単ではありません…。

ダメだった : シンセの開始位相設定をいじる(1)

実は問題のベース音、実は開始位相タイミングが 180 度になっています。 つまり「ノートオンの瞬間にノコギリ波のガケが来る」のではなくて「ノートオンの瞬間にノコギリ波のガケとガケの間の中間地点が来る」なんです。 なので、開始位相タイミングを 0 度にして前者の状態にするだけで解決するといえば解決します。

しかし、この解決法だと、ベースの立ち上がりに「プチッ」という音楽的にはよろしくない感じのノイズが入ってしまいます。 また、ベースのアタックの鋭さを自由に調整出来ません(アタックをゆるくすると初回のガケがなくなってしまいます)。 なのでこの解決法は無し。

ダメだった : シンセの開始位相設定をいじる(2)

モダン…というかいろいろできるタイプのシンセだと「どの音程を鳴らす時は発音をこのくらい遅らせる」みたいな設定が出来ます。 こういう、音程に応じて設定をいじる系をキー・マップとか言います。 YAMAHA DX7 の頃からある由緒正しいモジュレーション機能です。

が、コレもナシです…。 発音のディレイタイムにキーマップ出来ないシンセにはこの手使えないからね、しょうがないね。 シンセの選択肢はできるだけ狭めたくないです。

ダメだった : ベースの音程を進行させない

音程が一定ならそりゃタイミングがズレることもないですし、使う音程を2~3個程度に絞れば手作業でシンセの位相設定を微調整するのも現実的です。 この方法は「物理的な低音の鳴り方の問題を避ける」意味でも有効です。 音響にかなりしっかり力を入れてる所だとまんべんなく良い感じに鳴ってくれるのでそこまで気にすることは無いのですが、並の環境だと 60 Hz から 80Hz の間だけものすごいパワーを発揮してこの周波数帯を外れた瞬間に突然パワーダウンするとかザラです。 コード進行をしなければ「大抵の環境で良い感じに鳴る音程だけ使う」という真似が出来ます。 なので、キックとベースでズンドコしまくる頭悪い感じのドロップ系 UK Hardcore はコード進行なんてしないですし、Mainstream Hardcore に至ってはベースが居ないようなものですし、UK Hardcore でも音程を進行させるとしても、 III -> IV -> V の王道進行とかの結構狭い範囲で収めます。

しかし、この解決法もナシです。 コード進行したほうがエモく尊くなるからね、しょうがないね。 (歌モノ Mainstream Hardcore はエモいけどそれはまぁ別のお話ってことで)

結局どうしたのか

python でオフライン信号処理書きました(半ギレ)。 ベース音を音程ごとに wav ファイルに吐いて、それを python で書いたプログラムに食わせて補正済みの wav ファイルを出力して、それをまた DAW に食わせる…みたいなワークフローにしました。 なんだか結構限定的なシチュエーションでしか上手く動かない感じになっちゃったけど、そもそも自分発のニッチな需要を満たすためのプログラムだし、ままええやろ。

アルゴリズム

一応、工学系の大学の AC なのでアルゴリズムも簡単に触れておきます。

基本的には

  • ノコギリ波の「ガケ」位置を検出
  • ガケ位置情報を元に周期(=周波数)を推定
  • 推定した周期を元に上手く検出できなかった「ガケ」を復元
  • 検出した「ガケ」のうち音声波形先頭側の適当なものを選択
  • 選択した「ガケ」が「音声ファイル先頭からある一定のタイミング」に来るように波形をシフト

って感じです。 認識系タスクで有りがちな結構泥臭いことをやってます。 音声信号処理は履修してないのでかなりアホな事をやっているかもしれません。 じぶんなりにがんばりました(精一杯の強がり)。

「ガケ」が「ある遅れた一定のタイミング」に来ることになるので、DAW 側ではそれを織り込んで普通よりも少し早めにノートオンします。 具体的にはノートオンのタイミングを 1/128(128分音符)だけ早い方にずらします。 少し早く鳴らすので、ノートオンから「ガケ」が来るまでの間の区間はキックとベースのクロスフェードに使えます。 クロスフェードできるので、波形をバッサリ切り落としてブチッってなるアレを回避できます。

プログラム

かなりグダグダなので正直あんまり公開したくないけどこちらになります。

第三者が使えるように整備とか全然してないです。 ていうか波形によっては補正失敗して落ちます。 正直自分が使えていて問題を解決できていればそれで目的は達成しているので、第三者が使えるようにするモチベーションが存在しないんすよね…。 もしいろいろ整備しだしたらそれはきっと僕が失職したときでしょう。

ちなみに…

わかりやすくするために、実際にあった紆余曲折を全て端折っています。 実際には色々検証して知見を溜めつつこの結果に行き着きました。 スッゲーキツかったゾー。

明日

T_T3_M5 氏の「歴代ハマった音楽たち(2013~).」です。 ぼくも音楽遍歴系のネタにすればよかったと今凄く後悔してます。

おまけ : DREAMING WITH YOU の話

最初に例として出した曲の事です。 この曲のコード進行というかベースの動く範囲があまりにも自由すぎて今回お話した問題が顕在化して、解決を余儀なくされました。

この曲「はー、嫁クソかわいいし尊いししぬほどエモいわ。はーーーーーー。」って言いながら作った曲です。 作詞が難産で地獄だった。 ほぼ一夜漬けでなんとかした版(NIGHTLY 版)がテクノ部から出てるからみんな聞いてね! でも NIGHTLY HARDCORE VIP はベースが 💩 of 💩 だから聞いてほしくないよ!

URL 貼って気づいたけど、フルレングスの視聴出来なくて草。 テクノ部関係者に ONDISK の真似して「俺にも回してくださいよぉ」って言えば形式上の抵抗をした上で融通してくれそう。 (そもそも僕に直接コンタクトくれれば音源送りますけどね…)

なお、もしこの記事が間に合ってなかった場合は嫁との思い出の写真を10枚くらい選んで貼ってお茶を濁していたと思います。 こんな感じで

バックアップページ作りました

音源のバックアップを dropbox に集約しました。 soundloud 終わる終わる詐欺にやられました。

www.dropbox.com

バックアップページなので、閲覧性はゼロです。 各楽曲をプレビューしたい時は soundcloud とかに行ってください。 あと mp3 タグとかアートワークとかは全然手を付けてないです(めんどくさい)

FL Studio で Waves のプラグインをロードできなかった話

この記事は

FL Studio 12.5 で Waves 9.91 系のプラグインをロードしようとすると、謎いエラーでロードできなかった時の顛末をまとめたものです。 一応の解決はしましたが、正しい解決法ではない気がします。

ハマった環境

遭遇した事態

  • 至って普通の方法で waves プラグインをインストール(EASY INSTALL & ACTIVATE)
  • FL 上で ManagePlugin からスキャンをかけて F チェックを入れる(トラブルシューティングなので Scan options は全部入れといた方が良い)
  • ミキサーのチャンネルラックから右クリックで所望のプラグインを選択
  • Something went wrong loading the VST3 plugin WaveShell-VST3 9.91. Please make sure it’s installed and registered properly.

解決法

FL を管理者として実行する。 「管理者権限持ちのユーザーが普通に実行」ではダメで「管理者として実行」でないとダメ。

FL の実行ファイルのプロパティ開いて常に管理者として実行にすればいいと思う。

懸念点

管理者として実行した場合、出力されるファイルのアクセス権ってどうなるんでしょうね…?

感想

IL のフォーラム漁ったけど解決法に至らなくて、まさかね、と思って管理者実行したらドンピシャだった。 Waves ゆるせない。

フツーの DAW 上で行うゼロ位相フィルタリング

この記事は

いたって普通な DAW 上でゼロ位相フィルタリングを行う方法の紹介記事です。


フィルタとか位相とか何の話?

フィルターは EQ 全般だと思ってください。 典型的にはローパスフィルタとかハイパスフィルタとかの事を指しますが、EQ でよくあるピーキング(特定の周波数帯だけを上げ下げする)もフィルタの一種です。 以下全部、特定の周波数帯をゴニョゴニョする時のお話です。

で、位相と言うのはココでは音の遅れの事を指します。 ただ、遅れと言っても「波形が300ミリ秒遅れる」みたいな話ではなくて「波形が崩れる」という話です。

位相とか波形が崩れるとか何言ってんの?

まず、位相というのは「一定周期で繰り返すような音」の「遅れ」を「ディグリー(度)」で表したものです。 0 [deg] なら遅れなし、180 [deg] なら波形のちょうど半分だけズレる、360 [deg] なら一周まわって遅れてないように見える、って感じです。 今言ったのは「波形全体がまるごと XXX [deg] 分だけ遅れた」時の事を指します。

ところで、波形に EQ をかけると、この位相の遅れは発生します。 周波数ごとに遅れ方が異なりますが。 例えば、ローパスフィルタの場合なら、カットオフ周波数よりも高い周波数の帯域は位相が(あんまり)遅れませんが、カットオフ周波数よりも低い周波数帯になると周波数の低さに比例して位相の遅れが大きくなります。 こういう、フィルターの「周波数による位相の遅れ具合」のことを位相特性とか呼んだりします。

さて、この位相特性によっては周波数帯によって音が遅れたり遅れなかったりするので、そんなことをすれば当然波形が崩れます。 こうやって、位相特性によって波形が崩れる事を位相がおかしいだの崩れるだのと言ったりします。 例えば、ある波形にローパスフィルタをかけた場合、位相が崩れていなければ、単純に元波形のピークを落として滑らかにしたような波形が出てきますが、位相が崩れると波形のピークのいちが変わります。 もっと露骨な例で言えば、純粋なノコギリ波は完全に位相が揃った状態なのですが、倍音成分の位相だけをランダマイズするとノイズみたいな波形になり(sytrus なんかの加算合成シンセだと簡単に再現出来ます)、聴感上でもなんだかノイズっぽい音になります。

結局ゼロ位相フィルタとは

なので、基本的には位相が崩れるのは(意図してなければ)あまりうれしくないわけです。 できれば位相が変化せず、振幅だけが変化するフィルタがほしいわけです。こういうフィルタの事をゼロ位相フィルタと言います。

線形位相フィルタ

ゼロ位相ではありませんが「波形の形を保ったまま波形全体が遅れる」みたいなフィルタもあります。 こいうフィルタの事を線形位相フィルタといいます。 位相特性をプロットした時に直線が出て来るので線形位相って言います。 なんで線形位相なら波形が崩れないのか? みたいな話は、実際に試してみるとたしかにそうなります(暇な人はやってみよう!)

波形全体が遅れるのなら、遅れた分を補正すればゼロ位相じゃん! っていうやり方も出来ますが、世の中の線形位相 EQ はどういうわけかカットオフがゆるいです。 特定周波数でシュッとカットオフとか苦手です。 うーん困った。

どうやってゼロ位相フィルタリングするのか

ということで本当に位相の遅れが発生しないフィルタリングの方法の紹介です。

  • 元波形を A とします
  • 波形 A に EQ を普通にかけます(波形 B)
  • 波形 B をリバースします(逆再生です、波形 C)
  • 波形 C に もっかい EQ をかけます(波形 D)
  • 波形 D をリバースします

おめでとうございます! これでゼロ位相フィルタの完成です! 原理は本当にめちゃくちゃ簡単で「位相が遅れるんなら逆再生にして同じだけ遅らせれば良いじゃない!」ってことです。

元ネタは

scipy.signa.filtfilt()関数です。 これ最初見た時全く意味がわからなかったんですが、ある日突然意図に気づきました。

弱点

  • フィルタの2回重ねがけを強要されます。
    • 注意したいのは、例えば「-12dB/Oct のローパスフィルタを2回」=「-24dB/Oct のローパスフィルタを1回」は等価ではないです。
    • 大体似たような振幅特性になるのですが等価ではないので注意が必要です。
    • このあたりの解説はリンクウィッツ・ライリーフィルタを調べるとわかります。
      • ちなみに、リンクウィッツ・ライリーフィルタは同じフィルタを2回かける手法なので、このゼロ位相フィルタリングと相性が良いです。
      • そしてリンクウィッツ・ライリーフィルタはクロスオーバーに使われます。
      • つまり、位相を崩さずに、キレの良いマルチバンド処理ができます
  • リアルタイム処理は出来ません
    • 波形をリバース出来ないといけないので、録音済みの波形にしか適用出来ません。
  • 因果関係が崩れます
    • 例えば、スネアの音にこの方法を適用すると、なりはじめの前の無音部分に影響が発生します
    • つまり、未来の音が過去に影響を与えてしまいます!
  • 単純にめんどくさい
    • EQかけてリバースして…なんてぶっちゃけイチイチやってられない…

感想

こんな簡単なことにも気付かなかったなんて(KNN)

Markdown で書けるらしいっすね

たとえば

こんな感じに書ける。 連続する行は一行にまとめられる。 おのれアルファベット圏。

一行離せば改行される。

これはトップレベルの見出しで

これは一個深いレベルの見出しです

はてな記法で最高レベルの見出し使うと別記事扱いされた気がしますね?

レベル3

レベル4

見出しのレベルの違いわかりづらくね? CSS でカスタマイズしろってことか?

箇条書き

  • たとえば
  • こんなふううに
  • 箇条書き
  • ブラウザ上だと
    • タブ入力出来ないし
    • vscode とかで編集するのが前提かも

リンクだって貼れる

markdown 標準

ぬうぱんの備忘録

はてな記法も使える…?

nu-pan.hatenablog.com

センタリングは当然 html タグの div を使う

LaTeX の数式は?

<pre> [tex:{ y = ax2 + b2 }] </pre>

{
y = ax^2 + b^2
}

vscode 拡張の markdown tex 記法と互換性ないし type 数多くてしんどい。 $ 記号でくくりたい。

そのほか

markdown で使える記法ならなんでも使えそう

まとめ

tex の数式以外はまぁ満足。

FL 関連の最小分解能のすっごい雑なメモ

この記事は

FLとか付属のシンセとかで目盛り1個がどのくらいの長さになるのか? のお話です。
最近、音の長さの微調整ってめっちゃ大事じゃね? ってことに気づいてアレコレやってるんですけど、
作業のたびに大事な数字を忘れるので自分用にメモ。

何がどう大事なのか? みたいな話は追々しましょう(多分)

ノート打ち込む時

Snap to grid を (none) にした時の最小目盛り1個で 1/128 になる。

Sytrus とか harmor とかのエンベロープ書く時

デフォルトだと最小目盛り1個で 1/16 になる。
なので、ATT DEC REL のスケーリング系ノブを 12.5%(=1/8)に合わせれば、最小目盛り1個で 1/128 になる。
6.25% にすれば 1/256 になる。

slicex のエンベロープ書く時

ATT DEC REL のスケーリング系ノブを 12.5% に合わせた時、最小メモリ5個で 1/256 になる。
25% に合わせれば 1/128 になる。
コイツだけ分解能が妙なことになってるので注意。

AMM3

ヘロイン! 神ってる!

お ま た せ


f:id:NU_Pan:20170108161409p:plain

続きを読む