Lazuli

らずり

Sonic Pi を使って Ruby で音を楽しむ

Ruby Advent Calendar 2018 の12日目の投稿です。

Sonic Pi とは?

Sonic Pi は音楽を Ruby でライブコーディングできる IDE です。現時点での最新版は v3.0.1 です。
内部的には Super Collider という音響合成環境の Ruby ラッパーとなっています。

と、突然音楽用ライブコーディング IDE と言われても聞き慣れないものなのでイメージしにくいかもしれません。
どんなことが出来るのか、作者である Sam Aaronさんが実際にパフォーマンスをしている様子を YouTube に投稿しているので置いておきます。

www.youtube.com

めちゃくちゃかっこいいですよね!!そして頭がおかしい!

今回は、そんなSonic Pi の使い方を簡単に説明していきます。
音楽用語がいくつか載っていますが、今回それらについては説明しません。あしからず。

音を鳴らす

IDE の画面は以下の感じです。

f:id:app2641:20181211221110p:plain
Sonic Pi 画面

左側でコーディングして、右側に波形やログが表示されます。
メニューバーの Run ボタンを押してコードを再生するといった具合です。

まず、音を鳴らすには play メソッドを使います。
引数に鳴らしたい音名を渡します。

play :c

chord メソッドを使ってコードを鳴らすことも出来ます。

play chord(:c, :major)

play メソッドには音量を指定できる amp やパンニングを指定できる pan といったオプションもあります。

play :c, amp: 0.6, pan: -1
sleep 0.25
play :e, amp: 0.8, pan: 0
sleep 0.25
play :g, amp: 1, pan: 1

実行すると左スピーカーから右スピーカーへ徐々に音量を上げてアルペジオが流れます。
sleep は休符です。play は複数書いたとき同時に音を鳴らすようになっています。
ずらして音を鳴らすためには sleep でタイミングを変える必要があります。 sleep: 1 で 1 拍休みです。

ループで音を鳴らすには、鳴らす内容を live_loop にブロックで渡せば良いです。

live_loop :sample do
  chrod(:f, :M)
  sleep 1
  chrod(:d, :m7)
  sleep 1
  chrod(:g, :M)
  sleep 1
  chrod(:c :M)
  sleep 1
end

エフェクトを使う

音に味わいを出すために様々なエフェクトが使えます。リバーブやエコー、ディストーションを掛けられます。
エフェクトを使うには with_fx ブロックを使います。

# リバーブ
with_fx :reverb do
  play chord(:c, :major)
end

# エコー
with_fx :echo do
  play chrod(:c, :major)
end

with_fx には minroom といったオプションもあり、エフェクトのかかり具合が変更できます。
このあたりは実際に調整しながら遊んでみたほうが理解しやすいと思います。

with_fx :reverb, room: 1 do
  sample :loop_amen_full
end

with_fx :echo, mix: 0.3, phase: 0.25 do
  sample :loop_amen_full
end

Ruby の構文を使う

Sonic Pi は冒頭で述べたように Super Collider の Ruby ラッパーなわけですから、Ruby の構文ももちろん使えます。

10.times do
 play :c
 sleep 1
end

とか

notes = %w(c d e f g a b c5)

notes.each do |note|
  play note
  sleep 0.25
end

といったようなこともできます。

ちなみに、

class A
  def initialize
    play :c
  end
end

A.new

loop do
  `say "東京は夜の七時"`
  sleep 1
end

といったコードはエラーになってしまって実行できませんでした。ざんねんー
say をいい感じに使えたら面白くなりそうなのにな。

まとめ

基本的な使い方、なんとなくイメージできたでしょうか。
Sonic Pi で出来ることをなんとなくでも理解してもらえたら幸いです。
ドキュメントを見てもらうと分かりますが、Sonic Pi が秘めている能力はこんなものではないです。
かなり細かくチューニングできる仕様になっています。
気になった人は一度覗いてみると、さらに面白みが分かると思います。
Sonic Pi を使って Minecraft をやるとかいう謎の機能もあった気がする。

Ruby でコーディングして音を鳴らすのたのしいです 🍰

最近の読んだ本。読み中も含む。

絵で見てわかるシステムパフォーマンスの仕組み

絵で見てわかるシステムパフォーマンスの仕組み

パフォーマンス周りを学んでいく期間に入って買った。
システムパフォーマンス分析とチューニングを頑張りましょう本。
タイトル通り絵を交えて説明してあって分かりやすかった。何度か読み直してる。


Webフロントエンド ハイパフォーマンス チューニング

Webフロントエンド ハイパフォーマンス チューニング

フロントエンドのパフォーマンス改善本。
ブラウザレンダリングの仕組みとか、Chrome Devtool を使った分析方法やらフロントエンドに特化した内容になってる。
もともと俺がフロントエンドのパフォーマンス周りを何も知らなかったからってもあるけど、改善要点が細かく書かれてあってためになった。


超速!  Webページ速度改善ガイド ── 使いやすさは「速さ」から始まる (WEB+DB PRESS plus)

超速! Webページ速度改善ガイド ── 使いやすさは「速さ」から始まる (WEB+DB PRESS plus)

同じくフロントパフォーマンス関連。
ほぼ Web フロントエンドハイパフォーマンスチューニングと内容は同じ。
こっちのほうがキャプチャ画像が多め。あと画像最適化の話はこっちにしか載ってなかった。
良い本なのに表紙がださいのがもったいない。


ヘルシープログラマ ―プログラミングを楽しく続けるための健康Hack

ヘルシープログラマ ―プログラミングを楽しく続けるための健康Hack

まあなんか健康に過ごしたほうがいいかと買った。
自身の身体をシステムと捉えて、パフォーマンス計測してリファクタリングしてイテレーション回していこうというアジャイルダイエット本。
それなりに実践した。効果は悪くないと思う。
自身の健康をプログラミングと同じアプローチで改善していこうというのはおもしろい。


詳解 システム・パフォーマンス

詳解 システム・パフォーマンス

硬派なシステムパフォーマンス本。700ページくらいあるし、内容が濃すぎてわけわからん単語を調べながら読むとまったく進まない。
すぐ読み切れるとは思ってなかったらちまちまと読んでいく。
今年中に読み終えられれば良いなあくらいの心意気。

最近の読み物。

君主論 (講談社学術文庫)

君主論 (講談社学術文庫)

なんとなく読んだ。長く続く君主制とはどんなものかみたいな内容。君主になるといっても民族や身分からして様々なコンテキストがあって、パターン別にどういった政治を行うのが効率的か細かく書かれている。おもしろいんだけど、いかんせん翻訳が読みづらくてつらい。これ、その、あれ、それらといった指し方をする回りくどい文章がうざい程に多用されている。多用されすぎていて、何を指してるのかまじで分からん。


はじめよう!  要件定義 ~ビギナーからベテランまで

はじめよう! 要件定義 ~ビギナーからベテランまで

要件定義の必要に迫られて、ちゃんと知ろうと買った。君主論と打って変わってなんて読みやすい文章でしょうかね。


「原因と結果」の経済学―――データから真実を見抜く思考法

「原因と結果」の経済学―――データから真実を見抜く思考法

因果推論の入門的な本。介入群と対照群を比較する様々な手法が説明されている。例題も小難しくなく良かった。

というツイートを見て買った。


アジャイルレトロスペクティブズ 強いチームを育てる「ふりかえり」の手引き

アジャイルレトロスペクティブズ 強いチームを育てる「ふりかえり」の手引き

所属チームのイテレーション振り返りの改善に。なぜ振り返りが必要か、どういった振り返りがプロジェクトを成功に導くのかが書かれている。
先日ファシリテーターをやるときがあって、これを参考にやったら結構うまく回せたから読んでおいて良かった。


Team Geek ―Googleのギークたちはいかにしてチームを作るのか

Team Geek ―Googleのギークたちはいかにしてチームを作るのか

読んでなかったから読んでおくか、という感じで。評判と変わらない内容ですばらしい。


メモランダム

メモランダム


エッセイ。だれかのブログでお薦めされていた気がする。どこかは忘れた。まさしくエッセイという本。
ただまあフェミの匂いが結構強くてちょっと途中からうんざりしてしまった。


日本語ということば (Little Selectionsあなたのための小さな物語)

日本語ということば (Little Selectionsあなたのための小さな物語)

日本語にまつわるコラムの寄せ集め。いまはなき Mellow My Mind というはてなダイアリーで昔紹介されてるのを読んでからずっと気になっていた。最後の「甘えるということについて」がそれ。
感想は、ここ数年読んだ文章の中で一番心に来る文章だった。感動とか悲しいとかそんなチャラいもんじゃないんだけど、俺には語彙力もそれを表現できる文章力もない。レビュー読んだりしてくれ。気になったら買うとよい。


女子中学生の小さな大発見 (新潮文庫)

女子中学生の小さな大発見 (新潮文庫)

小学生たちの愉快な自由研究がたくさん載っているという触れ込みで購入。なるほどーと読んでいたけど、中盤に差し掛かるところで飽きた。


間取りの手帖remix (ちくま文庫)

間取りの手帖remix (ちくま文庫)

摩訶不思議な間取りが淡々と紹介されてる本。結構面白い。
最後の方に著者と間取り好きな人が対談してくコーナーがあって、そこにくるり岸田繁が出ていて驚いた。著者も岸田氏(以外も含めて)もよくわからん発言を自信ありありでしていて、俺からすればお互いに一方通行の意思疎通できてない会話のように見えるんだけど、何か通じ合ってるのかちゃんと終わりに向かって収束していく会話で謎だった。


aku-you.booth.pm

インターネットもぐもぐさんという方がやってる同人サークル?かな。中心人物っぽいけど組織構造は知らない。
いくつか買って読んだ。みんなぶっ飛んでいて、そんな金遣いでよく生活出来るなと感心する。内容はもちろん面白い。

Modern development with Google Apps Script

Google Apps Script(以下、gas)で今っぽいモダン環境で開発出来たから書いておく。

背景

以前、会社の業務時間を管理する Slack ボットを作った(ネタ元は宮本さん)。日報が Google Drive で管理されていることもあって gas で作られている。

作って運用してみたら社内で結構好評で徐々に利用者が増えていった。
そうなるとトラブルがあったときに対応出来るような作りにしておきたい。ただ、雑なパクリだったから謎構成になってしまったし、QUnit という一昔前のテスティングフレームワークを使っていたりで、何か手を入れるとしても触りたくない気持ちしかなかった。
gas のデメリットを解消しつつ良い感じに作り直せないかなーとやってみた。

モダンな JavaScript とは

以下の要件で書けるようにした。

  • ES2015 で書く
  • mocha でテストを回す
  • ESLint で構文チェックする
  • Yarn でパッケージ管理する
  • node-google-apps-script でデプロイ

ES2015 で書く

browserify でトランスパイル出来るようにした。とはいえ、gas は独自の JavaScript 仕様なため少し工夫をする必要がある。

export default が使えない

export default な構文を普通にトランスパイルしてもエラーで動かせない。
babel-plugin-transform-es3-member-expression-literalsbabel-plugin-transform-es3-property-literals というプラグインを追加する必要がある。
これがあればトランスパイルしてもエラーが出ずに実行出来る。

.babelrc

{
  "plugins": [
    "transform-es3-member-expression-literals",
    "transform-es3-property-literals"
  ]
}
gas のクラスが無い

当然ながらローカルに gas のクラスが無いから、トランスパイル時に参照出来なくてエラーになる。
これを解決するには gasify というプラグインが必要。便利。

便利関数が微妙に使えない

確認出来た限りだと find と引数展開は使用出来なかった(gas がエラーを吐く)。もしかしたら、これもプラグインで解決出来るのかもしらんが、調べる気にならなかった。
愚直に forEach を使ってやった。forEach は使えた。

mocha でテストを回す

テストで問題になるのも gas のクラス達。
ネットを彷徨うと様々な人がテストで困っている様子。
解決案は以下のようなものが見つかる。

  • テスト用の gas スクリプトを作って、gas 上で回す
  • Sinon.JS でモックする
  • gas-local というモックツールを使ってテストする
  • 自作モックを使う
テスト用の gas スクリプトを作って、gas 上で回す

CI サービスが使えないし諦め。

Sinon.JS でモックする

さすが簡単にモックは作れる。問題は、実在するクラスがないとモックを使用出来ないということだ。
UrlFetchApp をモックするには UrlFetchApp のクラスが用意されていないといけない。
モックを作って、テスト用のクラスも作ってとだるいので諦めた。

gas-local を使う

ES2015 では動かせなかった。諦め。
たぶん頑張れば使えるんだと思う。

自作モックを使う

gas-local のやり方見てたら自分でモック作ればいいじゃんねと気付いた。
やってみた。

// setup.js
import SpreadsheetApp from './mock/SpreadsheetApp';

global.SpreadsheetApp = SpreadsheetApp;
// SpreadSheetApp.js
import Spreadsheet from './Spreadsheet';

export default {
  openById() => (Spreadsheet),
};
// SpreadSheet.js
export default {
  // do something...
};

利用する gas の API を適当に定義すれば問題なくテストに使える。
少々めんどくさいが、うまく動くので良い。

ESLint で構文チェックする

Airbnb設定を利用した。
ちょっと厳しいところもあるので適当に緩めて。

ESLint を実行したときも勿論 gas のクラスは存在しないためエラーになる。
eslint-plugin-googleappsscriptプラグインとして読み込んでいれば良しなにしてくれる。

{
  "extends": "airbnb",
  "plugins": [
    "googleappsscript"
  ],
  "env": {
    "googleappsscript/googleappsscript": true
  },
  ....
}

ESLint は CI で回すのも便利だけど、git のフックを使うともっと良い。

# .git/hooks/pre-commit
#! /bin/sh
git diff --cached --name-only --diff-filter=AM | grep '\.js$' | xargs eslint

とやっておくだけで、コミット時に自動で ESLint が走って、エラーだとコミットが中断される。

Yarn でパッケージ管理する

npm と互換があるから使うのに何も困らなかった。

yarn add package_name
yarn add package_name --dev
yarn install

これだけ使えればだいたい事は足りる。
なにより yarn.lock でバージョンを固定出来るのが良い。npm shrinkwrap は嫌な思い出しかない。

node-google-apps-script でデプロイ

node-google-apps-scriptGoogle 製のデプロイツール(といっても API を使ってアップロードするだけだが)。

gapps upload

とやるだけでアップロードしてくれる。
設定は API キー作って認証情報登録してアップロード先を指定するだけ。詳しくは README とか見て。
アプリケーションの公開までやってくれると最高なんだが、そこは手動でやらねばならん。微妙に使いづらい。
それでも自分でアップロードするのと比べると断然ラクなんだけど。

最近読んだ本

読み中も含む。

暗号解読〈上〉 (新潮文庫)

暗号解読〈上〉 (新潮文庫)

サイモン・シンの本は面白いものが多い。これは暗号技術がどう発展していったか、古代ギリシャの初歩的な暗号からエニグマまでの歴史を逸話混じりに書かれている。ぐんぐん読めた。
下巻もあるそうだがまだ読んでいない。


ヒエログリフを書こう!

ヒエログリフを書こう!

暗号解読に感化されて、古代文字読み書き出来たら楽しそうという判断で買った。挿絵がかわいい。
かなり噛み砕いて書かれているから分かりやすいけど、分かりにくい。
古代文字とはそういうものだろう。


面白くて眠れなくなる元素

面白くて眠れなくなる元素

残念ながらそれほどだった。まあ眠くなる話だった。他の眠れなくなるシリーズも気になってるけどどうなんだろう?
化学話は俺には向いてないかもしれない。


インターネットルーティング入門 第3版 (ネットワーキング入門)

インターネットルーティング入門 第3版 (ネットワーキング入門)

読み中。雑な知識でインターネットしてるからちゃんと知ろうということで買った。
硬派な内容で、雰囲気で理解してた俺には難しいところもあるが、読めないことはない。


高速スケーラブル検索エンジン ElasticSearch Server (アスキー書籍)

高速スケーラブル検索エンジン ElasticSearch Server (アスキー書籍)

Elasticsearch を使う機会があったから買った。
本の内容は現行バージョンよりだいぶ古いけど基本的な API の使い方は変わらないので支障はなかった。参考になった。
これ読んだ後に本家ドキュメント読むと理解が違う。

という本を読んだ。
入浴施設の設計思想とか載ってるかなーと思ったけど期待した内容はほぼなかった。
ヨーロッパの入浴の歴史や、平安時代から続く温泉の歴史あたりは面白かった。

資料本ということで中盤以降はずっと様々な入浴施設の写真と設計図が紹介されている。
90年出版だったかな、27年前だしいくらかの施設は既になくなっているかもしれないが、残っている所もあるだろうし良さげな所へは行ってみたい。

本状況

10年戦えるデータ分析入門は読み終わった。分かりやすかったし面白かった。

くだんの本の最後で、統計学の初学として「マンガでわかる統計学」が良いぞと書いてあったから今はそれ買って読んでる。漫画か〜となりがちだけど文章より漫画のほうがサクサク読めるのは確かだし、先入観を持たずに読んでみようという感じで買った。
確かにちゃんと統計学の基礎を始めるという内容で出だしは良い。

あと、平民新聞で軽く紹介されてた「流星ひとつ」というのも買った。

「流星ひとつ」一杯目の火酒まで読んだ。引退して収入もなくなったら大変でしょ?と聞かれた藤圭子は軽く「別に」と答える。沢木「そうかな」藤「そうだよ。だって……確かに、いままで、贅沢はしてきたよ。だけど、それはそれ、そういうこともありました、そういう時代もありました、ていうだけのことだよ。やっぱり、あたしは、家でご飯と漬け物を食べるのがいちばん好きだし、親子丼とかカツ丼とか、御飯の上に何かがのっかっている簡単なものが好物だし、服だって、セーターとシャツとズボンがあれば、それでいいし……自信があるんだ、あたし」最後の、自信があるんだってところがいいな。この章のハイライトは、注文した酒がようやく届いて、「初めまして!」と乾杯しようとする藤圭子に対して沢木が「実は、あなたに会ったのは初めてじゃないんですよ」と打ち明ける場面だろう。ここからインタビュアーとインタビュイーが入れ替わるように、藤は沢木の語りに惹き込まれていく。全然おぼえてない、どこで?と不思議がる藤圭子に対し、「当然だけどね、わからなくて」と答える沢木は、五年前に、(後に深夜特急としてまとめられる事になる旅の最終地点)パリで出会った一人の少女の話をする。

こんな紹介。面白そうで買った。

それと、寿司を作ってみたくて寿司大全なるものも買った。はてブで話題になってたやつ。結構分厚い。
ひと通り読んでみて軽い気持ちで握れそうだったらやってみる。

そういえば本の消化活動してるしと amakan に登録してみたけど、流星や大全あたり載っていなくて残念だった。


マンガでわかる統計学

マンガでわかる統計学

流星ひとつ

流星ひとつ

すしの技術大全

すしの技術大全