ここまでのあらまし
前回、Elixir~Enum.zipでドラムシーケンサー!~
でドラムパターンを作ったが、今度はStream関数をシンセサイザーになぞらえることになりました。
式と解説
1..100 |> Stream.map (& (&1 * 2)) |> Enum.filter(& &1 >= 10 and &1 < 100)
1..100は1から100のリストの短縮系です。これにパイプライン演算子でStream関数をかけています。
Stream.mapで1から100のマップの数字すべてに2をかけているようです。
そしてEnum.filterで、10以上、100未満の結果を出力する。
シンセサイザーになぞらえてみよう
シンセサイザーというのは、もともとの波形をオシレーターで出力し、それにフィルターをかけ、LFOで各種周期をかけて音を揺らして音色を生成します。
1..100は純然たるオシレーターでしょう。サイン波かスクエア波かノコギリ波かでいえば、さしあたり一番シンプルなサイン波でしょうか。
Stream.mapで2をかけているところは音色の立ち上がり、減衰などを司るADSRというセクションに酷似しています。気になる方は"シンセ ADSR"でググってみてください。
そして、Enum.filterは文字通りフィルター。シンセサイザーではカットする周波数帯にピークをつけるレゾナンス機能とあわせてローパスフィルターでオシレーターの波形を加工するのが一般的です。
現時点ではめちゃくちゃわかりにくいかもしれませんが、Elixirでシンセサイザーをつくる、というのがわたしの中長期的なミッションです。
うまずたゆまず、頑張ります。
Kento Mizuno