コマンドラインからウェブオーディオのコードをちょっと試す
先日作った、JavaScript 実装の Web Audio API を使って、コマンドラインからウェブオーディオのコードをちょっと試すやつを作った。
使い方は簡単で、グローバルインストールすると wae
というコマンドが使えるようになる。
$ npm install -g wae-cli
で、適当にコードを書いて ( audioContext
は wae
コマンドから自動的に与えられる AudioContext )
// coin.js const osc = audioContext.createOscillator(); const amp = audioContext.createGain(); osc.type = "square"; osc.frequency.setValueAtTime(987.7666, 0); osc.frequency.setValueAtTime(1318.5102, 0.075); osc.start(0); osc.stop(2); osc.connect(amp); osc.onended = () => { process.exit(); }; amp.gain.setValueAtTime(0.25, 0); amp.gain.setValueAtTime(0.25, 0.075); amp.gain.linearRampToValueAtTime(0, 2); amp.connect(audioContext.destination);
実行すると音が鳴る。
$ wae coin
オプションを工夫するとWAV形式で出力したりできる。 ドキュメントに書くのを忘れたけど、この場合はスピーカーから音を出す必要がないので、5秒の音声でも0.何秒かで出力してくれる。 しかも setInterval などを使って逐次的に処理するようなコードを書いても上手に実行してくれる。
$ wae coin -o coin.wav
module.exports = function
で書けば引数を渡したりもうちょっと高度なコードが書ける。
// beep.js module.exports = (audioContext, frequency, duration) => { const osc = audioContext.createOscillator(); const amp = audioContext.createGain(); osc.frequency.value = frequency; osc.start(0); osc.stop(duration); osc.connect(amp); amp.gain.setValueAtTime(0.5, 0); amp.gain.linearRampToValueAtTime(0, duration); amp.connect(audioContext.destination); };
$ wae beep -- 1760 0.5
ベースで使っている web-audio-engine というライブラリが完全ではない (例えば現状 ConvolverNode や DynamicsCompressor が未実装など) という問題があるけど、ちょっと試したい時にブラウザをわざわざ開かなくて良いので便利だと思う。
関連
wae クソ便利だけど読み方が自分でも分からん
— モハヨナオ (@mohayonao) 2016年4月27日
「ワ」にしましょう
— モハヨナオ (@mohayonao) 2016年4月27日
aとeがくっついてる発音記号で
— モハヨナオ (@mohayonao) 2016年4月27日
ワæ
— CV:堀江由衣 (@amagitakayosi) 2016年4月27日