読者です 読者をやめる 読者になる 読者になる

音の鳴るブログ

鳴らないこともある

timbre.js v13.05.01

先週くらいから思い出したように作業はじめたら結構よい機能を追加できた。

http://mohayonao.github.io/timbre.js/

色々できること増えたのだけど、そもそもどういうことが出来るのかみたいな部分から説明したほうが良いかと思って 何となく分かってる人向けのチュートリアルページを作った。

http://the.mohayonao.com/concept/

とりあえず何か聴かせろという人にはこのページがある。 http://the.mohayonao.com/concept/#extra-examples-01

最近 SuperCollider のサンプルコードを参考に音を作る練習をしていて、色々足りないものとか JavaScript のさじ加減とか分かってきた気がするので良い連休になりそう。


.to() を追加

処理を流れの方向に書けて分かりやすいと思います。

# これと
a = T("lpf", {cutoff:800}, T("audio", {load:"drum.wav"})).play()

# これは同じ
a = T("audio", {load:"drum.wav"}).to("lpf", cutoff:800).play()

.slice() を追加

接続グラフを変更できる。

audio = T("audio", {load:"drum.wav"})
lpf = T("lpf")
reverb = T("reverb")

audio.to( lpf ).to( reverb )
# audio -> lpf -> reverb

comp = T("comp")

audio.splice(insert=comp, connect=reverb, remove=lpf)
# audio -> comp -> reverb になる

最初の引数に挿入したいオブジェクト。二番目に終端。三番目に削除したいオブジェクトを指定して接続を切り替える。 挿入オブジェクトを null にして削除のみとか、削除オブジェクトを null にして挿入のみとかも出来る。 .play() しているオブジェクトの場合は以下のように操作する。

# connectを省略するケース
audio = T("audio", {load:"drum.wav"}).play()
# audio -> output

delay = T("delay")

audio.splice(delay, null) # null は省略しても良い
# audio -> delay -> output になる

T("task") の追加

一連の処理をまとめられて任意の回数(または Infinity)繰り返す。waitが使えるので便利だと思う。最初にあげた3番目のページで使っている。以下のコードだと、 音を出して何秒かたったら音を止めて、周波数をちょっと変えてまた音を出すのを100回繰り返す。

T("task", {do:100, init: ->
  { freq: 1000 } # args を定義する

}, (count, args)->
  args.synth = T("sin", {freq:args.freq, mul:0.5}).play()
  @wait Math.random() * 4000 + 1000 # 1秒から5秒待機する

, (count, args)->
  args.synth.pause() 
  args.freq += Math.random() * 100 - 50

).on("ended", -> @pause() ).start()