iicafiaxus

飯香 · @iicafiaxus

30th Jul 2011 from Twitlonger


■ UTAU用BFプラグインについて
■  2011年7月 ヒギンズ ◆iicafiaxus


■ これは、何をするためのものですか?

楽曲をUTAUに入力する途中で、すでにUTAUに入力されているノートを、
特定の規則に従って編集する必要がある場面は多く登場します。

たとえば、
「すべての音の長さを2倍にする」とか、
「他フラグの値を変えずにすべての音からgを10引く」とか、
「gフラグの値が+20以上かつ音高がC4以上の場合はgフラグの値を+20にする」とか。

このような単純作業は、もちろん素直に手作業でやってもよいのですが、
スクリプトを書いて一括でできたら楽ですよね。

そのような趣旨のプラグインはすでにいろいろあるのですが、
今回ご紹介するプラグインは、コマンドの数が少なくて憶えやすいことが特徴です。
(コマンドはなんと全部で8個しかありません。)

しかも、別途テキストエディタなどを用意する必要がなく、
UTAUエディタ上からスクリプトを入力し、実行することができるので大変手軽です。


■ どのような動作をするのですか?

プラグインをインストールすると、「BF指示の読み込み」と「BF指示の実行」という
2つのメニュー項目がプラグインメニューに追加されます。

「読み込み」は後にして、まずは「実行」について説明しましょう。
使い方は次のような感じです。

UTAUを起動し、楽曲のうちでスクリプトを適用させたい部分
(つまり、たとえば、間違って音符の長さをすべて半分で入力しちゃった部分など)
を選択状態にします。

そして、プラグインメニューの「BF指示を実行」をクリックします。

すると、次のようなことが起きます:

 ・選択部分の内容が、BFエンジンに送られる。
 
 ・BFエンジンでは、あらかじめ読み込んでおいた指示に従って、
  送られてきた内容を編集する。
 
 ・編集した結果がUTAUに戻され、選択部分の内容がそれに置き換えられる。

つまり、たとえばもしそのあらかじめ読み込んでおいた指示というのが
音符の長さを2倍にするスクリプトだったならば、音符の長さが2倍になるだろうし、
ほかのスクリプトだった場合はそれぞれそれに応じた結果が得られるわけです。


■ 指示はどのようにして与えるのですか?

それでは、指示を読みこませておくにはどうするのでしょうか。

その時に使うのが、もうひとつのメニュー項目「BF指示の読み込み」です。
その手順を説明しましょう。

編集したいUTAUウィンドウとは別に、指示用にもうひとつUTAUウィンドウを開きます。
そして、少なくとも「左右上下AB吸吐」の8種類の音を持ったシンガーを
新しいUTAUウィンドウに呼び出してください。

(もし、「吸」「吐」ではなく「ブレス1」等の名称になっている場合であっても、
 「吸」「吐」になるように適宜エイリアスを設定してあげれば大丈夫です。)

たとえば、「蟹音ぱん。」などがその代表例です。

そして、指示用のウィンドウに、たとえば次のようなノートを並べてください。

 例1 吸あAげ上上上上上吐吸あB

 例2 吸あAなA右上上左下B右A左上右下B左吐吸あB

 例3 あ吸A右吸B左A吐左B

たとえば例1でいえば、「吸」というノート、「あ」というノート、… を並べます。
ノートの高さや長さは、今は気にしなくて大丈夫です。

そして、並べたノートの全体を選択して「BF指示の読み込み」をクリックします。

すると、ノートのリリック(歌詞)がスクリプトとして読み込まれ、記憶されます。

あとは、編集用のウィンドウに戻って、メニュー項目「BF指示の実行」をクリックすれば
今読みこませたスクリプトが適用されることになります。

なお、例1は「すべてのノートのgフラグの値を5だけ上げる」、
例2は「音符の長さをすべて2倍にする」、例3は「音符の並びを逆順にする」
という指示です。


■ どのような仕組みなのですか?

BFエンジンのメモリ構成は、次のようになっています。

 ・入力キュー … 「指示を実行」すると、選択中のノートはまず全部ここへ入ります。

 ・編集エリア … ノートの内容や並び順を編集するための作業エリアです。
          スクリプトの中では、入力キューからここへノートを取りこみ、
          ここでノートの内容や並び順を編集して、
          終わったら出力キューへ書き出すというのが基本的な編集の流れです。

 ・出力キュー … 編集が終わったノートはここへ書き出しておきます。
          スクリプトの実行が終わったとき、UTAUに戻されるのは
          ここに書き出しておいたノートです。
          ここに並んでいる順序で、UTAUの選択範囲に入力されます。

入力キュー、出力キューは、いわゆる「キュー」で、ノートが一列に並んだものです。
入力キューでは、一度取り出したノートは消えてしまいます。
また、出力キューでは、一度書き出したノートをあとから直すことができません。

編集エリアは、左方向と右方向に果てしなく広がった、一列のノート置き場です。
編集エリアには「カーソル」というものがあって、
スクリプトの中で操作できるのはその「カーソル」の位置のノートだけです。


■ 指示の書き方は?

スクリプトの中で指示として使えるコマンドは、次の8つです。
これらをうまく並べることで、意味のあるスクリプトを作るわけです。

○カーソルの位置を変えるコマンド:

 「左」 … カーソルを左へ移動
 「右」 … カーソルを右へ移動

○ノートの属性値を変えるコマンド:

 「上」 … カーソル位置のノートの属性値を1だけ上げる
 「下」 … カーソル位置のノートの属性値を1だけ下げる

 なお、属性値については、あとで追加で説明します。

○コマンドの読む順序を変えるコマンド:

 スクリプトの中で、繰り返し部分や条件分岐を作るときに使います。
 (なお、カーソルというのはつねに編集エリアのカーソルのことです。)

 「A」 … カーソル位置のノートの属性値が0なら、Bまで読み飛ばす
 「B」 … カーソル位置のノートの属性値が0でなければ、Aまで戻る
 
 AとBは必ず対になるように配置してください。
 
 なお、先ほどの例2では、A~Bの対の中にはさまれて、別のA~Bの対があります。
 このような入れ子になっているときには、外側のA~B、内側のA~Bがそれぞれ対応します。
 
○入出力のコマンド

 「吸」 … 入力キューのノートを、カーソル位置に吸い込む
 「吐」 … カーソル位置のノートを、出力キューへ吐き出す
 
 入力キューのノートは、先頭から順に読みこまれてきます。
 (一度読み込んだノートは、入力キューからは消えてしまいます。)
 なお、出力キューにノートを吐きだしても編集エリアには影響ありません。

コマンドは以上の8つです。

指示用のUTAUウィンドウで、「BF指示を読み込み」をクリックすると、
選択範囲のノートのリリックがこれらのコマンドとして解釈されます。

たとえば、例1なら、
  「吸」コマンド、「あ」の文字、「A」コマンド、「げ」の文字、「上」コマンド、…
の順に、コマンドや文字が並んでいるものとみなされるわけです。

なお、コマンドでない「あ」や「げ」などの文字の意味については次の節で解説します。


■ 属性値とは?

先ほど、ノートの属性値と言いましたが、
これはUTAUのノートにある、「Length」や「BRE」、「gフラグ」、「子音速度」などの
プロパティやフラグの値のことです。

スクリプトの中で、これらの値を上げ下げすることで、必要な編集をするわけです。

ただし、もちろん1つの音にはたくさんのプロパティやフラグがあるので、
「1上げる」などとただ言っても、どれの値を1上げるのかわかりません。

そこで、文字を使って、どのプロバティやフラグのことなのか指示するのです。

たとえば、「な」はLength(長さ)、「ぶ」はBRE(ブレス)、などと決めてあります。

一度「な」の文字を読んだら、次に他の文字を読むまでは、属性値とはLengthのことです。
もし次に「ぶ」の文字を読んだら、その時からは属性値とはBREのことになります。

次の節で先ほどの例を解説しますから、実際に追ってみるのがわかりやすいでしょう。


■ スクリプトの例

それでは、実例を使って、スクリプトがどのように実行されるか説明します。

先ほどの例1で説明しましょう。

 例1 吸あAげ上上上上上吐吸あB

スクリプトの実行が始まった時には、まだ何もコマンドを実行していないので
UTAUで選択中のノートはすべて入力キューに読み込まれている状態です。

そしてスクリプトの実行を開始します。

まず「吸」なので、編集エリアへ、入力キューから1つのノートを取り込みます。
ノートは、カーソル位置に入ります。
カーソル位置は特にいじっていないので、初期状態の場所にあるはずです。

次に「あ」です。
「あ」は文字なので、属性値の表すものが何であるかを指定するのですが、
これは実はちょっと特殊な属性値で、存在フラグと呼んでいるものです。
存在フラグは、UTAUのノートのプロパティやフラグとは直接関係がなく、
ノートが存在するとき1、存在しないとき0になるという属性値です。
(存在しないというのは、入力キューがもう空なのに取り込んできた場合とか、
 編集エリアでまだノートを何も置いていない場所にカーソルがあるときなどです。)
このあとの実例を見るとどういうことかわかると思います。
「あ」はコマンドではないので、編集エリアには何の影響もしません。

さて次は「A」です。
「A」なので、カーソル位置のノートの属性値を見て判断します。
カーソル位置には、さきほど「吸」で取り込んだノートがありますね。
そして、今は属性値は「あ」ですから、属性値とは存在フラグのことです。
つまり、さきほど取り込んだノートの存在フラグを見て判断するわけです。
(取り込んだノートの存在フラグが0となるのは、
 入力キューが空で取り込めなかったという場合です。
 ここの説明では、入力キューは空ではなかった場合ということに
 しておきましょう。)
すると、属性値は1なので、次へ進みます。

次は「げ」です。
「げ」も文字です。よって、ここからは、属性値とはgフラグのことになります。

次は「上」が5個続きます。
つまり、カーソル位置のノートの属性値を5上げる指示です。
今は属性値とはgフラグのことなのですから、カーソル位置のノートの
gフラグの値が5上がります。もし、もともとg+10だったら、g+15になるし、
またもしもともとg-2だったらg+3になります。

そして「吐」。
カーソル位置のノートを出力キューに書き出します。
つまり、先ほど読みこんで、gフラグの値を編集した結果のノートです。
編集が終わったので、あとでUTAUに戻すつもりで蓄積しておくわけです。

次は「吸」です。
カーソル位置に、入力キューから新しいノートを取りこんできます。
今までカーソル位置にあったノートは上書きされてしまいますが、
もう編集が終わって出力キューに書き出してありますから心配ありませんね。
なお、入力キューでは、初めに読み込んだノートはもう流れてしまっています。
そのため、今読みこむと、もともと選択範囲の2個目にあったノートが出てきます。

次は「あ」です。
よって、ここからは、属性値とはgフラグではなく、存在フラグのことになります。
このように、文字を何度も使って属性値の指すものを適宜切り替えていくことが
スクリプトを作る際のポイントになります。

次は「B」です。
今は属性値とは存在フラグのことですから、カーソル位置のノートの存在フラグ、
つまり先ほどの「吸」のときにちゃんとノートを読めたかどうかで判断します。
もし、ちゃんと入力キューからノートが読めていた場合は、属性値が1なので、
Aに戻ります。
また、もし入力キューが終わりで、もうノートが残っていなかった場合は、
存在フラグが0ですから、次へ進みます。

このスクリプトはどういうことかというと、A~Bのあいだの処理を、
入力キューにノートがある限り繰り返して続けるということになります。

そして、ノートがもう無かった場合は、Bの次へ指示が進むのですが、
次はもうないので、スクリプトの実行はその時点ですべて終了となります。

この時点で出力キューに書き出されていた内容が、UTAUに戻されます。


■ 注意

スクリプトがまずいと簡単に無限ループに入ってしまうので注意してください。
自己責任でタスクマネージャから「kbfapply.exe」を落とせば止まります。


Reply · Report Post