だんだん早くなるメトロノームをFlutterで書いた
トナミです。夏休みの話をしてから3ヶ月ぐらい経ちましたね。
今日は冬の話をします。
文脈
11月の半ばにギターを買いました。
本当はテレキャスターが欲しかったけど、某サイトを見てたら中古で安く出ていたので
www.soundhouse.co.jpオタクギターです。紗夜さんとおそろ。
友達が今井リサモデルのベースを持っているので早く撮影会をしたいです。
んでギター買ったんですけど弾けないので頑張って練習しています。
だんだん早くなるメトロノームを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は状態管理が難しいようで、複雑なアプリに耐えれるかは良く分かりませんが
単機能なアプリを作るのはめちゃくちゃ簡単で良いですね。
今日はこのアプリを使って練習してみて、以降のブラッシュアップに繋げたいと思います。ドッグフード美味しいと良いですね。
実装中、機能が増える度に完成したつってTwitterに投稿してたんですが
細かく披露する事でモチベーションが保てたので良かったです。
どうせ誰も見ないので気軽に披露していきたいですね。
ちなみに1日で9回完成しました。良かったですね