ぬうぱんの備忘録

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

作った曲一覧はこちら

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枚くらい選んで貼ってお茶を濁していたと思います。 こんな感じで