Web Audio APIでピアノを鳴らす


音楽素人でも思い付きで簡単なメロディーを作れたらなぁと思い、ちょっと Web API でどんなことが出来るか試します。

https://developer.mozilla.org/ja/docs/Web/API/Web_Audio_API

 

正直できることが多すぎて何していいか困りますが、とりあえず1曲鳴らすまで。

周波数の計算

ドレミファソラシドを周波数に変えます。

基準音A(ラ)を440(442)Hzとして、十二平均律で以下のように計算できます。

1オクターブ(12音)上げると周波数は倍、下げると半分になります。

周波数を音にする

Web_Audio_API を参考にしますが、できることが多すぎる。

音源として周波数を音にする OscillatorNodeGainNode で音量指定します。

 

oscillator.type によって雰囲気が変わりますが、square が一番それっぽい。

ユーザーアクションに関わらず自動で再生させようとすると以下のエラーが出ることがあります。

The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on the page.

音の長さを決める

4分音符を基準としてテンポが60の曲を考えます。

テンポはBPM(Beat Per Minute)なので1分間に60拍、1拍は1秒。

テンポが倍になれば1拍は半分、8分音符も半分、2分音符は倍。

つまり1拍は (60/テンポ)*(4/音符の長さ) になります。

1音の強弱をつける

最初のサンプルコードの gain.setValueAtTime() だけでは音が平坦で、同じ音を続けた場合にわからなくなります。

AudioParam を見て適当に音量の強弱を付けます。

きらきら星

ここまでの知識を利用して「きらきら星」を鳴らします。

 

d(1音の長さ)が2分音符などで長くなると、それに依存した強弱がなんとなく気持ち悪い。実際の音はどうなってるかよく聞いて作らないといけないですね。

所感

簡単にそれなりの音を出せたけど、こだわると沼にハマりそう。

Web API はどうしても限定的な用途になるのであまりコストをかけたくないんですが、思ったより面白いからもう少し続けてみよう。


コメントを残す

メールアドレスが公開されることはありません。