Metronome.fm で、6/8 のような複合拍子や、7/8 のような変拍子を選べるようにしました。拍子の分母(2・4・8・16)と、7/8 を 2+2+3 と分けるような拍のまとまりを選べます。

- 拍のメーターと、その下のまとまりの括弧。まとまりの頭(1・3・5 拍目)がアクセントになる
- 拍子の表示
- 拍子の欄のボタン。下にまとまりを出す
ただ、鳴る音だけを見れば、これまでの「拍の数とアクセント」でも同じものを鳴らせていました。この記事では、それでも分母とまとまりを選べるようにした理由と、それをどう保存しているかを書きます。
前から同じ音は鳴らせた
9/8(3+3+3)を選ぶと、9 拍のうち 1・4・7 拍目がアクセントになります。これは、9 拍子(9/4)を選んで 4 拍目と 7 拍目をアクセントに変えたものと、同じ音です。

- 拍のメーター。まとまりの括弧はない
- 拍子は 9/4 と出る

- 拍のメーター。3 つのまとまりの括弧が出る
- 拍子は 9/8 と出る
アプリの中で拍を刻むシーケンサーは、1 拍を 60 / BPM 秒として進め、拍の数(分子)で小節を区切ります。分母もまとまりも見ていません。
// 1 拍ぶんの音を予約して、次の拍へ進める(抜粋)
const beatDuration = 60 / bpm;
pushBeatSounds(beatTime, beatDuration);
nextBeatTime += beatDuration;
currentBeat = (currentBeat + 1) % settings.timeSignature[0];BPM が同じなら、クリックの間隔もアクセントの位置も変わりません。今回の変更でも、シーケンサーは変えていません。
それでも分母とまとまりを選べるようにした理由
違うのは、音以外の扱いです。
9 拍子(9/4)+手でアクセント | 9/8(3+3+3) | |
|---|---|---|
拍子の表示 | 9/4 | 9/8 |
まとまりの括弧 | なし | 3 つ |
保存される拍子 | "9" | "3+3+3/8" |
アクセント | 1 拍ずつ手で置く | 選んだときに、まとまりの頭の拍に付く |
保存される拍子の文字列の形は、後の「DB の列を足さずに…」の節で書きます。
拍の数とアクセントで作った設定は、保存しても「アクセントが 3 つある 9/4」としてしか残りません。共有された人には、それが 9/8 のつもりなのかがわかりません。6/8 を練習したい人は、拍の数を変えたあとにアクセントを 1 拍ずつ直していました。
そこで、拍子の分母とまとまりを選べるようにしました。6/8 を 6/8 として、7/8 を 2+2+3 として選び、保存できます。
BPM は分母の音符で数える
分母が 8 の拍子で、BPM を何の音符の速さにするかは迷いました。
- 分母の音符で数える(採った): 6/8 なら 8 分音符を 6 回鳴らし、BPM は 8 分音符の速さ
- まとまりで数える(採らなかった): 6/8 で BPM 60 なら、付点 4 分音符が毎分 60 回
6/8 や 12/8 だけなら、まとまりで数えるほうが楽譜の書き方に近いです。ただ、7/8 の 2+2+3 では、まとまりの長さが 8 分音符 2 つ・2 つ・3 つと揃いません。どのまとまりを 1 拍として BPM を数えるのかが決まらず、BPM の意味がぶれます。
分母の音符で数えれば、どの拍子でもクリック 1 回が BPM の 1 拍です。シーケンサーも MP3 の書き出しも変えずに済みました。6/8 を付点 4 分音符 = 60 で鳴らしたいときは、BPM を 180 にします。
まとまりは、アクセントとは別に保存する
まとまりをどう保存するかも、2 つの案を比べました。
- まとまりとして保存する(採った): 拍子ごとに
[2, 2, 3]のようなまとまりを保存し、まとまりの頭にアクセントを置く - アクセントの並びだけにする(採らなかった): 「7/8(2+2+3)」を選んだら、アクセントをその形に並べるだけで、まとまりは保存しない
アクセントの並びだけにすれば、保存する値は増えません。ただ、あとからアクセントを 1 つ変えると、元のまとまりがわからなくなります。括弧も出せません。
まとまりとして保存したので、アクセントを変えても画面にはまとまりの括弧が出たままで、保存した設定や共有した設定にもまとまりが残ります。アクセントは、まとまりを選んだときにまとまりの頭の拍に置くだけで、そのあとは拍ごとに自由に変えられます。
DB の列を足さずに "2+2+3/8" と保存する
保存した設定の拍子は、もともと DB に文字列で "4" のように分子だけを入れていました。ここに、拍子の書き方をそのまま入れることにしました。
拍子 | 保存する文字列 |
|---|---|
4/4 | "4" |
6/8 | "6/8" |
7/8(2+2+3) | "2+2+3/8" |
分母が 4 でまとまりがない拍子は、分子だけで書きます。これまでに保存した "4" は、そのまま 4/4 として読めます。列を足さないので、DB のマイグレーションも要りませんでした。
// 拍子を文字列にする(抜粋)
export const formatMeterKey = ({ numerator, denominator, grouping }: Meter) => {
const normalized = normalizeBeatGrouping(grouping, numerator);
if (normalized.length > 0) {
return `${normalized.join("+")}/${denominator}`;
}
return denominator === 4 ? `${numerator}` : `${numerator}/${denominator}`;
};同じ文字列を、拍子のプリセット(拍子の欄に並ぶボタン。次の節で書きます)の名前と、キーボードショートカットの「拍子を変える」の値にも使っています。ショートカットには 6/8 や 2+2+3/8 と書けます。
候補にない拍子は書いて足す
拍子の欄(最初の図の 3)の「編集」には、2/2・3/2・3/8・6/8・9/8・12/8・5/8(2+3・3+2)・7/8(2+2+3・2+3+2・3+2+2)を候補に並べました。これ以外の拍子は、「拍子を足す」に書いて足します。

- 複合拍子・変拍子の候補
- 書いて足した拍子。× で消せる
- 5/16 や 3+3+2/8 のように書いて足す
分母は 2・4・8・16、拍は 16 までです。拍の数は、これまでの分母が 4 の拍子の上限に合わせました。拍のメーターは、スマホの幅でも 16 拍が収まるように作ってあります。
AI の設定の編集でも使える
AI に設定の編集を頼む機能は、設定を JSON の形でやり取りしています。そこに、分母(beatUnit)とまとまり(beatGrouping)を足しました。
これまでは「6/8 にして」と頼まれたときのために、代わりの作り方をプロンプトで教えていました。1 つは、8 分音符を 1 拍として 6 拍にし、1・4 拍目をアクセントにする作り方です。もう 1 つは、2 拍にして、1 拍を 3 つに分けるガイド音を鳴らす作り方です。いまは分母とまとまりを書けるので、6/8 を 6/8 として返せる形になりました。プロンプトにも、7/8 を 2+2+3 と頼まれたときは、まとまりの頭をアクセントにして返すように書き足しました。
この JSON は、設定をファイルに書き出したり読み込んだりするときと同じ形です。足した項目は、省いたときの値(4 とまとまりなし)を決めてあるので、前に書き出した設定の JSON もそのまま読み込めます。
気をつけること
パターン(1 拍の中に鳴らすガイド音を選ぶ欄)のガイド音と、カスタムビート(1 拍を分けたマス目に音を置いて作るリズム)のマス目は、1 拍(分母の音符)を分けます。6/8 でパターンの 8th のボタンを選ぶと、8 分音符を 2 つに分けるので、16 分音符で鳴ります。ボタンの文字は 8th のままなので、分母を 8 にしたときは気をつけてください。