TonamiLog

ゆるキャン△とスノーボードとオタク

続 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

https://twitter.com/sirrow/status/1348493240

 オッケイ!やってみましょう。

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

 

f:id:Thiroyuki:20210117211317p:plain

げ、劇的に改善してる……。マジか。

 

という訳で、whileループをやめてTimerの繰り返し処理で動くよう修正しました。

github.comコミット8f7bf782bc74401559bc267c47745e2363e473c2でガーッと修正しています。

単純なループ処理は簡単だったのですが、ループ→転換処理→ループ……をうまく書けず

TimerがTimerを起動して無限にぐるぐる回る感じの実装をしました。

とっ散らかり感が凄いです。

とりあえずこれでも動いてはいますが、もっと良い書き方が絶対ありそう。

 

波形はこんな感じになりました。

f:id:Thiroyuki:20210118193526p:plain

前のよりはかなり良い……けど、やっぱり基準に対して微妙に前後していますね。

今まで起きていただんだん遅くなっていく = そもそもテンポがズレている。という問題は解消したのですが

音源再生のタイミングが微妙に前後してるのが直ってません。

人間が聞いて違和感があるぐらいにはズレてるので、まだまだ使用感は微妙です。

もう少し何とかしたいので、頂いたマサカリをもとに何が出来るか考えてみます。

そりでは

5

これは38787842?s=20