拍って何だろう・・・
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●●というメンバから取得ができます。