domino/不具合報告/315

Last-modified: 2023-05-28 (日) 16:27:48

テンポイベントのズレ

  • ページ: domino/不具合報告
  • 投稿者: HRK.EXEX?
  • 優先順位: -
  • 状態: 仕様
  • 投稿日: 2022-06-25 (土) 12:14:15

メッセージ

v1.45 dev001において、中途半端なテンポを指定するとSMF出力時に店舗イベントの値が1下がる超細かいバグを見つけたので報告させていただきます。例として、テンポ119.999760の曲を出力するときに、このテンポが近似値である120に置き換わるイメージです。MIDIイベントの仕様上、高いテンポほど変化が起きやすいので、機会があればご検討ください。


  • おそらくSMFファイルの仕様ではなかろうかと思います。もともとSMFとしては小数は扱えませんので、その誤差は必ず出ます(たしか四分音符の長さをマイクロ秒の整数で表現したものだったと思います)。※floatによる計算なのでdoubleでやればもう少し精度は上がるかもしれません。もしそこまで求められるでしたらトライはしてみますが・・・ -- たかぼー? 2022-06-27 (月) 18:11:31
  • たかぼーさんがおっしゃっていることは正しいのですが、このバグの問題点はfloatで確保されている有効桁数(7桁)であっても、想定以上の誤差が発生するということです。極端な例ですが、テンポが1962に一番近いMIDIファイルを読み込んで、そのまま出力するときは、6千万30581で割った 1962.00255... という値がテンポイベントに格納されるはずです。ここで、何らかのバグで割る数が1引かれてしまう(30580になる)ことで、1962.06671... という値が格納されてしまうことになります。現地点でv1.44ではこのバグは起こりません。 -- HRK.EXEX? 2022-06-27 (月) 23:09:40
  • すみません、Ver.1.44とVer.1.45 dev001で何らかの値に差が出ている事を手元で確認させていただきたいのですが、検証されている「テンポが1962に一番近いMIDIファイル」を添付していただいてもよろしいでしょうか?(そのファイルを各バージョンで読み込み、テンポイベントの値に相違が見られるかを確認すれば宜しいですよね?) -- たかぼー? 2022-06-28 (火) 15:04:31
  • 添付の仕方が分からないのですが、これでいいですか?ファイルサイズは大きめです。問題のシーンは41小節目、199小節目です。>https://mega.nz/file/NShl3CDJ -- HRK.EXEX? 2022-06-29 (水) 00:58:47
  • https://mega.nz/file/NShl3CDJ#v-tOfUdKx9ftkRnxCIS9DkVIGqqsFJXBz7WMrNzN14c 上のURLは正しく機能しないので、こちらのものをコピーしてください。 -- 2022-06-29 (水) 01:00:01
  • midファイルのご提供ありがとうございました。同じPCにて、Ver.1.44とVer.1.45 dev001でそれぞれ読み込んで見ました。結果としてテンポイベントに関してはどちらも同じ値が読み込まれました。
    tkb_diff.png
    HRK.EXEXさんの環境ではVer.1.44とVer.1.45 dev001とで違う結果になるのでしょうか?別のCPUだと小数の計算結果が異なることもあるらしいのですが、同じPCであればDominoのバージョンに影響は受けずテンポの値は変わらない想定です(Ver.1.44とVer.1.45 dev001間で関連する部分のソースやコンパイラのオプション等の変更が無いため)。 -- たかぼー? 2022-06-29 (水) 13:29:34
  • 私が提供したMIDIファイルの読み込みに関しては、たかぼーさんのスクリーンショットの結果通りになりますので、その状態でSMF出力を各バージョンで実行して、SMF出力したMIDIファイルを再度読み込むと、違う結果になるはずです。このバグはSMF出力時に発生するものなので、お手数ですが上記の操作を実行していただきますようお願い申し上げます。(添付する前に操作の確認をさせていただいたのに、こちら側で指摘できず申し訳ありません。) -- HRK.EXEX? 2022-06-29 (水) 23:23:59
  • 各バージョンで同midファイルを読み込み、SMF書き出ししてみましたが、Ver.1.44とVer.1.45 dev001とで違いは発生しませんでした(midファイルのバイナリ比較でも差分はありませんでした)。
    tkb_diff2.png
    ※テンポの値が変わる症状は出てはいますが、こちらは想定通りで、バージョン依存は出ていない認識です。 -- たかぼー? 2022-06-30 (木) 09:14:00
  • いろいろ調査をしていたら、この不具合が発生するものそうでないものの違いを掴めました。ドミノ特有の機能で、テンポイベントに基準となる音符(以降は Gate と呼びます)を指定することで、それを4分音符と見立ててテンポイベントを設定するオプション(?)があるかと思います。そちらを使用してSMF出力したときは不具合は起こりませんでした。ですが、提供したファイルのように、元々高いテンポを指定しているかつ、Gateを指定していない場合、不具合が起こることが判明しました。今回は、この不具合をGateがあるときの動作と同じものにしてほしいと思い、報告させていただいた次第です。動作確認用のdmsファイルも添付させていただきます。https://mega.nz/file/NGAECDDB#Ys0Bun9LjdTMZqHtxSpzznej-9Ubs45ttI3A6kCpB4g -- HRK.EXEX? 2022-07-04 (月) 19:39:15
  • 私の認識では今回の要因はmidファイルとdominoが扱うテンポイベントで、扱える数字の範囲や精度に差があるため、mid→dmsやdms→midとしたときにテンポの値の精度が落ちるというものです(マイクロ秒での4分音符の長さ↔floatでのテンポ値として変換が走るため)。値が劣化するという意味では少しシーケンサ側の設計ミス感はありますが、根本的な問題とも言えますので放置とさせてください。dmsで作曲し、必要に応じてmidへ出力するという感じで運用してもらえれば誤差が広がりつづけることは無いと思います。 -- たかぼー? 2022-07-05 (火) 08:53:13
  • わかりました。バグ検証のためにわざわざ時間を割いて付き合っていただき、ありがとうございました! -- HRK.EXEX? 2022-07-05 (火) 19:38:28