Web Audio でシンセを作った話
どうもー
最近は暑くて死にそうです。
高山に行ったんですけど、22℃とかでくそ涼しかったです。
www.instagram.com www.instagram.com www.instagram.com www.instagram.com www.instagram.com
小京都だぞ!という感じがありノスタルジーに浸れたり、山の方に行けば綺麗で景色も見れて最高に涼しくて、最高に最高でした。
そんな気持ちになりました。
はい。
高山には海の日あたりに学生時代の後輩氏達と行ったのですが、ただ遊びに行ったわけじゃなくて、開発合宿しようぜ〜とのことだったので、前々からちょっとやりたかった、 WebAudioをつかってシンセをつくるぞ〜⤴という気持ちを強く持ちながら、結構な時間を観光を楽しんだのでその進捗のNASAを書きます!!!!
Web Audio?
Web Audio API が正しいかな。
詳しくはこちらをどうぞ Web Audio API。
まぁざっくりウェッブで音を扱うAPIですね。
音をだすだけじゃなくて、入力とかも扱うことができます。
でまぁもうこれをつかってシンセとかいくらでも作られているんですけど、まぁ作りたかったんです。
ロマンです。ロマン。
成果物〜
ネーミングセンスがないので、「FXで有り金全部溶かす人の顔」みたいな顔をしながら 「synse」という名前のパッケージをつくりました。
READMEはまだ無い。
でこれを使ったexampleがこちら
GitHub Pageで見れるようにしてるので良い感じにアクセスするか、 下のiframe内をご確認くだされ〜。
キーボードのa
w
s
e
d
f
t
g
y
h
j
k
をおすことで音がなります。
一応鍵盤通り?な配置で1オクターブが良い感じになるようになってるはずです。
同時に押してもオシレーターが一個しか無いので、単音しかなりません。
和音を鳴らしたいときは、後述するけどがんばれ。
他のいろいろな input
は色々いじってもらうとアナログシンセみたいな感じに音が変わるかと思います。
設計思想とか?
そんなたいそれたものではないけど…
一応、あくまで一応、アナログシンセをイメージして作りました。
vco
vcf
vca
とかをモジュールとして提供する感じにしています。
なので、vco
をそのままspeaker
につなぐこともできるし、vco -> vcf -> speaker
のようにvca
を飛ばしたりとかもできるようになってる。
今は無いけど、もうちょっとしたらmixer?
というか
vco -> mixer -> vcf .... vco ->
まぁmixerかな…。なんだろ…。
みたいに感じにn個の音源を混ぜるみたいなのも作ろうと思ってる。
実装的な話
Flow type
とか Type Script
とかを使って型がほしかったけど、開発合宿で2日くらいしかないし、まぁ後にしよーと思って結構ツライなぁとなってた。素直に入れればよかったけど、webpack
とかで苦しんでいたので、そんな余裕はなかった。
そのうち Flow type
をいれたいなぁと思っている。
で、vco
とかはAudioNode
っていうクラスを継承させて作っていて、そこで他のAudioNode
とつなげるところは共通化させている。
vca
だけはちょっと特殊で、時間が経過するに連れて音を大きくしたり、小さくしたりみたいなのがあったので、どうしようか迷いに迷って、setTimeOut
を使うようになっている。
よくないなぁ…と思いつつ、web上でのkeydownとかのイベントの発火が押しっぱなしだとワンテンポ遅れたりして、音が急にでかくなったり、いきなり消えたりしてわけわからんくなってしまったので、ダサいけどそうなっている。
今でも微妙なときがあるのでカイゼンの余地がある。
またsynse
で提供している、keyboard
は単音?1音?しか出せないようになってます。和音は出せません。
なぜならアナログシンセを設計思想においているからです。
和音を出したいときは、ナウいシンセのように複数個オシレーターを準備してやればいいかなと思ってます。*1
まぁvco
をn個用意してやればいいですね。
そのうちmixer
ができるから良い感じにつなげれば完成ですよ〜和音でますよ〜。
ちょっと話がそれましたね。
またkeyboard
の実装もだいぶ汚いものになっています。
こちらもvca
と同様にsetTimeOut
があります。理由はvca
と同様です。辛かったし今もツライ。
そんな感じかなー。
色々もやっとしてるところはあるので、良い感じにしていきたいにゃーって思ってます。
あーあとテストとかも一切ないのでうーんってなってるけど、 これどうやってテストするんだ…ってなってる。 音が鳴るとか、ね。*2
まとめ
- 高山はめっちゃ良いところだった。
- web audio api 奥が深い。
- つらいこともありますが、たのしかったです。
はいー
まぁそんなに使うタイミング無いかもしれないですけど、こういうのやっぱりおもしろいなぁーと思いましたまる。
そんなかんじで、ここまで。
またねー。じゃあねー。