<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Oscillator</title> <meta name="viewport" content="width=device-width,initial-scale=1"> </head> <body> <form name="form"> Type<select name="type"> <option value="sine">Sine</option> <option value="square">Square</option> <option value="sawtooth">SawTooth</option> <option value="triangle">Triangle</option></select><br> Freq(Hz)<input type="range" min="50" max="15000" name="freq" value="440"><br> </form> <button onclick="srt()">start</button> <button onclick="stp()">stop</button> <script type="text/javascript"> window.AudioContext = window.AudioContext || window.webkitAudioContext; // AudioContextクラスインスタンス生成(Web互換指定) context = new AudioContext(); function srt() { oscillator = context.createOscillator();// oscillatorノードのインスタンスの作成 oscillator.start = oscillator.start || oscillator.noteOn; oscillator.stop = oscillator.stop || oscillator.noteOff; oscillator.connect(context.destination);// サウンド出力ノードに接続する oscillator.type = form.type.value; // 生成タイプの設定 oscillator.frequency.value = parseFloat(form.freq.value); // 発生周波数の設定 oscillator.start(0); // 開始 } function stp() { oscillator.stop(0) ; } // 停止 </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Gain</title> <meta name="viewport" content="width=device-width,initial-scale=1"> </head> <body> <form name="form"> Level<input type="range" min="0" max="1" step="0.01" name="level" value="0.5" onchange="cng()"> </form><br> <button onclick="srt()">start</button> <button onclick="stp()">stop</button> <script type="text/javascript"> window.AudioContext = window.AudioContext || window.webkitAudioContext; // AudioContextクラスインスタンス生成(Web互換指定) context = new AudioContext(); function srt() { oscillator = context.createOscillator();// oscillatorノードのインスタンスの作成 oscillator.start = oscillator.start || oscillator.noteOn; oscillator.stop = oscillator.stop || oscillator.noteOff; context.createGain = context.createGain || context.createGainNode; gain = context.createGain(); // gainノードのインスタンスの作成 oscillator.connect(gain); // gainノードに接続する gain.connect(context.destination); // サウンド出力ノードに接続する oscillator.type = "sine" ; // 生成タイプの設定(正弦波) oscillator.frequency.value = 440 ; // 生成周波数の設定 gain.gain.value = parseFloat(form.level.value); // レベルの設定 oscillator.start(0); // 開始 } function stp() { oscillator.stop(0) ; } // 停止 function cng() { gain.gain.value = parseFloat(form.level.value) ; } // レベルの再設定 </script> </body> </html>
利用プラウザにより動作しない場合があります。(Widows/Andorid Chrome は動作します。)
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Panner</title> <meta name="viewport" content="width=device-width,initial-scale=1"> </head> <body> <form name="form"> Pan(Balance)<input type="range" min="-1" max="1" step="0.01" name="pan" value="0" onchange="cng()"> </form><br> <button onclick="srt()">start</button> <button onclick="stp()">stop</button> <script type="text/javascript"> window.AudioContext = window.AudioContext || window.webkitAudioContext; // AudioContextクラスインスタンス生成(Web互換指定) context = new AudioContext(); function srt() { oscillator = context.createOscillator();// oscillatorノードのインスタンスの作成 oscillator.start = oscillator.start || oscillator.noteOn; oscillator.stop = oscillator.stop || oscillator.noteOff; panner = context.createStereoPanner(); // pannerノードのインスタンスの作成 oscillator.connect(panner); // pannerノードに接続する panner.connect(context.destination); // サウンド出力ノードに接続する oscillator.type = "sine" ; // 生成タイプの設定(正弦波) oscillator.frequency.value = 440 ; // 生成周波数の設定(正弦波) panner.pan.value = parseFloat(form.pan.value); oscillator.start(0); // 開始 } function stp() { oscillator.stop(0) ; } // 停止 function cng() { panner.pan.value = parseFloat(form.pan.value) ; } // レベルの再設定 </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Analyser(TimeDomainData)</title> <meta name="viewport" content="width=device-width,initial-scale=1"> </head> <body> <canvas id = "c1" width="400" height="200"></canvas> <form name="form"> Type<select name="type"> <option value="sine">Sine</option> <option value="square">Square</option> <option value="sawtooth">SawTooth</option> <option value="triangle">Triangle</option></select><br> Freq(Hz)<input type="range" min="50" max="15000" name="freq" value="440"><br> </form> <button onclick="srt()">start</button> <button onclick="stp()">stop</button> <script type="text/javascript"> canvas1 = document.getElementById("c1"); // キャンバスの設定 canvasContext1 = canvas1.getContext('2d'); window.AudioContext = window.AudioContext || window.webkitAudioContext; // AudioContextクラスインスタンス生成(Web互換指定) context = new AudioContext(); function srt() { oscillator = context.createOscillator();// oscillatorノードのインスタンスの作成 oscillator.start = oscillator.start || oscillator.noteOn; oscillator.stop = oscillator.stop || oscillator.noteOff; analyser = context.createAnalyser(); // Analyserノードのインスタンスの作成 analyser.fftSize = 2048; // 標準値 oscillator.connect(analyser); // analyserノードに接続する analyser.connect(context.destination); // サウンド出力ノードに接続する oscillator.type = form.type.value; // 生成タイプの設定 oscillator.frequency.value = parseFloat(form.freq.value); // 発生周波数の設定 oscillator.start(0); // 開始 drawwave1() ; } function stp() { oscillator.stop(0) ; } function drawwave1() { intervalid1 = window.setInterval(function() { var times = new Uint8Array(analyser.fftSize); // Array sizeは1024 (FFTサイズの半分の値) analyser.getByteTimeDomainData(times); canvasContext1.clearRect(0, 0, canvas1.width, canvas1.height); // キャンバスのクリア canvasContext1.beginPath(); // 描画の開始 for (var i = 0, len = times.length; i < len; i++) { var x = (i / len) * canvas1.width; var y = (1 - (times[i] / 255)) * canvas1.height; if (i === 0) { canvasContext1.moveTo(x, y); } else { canvasContext1.lineTo(x, y); } } canvasContext1.stroke(); // 描画 }, 50); // 1秒間に50回 } </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Analyser(FrequencyData)</title> <meta name="viewport" content="width=device-width,initial-scale=1"> </head> <body> <canvas id = "c2" width="400" height="200"></canvas> <form name="form"> Type<select name="type"> <option value="sine">Sine</option> <option value="square">Square</option> <option value="sawtooth">SawTooth</option> <option value="triangle">Triangle</option></select><br> Freq(Hz)<input type="range" min="50" max="15000" name="freq" value="440"><br> </form> <button onclick="srt()">start</button> <button onclick="stp()">stop</button> <script type="text/javascript"> canvas2 = document.getElementById("c2"); // キャンバスの設定 canvasContext2 = canvas2.getContext('2d'); window.AudioContext = window.AudioContext || window.webkitAudioContext; // AudioContextクラスインスタンス生成(Web互換指定) context = new AudioContext(); function srt() { oscillator = context.createOscillator();// oscillatorノードのインスタンスの作成 oscillator.start = oscillator.start || oscillator.noteOn; oscillator.stop = oscillator.stop || oscillator.noteOff; analyser = context.createAnalyser(); // Analyserノードのインスタンスの作成 analyser.fftSize = 2048; // 標準値 oscillator.connect(analyser); // analyserノードに接続する analyser.connect(context.destination); // サウンド出力ノードに接続する oscillator.type = form.type.value; // 生成タイプの設定 oscillator.frequency.value = parseFloat(form.freq.value); // 発生周波数の設定 oscillator.start(0); // 開始 drawwave2() ; } function stp() { oscillator.stop(0) ; } // 停止 function drawwave2() { intervalid2 = window.setInterval(function() { var spectrums = new Uint8Array(analyser.frequencyBinCount); // Array sizeは1024 (FFTサイズの半分の値) analyser.getByteFrequencyData(spectrums); canvasContext2.clearRect(0, 0, canvas2.width, canvas2.height); //キャンバスのクリア canvasContext2.beginPath(); // 描画開始 for (var i = 0, len = spectrums.length; i < len; i++) { var x = (i / len) * canvas2.width; var y = (1 - (spectrums[i] / 255)) * canvas2.height; if (i === 0) { canvasContext2.moveTo(x, y); } else { canvasContext2.lineTo(x, y); } } canvasContext2.stroke(); // 描画 }, 10); // 1秒間に10回 } </script> </body> </html>
多チャンネル信号の分離(splitter)/合成(merger) 戻る
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>splitter</title> <meta name="viewport" content="width=device-width,initial-scale=1"> </head> <body> <form name="form"> 左の音量:<input type="range" min="0" max="1" step="0.01" size="10" id="levelL" value="0.5" onchange="cng()"/> 右の音量:<input type="range" min="0" max="1" step="0.01" size="10" id="levelR" value="0.5" onchange="cng()"/><br> </form> <button onclick="srt()">start</button> <button onclick="stp()">stop</button> <script type="text/javascript"> window.AudioContext = window.AudioContext || window.webkitAudioContext; context = new AudioContext(); function srt() { oscillator = context.createOscillator(); context.createGain = context.createGain || context.createGainNode; splitter = context.createChannelSplitter(2); // The number of splitted channels merger = context.createChannelMerger(2); // The number of merged channels gainL = context.createGain(); // for Left Channel gainR = context.createGain(); // for Right Channel oscillator.connect(splitter); // OscillatorNode (Monaural input) -> Stereo splitter.connect(gainL, 0, 0); // ChannelSplitterNode -> GainNode (Left Channel) splitter.connect(gainR, 0, 0); // ChannelSplitterNode -> GainNode (Right Channel) gainL.connect(merger, 0, 0); // GainNode (Left Channel) -> ChannelMergerNode (Left Channel) gainR.connect(merger, 0, 1); // GainNode (Right Channel) => ChannelMergerNode (Right Channel) merger.connect(context.destination); // ChannelMergerNode -> AudioDestinationNode (Output) oscillator.start = oscillator.start || oscillator.noteOn; oscillator.stop = oscillator.stop || oscillator.noteOff; oscillator.type = "sine" ; oscillator.frequency.value = 440 ; oscillator.start(0); } function stp() { oscillator.stop(0); } function cng() { gainL.gain.value = parseFloat(document.getElementById("levelL").value); gainR.gain.value = parseFloat(document.getElementById("levelR").value); } </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Audio play(file)</title> <meta name="viewport" content="width=device-width,initial-scale=1"> </head> <body> <button onclick="srt()">Play</button> <button onclick="stp()">stop</button> <script type="text/javascript"> window.AudioContext = window.AudioContext || window.webkitAudioContext; // AudioContextクラスインスタンス生成(Web互換指定) context = new AudioContext(); loaded = false; onload = function() { xmlHttpRequest = new XMLHttpRequest(); xmlHttpRequest.responseType = 'arraybuffer'; xmlHttpRequest.onload = function() { audioData = this.response; context.decodeAudioData( // バイナリデータのデコード audioData, function( decodedData ) { audiodata = decodedData; loaded = true ; srt() ; }, function( e ) {alert( e.err ); } ); } xmlHttpRequest.open( 'GET',"Yesterday.mp3", true ); xmlHttpRequest.send(); } function srt() { if ( loaded ) { source = context.createBufferSource(); // オーディオノードの作成 source.connect(context.destination); // サウンド出力ノードに接続する source.buffer = audiodata ; source.start(); // 音源の再生 } else { alert ("オーディオデータが読み込まれておりません") } } function stp() { source.stop() ; } // 音源の再生停止 </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Audio play(file upload)</title> <meta name="viewport" content="width=device-width,initial-scale=1"> </head> <body><input id="sample" type="file" size ="30" accept="audio/*" /> <button onclick="srt()">Play</button> <button onclick="stp()">stop</button> <script type="text/javascript"> window.AudioContext = window.AudioContext || window.webkitAudioContext; // AudioContextクラスインスタンス生成(Web互換指定) context = new AudioContext(); loaded = false; file = document.getElementById( 'sample' ); file.onchange = function() { var reader = new FileReader(); reader.onload = function() { var audioData = this.result; context.decodeAudioData( audioData, function( decodedData ) { source = context.createBufferSource(); audiodata = decodedData; loaded = true ; srt() ; }, function( e ) { alert( e.err ) ; } ); }; reader.readAsArrayBuffer( this.files[ 0 ] ); } function srt() { if ( loaded ) { source = context.createBufferSource(); source.connect(context.destination); // サウンド出力ノードに接続する source.buffer = audiodata ; source.start(); } else { alert ("オーディオデータが読み込まれておりません") } } function stp() { source.stop() ; } </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Audio play(rate)</title> <meta name="viewport" content="width=device-width,initial-scale=1"> </head> <body> <form name="form"> <input type="range" min="0.2" max="5" step="0.01" id="rate" value="1" onchange="cng()"/> </form> <button onclick="srt()">Play</button> <button onclick="stp()">stop</button> <script type="text/javascript"> window.AudioContext = window.AudioContext || window.webkitAudioContext; context = new AudioContext(); loaded = false; onload = function() { xmlHttpRequest = new XMLHttpRequest(); xmlHttpRequest.responseType = 'arraybuffer'; xmlHttpRequest.onload = function() { audioData = this.response; context.decodeAudioData( audioData, function( decodedData ) { audiodata = decodedData; loaded = true ; srt() ; }, function( e ) {alert( e.err ); } ); } xmlHttpRequest.open( 'GET',"audioapi_piano.wav", true ); //440Hz ピアノデータ xmlHttpRequest.send(); } function srt() { if ( loaded ) { source = context.createBufferSource(); source.connect(context.destination); source.buffer = audiodata ; source.playbackRate.value = parseFloat(form.rate.value) ; // 再生速度の設定 source.start(); } else { alert ("オーディオデータが読み込まれておりません") } } function stp() { source.stop() ; } function cng() { source.playbackRate.value = parseFloat(form.rate.value) ; } // 再生速度の設定 </script> </body> </html>