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を設定しております。こちらもとても便利で作業がはかどります。

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


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

2016年7月13日水曜日

ギター音源の自論 - 傷ついたレンガ

とりあえず、私がKMG7の作者です(・ω・;)ゞ

最近ツイートを見ているとエレキギター音源がどんどん増えている気がします。

外国製品はあまり知らないので、国産品でお話を進めますが。

KMG7はKMGと書きます。
ほか、AとBとCとします。何がどの音源かはご想像にお任せ。


まず、それぞれの簡単な特徴から

 以下、私個人が感じた評価です。
ちなみにKMGは無料なのでこれらの評価に差別はしていません。

Aの特徴
世界的知名度=高
価格=高
出せる音の種類=多い
音質=良
操作性=不明
 
Bの特徴
世界的知名度=普通
価格=普通
出せる音の種類=普通
音質=良
操作性=普通
 
Cの特徴
世界的知名度=低
価格=普通
出せる音の種類=多い
音質=良
操作性=難

ついでにKMGの特徴
世界的知名度=普通
価格=無料
出せる音の種類=普通から少なめ
音質=低
操作性=良


ということで
KMGの特徴としては
基本フリーである。
ABCは有料。

7弦である。
いろんな方のブログを読ませていただくと、フリーで7弦は貴重であるらしい
7弦まででるのはABCで1つのみ。(なんか人狼ゲームみたいになってきた)

音色選択はキースイッチがメイン。ベロシティ100までは若干内部フィルターで音が変わるだけでほかに機能はない。101から110に同じサンプルでアタックが強くなり、111から127にPHがある。
レイヤー的には2~3レイヤーという感じ。
ABCはレイヤーが多い(と思う)。かつ出せる音色の種類も多い。
この点ではKMGは劣っている。でも僕が使うぶんには気にしないヽ(´∀`)ノ

チョーキングとビブラート
これは、どちらもひとつのサンプルで機械的に変えます。
ABCはそれぞれのサンプルがあると思われます。これもKMGが劣っています。考え方を変えると操作が楽。

音質
そんなによくないですヽ(´-`)ノ
もともと自分のために制作した音源だったので、歪んでかっこよければよいと思っていたのでそこまで重視していませんでした。
しかし、ABCをきいて(BとCはクリーントーンも)KMGがどれほど音質が悪かったかわかりました。
しかし今回は、それに関する自論なので、よかったら最後までお読みください。

操作が簡単(なはず。)
バグを除いて、音が鳴りっぱなしになるモードはなく、キーリリースか、サスティンペダルOFFで必ず音が止まる。ABCはすべて、どちらにするか選択できたはず。しかし考え方次第では、KMGはサスティンペダルでなりっぱなしになるので、操作できるともいえます。KMGはソロモード時にリアルタイム入力でリアリティを出せるような作り方をしています。

そして、知名度!
なぜかKMGは海外によく知られている!
ヨーロッパあたりからよくメールがきます。


さて、ここからは、KMGをすすめる自論です。KMGが嫌いな方や興味ない方はここで終了で、、、、はありません!
使ってない人こそあえて一度読んでもらいたいと思っています。


ちょっと毒舌も混じるかもしれません。すみません。
よそ様の音源をけなしはしません。
そうでなく、KMGの良いところに目を向けていただきたく思いました。

そもそもギター音源で生ギターを表現することじたい、難しく、生演奏にはほど遠く勝てないのです。ですから、ギター音源が最終工程にて必要な方は、ギターの弾けない方がほとんどです。私もそうです。だから1個ずつ弾いて録音して音源にしたのです。それがKMG7です。

で、演奏のうまい人がギターを弾くと、音の粒がそろいます。下手な人はバラバラです。
一般的に良いギター音源と呼ばれるものは、うまいプレイヤーが演奏して録音しています。これは当たり前ですね。KMGは逆ですが。

ではなぜKMG7をあえてお勧めしたいかというと、僕が感じるに、、、

フリーだから(´д`)

じゃないんです!それも使う側のメリットのひとつですが、僕にメリットなんてないんです(笑)だけどお勧めしたいには理由があるんです。

「DTMのエレキギター音源の最終的な評価は、打ち込む人の腕にある」

と思うからです。

KMGのチョーキングはなぜサンプリングでなくベンドで操作するのか、これは、(録音できなかったというのも大いにありますが)サンプリングだとチョーキングがリアルにはなりますが、スピードが調節できないんです。できても速さが変わるだけでニュアンスを変えられません。
よく打ち込みギターでうまい人の曲を聴きますがソロのときに残念さを感じることが多いです。
「ああ、ベンドが機械的な打ち込みだ・・・」ってのがよくあります。
え?KMGはベンドだからよくない?
そうじゃなくて、打ち込む人の腕です。ベンドをリアルタイムで操作すればよりリアルに近づきます。ただしそれでも、ギターリストからすると、ギターのチョーキングではないといわれます(シンセソロだといわれます)。でも機械的よりはましでしょう。
あとは、スピードコントロールできないチョーキングサンプルを鳴らすか、自由なチョーキングを自分で操作するか、お好みしだいです。僕は、キーボード操作に慣れていたので、KMG7をベンド操作する音源にしたということです。

次に、KMGの音質が悪いのになぜお勧めするか、これはまず、音質はごめんなさい、そのうち時間あればノイズ除去します(←それだけの問題じゃないやろヽ(`Д´)ノ)。
音質のもうひとつに粒のそろいがあります。KMGはギターの弾けない僕が一生懸命弾いたので粒がバラバラです。

ここで今回のブログの本題です。

うまいプレイヤーが録音すると粒もそろい、音色も何度弾いても同じ音が出せます(現役○A○A○Aギター講師のお言葉です)。そしてそれを生で聴くときれいで、生々しさに感動するわけです。
しかし、僕が思うに、きれいな音を人間のニュアンスで弾いているから生々しいのだと思っています。
きれいな音を、100%ずれないシーケンサーで8分音符を刻むとラウンドロビンがあってもマシンガン効果は避けられません。むしろ、きれいな音で粒がそろっているためにラウンドロビンが効果を発揮していないのだと思います。
人間が表現する微妙なリズムのノリ(ずれ)が粒ぞろいの音をリアルに表現している(というかリアルですから)のだと思います。
この場合下手な演奏もリアルといえるでしょう。

だから、これが自論ですが、音源のサンプルがきれいであればあるほど、その音源を打ち込みでリアルに表現するのが難しくなっているのではと思っています。
リアルな音源は、それだけギターに詳しく熟知した者で、打ち込みの技術を持った者でないと、リアルには扱えないのでは、と思っています。

だからKMG7をお勧めしたのです。
負け惜しみに聞こえたり、偶然の産物に聞こえますが、

つるつるのきれいなレンガを1/100㍉ずれずにきれいに並べた壁より、少し傷ついたレンガを全くずれずに(または少々のずれありで)並べた壁のほうが人間味があるのでは、と思うしだいです。
もちろんつるつるのきれいなレンガを味のあるようにずらしたり工夫して並べられる人は、そちらのほうが表現力があります。同時に難易度も上がりますよと。

KMGはギターが下手な作者が弾いたために、傷ついたレンガのようなサンプルだらけです。
しかし、それらは、ロボットに寸分違いなくきれいに並べさせるだけで新人職人さんが並べたかのような壁になります。下手さ加減が生んだ偶然の産物がKMG7です。

ギターの仕組みや演奏を熟知していて、打ち込みに自信のある方は、値段が高くて操作性が難しくても、いろんなことができるギター音源を買うのがよいでしょう。
ギターを詳しく知らず、ほとんど弾けない人は、高性能ギター音源を買っても、その音源の真の能力を発揮することはとても困難です。お金に余裕があって、じっくり使い方を覚えるなら問題ないですが、お金もきつい、操作を覚えるのもだるいという方は、KMG7といわずとも、まずは、フリーの音源で楽しむのもありじゃないでしょうか?

ひとつ気づきませんか?
高価なギター音源はいい音が出るのに、ギターを熟知したものしか効果が期待できない。
ギターリストはギター音源要らない。
ギター音源制作者としてはとても切ないことなんですよ。

KMG7はこれまで何度も言ってきましたが、2.9.0の現在のバージョンではフリーです。
現在のものはこれからも、権利が自分の手元にある間はフリーでいきたいと思っていますが(ちなみにこれは日本語を理解できる方のみであり、海外にはドルで売るかもしれません)、

私はギター音源を自作するぐらい貧乏なので、

最近はちょっとくらい商売させてもらってもいいかななんて考えています。_o/|_ ユルシテ
かといって、いまさらKMG7 2.9.0を有料にはできませんし、国内ではそうする気はないので、この前すこしツイートしましたが、KMG7 IIとか、アドバンスドとかスペシャルとか、そんな感じで、より良いものに引き継ぐことができたときは、それを有料(安めに)で販売させていただこうかなんていう計画はなくもないです。しかし、ほかの音源も制作しているので、まだまだ先の話になりそうです。

それまでは、KMG7をお使いの皆様、どうか傷ついたレンガを味のあるように並べてやってください
よろしくお願いします。
そして今更ですが、KMG7をメインで使用して作られた楽曲が公開されたときは、ぜひお知らせください。じっくり聴かせていただきます。

2016/7/13
Studio Major7th
KMG7制作者:Yutaka Morikawa
http://major7th.jp/kontakt/kmg7/

2016年6月21日火曜日

KONTAKT KSPメモ play_note, note_off

今回は、かなりマニアックな内容です。
ちなみに気になったことなどあれば、ツイッターのほうにでも連絡ください。

レガートを制作する上で、KONTAKT内でグループ単位のサンプルのディレイが必要になった。
しかし、グループ単位で音を遅らせる方法がこれといって無い。

そこで、waitとplay_noteの検証をした。
そして現在押されているキーの数を数えるための$Stackを用意した。
KMG7を制作中、これにかなり悩まされたので、改めて検証。

on note
    inc($Stack)
    wait(1000000)
    $Eve_ID := play_note(60,127,0,-1)
end on

キー50をonにしたとする。
この場合
50キーオンから1秒たつ前にキーを放すと
60の音は鳴らない。
・50キーを放したとき60のon releaseはコールバックされない。(50のon releaseだけ働くっぽい)
50キーオンから1秒経過させると
60の音が鳴る。
・50キーを放したとき60のon releaseはコールバックされる。(2つ分on releaseが働くっぽい)

###########################

on note
    inc($Stack)
    wait(1000000)
    $Eve_ID := play_note(60,127,0,0)
end on

キー50をonにしたとする。
この場合
50キーオンから1秒たつ前にキーを放しても
60の音は鳴る。(鳴りっぱなし)
・50キーを放したとき60のon releaseはコールバックされない。(50のon releaseだけ働くっぽい)
50キーオンから1秒経過させると
60の音が鳴る。(鳴りっぱなし)
・50キーを放したとき60のon releaseはコールバックされない。(50のon releaseのみ働くっぽい)
・60の音は、サンプルが終わるか、fade_outまたはnote_offを使用しなければ止まらない。

ここで、後者の場合、
on release
    dec($Stack)
    note_off($Eve_ID)
end on
とすると、
50キーオフで、音は50も60も止まる。
on releaseは1つ分だけ働き、note_offによる重複はないっぽい。
ただし、キーオンを和音にすると、$Eve_IDが順次上書きされ、note_offは最後の一つの音しか消えない。

これを回避するには、
play_note時の$Eve_IDを
%Eve_ID[$EVENT_NOTE]
にするなどの必要がある。

release時は
$i := 0
while($i<128)
    if($i=$EVENT_NOTE)
         note_off(%Eve_ID[$i])
    end if

    inc($i)
end while
とすれば、オフにしたキーのみ消えてくれて、全部放すと全部消えてくれる。
しかし、play_noteが開始になってからでないと消えない(1秒経過前にキーオフすると1秒経過後に音が鳴り出し、なり続ける)

###########################

もう一つ注意があるようです。
on controller
    message($Stack)
end on
をセットし、
音が鳴っている間、CC1を動かしまわって、$Stackの動きを観察した。

on note
    inc($Stack)
    wait(1000000)
    %Eve_ID[$EVENT_NOTE] := play_note(60,127,0,-1)
end on

on noteの中でplay_noteは、循環しないらしい。
というのは、50キーを押しっぱなしにしたとき、$stackが1以上増えないからである。

on note
    inc($Stack)
    wait(1000000)
    %Eve_ID[$EVENT_NOTE] := play_note(60,127,0,0)
end on
の場合も同じであった。

そして先ほどの例のように、
on release
    dec($Stack)
    $i := 0
    while($i<128)
        if($i=$EVENT_NOTE)
            note_off(%Eve_ID[$i])
        end if

        inc($i)
    end while
end on
relaese内でのnote_offも循環しないようである。

注意すべきは、on note内でのnote_offはon releaseがコールバックされるようで、$Stackが減ります。on release内でのplay_noteは$Stackが増えなかったので、そもそもplay_noteはon noteをコールバックしないっぽい?です。

on controller
    message($Stack)
end on

on note
    inc($Stack)
    wait(1000000)
    %Eve_ID[$EVENT_NOTE] := play_note(60,127,0,0)
    wait(1000000)
    $i := 0
    while($i<128)
        if($i=$EVENT_NOTE)
            note_off(%Eve_ID[$i])
        end if

        inc($i)
    end while
end on

↑これで50キーを押しっぱなしにして2秒以上の間CC1を動かしまわってメッセージを見ると1秒後に1になって2秒後に0になるのがわかります。

実験中気になったのは
%Eve_ID[$EVENT_NOTE] := play_note(60,127,0,0)
%Eve_ID[$EVENT_NOTE] := play_note(60,127,0,-1)
on note内だと、前者は無条件にplay_noteが起動し、後者はキーがオンになっている場合にplay_noteが起動しましたが、on release内で使うと、共にキーオフ後でもplay_noteの音がなりっぱなしになるようです

それをふまえて、
つまり、ややこしいのだが、

on note
    inc($Stack)
    wait(1000000)
    %Eve_ID[$EVENT_NOTE] := play_note(60,127,0,-1)
end on

on release
    dec($Stack)

end on

これは、note_offがなくても、1秒以後にキーを放せば、play_noteの音も止まるが
releaseが2個ずつ働くため、3和音を鳴らすと、1秒以後にキーを放すと$Stackは-3になってしまう。(1音だと-1)

on note
    inc($Stack)
    wait(1000000)
    %Eve_ID[$EVENT_NOTE] := play_note(60,127,0,0)
end on

on release
    dec($Stack)
    $i := 0

    while($i<128)

         if($i=$EVENT_NOTE)
            note_off(%Eve_ID[$i])
        end if
    

        inc($i)
    end while

end on


こちらは、note_offをセットしなければ1秒以後に音が消えてくれないが、1秒以後にキーを放せば、play_noteの音はnote_offにより止まる。
そして、on note内のplay_noteやon release内のnote_offは循環しないようなので、3和音を鳴らし、1秒以後にキーを放しても$Stackは正常に0に戻る。
ただし問題は、一度キーをオンにすると、1秒以内にキーをオフにしても、1秒後に60の音が鳴り始めてしまうことである(オンにしたキーが生きていればplay_noteを起動するという方法も取れるかもしれないがややこしくなる)

つまり前者の場合、play_noteの音が鳴り始めたあとにキーオフすると、$stackが-(マイナス)に
後者の場合、$Stackに異常は発生しないが、無条件に音が鳴ってしまうという。

そこで偶然良い結果を見つけたので、記しておきます。

前者を使い、on release内でnote_offをセットします。
すると、3和音キーオフ時にreleaseが重複し$stackが結果的に-3になるかと思いきや、
かなりめちゃくちゃな演奏をしても、$Stackが必ず0に戻りました。

最終的にplay_noteを使ったディレイ効果としてよさそうなのは、少し改造を加えて、

on note
    inc($Stack)
    disallow_group($ALL_GROUPS)
    wait(1000000)

    allow_group(find_group("Legato"))
    %Eve_ID[$EVENT_NOTE] := play_note($EVENT_NOTE,$EVENT_VELOCITY,0,-1)

end on

on release
    dec($Stack)
    $i := 0

    while($i<128)

        if($i=$EVENT_NOTE)
            note_off(%Eve_ID[$i])
        end if   

    inc($i)
    end while

end on

これで、1秒後にグループ"Legato"のキーが鳴り、キーオフで遅れた音も消える、そして$Stackに異常も発生しないプログラムのできあがりです。(保障しませんが)これを応用すると、1つのキーオンで2つ以上の任意の音をつないでレガートを作れるはずです。
$Stackが0のときは通常のグループを鳴らし、$Stack>0のときは、このディレイを使って、2つ以上の音をつなげるLegatoグループを鳴らすというわけです。


KSPの説明書を読むと、コールバック関係のことはしっかり書いてあるようなのですが、英語なので正確につかめないというのが、全ての元凶でした。

しかし、説明書にディレイの作り方を書いてあるわけではないので、良しとしませんか・・・。

実は現在制作中の音源には別の方法をとっています。ひと段落したら今回の方法を試したいと思います。そして不具合があればまた記事を修正なり、更新したいと思います。

以下6月25日追加更新
実際に音源に組み込んでみました。
見事バグが発生しました。
理由はwaitです。
上のスクリプトでは1秒だったので気づかなかったのですが、waitをはさんでグチャグチャやると、$Stackに異常が発生しました。
ここでは振れていませんが、消えるはずのノートが消えなかったりと、いろいろ不具合が出ました。
結局何がおきているかというと、おそらくですが、
1.ノートオン
2.wait
3.play_note(同時にID取得)
4.wait
5.play_note(同時にID取得)
となるところが、速い演奏やあるタイミングで、
1.ノートオン
2.wait
3.play_note(同時にID取得)
4.wait前にplay_note(同時にID取得)
5.wait
6.play_note(同時にID取得)
このへんの関係で、note_offで消えないIDが残ってしまい、on releaseで消すことになり、$Stackが余分に減ってしまうのだと思います。

前回の検証で、play_noteはon releaseで消す(止める)と、play_noteを呼び出したノートを止めるreleaseとplay_noteを止めるreleaseの2つが働いてしまうようで、$Stackが1個余分に減ってしまうらしいことがわかりました。
正しく、on release内のnote_offでplay_noteを止めると、on releaseは一つしか働いてないようで$Stackも1個しか減りませんでした。

つまり、waitの前後の関係でplay_noteで取得したIDが%Eve_IDに無い状態になり、on release時に
note_offで止めれてないこととなり、on release自体で止めることとなり、$Stackが減ってしまった、と勝手に解釈しました。

結果的に、$Stackに異常が出ると先に進めないので、
「後者の場合、$Stackに異常は発生しないが、無条件に音が鳴ってしまうという。」
という方を採用しました。

もう一度おさらいです。

on note
    inc($Stack)
    wait(1000000)
    %Eve_ID[$EVENT_NOTE] := play_note(60,127,0,0)
end on

on release
    dec($Stack)
    $i := 0

    while($i<128)

         if($i=$EVENT_NOTE)
            note_off(%Eve_ID[$i])
        end if
    

        inc($i)
    end while

end on


こちらは、note_offをセットしなければ1秒以後に音が消えてくれないが、1秒以後にキーを放せば、play_noteの音はnote_offにより止まる。
そして、on note内のplay_noteやon release内のnote_offは循環しないようなので、3和音を鳴らし、1秒以後にキーを放しても$Stackは正常に0に戻る。
ただし問題は、一度キーをオンにすると、1秒以内にキーをオフにしても、1秒後に60の音が鳴り始めてしまうことである(オンにしたキーが生きていればplay_noteを起動するという方法も取れるかもしれないがややこしくなる)

「たぶん」$Stackに異常はでません。そのかわり、小文字で表示したややこしい方法をとることにしました。といってもめんどくさかっただけでそんなにややこしくはないのですが。

on note
    %Alive_NOTE[$EVENT_NOTE] := 1
    inc($Stack)
    wait(1000000)
    if(%Alive_NOTE[$EVENT_NOTE] = 1)
        %Eve_ID[$EVENT_NOTE] := play_note(60,127,0,0)
    end if
end on

on release
    %Alive_NOTE[$EVENT_NOTE] := 0
    dec($Stack)
    $i := 0

    while($i<128)

         if($i=$EVENT_NOTE)
            note_off(%Eve_ID[$i])
        end if
    

        inc($i)
    end while

end on


ということです。
押したキーが生きてるか死んでるかを判断してやり、生きていればplay_noteするとしてやりました。

これで、やっとwaitがからんでも、$Stackに異常なく正しい動作が可能となりました。(たぶんです)

実際に組み込む際は、waitより前に設定する事項と、あとで設定する事項とがあります。
それをしないと、正しく動作しません。

まだ不具合が出るかもしれませんが、ひとまず安心です。
とにかく、前回の記事(この記事の上のほう)は失敗作です。

条件をつけてplay_noteの最後の引数を0にする方を使うことになりました。

おしまい。

2016年5月21日土曜日

Let's Go to HOLLYWOOD - KONTAKT

KONTAKT用ライブラリ、「Let's Go to HOLLYWOOD」を公開いたしました。
http://major7th.jp/kontakt/lgh/



制作経緯についてですが、ハリウッド系BGMを制作するのに、僕は開発当初それらしき音源を持っていなかったのです。

なら作ってしまえ!というKMG7的な発想のもと、この音源の開発に取り掛かりました。

最終的にお値段を安く設定させていただきましたが、高い音源だから信用があるという概念を振り払うよう、安くても使える音源を志しました




さて、オケに混ぜてどれほど使えるかはまだまだ未知数ですが、実際にPVで使ってみる限り、EQをいじったり、リバーブを他のものと差し替えたりして、それなりのサウンドが出せることがわかりました。

現在はまだバージョン1.0.0で23種類の音色しかありませんが、スクリプト上60種類まで増やせるようになっております。

今後バージョンアップにてよい音が見つかり次第、音色を増やしていこうと考えております
そのときお値段も若干上げさせていただきますのでよろしくお願い致します。

おっと、経緯の説明でしたね。
つまり、そういう音源を持っていなかったわけで、持ってないというのは、お金がなかったんです。その後NI社KOMPLETE10を導入し、アクションストライクスを手に入れたので、しばらく必要なかったのですが、KMG7を2.9.0にバージョンアップしたのをきっかけに、音源制作に気合が入り、続きを制作したわけです。

当初お金がなく、この音源を作り始めたという気持ちを大切にし、この音源を作るにあたり、大金をかけることは好ましくないと考え、とにかく身の回りのものでHOLLYWOODを体験しようというのが、コンセプトとなりました。決してケチ心でお金を使わなかったわけではないです。

使った物をおおまかに解説いたしますと、



洗濯機

ドア

引き戸

空き缶(500円玉2枚付き←スナッピー代わり)

鍋(おたま)

コップ(中身は薄めためんつゆ)

箱(ドラムスティック)

スプレー

カーテンレール

電動ドリル





といったところでしょうか。

決して既存の楽器を使わないというのもコンセプトの一つであります。

お勧めは、「ボンネット」「おかん's Room」「洗濯機」「スプレー」あたりでしょうか。
特にボンネットはいい音でます。玄関ドア(タイミングを少し加工してますが)はボンネットの少し軽い版みたいなサウンドです。車のドアは、低域を増やしたいときにアクセントにもちいるとよいでしょう。
そしてスプレーは、ループしてありますので、鳴らし続けることもできますし、短く切ってアクセントをつけると、ハイハット的な使い方ができます
偽スネアは、500円玉をスナッピー代わりにし、ひそかに11レイヤーも使っております。ベロシティ1から127までクロスフェードしながら自然な音の移り変わりを体験できます。

全てのサウンドはレイヤーと別に4種類用意されていて、CまたはG(赤鍵盤)でランダムでサンプルが選ばれます。連打しても同じサンプルの連打にはなりません。(2連打くらいはありえますが)
CまたはGの半音4個上分(青鍵盤部分)に、そのサンプルを割り当てておりますので、ランダムで好ましくない音が出るときに、好きなサンプルを選ぶこともできます。

今後、身の回りでハリウッドサウンドに使えそうな「物」探しをしばらく続けていこうと考えております。

今後とも、Let's Go to HOLLYWOODをよろしくお願い致します。

作者:Yutaka Morikawa

人気の投稿