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

音の鳴るブログ

鳴らないこともある

コマンドラインからウェブオーディオのコードをちょっと試す

先日作った、JavaScript 実装の Web Audio API を使って、コマンドラインからウェブオーディオのコードをちょっと試すやつを作った。

使い方は簡単で、グローバルインストールすると wae というコマンドが使えるようになる。

$ npm install -g wae-cli

で、適当にコードを書いて ( audioContextwae コマンドから自動的に与えられる 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 が未実装など) という問題があるけど、ちょっと試したい時にブラウザをわざわざ開かなくて良いので便利だと思う。

関連