2016年10月13日木曜日

KONTAKT音源制作風景 RX5編

もっぴーさんが、音源制作に使用しているソフトウェアの公開をされたページはこちら)ので、そのうちのRX5の詳細を私が記事にしてみようという話題が出て、私の音源制作の風景の一部を記事にしてみることにしました。

こんな記事やくにたつんかいなと思いつつですが、音声編集の一環として読んでいただければ光栄でございます。


まず、

iTunesを立ち上げます。(ぇ

そしてカラムブラウザーでサントラにセットしてランダム再生させます。
ミニプレイヤーにして画面の隅においておきます。

おいおい、これは・・・・

いえ、作業中、音を鳴らさない時間がけっこうあるので、BGMが必要なのです。
そして音声編集が終わり音源制作に移ると音楽が聞けなくなることが多いので・・・。
ということで、何でもいいのでBGMを立ち上げますw

そして今回のメインとなる、RX5です。
こちらです。

何も表示されてないので味気ないですが、この右に表示されているのが、いわゆるツールみたいなもので、これのうち、私がよく使うのは、

Spectral Repair
Gain
Plug-in

です。

バッチ処理させたときは、

De-noise

を使用しましたが、今は手作業がメインなので、あまり使いません。

こちらがそれぞれの画面です。


Plug-inは使うものによって画面が違うので画像は表示させませんでした。
RX5では、いわゆるプラグインが使えるので、よそ様のEQが使えたり、トーンジェネレーターだったりコンプだったりが、選択範囲に適用されます。使えないプラグインも結構ありますのでDEMO版を入れてチェックしてから買うなどしないと、痛い目見ます。
ちなみに私がよく使うプラグインはピッチシフター系です。
RX5の上位版だとピッチ変更も可能なのですが、DEMOでさわった感じ、周波数の一部だけの適用ができなかった感じがします。プラグインだと、選択範囲内だけピッチチェンジされたものが反映されて、便利でした。
選択範囲が窓で、全体がピッチ移動して、丁度窓の中に、移動されたものが見えてくるという感じです。
モノにより、ノイズが発生しやすいピッチシフターもあります。つまりは、プラグインの質ということです。慎重に選ぶことが大事ですね。

ついでにこちらは、Spectrum Analyzerの画面。ま、分析画面の一つです。うちはデュアルディスプレイなのでもう一つのディスプレイの方に表示させてあります。

では、作業に移ります。
と、せっかくなので、De-noiseで、前回どういう作業をしたかを、見てみましょう。


こちらが、Legato部分を作ったときの生ファイルです。
生といっても、Cubaseで一部加工済みです。
左に段差があるのがそうで、これは、ちょっと理由があって、聞こえない部分ですが、音程を変える必要があってこうなりました。実際には使われない部分です。気にしないでください。

このファイルをDe-noiseを使用して、音声部分だけを抜き出す作業を、バッチ処理させました。
処理させた結果が、こちらです。


この時点でノイズはだいたい取れてます。
しかし、音源のバージョンアップに伴い、もっと音質向上を目指し、他の工程をとることにしました。
 それは、今回はボーカル音源ですが、人の声をアナライズして、手動でデジタルボイスをリアルに作ることです。

過程は企業秘密なので、結果とその後の工程だけ示させていただきます。
 まず、レガートを作るため、秘密に制作した2種類の「A(ア)」のサンプルを用意します。


上が高い音、下が低い音です。
これをなめらかにに繋がなければなりません。どうしましょう。

こんなファイルを用意しました。

これは、CubaseとMassiveを使って、Saw toothをベンドさせたものを書き出したものです。

ではこれらを使って、きれいなレガートを作りましょう。

まずは、ベースとなる元のファイルに、高い音を約0.65秒上書き貼り付けします(RX5はMIXもできますが今回はしません)。

波形をうっすら表示させ、なるべく綺麗そうなところを、約0.65秒選択してコピーです。
これで、このファイルの役目は一旦終わりました。さようなら。。。
ちなみにこの時、アナライザーはこうなってます。

選択した部分の平均値かな?そんな感じが表示されます。特にここでは見る意味はありませんが、スペクトラムアナライザとはこんなものだという参考までに。。。(ちなみに右端にちょこんと出っ張っているのは、どこかで混入したノイズです。あまりにもひどい場合は、作業中に消してしまいます。)

さて、コピーした部分を先ほど言ったように貼り付けます。

はい!できました。あ、このときGainを使用して、-1ずつ調整していき、波形を見ながらだいたい同じボリュームに調節します。この作業は、メイン画面の色ではわかりにくいので、波形で判断します。それこそ先ほどのスペクトラムアナライザーで確認するのもありです。

次は、低い音をの方を、今回は約1.3秒を0.9秒から貼り付けます。

はいぺったんこ!
これだけでもずいぶん綺麗になった気はしますが、実際は、つなぎ目にノイズがのり、おかしな音になりますし、今回の目的である綺麗なレガートを作るという役目を果たせていません。

ここからひとまず、最後のお尻の部分の処理をします。
ここでSpectral RepairのPartials+Noiseという機能を使います。
私も細かくは説明できないのですが、簡単に言うと、左右の音を綺麗につないでくれます。

設定値をガンガンに上げて、左を参照するように設定し、2.1秒以降に適用します。

Core i7 3820でも10秒程かかる処理ですが、このように、お尻が綺麗になりました。
コピーして貼り付けりゃいいじゃんと思われるかもしれませんが、コピペは、つなぎ目にノイズが発生し、それを処理するためにさらに処理が発生しますので、二度手間なのです。今知っている方法として、端っこの処理はこれが一番綺麗でした。

そしてこれを、GainツールのFadeを使用し、フェードアウトさせます。画像は、あえて載せませんので、後の画像でご確認ください。

次の工程は、用意したSaw toothファイルを繋げます。
まずは、あらかじめタイミングを計っておいたので、0.8秒から1.3秒をコピーし、それを0.48秒(このタイミングが大事)から上書き貼り付けします。(つまり、元のファイルの修正なので、秒数とフォーマットが同じであれば、元のファイルの内容なんて何でもよかったんです。全部上書きされてしまいますw)

作業画像を省きますが、ここで大きなミスを発見しました。B3からC#3までの7thのレガートだったのですが、低い方のファイルを間違ってCを使用していました。ここで、画像抜きで、修正します。これ以降、これ以前の画像とほんのちょっと変わっています。


はい、ぺったんこ!
しかしこれではいけませんね。わかりますね、レガート部はのこぎり波です。ビーっていいます。それと、下から3番目と4番目(第3倍音と第4倍音)を見てください。後続する音の方が色が明るいです。つまり、後続音の方がボリュームが大きいのです。
RX5は、綺麗に音を下げることはできますが、上げるのは難しいのです。
そこで、あらかじめここの範囲のボリュームをGainで上げておき、そのあとSpectral Repairツールで不要な部分を下げる方法をとります。
まず、グイッと上げます。

あとから上げて綺麗につなげるのは大変難しいので、前後(図でいう左右)の音のどこよりもボリュームを大きくしておきます。色が他より明るければいいわけです。

このあと、魔法を使います。
私がRX5で一番よく使う機能といってもいいでしょう。
Spectral RepairのAttenuateです。
この、貼り付けた部分の選択を維持したまま、Attenuateを行います。
設定値は、いろんな要素から判断しているのでここでは細かい説明を省かせていただきます。
簡単に言うと、Bandsは細かすぎると消えてはけない部分が消えるので256と浅めに、左右の参照比重はまずは対称に、Strengthは少し強めで1.5、方向はHorizontalつまり左右で(結局全部説明してしもた)。
これで適用させると、

はい!このとおり!!
あとGainを数回、Attenuateを2、3回使い、微調整します。ここは企業秘密で。要は前後とボリュームが、全周波数(図でいう上下)で綺麗に繋がる(色の明るさが同じくらいに)ように調整するわけです。

現時点でこのような感じになります。(波形は邪魔なので上に移動しました。)
この時点ではつなぎ目にノイズがのっています、これを今から削除するのですが、その前に、音程が変わったのに強く出ている周波数がほとんど変わってない、問題ないのかと思われるかもしれません。実は、フォルマントの関係で、この方が自然に繋がるのです。逆にこうなってないと、「はじめてのチュウ」のコロ助みたいに、ボイスチェンジャーで変化させた声みたいになるわけです
人の声は、同じ母音の場合、音程が変わっても、強く出る周波数がだいたい同じなのです。これにより、人それぞれの声の特徴が出るのです(専門家ではないので間違ったこと言ってるかもしれません)

ではこれから、つなぎ目を綺麗にします。
これは、口頭で言うと、まず、ReplaceとPartials+Noiseを使用し、繋ぎ目をなくしていきます、その過程で生じるノイズをAttenuateで消していきます。
細かい作業は、今回の作業とは異なりますが、こちらの動画である程度わかります。30分バージョンと3分バージョンとありますが、内容は早送りしただけなのでどちらでもww

で、ノイズ処理をほどこしたものがこちらになります。

ここで聞いていたBGM(iTunes)を止めます。

音声チェックです。綺麗に繋がっているか、おかしな音はないか。


。。

。。。

どうやら大丈夫です。

あと、お化粧します。

人がレガートで声を下げると、一瞬音が強く出る周波数があるのです。

元の画像でいうこれです。(途中のファイルミスにより、元画像変わりました)

だいたい「A(ア)」の場合で600Hzから1200Hzあたりにあります。
それを私は、なめらかになるよう範囲をずらしながら3回に分けて、Gainで約10dB程度上げます。

はいっ!できました!

比べてみましょう。

とっても綺麗になりました。
しかしこれは大問題なのです。
音が綺麗過ぎて、人間らしさを失っているのです。
声の微妙な揺れも、吐息の音も消えてしまっているのです。
ですから、ここからまだKONTAKT上で人間らしさを追加し、Breath(息)サウンドを追加します。
それでやっと、この上の図でいう下の音のゴージャス版が出来上がる(予定)というわけです。

いくつか企業秘密がありましたが、RX5での作業というのはこんな感じで、こういうことができますよ、の、一部を紹介できたかと思います。
他にも、ClipやClickノイズを消したり、EQもついてたりします。しかし、1、2箇所のClickノイズであらば、今回の方法のように、手動で消すことも不可能ではないです。3分のファイルに大量に載っているClickなどを消すならば、そちらのツールを使う方が早いでしょう。

ということでRX5の作業風景の一部でした。

大事なのは、作業中、BGMを聞くことです!

2016年10月11日火曜日

ゲーミングマウス G700s スクリプト



ま、これがG700sなわけですが。

通常のマウス機能に加えて、割り当て可能なボタンが8個あるわけですな。

そして、左右クリック、中央クリック、中央左右で、5、全部で13クリックあるわけですな。
それとホイール操作。

スクリプトでホイール操作はできるようですがホイール操作の検知はできないようです
その他のボタンの検知はできるので、私の場合は、スクリプト起動時からの時間というのを用いて、各ボタンにダブルクリックや、ドラッグを、配置しております。

私はゲームに使っているのではなく、音源制作における、RX5というソフトでの音声編集作業にこれを使っております。

今回ご紹介するスクリプトは、Luaという言語らしく(初耳です)、G-series独自の関数が用意されたものらしいです。インストール時に説明書PDFが着いてたと思います。

さて、何がしたいかというと、

中央ボタンに「I」を設定し、かつ、ドラッグ時はIを起動させずShift+Gからドラッグしてドラッグ終了で都合上Rに戻すという設定

ボタン5(横の下、前側)にAltダブルクリックでCtrlにするという設定

ということです。

ドラッグやダブルクリックは、専用ソフトで設定できなさそうだったので、スクリプトを使用することにしました。

まず、設定可能な主な機能は、専用のソフトウェアで設定し、スクリプトを使用するボタンは、機能をはずしておきます。以下スクリプトです。↓

key, new_time, old_time = 0,0,0;

function OnEvent(event, arg, family)
    --OutputLogMessage("event = %s, arg = %s, family = %s\n", event, arg, family);
    if (event == "MOUSE_BUTTON_PRESSED" and arg == 3) then
        new_time = GetRunningTime();
        EnablePrimaryMouseButtonEvents(1);
        PressKey("lshift");
        PressAndReleaseKey("g");
        ReleaseKey("lshift");
        PressMouseButton(1);
    end
    if (event == "MOUSE_BUTTON_RELEASED" and arg == 3) then
        old_time = GetRunningTime();
        --OutputLogMessage("%s %s\n", new_time, old_time);
            if ((old_time - new_time) < 200) then
                PressAndReleaseKey("i");
            end

            PressAndReleaseKey("r");
            ReleaseMouseButton(1);
            EnablePrimaryMouseButtonEvents(0);
        end

    if (event == "MOUSE_BUTTON_PRESSED" and arg == 5) then
        new_time = GetRunningTime();
        --OutputLogMessage("%s %s\n", new_time, old_time);
        if ((new_time - old_time) > 2000) then
            key = 0;
        end
        if (key == 0) then
            PressKey("lalt");
            old_time = GetRunningTime();
        else
            PressKey("lctrl");
            old_time = GetRunningTime();
        end
        key = math.abs(key - 1);
    end
    if (event == "MOUSE_BUTTON_RELEASED" and arg == 5) then
        ReleaseKey("lalt");
        ReleaseKey("lctrl");
    end
end

こっから解説
中央ボタンのスクリプトで、new_timeとold_timeの意味合いが逆になっていることを先に言っておきます。ボタン5で同じ変数を使ってしまったのでこうなってしまったのかも。別変数にわけたほうがよかったですね)

とりあえず変数設定、すべて0
key, new_time, old_time = 0,0,0;

イベント発生
function OnEvent(event, arg, family)
    テスト用メッセージ
    --OutputLogMessage("event = %s, arg = %s, family = %s\n", event, arg, family);
    もし中央ボタン(3)が押されたならば
    if (event == "MOUSE_BUTTON_PRESSED" and arg == 3) then
        スクリプト起動からの時間をnew_timeとして記録(ミリ秒だったかと)
        new_time = GetRunningTime();
        左クリックの制御を有効にする
        EnablePrimaryMouseButtonEvents(1);
        左シフトキーを押さえっぱなしにする
        PressKey("lshift");
        キーボードのgを押して離す(要はタイプする。今回はShift+Gがドラッグする前のショートカットキーである)
        PressAndReleaseKey("g");
        左シフトキーを離す
        ReleaseKey("lshift");
        左クリックボタンを押しっぱなしにする(ドラッグ操作のため)
        PressMouseButton(1);
    end
    もし中央ボタン(3)が離されたならば
    if (event == "MOUSE_BUTTON_RELEASED" and arg == 3) then
        離したときの時間をold_timeとして記録する
        old_time = GetRunningTime();
        メッセージ
        --OutputLogMessage("%s %s\n", new_time, old_time);
            もし、中央ボタンを離したときの時間が押したときから200ミリ秒未満なら
            if ((old_time - new_time) < 200) then
                通常のクリックとみなしてキーボードのiを押して離す
                PressAndReleaseKey("i");
            end

            いずれにしても中央ボタンを離すまではドラッグ状態で、離したときキーボードのrを押して離す(これは操作するソフトの都合上、Gを解除するためにRを押しているだけである)
            PressAndReleaseKey("r");
            ドラッグ終了のため左ボタンを離す
            ReleaseMouseButton(1);
            念のため、左クリックボタンの制御を無効にする
            EnablePrimaryMouseButtonEvents(0);
        end
    もし中央ボタン(5)が押されたならば
    if (event == "MOUSE_BUTTON_PRESSED" and arg == 5) then
        スクリプト起動からの時間をnew_timeとして記録
        new_time = GetRunningTime();
        メッセージ
        --OutputLogMessage("%s %s\n", new_time, old_time);
        もしボタン5を押したのが、前に押したときより2秒を超えていたら
        if ((new_time - old_time) > 2000) then
            通常クリックとみなしフラグkeyに0をセット
            key = 0;
        end
        通常クリックならば
        if (key == 0) then
            Altキーを押しっぱなしにする
            PressKey("lalt");
            スクリプト起動からの時間をold_timeとして記録
            old_time = GetRunningTime();
        もしボタン5を押したのが、前に押したときより2秒以下ならダブルクリックとみなす
        else
            Ctrlキーを押しっぱなしにする
            PressKey("lctrl");
            スクリプト起動からの時間をold_timeとして記録(どうせ同じなんだからnew_timeと比較の後にまとめて書いてもよかったですね)
            old_time = GetRunningTime();
        end
        フラグを0なら1、1なら0にする
        key = math.abs(key - 1);
    end
    もし中央ボタン(5)が離されたならば
    if (event == "MOUSE_BUTTON_RELEASED" and arg == 5) then
        Altボタンを離す
        ReleaseKey("lalt");
        Ctrlボタンを離す
        ReleaseKey("lctrl");
    end
end

もっとよい書き方があるかもしれません。
たとえば、時間を取得せず、Sleepを使う方法もあるようです。
しかしSleepはその間操作が止まるらしいので、この場合まずいと思い今回は時間をはかる方にしました。

ちなみに今回の用途はブラウザ閲覧などではないので、中央クリック左にUndo、右にRedoを設定しております。こちらもとても便利で作業がはかどります。

お約束ながら、このスクリプトで誤動作を起こして、皆さんにダイソンガイを起こしても責任は取れませんのでご了承ください。自己責任でお願いします。


ではまたお会いしましょう。。。

人気の投稿