続 Flutterで書いたメトロノームの精度を高める
ハトナミ。
th.hatenablog.jp前回に引き続きやっていきます。
とりあえず、音が鳴る瞬間のDateTimeを観測しました。
I/flutter (24608): 2021-01-17 10:03:23.019920
I/flutter (24608): 2021-01-17 10:03:23.523110 + 503190
I/flutter (24608): 2021-01-17 10:03:24.025354 + 502244
I/flutter (24608): 2021-01-17 10:03:24.527632 + 502278
I/flutter (24608): 2021-01-17 10:03:25.030974 + 503342
I/flutter (24608): 2021-01-17 10:03:25.533099 + 502125
I/flutter (24608): 2021-01-17 10:03:26.037653 + 504554
右のプラスは手計算した差分です。
BPMは120に設定しているので、ここが500000からズレている分だけ想定値とズレています。
やはり安定しておらず、常に遅れている状態なようです。
遅れ具合もまばらです。これを均していきましょう。
色々なマサカリがきているのですが、今回は1つ試した結果を書きます。
while(true)をやめる
こんなマサカリがありました。
https://twitter.com/sirrow/status/1348493240538787842?s=20
htt
://twitter.com/sirrow/status/1348493240
音を鳴らすところを await してるように見えるんだけど、こんな難しいことしないで、単純に javascript の setInterval とか使うインターバルタイマか、あるいはそれを薄くラップしただけの flutter のインタフェース叩けばいいのでは
オッケイ!やってみましょう。
dartはjsの代替を目指して設計されたらしいので、jsのアレコレに対して互換性があるとは思うのですが
Flutterでモバイル開発をしてる限りではjsの存在を感じる事が殆ど無く
どのような関係になってるか具体的なイメージが湧いていません。勉強しないとですね
インターバルタイマについて考えましょう。
繰り返し処理させる君はdartにおいてはTimerでやるっぽいので、とりあえず試してみます。
/// Timerで繰り返し処理する用の音源再生くん void _beat(Soundpool pool, int soundId, Timer t) { print(DateTime.now().difference(check).inMicroseconds); // 計測用 check = DateTime.now(); // 計測のために関数外で定義したDateTime if(!_run) {t.cancel();} pool.play(soundId); }
(差分を手計算するのが面倒だったので、計算してから出力するようにしました。)
とりあえずこんな感じの関数を生やして
var duration = Duration(microseconds: (60000000 ~/ _tempo)); // _tempo = 120; Timer.periodic(duration, (Timer t) => _beat(beatPool, beat, t));
こう書くだけで、Duration毎に音を鳴らして、前回実行時との間隔を出力してくれます。
超簡単。これ使えばwhile使ってごちゃごちゃ書いてたのがスッキリしそうですね。
動かしてみた結果、printの出力と録音した波形はこんな感じでした。
I/flutter (25379): 499513
I/flutter (25379): 500720
I/flutter (25379): 499491
I/flutter (25379): 498867
I/flutter (25379): 500159
I/flutter (25379): 500759
I/flutter (25379): 499186
げ、劇的に改善してる……。マジか。
という訳で、whileループをやめてTimerの繰り返し処理で動くよう修正しました。
github.comコミット8f7bf782bc74401559bc267c47745e2363e473c2でガーッと修正しています。
単純なループ処理は簡単だったのですが、ループ→転換処理→ループ……をうまく書けず
TimerがTimerを起動して無限にぐるぐる回る感じの実装をしました。
とっ散らかり感が凄いです。
とりあえずこれでも動いてはいますが、もっと良い書き方が絶対ありそう。
波形はこんな感じになりました。
前のよりはかなり良い……けど、やっぱり基準に対して微妙に前後していますね。
今まで起きていただんだん遅くなっていく = そもそもテンポがズレている。という問題は解消したのですが
音源再生のタイミングが微妙に前後してるのが直ってません。
人間が聞いて違和感があるぐらいにはズレてるので、まだまだ使用感は微妙です。
もう少し何とかしたいので、頂いたマサカリをもとに何が出来るか考えてみます。
そりでは
5
これは38787842?s=20