LoginSignup
12

More than 5 years have passed since last update.

あけましてElmでドラムマシンを作りました。ズンドコドコドコズンドコドコドコ

Last updated at Posted at 2018-01-01

screen.png

あけましておめでとうございます。昨年末のアドベントカレンダーでは、Elmがずいぶん健闘を見せましたよね。私もさくらちゃんもぐもぐ会にちょっと顔を出したりして、Elmの盛り上がりを少しづつ感じてきました。冬休みの課題としてElmで何か小さな練習作を作ろうと思い、お題をいろいろ考えたんですが、今回はシンプルなドラムマシンにしました。楽譜のようなものを入力するとスンドコドコドコって音が鳴るやつです。デモとリポジトリはこちらです。

アプリケーションの名前は音楽用語から持ってきて、Capriccioとつけました。使い方としては、楽器ごとにトラックが用意されているので、音を鳴らしたいところをテキトーにクリックするだけです。あとはPlayを押せばズンドコズンドコ音が鳴り始めます。動作はWindows版のChrome、Firefox、Edgeだけで確認しましたが、動かなかったらごめんなさい。

Elmを使ってみた感想など

わりと簡単でした

それで、今回Elmを使ってみた感想なんですが、思った以上にさくさくと使えたという印象です。もちろん言語が違えば構文もAPIも違うので、それゆえ戸惑う部分はありましたが、言語自体はとてもシンプルなので、大きく迷うところは少なかったです。どちらかというと、Web Audioの扱いのほうでバグが取れなくて苦労しました。Web Audioで正確にリズムを刻むには、ちょっと面倒くさいコーディングが必要になるのです。オーディオ系のプログラミングはリアルタイムな要素も多いので、デバッグも結構つらかったです。

また、port/sbscriptionとかCmd/SubとかTaskとかElm独特の概念はいろいろ出てはきますが、ろくにドキュメントも読まずにサンプルを見ながらの「たぶんこう使うんだろうなー」的なテキトーなコーディングをしただけで普通に動きました。これもElmが純粋で厳格な静的型付けの言語であるお陰ですね。このアプリケーションでは数十ミリ秒ごとに画面全体をごりごり書き換えてアニメーションを行ってますが、パフォーマンス面でも特に問題はなかったです。

elm-packageelm-formatとか、create-elm-appとかの周辺ツールも充実しているのが嬉しいですね。カンマを行頭に持ってくるあの変なスタイルは、最初は違和感が強いですが、慣れれば慣れます。

初心者にはお勧め、経験者にはちょっと物足りないかも

ツイッターで私もよく言っているんですが、Elmはとても入門しやすい言語だと思います。純粋関数型言語の一族にまだ触っていない人には、Elmは最初の関数型言語として特にお勧めです。私としてはどうしてもPureScriptと比べちゃうところがあって、Elmでは型クラスがないので物足りなさはつきまといますし、portやsubscriptionの扱いが面倒くさい感じはあります。モナドに慣れちゃうと、portよりモナドで作用を扱ったほうがずっと楽だったりします。でもPureScriptのあのエグいAPIを純粋関数型の初心者にお勧めできるかというと、ちょっと厳しいと思うので、Elmはそのあたりの落とし所として妥当なポジションにあるのかなーと思いました。

また、elm-packageelm-formatのような周辺のツールが成熟している点においては、PureScriptよりも優れているでしょう。コミュニティもずっと大きくて安定しています。個人的な好みではPureScriptの未来に期待したいんですが、全体のバランスを考えれば、現時点ではElmのほうが堅実な選択だと思います。

次に作りたいもの

次はElmでゲームか何かでも作ってみたいとは思いますが、気になるのはElmでCanvas APIWebGLがどこまでまともに使えるかですね。elm-graphicselm-canvasも調べていますが、experimentalだよーとかSVGを使ったほうがいいよとか書いてあって、どれを使うのがベストなのかまだちょっとわかりません。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12