TonamiLog

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

だんだん早くなるメトロノームをFlutterで書いた

トナミです。夏休みの話をしてから3ヶ月ぐらい経ちましたね。

今日は冬の話をします。

 

 

文脈

f:id:Thiroyuki:20210111130016j:plain

11月の半ばにギターを買いました。

本当はテレキャスターが欲しかったけど、某サイトを見てたら中古で安く出ていたので

www.soundhouse.co.jpオタクギターです。紗夜さんとおそろ。

https://bang-dream.bushimo.jp/wordpress/wp-content/themes/bang-dream_gbp/assets/images/common/character/roselia/s2/img_hikawa-sayo_1.png

友達が今井リサモデルのベースを持っているので早く撮影会をしたいです。

 

んでギター買ったんですけど弾けないので頑張って練習しています。

 

だんだん早くなるメトロノームをFlutterで書いた

自分はもともとベースをやっていたので、その時と同じような練習をしています。

基本的にどのフレーズも規定速度よりかなり遅いテンポで練習し始めて

だんだん早く弾けるようにしていく……というのを繰り返しています。

なので、メトロノーム設定してギター弾いて、メトロノーム弄ってギター弾いて、メトロノーム弄って……を繰り返しています。

で、メトロノームが勝手に早くなってったら面白いかもと思ったので作りました。

スタジオで使う事を考えてスマホアプリにしたかったので、Flutterで実装しました。

github.com出来たものがこれです。

画面も1枚しかないし、機能もごく簡単なのでモノリシックです。オブジェクトもクソもありません。

 

メトロノーム部分だけ抜き出すと

while(_run) {
  waitTime  = 60000 ~/ _tempo;
  beatPool.play(beat);
  setState(() => _remainBeat = _remainBeat - 1);
  await Future.delayed(Duration(milliseconds: waitTime));
  if (_tempo < _maxTempo && _remainBeat == 0) {
    await finishPool.play(finish);
    setState(() {
      _tempo = _tempo + _stepSize;
      _remainBeat = calcBeatPerLoop();
    });
    // その時のテンポに合わせてインターバルを設定しないと違和感が出る
    await Future.delayed(Duration(milliseconds: 60000 * 4 ~/ _tempo));
    // 入の4カウント
    waitTime  = 60000 ~/ _tempo;
    for(int i = 0; i < 4; i++) {
      await clickPool.play(click);
      await Future.delayed(Duration(milliseconds: waitTime));
    }
  }
}

という感じの実装になっています。

音を出すやつはsoundpool | Flutter Packageを使っています。

こいつを非同期で動かして基本的に無限ループさせ、外部からsetStateで_runをfalseにすると止まる。というだけです。手抜き感

これ微妙に安定していなくて、音源のロード?の時間のせいなのか細かくテンポが前後する気がしています。

手元に高精度のメトロノームが無いのでテンポに関する検証が面倒くさいです。

個人的には別に良いかと思える範疇なのですが、どなたか改善案あったらマサカリ下さい……。

 

あ、今書いてて気づいたけどpool.playにawaitついてるのは凡ミスな気がしています。

 

書いてみて

3連休初日に環境設定だけして、2日目でFlutter公式サンプルアプリ(?)から上記リポジトリまで実装しました。3日目の昼にこのブログを書いています。

1日で作ったにしては良い感じという事でそれなりに満足しています。

Flutterは状態管理が難しいようで、複雑なアプリに耐えれるかは良く分かりませんが

単機能なアプリを作るのはめちゃくちゃ簡単で良いですね。

今日はこのアプリを使って練習してみて、以降のブラッシュアップに繋げたいと思います。ドッグフード美味しいと良いですね。

 

 

f:id:Thiroyuki:20210111133201p:plain

実装中、機能が増える度に完成したつってTwitterに投稿してたんですが

細かく披露する事でモチベーションが保てたので良かったです。

どうせ誰も見ないので気軽に披露していきたいですね。

ちなみに1日で9回完成しました。良かったですね

夏休みの自由工作: 物理編

ハロートナミです。お久しぶりです。

 

Googleフォトの貼り付け機能が使えなかったのでやる気が消えていたのですが、この度晴れて復活したようなのでブログを書いています。

今更夏休みの自由工作についてです。もう2ヶ月ぐらい前の話ですね。

それではやっていきましょう。

 

続きを読む

夏休み自由工作:通販したら着弾日がTimeTreeに登録されるやつ③

ハロートナミです。

自分の作業と平行してブログを書いているので更新頻度が高いです。

さて、引き続き
Amazonから届く確認メールをあれこれして、TimeTreeに着弾時間を登録するやつ
を作っていきます。
これは続きなので、前のやつを読みたい方はこれこれを読んで下さい。

前回の記事でAmazonからの発送通知メールそれがしする処理を書き
TimeTreeの予定投稿APIを使って予定登録するところまでやりました。
なので、残りのやることが

  • Lambdaに乗せる
  • 動かしてみる

という感じになっていました。もう少しで終わりですね。それではやっていきましょう。

続きを読む

夏休み自由工作:通販したら着弾日がTimeTreeに登録されるやつ②


ハロートナミです。引き続き

Amazonから届く確認メールをあれこれして、TimeTreeに着弾時間を登録するやつ

を作っていきます。
これは続きなので、前のやつを読みたい方はこれを読んで下さい。


前回の記事でTimeTreeにAPIを投げて予定を登録する処理を確認したので、残りのやることが

  • Amazonからの発送通知メールをいい感じに取ってくる実装
  • Lambdaに乗せる
  • 動かしてみる

という感じになっていました。それではやっていきましょう。

続きを読む