stefafafan の fa は3つです

"すてにゃん" こと id:stefafafan のブログです

VSCode+Extemporeで音を鳴らしたいよね

こんにちは〜。こちらは、 はてなエンジニア Advent Calendar 2018 5日目の記事です。
qiita.com

昨日は id:yutailang0119 さんの モバイルアプリエンジニア向け、便利CLIツール作成のススメ でした。

音楽作りたい

突然ですが、音楽が作りたいと最近思い始めています。どうやって音楽を作るんでしょうねとググったらAudio Programming Languageというのを知りました。

ググる

なるほど、これ使えば僕も曲が作れそう

色々あるみたいだけど、今回はExtemporeっていう言語を触ってみようと思います。
extemporelang.github.io

オライリー公式で動画出てるけどなんかすごそうですね。リアルタイムで音を出せて便利そう
www.youtube.com

環境セットアップ

インストール方法についてはここに書いてある、英語しかなさそうだけど、自分でいじってビルドとかしない限り普通にバイナリ落とせば良さそう
extemporelang.github.io

エディタもいくつか対応しているが、ぱっと見VSCode推しのようだし、僕も最近VSCodeで仕事しているのでそれをいれるのが楽そうですね。

f:id:stefafafan:20181204204245p:plain
I see..

VSCodeのMarketplaceでExtemporeで調べるといいやつがでてくるのでそれを入れれば準備は完了。

f:id:stefafafan:20181204204526p:plain
Parinferも便利そう

サンプルプログラムを動かしてみる

  1. Extemporeを実行する
  2. サンプルプログラムを開く
  3. Extempore Connectで接続する
  4. 該当の行を実行したりする
  5. 音がなるので適当に数字をいじってみて遊ぶ

というのを以下の動画でやってみました。みんなも参考にやってみて (※1:53辺りから初めて音が鳴ります)
ちなみに以下では実行したい行はコマンド+Enterで実行しています。(ショートカット自体は好みのやつに変更できそう)

www.youtube.com

ドキュメントを参考にちょっとずつコードを理解したい

何もわからないまま音を出しているのでドキュメントを見ます
extemporelang.github.io

ドキュメントの通りだと実は上手く動かなかったので以下のように変更して実行した

;; instrumentファイルをロードする
(sys:load "libs/core/instruments.xtm")

;; シンセの定義
-- (make-instrument synth fmsynth)
++ (bind-instrument fmsynth fmsynth_note_c fmsynth_fx)

;; aDSP output クロージャにシンセを追加する
(bind-func dsp:DSP
  (lambda (in time chan dat)
--    (synth in time chan dat)))
++    (fmsynth in time chan dat)))
(dsp:set! dsp)

;; シンセを使って音を鳴らす
--(play-note (now) synth (random 60 80) 80 (* 1.0 *second*))
++(play-note (now) fmsynth (random 60 80) 80 (* 1.0 *second*))

(良い機会なのでドキュメントのコードについてはissue立てました)
github.com

なるほどこれだけ見ると結構シンプルですね。特に下の行の数字をいじるとわかりますが、最初の60 80はrandomで60-80の数字を選びそれが音程となる、その次の80が音量、最後の1.0は音を鳴らす秒数というのが何となくわかります。

(play-note (now) fmsynth (random 60 80) 80 (* 1.0 *second*))

上記を応用して関数内で複数の音を鳴らすというのも出来るみたいでこれも意外と直感的かもしれない。

(define chord
   (lambda ()
      (play-note (now) fmsynth 60 80 *second*)
      (play-note (now) fmsynth 64 80 *second*)
      (play-note (now) fmsynth 67 80 *second*)))

(chord)

で何よりせっかくSchemeベースなので、再帰的なコードとか書いて行こうぜ、みたいなことがドキュメントに書いてありますが、そろそろアドベントカレンダー記事投稿時間が迫ってきたので今日は一旦この辺で。音さえ出せるようになればあとは遊んでれば何とかいい感じになるでしょうと期待したい…

明日のはてなエンジニアアドベントカレンダーの担当は id:susisu です!