【JUCEプラグイン開発】ディレイプラグイン、DAWのBPMと拍の関係性についての考察

パンダさん

拍って何だろう・・・

コパンダ

BPMとは関係があるのかな??

こちらの記事での、テンポ計算について、なんとなくやっていましたが、拍についてもう少し調べましたので、その点についての考察を備忘録します。

目次

BPMと拍の関係

これについては、すごく基本的な事項なのですが、なんとなく、経験上、BPMとの関係性を4分音符基準でやっていました。作成しているディレイプラグインでは、次のように計算を行っています。

次の計算の「4.0」という定数は4分音符(delayNum変数に何分音符かという数字が入ります。)の時、4で割ると後ろのカッコ内が「1」となるので、4分音符の時にBPMを60秒で割った秒数がそのまま反映されるような計算としていました。

((float)60.0 / current_bpm) * (4.0f / delayNum);

この計算では、無意識にBPMの1拍(一ビート)が四分音符である前提の計算となります。

楽譜でのテンポ

楽譜のテンポでは、♩=60などのように記載しますので、DAWの時は?みたいな点で少し疑問となった点を調べてみました。もしかしたら、DAWでは、この「♩」の四分音符の指定の部分が拍子記号を指定することで変化する?という点について疑問が生まれました。

DAWでのBPM

BPMは、一分間の拍の数とという定義をよくみます。LogicProXのユーザーマニュアルの用語集にも「BPM」は「120bpmは一分間に120個の拍がある」と書いてありました。

ただこの「拍」の数ということになると、BPMの拍が何分音符なのか、という点については曖昧なままです。

https://zasshokumusic.com/4263/

https://dtm.wbrain.net/elements/bpm_beat.html

これらの記事によると、一般的に、DAWのBPMの1拍は4分音符が基準になっているようです。

試しに、BPM120の1分で検証を行ってみました。

LogicProXでは、BPM120で拍子記号が4/4の時、次のように30小節が埋まるところで1:00となります。30小節×4個=(四分音符)120個となります。これは普通です。

次に、6/8です。40小節が埋まるところで1:00となりますので、やはりBPMの基準は4分音符となっているようです。小節あたり4分音符3個なので、40小節×3個=(四分音符)120個となります。表記がBPM240ではないので、4分音符が1分に何個あるかで表記されていることがわかります。

DAW(LogicProX)の拍という言葉

DAWの設定の「拍」に惑わされてはいけないということもわかりました。

Logicでは、メトロノームの設定で、拍に対してのクリックをオンにするという設定がありますが、この拍は、拍子記号の分母の値で発音するという意味になります。実際に拍のクリック位置を聞いてみたところ6/8では八分音符の単位で発音されます。まあ、これはこれで当たり前なのですが、BPMの一分間の拍の数、の拍とは違うという点が注意点でした。

ということで、プラグイン作成において、何分音符の厳密な秒数を求めるためにはBPMの拍は4分音符になるという前提で秒数を計算することにします。

DAWから表示記号の取得を行う方法

今回のディレイプラグインでは使っていないのですが、拍などについて色々調べているついでに、JUCEでDAWから拍子記号を取得する方法も調べましたので、まとめておきます。

拍子記号は、英語で「TimeSignature」と書きます。なので、JUCEで扱うときも、このTimeSignatureという用語を覚えておくと便利かと思います。

拍子記号の分母は、英語でtime signature Denominatorといいます。

JUCEでは、PlayHead::currentPositionInfo構造体の「timeSigDenominator」からDAWの拍子記号の分母を取得することができます。

クラスに変数を準備しておきます。

//クラスに適当に変数を追加しておきます。
private:
//...略...
    double current_denominator = 4.0;//追加
    double current_numerator = 4.0;//追加

playHeadでDAWからの情報を受け取ります。

//処理で拍子を取得する方法
playHead = this->getPlayHead();
playHead->getCurrentPosition(currentPositionInfo);

current_denominator = currentPositionInfo.timeSigDenominator;//分母の取得
current_numerator = currentPositionInfo.timeSigNumerator;//分子の取得

currentPositionInfo構造体のtimeSig●●というメンバから取得ができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次