年末年始休みでメトロノーム作った

年末年始なので、ふだんなかなかまとまった時間が取れずできないことをやろうと思い、メトロノームアプリケーションを作った。

世の中にはメトロノームアプリは掃いて捨てるほどあるのだけれど、十六分音符や三連符、あるいは六連符でクリックをならせて、しかも任意の場所にアクセントをおける(ポポピポ ポポピポ、だとか、ポポピ ポポピだとか、ポッポピッポ ポッポピッポだとか)メトロノームアプリが見当たらなかった。

こういうことをやりたい場合はメトロノームではなくてリズムマシンアプリとかそういうやつを使わないといけなくて、で、リズムマシンだとこんどは無機質なクリックの音がなかったりする。

こういうメトロノームをバンドのリハでつかいたいんだけどな〜、というのが長年の課題で、なければ作ればいいというわけで作ってみた。

https://groove-partner.netlify.app/

Angular製。技術的に尖ったことはなにもしてないけど、自分にとって新しいことはいくつかあって

  • GithubActionsに触れた
    • 普通のCIという感じだった
    • GITHUB_TOKENがなにもしなくてもセットされててらくちん
    • stepの定義の際、runだけじゃなくてusesが使えるのがなかなか面白い
    • actionをコミュニティがどんどん公開できるあたりもGithubっぽいくておもしろい
  • こういう小さいアプリならば、ディレクトリ構成は凝らずにpresentationdomain(このdomainというのはDDDの文脈でいうドメインレイヤーではなくて、PDSの文脈で言うところのdomainである)で十分ではないかという仮説をたててそうしてみた
    • 結果として成功だったと思う、これくらいのサイズのアプリケーションに対して、無駄に複雑なレイヤーを作る必要はない。十分に見通しがいいし、開発もしやすかった。
  • 同様の理由で、ngrxも利用していない
    • ぶっちゃけ、状態に対するCommandとQueryを意識して、なおかつデータフローを単方向にできる人間だけで開発するぶんにはngrxは必要ないと思っている。が、人間はミスするものだし、そもそも人間が頑張って制約を守るよりも仕組みで制約をつけてしまったほうがいいので、問題のサイズが大きい場合や、チーム開発をする場合にはあったほうがいいという立場です。
  • WebAudioAPIを利用していて、なおかつ音声ファイルを読み込むのではなくて、自分で矩形波を書き込んでいる
    • 矩形波なんて誰にでも作れるんだけど、ファイル読み込みしないぶんシュッと立ち上がるのが気に入っている。スタジオって電波わるかったりするしね
  • 以前ドラムシーケンサーを作ったとき、その目的がDDD-like レイヤードアーキテクチャ(これは一般的な語彙ではない。詳しくは GitHub - Shinpeim/NekogataDrumSequencer を参照のこと)の解説がメインだったため、なるべく他の要素を減らそうとRxJSを利用せずに書いたのだけれど、今回はべつになんの解説のためでもなくて単に自分が欲しいものを作るだけなのでRxJSを普通に利用している(Angularだしね)。RxJSはぜったいあったほうが便利だよね。

妥協してしまった点として

  • UI
    • UIなんもわからん
  • スリープすると音が消える
    • これスマートフォンで再生するばあい致命的なんだけど、まあスタジオにいるときはスマートフォンを給電できるし、スタジオにいる間だけ自動スリープoffにすりゃええやろ、と思ってそのままにしてある。
  • マナーモードだと音が鳴らん
    • これどうすればいいんかな? WebAudioの限界?

以上です。労働ではあまり開発をしなくなってしまったので、久々に開発ができてよかった。

自分で使うために作ったのもなので、リハスタで実際に使ってみながら地味に改善を続けて行けたらいいなと思っている。