はじめに
DAW(Digital Audio Workstation)で扱う Waveデータ(wavファイル)について遭遇した互換性の問題についてメモしておきたいと思います。
私はABILITYというDAWでWaveデータの書き出しを行っているのですが、 小節の終わりにピッタリ合わせて書き出したWaveデータを Cubase(バージョン6.5)を使っている人へ渡した時に、 「Waveデータの末端が、少し短い」と言われました。
そこで、この現象を解明するため、 ABILITYの開発元へ連絡を取り、 私と開発元で様々検証した結果、 DAWによってWaveデータの末端処理に差異があることが判明しました。
DAWによるWaveデータ末端処理の違い
あるDAWで書き出されたWaveデータを 別のDAWに貼り付けたとき、長さの認識に差異が出ることがあります。
私が把握している範囲では、Cubaseと、StudioOneやABILITYの間では差異が出ます。
書き出しの主な条件分岐は以下の通りです。
各条件で書き出されたWaveデータを、 Cubase、StudioOneで読み込んだ結果を表にまとめると以下のようになります。
Waveデータ書き出し | Waveデータ読み込み | ||||
---|---|---|---|---|---|
サンプル数(理論値) | 末端の処理 | ACIDテンポ情報 | Cubaseでの表示(小節数ベース) | StudioOneでの表示(小節数ベース) | StudioOneでの表示(サンプル数ベース) |
小数点以下あり | 切り捨て(StudioOne、ABILITY) | あり | 短くなる | ジャスト | ジャストの内側(小数点以下の分) |
なし | 短くなる | ジャスト | ジャストの内側(小数点以下の分) | ||
切り上げ(Cubase) | あり | ジャスト | ジャスト | ジャストの外側(小数点以下の分) | |
なし | ジャスト | ジャスト | ジャストの外側(小数点以下の分) | ||
小数点以下なし(ジャスト) | そのまま(StudioOne、ABILITY) | あり | ジャスト | ジャスト | ジャスト |
なし | 短くなる | ジャスト | ジャスト | ||
1サンプル追加(Cubase) | あり | ジャスト | ジャスト | ジャストの外側(1サンプル分) | |
なし | ジャスト | ジャスト | ジャストの外側(1サンプル分) |
つまり、 Cubaseに別のDAWで書き出されたWaveデータを貼り付けると、条件によっては1tick短く認識 されてしまいます。
逆にCubaseでは、理論値よりも少し余分なサンプル数を「標準」としているようです。 これをStudioOneに貼り付けサンプル数ベースの最大解像度で確認すると、 ジャストの位置から少しはみ出ていることが確認できます。
具体例
具体例を見てみましょう。
まず、Waveデータのサンプル数の理論値を求める必要があります。 これは以下の式で導くことができます。
サンプル数を求めるためには秒数を求める必要があります。 そこで、BPMと小節数から秒数を求め、 そこに毎秒あたりのサンプリング周波数を掛けてやることで、 サンプル数を求めるわけです。 (最初の240ですが、BPM240での1小節がちょうど1秒になるため、こういう式になります。 小節数と秒数とではモノサシが異なるため、BPM240を基準に変換してやる必要があります。)
これが、 DAWどうこう関係なく「理論的に正しい値」 になります。 どんなDAWでも内部的にはこれと同様の計算をしているはずです。
以下、サンプル数に小数点以下がある場合とない場合の具体例を見ていきます。
書き出しサンプル数に小数点以下がある場合
BPM175、61小節分、48kHzのWaveデータを考えます。
サンプル数の理論値は以下のようになり、小数点以下が発生します。
この場合、
小数点以下を切り捨てた状態で書き出したWaveデータは、Cubaseで読み込むと長さ「60.3.3.119」と足りなくなり、
小数点以下を切り上げた状態で書き出したWaveデータは、Cubaseで読み込むと長さ「61.0.0.0 」となります。
Cubaseは小数点以下を切り上げて書き出すため、Cubase同士では問題は起こりません。 (上記の例だと「4015543」となる)
StudioOneやABILITYでは小数点以下を切り捨てて書き出すため、Cubaseで読み込むと長さが足りなく表示されます。
StudioOneやABILITY間では、小数点以下が切り上げでも切り捨てでもジャストと認識するため、問題は起こりません。
書き出しサンプル数に小数点以下がない場合(ジャストの場合)
BPM100、43小節分、48kHzのWaveデータを考えます。
サンプル数の理論値は以下のようになり、 ジャストで割り切れるため小数点以下は発生しません。
この場合、
ACIDテンポ情報のある状態で書き出したWaveデータを、Cubaseで読み込むと長さ「43.0.0.0 」となり、
ACIDテンポ情報のない状態で書き出したWaveデータを、Cubaseで読み込むと長さ「42.3.3.119」と足りなくなります。
ただし、ジャストから1サンプル追加した場合、ACIDテンポ情報に関わらず、Cubaseで読み込むと長さ「43.0.0.0 」となります。
Cubaseからの書き出しではジャストから1サンプル追加(上記の例だと「4953601」となる)されて書き出されるので、Cubase同士では問題は起こりません。
StudioOneやABILITYではジャストのまま書き出すため、ACIDテンポ情報を付加しないと、Cubaseで読み込んだ時に長さが足りなく表示されます。
StudioOneやABILITY間では、ジャストはジャストとして認識するため、問題は起こりません。
考察
小数点以下のサンプルが発生した場合、 切り上げるのか切り捨てるのかはある意味、決めの問題ですし、 秒数にしたらもの凄く小さい(何万分の1秒というレベル)ので、 実用上はどちらでもよいと言えるでしょう。
ただ、小数点以下のサンプルを切り捨てたWaveデータについて、 Cubaseでは1tick短く認識されてしまいますが、 これは ジャストで認識するほうが妥当 ではないかと思います。 1サンプルと1tickでは解像度が全く異なり、 48kHzなど一般的なサンプリング周波数であれば、 1サンプルのほうが遥かに細かい解像度であるためです。
時計に例えてみます。 1tickを1分、1サンプルを1秒とすると、 11時59分59.5秒という時間があったときに、 Cubaseは11時59分と認識し、 StudioOneは12時00分と認識するようなイメージです。 11時59分59.5秒に対して、 12時00分であれば0.5秒しかズレていませんが、 11時59分としてしまうと59.5秒分大きくズレてしまうわけです。
また、サンプル数がジャストで割り切れる場合についても、 条件により1tick短く認識されてしまうCubaseの仕様は、 いささか不可解と言わざるを得ないでしょう。 Cubaseでは基本、 サンプル数が「ジャスト+1サンプル」ないとジャストと認識されませんし、 サンプル数がジャストの場合、 ACIDテンポ情報がある場合にはジャストで認識され、 ACIDテンポ情報がない場合には1tick短く認識されます。 サンプル数が同じなら厳密に長さも同じなのに、ACIDテンポ情報の有無で長さの認識にバラつきが出るという謎仕様 です。
業界標準と言われるProToolsも同じ挙動らしいので、 Cubaseはそれに合わせているのかもしれません。 どちらも昔からあるDAWなので、 何らかの互換性事情を引きずっているのかもしれません。
それに対し、新しいDAWであるStudioOneやABILITYは、 理論値に沿った処理を行っているようです。
異なるDAWでデータをやりとりすることは普通にありえることですから、 このあたり、業界でルールを作って挙動を統一してほしいものですね。
対策
私の報告をきっかけに、ABILITYではバージョン2.5あたりから 「ACIDテンポ情報を付加する」 「小数点以下のサンプルを切り上げる」という2つのオプションが追加されました。 この2つのオプションにチェックを入れてWaveを書き出すと、 Cubaseとの互換性を取ることができます。 (ただし、ACIDテンポ情報を付加した場合、 DAW側のテンポに合わせてデータがストレッチされることにはなります。)
StudioOne(バージョン3.5)の場合、テンポ情報の付加はできるのですが、 小数点以下のサンプル切り上げには対応していないようです。
また、StudioOneもABILITYも、1サンプル余分に書き出す機能はないようです。
まとめ
- DAWによりWaveデータの末端処理に違いが存在する
- Cubaseは特定の条件が揃うとWaveデータの長さを1tick短く認識してしまう
- 小数点以下のサンプルの切り上げと、ACIDテンポ情報の付加により、Cubaseと互換をとることができる