OctaQ 1.1 — 拍線は出す、小節頭は出さないことにしました
イベントBGM用の8 Deck再生アプリOctaQを1.1に更新しました。HOT CUE、拍線の表示、客席に音を出さずに仕込める操作系、同一オーディオI/Fでの2系統出力。そして小節頭の自動判定を、測ったうえでやめた話を書きます。
文 / YKC(イベント配信エンジニア / SynQNow 開発者)
イベントBGM用の8 Deck再生アプリ OctaQ を 1.1 に更新しました。
前回の記事では、EQもSYNCもFXも「載せないと決めた」話を書きました。判断そのものは自動化しないという線は、今回も変えていません。ただし一度「載せない」と決めたものを使ってみて戻した機能があり、逆に作ってみて、測ったうえでやめた機能もあります。
今回のリリースで変わるのは次の点です。
- 曲の中にHOT CUEを6箇所覚えさせ、ボタン1つで飛べます
- 波形に拍線を出します。ただし小節頭は自動で当てません([頭]ボタンを1押しで決めます)
- 客席に音を出さないまま、頭出しの仕込みが終わるように操作系を作り直しました
- Deckごとのゲインを、卓と同じ回転式のつまみとして画面に出しました
- 同じオーディオI/Fの別chを本線とモニタに使えます
- MIDIは上下の波形枠にも割り当てられます(HOT CUEを12個で組めます)
- Deckの縦波形を2倍に拡大し、縦長タッチモニタに対応しました
以下、それぞれ何のための追加なのかを書きます。

拍線は出しますが、小節頭は出しません
いちばん時間を使ったのがここです。そして最終的に「出さない」を選んだので、先にその話を書きます。
波形に拍線を出せるようにしました。ただし小節の頭がどこかは、アプリが決めません。[頭]ボタンを1回押すと、そこが小節頭になり、小節線と番号が出ます。
![拡大波形に等間隔の拍線が引かれ、上端の帯に小節番号17と21が表示されている。ツールバーには[頭][‹拍][拍›]4/4 TAPのボタンが並ぶ](/blog/images/octaq-beatgrid.webp)
取れたものと、取れなかったもの
| 自動で取れるか | 根拠(自社実測) | |
|---|---|---|
| 拍の間隔(テンポ) | 取れる | 誤差1%以内。30秒先での累積ずれが1拍の1/4未満 |
| 拍の位置 | 取れる | 低域の音の立ち上がりから判定 |
| 小節頭(4拍のどれが1拍目か) | 取れない | 下記 |
最初の実装では小節頭も当てにいきました。実音源で確かめた整合率はおよそ50%。拍は合っていて、ずれているのは小節頭だけでした。
改善できるのかを、測って確かめました
粘れば上がるのか、それとも原理的に無理なのか。判断するために、互いに独立した手がかりを3通り用意して、同じ曲で突き合わせました。
| 手がかり | 中身 |
|---|---|
| 低域エネルギー | 低域の音の立ち上がりがいちばん強い拍 |
| 全帯域ノベルティ | スペクトルの変化量がいちばん大きい拍 |
| 和声変化 | 拍ごとの和音の変化がいちばん大きい拍(コード進行は小節頭で変わる) |
実音源7曲での結果です(自社実測)。
- 3つが一致した曲は1曲もありませんでした
- 1位と2位のスコア比は1.00〜1.23倍。ほぼ差がありません
独立な手がかりが互いに一致しないのは、その特徴量の層にそもそも情報が無いときの形です。特徴量を足して精度を上げる望みは薄い、と判断しました。上げるなら学習済みモデルが要りますが、この規模のアプリに載せる依存としては重すぎます。
人間は和声とメロディの文脈で小節頭を判断していて、その情報は音の立ち上がりには出てきません。実装が未熟なのではなく、原理的に決まらない部分がある、ということです。
間違ったグリッドは、無いより有害です
ずれた線を信じてIN点を置けば、拍がずれた繋ぎが本番で鳴ります。線が無くて耳で決めるほうが、はるかに安全です。
そこで自動で出すのは拍線までにしました。小節番号も出しません。[頭]を押した瞬間だけ、そこが1拍目になります。押した位置はそのまま使わず、いちばん近い拍へ寄せます。拍の間隔は当たっているので、人が決めるべきは「4拍のうちどれか」だけだからです。生の時刻を入れると、当たっている拍線まで動いてしまいます。
決めた値はIN/OUT点と同じく曲ごとに保存されます。仕込みで一度決めれば済みます。
線を出さない曲もあります
テンポが一定でない音源では、線そのものを出しません。曲を通して30秒ずつの窓でテンポを推定し、全体と合った窓の割合で判定しています。
| 音源 | テンポ安定度 | 判定 |
|---|---|---|
| BGM素材(単曲) | 100% | 線を出す |
| ゲーム音楽 | 83% | 線を出す |
| 89分のBGM集(複数曲入り) | 23% | 出さない |
出さないときは理由を画面に出します。「この曲はテンポが一定でないため、拍線を出していません」と書きます。「解析できませんでした」では、使う側が次に何をすればいいか分かりません。
見えなければ意味がありません
音圧の高い曲は波形が画面いっぱいを埋めるので、薄い線を重ねるだけでは完全に見えなくなります。実際、最初はそうなっていました。
対策を3つ重ねています。線を重ねる面では波形を少し落とす。線に暗い縁取りを敷く。そして上端に不透明の目盛り帯を置く。3つ目が本命で、波形が何であろうと必ず読める場所を作る、という考え方です。
拡大波形の操作列には、拍に合わせて光るランプも置きました。小節頭は強く、それ以外の拍は弱く光ります。線は「これから置く場所」を見るためのもので、目は波形の形のほうへ行きます。鳴っている拍がその場で光れば、引いた線が音と合っているかを耳と目で同時に確かめられます。[頭]ボタンのすぐ隣にあるので、光っているのを見ながら押せます。
解析はDeckの再生とは別のスレッドで走ります。解析中も再生・波形表示・IN/OUT操作は妨げられません(8 Deck同時ロード+4 Deck再生中でも描画は121fpsを維持。自社実測)。89分の音源で18秒かかりますが、結果はキャッシュするので2回目からは待ちません。
HOT CUE — 6箇所を覚えさせて、手で戻る
曲の中に最大6箇所の頭出し位置を覚えさせ、ボタン1つで飛べます。進行が動くイベントでは「1番を飛ばして2番のサビから」が頻繁に起きるためです。

DJ機のHOT CUEと同じ役割ですが、押したときの意味を役割で分けています。
| 未登録 | 登録済み | |
|---|---|---|
| IN / OUT | いまの位置に置く | いまの位置に置き直す(設定なので上書きしてよい) |
| HOT CUE | いまの位置に置く | そこへ飛ぶ |
HOT CUEを押して位置が書き換わると、本番中に「3を押したら別の場所から鳴る」が起きます。だから消すのは右クリックという別操作にしてあります。
- 波形には番号ごとに色を変えた線が出ます。6本まで立つので、色が無いと押す前に番号を数えることになります
- 再生中に押すと、その位置から鳴らし直します。切り際だけ10ms落として繋ぎます(即断ちは「ボツッ」と鳴り、停止用の150msフェードだと「押してから鳴る」感触になります)
- 停止中に押すと再生ヘッドがそこへ行き、次のSTARTはそこから鳴ります
- 位置は曲ごとに保存されます。事前準備で仕込んでおけば翌年も残ります
客席に音を出さないまま、仕込みが終わります
初版を触ってもらって出た指摘が2つありました。
- 再生ヘッドを動かせないので、頭出し位置を決めるのに等倍で鳴らして待つしかない
- 客席へ音を出さないと点を置けない
どちらも本番で使う道具としては致命的なので、操作系ごと作り直しました。
左クリックは再生ヘッド、右クリックはメニュー
初版は「波形を左クリックでIN点、右クリックでOUT点」でした(前作からの踏襲です)。改めています。
| 操作 | 何が起きるか |
|---|---|
| 拡大波形を左クリック | 再生ヘッドがそこへ動く |
| 拡大波形を右クリック | メニューが開き、IN / OUT / HOT CUE 1〜6のどれをそこに置くか選ぶ |
| IN / OUT / HOT CUEのボタン | 押した瞬間の再生ヘッドの位置に置く |
そして左クリックが客席の音を飛ばすことはありません。
| Deckの状態 | 左クリックしたとき |
|---|---|
| 止まっている | 待機位置が動く。次のSTARTはそこから |
| プレビュー中 | プレビューがその位置から鳴り直す |
| 客席へ出ている | 何もしない |
波形は面が広く、押し間違いがそのまま客席の音飛びになります。飛ばしたいときはHOT CUEボタンという、狙って押す別の操作があります。
プレビューを「モニタだけの再生」にしました
初版のプレビューは押している間だけ鳴る方式でした。これでは鳴らしながら点を置けません。押さえている手が塞がるからです。トグルに変えました。
- ▶ を押すと、そのDeckをいまの再生ヘッドからモニタだけで鳴らします
- 上部の大きい波形にも出ます。再生ヘッドは水色で描かれ、客席へ出ている白と並べても取り違えません
- 鳴っている間にIN/OUT点・HOT CUEを置けます
- 拡大波形を左クリックすると、プレビューがその位置から鳴り直します。早送りの代わりに位置を探せます

これで、客席へ一切音を出さずに仕込みが終わります。 本番前のリハーサルや、幕間の裏で次の曲を用意する場面で効きます。
プレビューの音はモニタ用のAudioContextの中にしか存在しません。Contextをまたいだ接続は例外になるので、客席へ回る経路が構造として存在しない、という作りです。
Deckごとのゲインを、つまみとして出しました
フェーダーとは別に、Deckごとの音量を±12dBまで調整できます。曲ごとの音量差を、フェーダーの位置を揃えたまま吸収するためのものです。
卓のゲインつまみと同じ回転式にしました。±0が真上、外周の弧が可動域、±0から現在値までをオレンジの弧で描くので、どちら向きにどれだけ振ってあるかがひと目で読めます。

- フェーダーの真上に置いています。同じ列にあるものは同じ系統だと読めるようにするためです
- ただし形はフェーダーに似せていません。似せると本番中に「音量つまみ」だと思って触られ、仕込みで合わせた値が壊れます
- ±0のときは沈ませてあります。光っている=このDeckだけ細工がしてある、という合図です
- ホイールでは動きません。 Deckの上でスクロールしただけで客席の音量が変わるのは、このアプリが避けている類の事故そのものだからです
同じオーディオI/Fの別chを、本線とモニタに使えます
初版では「本線と同じ物理デバイスなら、モニタ用の出力を作らない」という安全則にしていました。2chの機器では正しいのですが、多chのオーディオI/Fでは出力が物理的に別系統です。「本線ch3/4・モニタch1/2」という現場でごく普通の構成を、丸ごと塞いでいました。

禁止する条件を「同じ機器」から「同じchペア」へ狭めました。
- 本線ch3/4 / モニタch1/2 → モニタが動きます
- 本線ch3/4 / モニタch3/4 → 従来どおり拒否し、「別のchを選べば鳴らせます」と理由を出します
客席へキュー音が乗る経路は、従来どおり出力先そのものを作らないことで塞いだままです。ソフトウェア的にミュートするのではなく、鳴らす先が存在しない、という形にしてあります。
なお、前回書いた「デバイス1台につきAudioContext 1つ」という2系統出力の設計そのものは変えていません。同期のずれが自社実測で中央値0.01ミリ秒に収まったのはこの構造のおかげなので、そこは触らずに、選べる構成のほうを広げた形です。32chのオーディオI/Fで実測したところ、同一デバイスに2つの出力を開いて両方が動き、時刻の申告は完全に一致しました。同じハードウェアクロックを共有しているので、この構成の同期はむしろ別デバイスより有利です。
MIDIは「枠」にも割り当てられます
HOT CUEをDeckごとに割り当てると、8 Deck × 6 = 48個。それだけでコントローラのパッドが尽きます。
そこで、上部に出している2枚の波形(枠)に割り当てられるようにしました。効く先は、そのとき枠に出ているDeckです。
| 割り当て先 | 数 | 効く先 |
|---|---|---|
| Deckごと | 48 | そのDeck |
| 上の波形 / 下の波形 | 12 | そのとき枠に出ているDeck |
IN点・OUT点・プレビューも枠に置いてあります。枠からDeckを引くのは押した瞬間なので、仕込み中に枠の中身が入れ替わってもそのまま使えます。実際に触るのは上部の2枚なので、12個で組めます。
Deckごとのゲイン、マスターレベル、選曲ジョグも割り当てられるようになりました。前回書いた「Deck 1の割り当てを2〜8へ写す」機能はそのまま使えます。
表示まわり
- Deckの縦波形を2倍に拡大しました(20秒 → 10秒)。波形のディテールが出て、重ねた小節線・拍線の間隔も2倍になります
- 波形上のボタンを大型化しました。この操作をするときはMIDIコントローラに手があり、画面は通常より遠くにあります。小さいと「押せない」のではなく「狙えない」のです
- 縦長タッチモニタ(〜1920×2160)では、波形とフェーダーの高さはそのままに、下部のフォルダツリーだけが伸びます
- 最上段の右端にアプリ名とアイコンを出しました。バージョンはツールチップに入れてあります。配布したものがどれか分からないと、報告を受けても追えないためです
アップデートの提供について
小数点以下のバージョンアップは無償です。
- すでに購入された方には、最新バージョンをお届けします
- Facebookの音響家グループでお配りした方にも同様にお届けします。ダウンロード用のURLは追ってご案内します
設定・IN/OUT点・HOT CUEの位置は、保存先をアプリ名と切り離してあるため、上書きインストールでも引き継がれます。
そのほか、この機会に決めたことを2点書いておきます。
Intel Macには対応しません。 対応OSはmacOS 12以降、Apple Silicon搭載のMacです。
返金の対応は行いません。 今回のアップデートは機能追加を目的としたもので、不具合の修正ではないためです。
これから購入される方はお問い合わせフォームの「OctaQ(BGM再生アプリ)の購入について」からご連絡ください。価格は4,800円(税込)の買い切りで、サブスクリプションではありません。折り返しお支払い方法をご案内し、確認後にインストーラをお送りします。
なお、このアプリを本番で回した実績はまだありません。1.0の記事に書いたときと同じ状態です。使ってみての気づきは、あらためて書きます。
まとめ
- 拍線は自動で出しますが、小節頭は自動で当てません。独立した手がかり3通りが実音源7曲で一度も一致せず、特徴量の層に情報が無いと判断したためです(自社実測)
- 間違ったグリッドは、無いより有害です。 ずれた線を信じてIN点を置くと、拍のずれた繋ぎが本番で鳴ります
- HOT CUEを6箇所登録できます。未登録なら置く、登録済みなら飛ぶ、と押したときの意味を分けました
- 客席に音を出さないまま仕込みが終わります。 プレビューはモニタ用のAudioContextの中にしか存在せず、客席へ回る経路が構造としてありません
- 同じオーディオI/Fの別chを本線とモニタに使えます。禁止条件を「同じ機器」から「同じchペア」へ狭めました
- MIDIは上下の波形枠にも割り当てられます。HOT CUEを48個ではなく12個で組めます
BGMオペレーションで何を載せて何を載せなかったのか、その判断の全体はイベントBGMのために、8 Deckの再生アプリを自作したに書いています。
- #新機能
- #BGM
- #イベント音響
- #PA
- #音楽再生アプリ
- #macOS
- #OctaQ
この記事を書いた人
YKC
イベント配信エンジニア / SynQNow 開発者
イベント制作の現場に25年、映像配信に20年近く携わってきました。オンライン配信が当たり前になるより前から、拠点間中継やライブ配信の現場に立っています。
- イベント制作の現場に入り、以来25年にわたって本番運営に携わる
- 映像配信に軸足を移し、20年近く配信オペレーションと技術設計を担当
- オンライン配信が一般化する以前から、拠点間中継・遠隔中継の現場を手掛ける
- 株主総会をはじめとする、失敗が許されない配信の現場を数多く経験
- 現場で繰り返し直面した課題をそのまま設計に落とし、SynQNowを開発
- ライブ配信
- 超低遅延配信
- WebRTC
- HLS
- RTMP
- SRT
- 拠点間中継
- 株主総会配信
- IR・決算説明会配信
- 社内配信
- イベント音響・映像オペレーション
あわせて読みたい
イベントBGMのために、8 Deckの再生アプリを自作した
進行が読めないイベントのBGMオペレーションは、2 Deckでは回りません。8 Deckにした理由、EQもSYNCも載せなかった判断、2系統出力の同期で詰まった点まで、macOS用アプリOctaQの開発記録をまとめます。
- #BGM
- #イベント音響
- #PA
- #音楽再生アプリ
- #macOS
- #OctaQ
配信の音が小さいと言われる理由 — PAの音は、そのまま流せない
PA卓の音をそのまま配信に流すと「小さい」と言われます。原因はレベルではなくダイナミクスレンジ。ラウドネスで測る方法、音楽とプレゼンでの違い、プラグインで整える順番、PCが落ちても音を止めないDanteの構成まで書きます。
- #音声
- #ラウドネス
- #PA
- #イベント音響
- #プラグイン
- #Dante
- #現場対応
ボンディングルーターとは — 回線を束ねる仕組みと2つの種類
複数の携帯回線を束ねて配信用の安定した経路を作るボンディングルーター。パケットを分散して対向で束ね直す仕組み、配信エンコーダ内蔵型とインターネットアクセス専用型の違い、超低遅延の配信につなぐときの注意点を解説します。
- #ボンディングルーター
- #回線
- #冗長化
- #5G
- #LTE
- #リモートプロダクション
