産物ですがメモ (エクスプレッション)
現在曲のテンポ(小節)に合わせて画面がスライド移動する事をやっていたのですが、その途中で理解した事が産物となりましたので、メモをしておきます。
テンポに合わせて1・2・3・4・1・2・3・4と数字を表示させる
var fixNum = 60 ;
var BPM = thisComp.layer("control").effect("BPM")("スライダー") ;
var compFrameRato = 1/thisComp.frameDuration;
var Onetemp = fixNum / BPM * compFrameRato;
var TToF = timeToFrames(time,compFrameRato );
var temp = TToF/Onetemp+1;
var result = Math.floor(temp ) % 4;
if (result == 0){
result = 4 ;
}
result
ついでに簡易BPMマーカーも作成しました。(スクリプト)
とりあえず、さっと作ったので今私が必要な4/4拍子でしか使えません。
またフレームレートが29以下と59.94fpsに関してはちょっと曖昧かもしれません。
が目安にはなります。
/////Script UI
var winObj = (this instanceof Panel) ? this : new Window("palette", "BPM Marker", undefined, {resizeable: true});
//実行ボタン
var grp001 = winObj.add('group');
var information = grp001.add("statictext",undefined,"BPM:");
var bpmEdit = grp001.add("edittext",[0,0,40,20],"75");
var btn = winObj.add("button",undefined,"Do it!!")
winObj.onResizing = winObj.onResize = function () {this.layout.resize();};
if (winObj instanceof Window) {
winObj.center();
winObj.show();
}
else {
winObj.layout.layout(true);
winObj.layout.resize();
}
var activeComp;
var myAdust;
btn.onClick = function(){
activeComp = app.project.activeItem
addADLayer();
addMarker();
}
function addADLayer(){
var temp =activeComp.duration;
myAdust = activeComp.layers.addNull (temp) ;
}
function addMarker(){
var compDur =activeComp.duration;
var fixNum = 60 ;
var BPM = bpmEdit.text;
var compFrameRato = activeComp.frameRate;
if (compFrameRato < 30){
compFrameRato = 30;
}
if (compFrameRato = 59.94){
compFrameRato = 60;
}
var Onetemp = fixNum / BPM * compFrameRato;
var result = currentFormatToTime(Onetemp, compFrameRato, true)
var count = compDur /result ;
for (var i = 0 ; i < count ; i++){
var myMark01 = new MarkerValue(i+1);
myAdust.property("ADBE Marker").setValueAtTime(result *i,myMark01);
}
}
Nullレイヤーでスライドの動き
var fixNum = 60 ;
var BPM = 75 ;
var compFrameRato = 1/thisComp.frameDuration;
var Onetemp = fixNum / BPM * compFrameRato;
var TToF = timeToFrames(time,compFrameRato );
var result= TToF/Onetemp;
x = (result)*960;
y=value[1];
[-x,y]
解説
BPMで出したテンポの1拍で任意(今回は960px)のPX分移動する。
まず初めに考え方としてはtime*960みたいに1秒ごとに960px動かす的な方法で考えました。
つまりtimeを1拍分の秒数にしてまえばいいという考えです。
BPMとフレームレートについてはこちらのブログを参考にさせてもらいました。
http://blog.livedoor.jp/kamqgm/archives/50538540.html
60÷BPM×FPS
この計算式で1拍の秒数が割り出せます。
まずは固定値
var fixNum
こちら60ですので、変数を固定しておきます。
var BPM = 75 ;
こちらは曲のテンポ数(BPM)です。
余談ですが私は昔バンドをしていたのですが、BPMというと打ち込み関係の言い方なのでテンポ数というのがしっくりきます。
生演奏=(テンポ)打ち込み=(BPM)という感じです。先輩のミュージシャンにBPMというと怒られます(笑)
と余談はさておき・・・
var compFrameRato = 1/thisComp.frameDuration;
こちらはコンポジションのフレームレートを取っています。
まずはこの3つを計算式に割り当てます。
var Onetemp = fixNum / BPM * compFrameRato;
これで1拍分の秒数が取れました。
そしてコンポジションのtimeをフレーム数に変換します。
var TToF = timeToFrames(time,compFrameRato );
コンポジションのFPSが24で設定されていたとして
0:00:01:00 を 24 という数字で返してくれます。
0:00:01:01 なら25ですね。
そして最後に
var result= TToF/Onetemp;
これで今回は19.2フレーム毎にカウントがアップしていきます。
これでtimeの代わりにresultで動かしています。
粗編ですが、どういった動きかをyoutube限定公開でアップしておきます。
https://www.youtube.com/watch?v=npeR8_5-BXg&feature=youtu.be