Practical Web Audio API Programming

aike
WebAudioAPI
実践的
プログラミング

Practical Web Audio API Programming

藍 圭介 小樽商科大学
Ai Keisuke @aike1000

2013.11.30

CC BY Temari 09 http://www.flickr.com/photos/34053291@N05/4658010136/
誰?
今日話すこと
• Web Audio APIは何がすごいのか?
• 簡単なプログラミング例
• はまりやすい落とし穴
• 楽器アプリ作ってみる
Web Audio APIは
何がすごいのか?
http://middle-earth.thehobbit.com/
http://labs.gooengine.com/mozlod/
http://www.modulargrid.net/e/racks/synth
WebAudioSynth
アナログモデリングシンセ

http://aikelab.net/websynth
PG01Web
メタルギターサンプリング音源

http://aikelab.net/pg01/
Beatonica
ソーシャルグラフで音楽自動生成

http://beatonica.com/
でも、ウェブで音を
鳴らすのって
前からあったよね?
<EMBED	 SRC="○○.mid">

Flash

Java Applet

<Audio SRC=”○○.mp3”>
これらは基本的に、サウンド
再生プログラムをブラックボ
ックス化してHTMLに埋め込
んでいたに過ぎない
CC BY-NC-SA Peter Dutton http://www.flickr.com/photos/joeshlabotnik/7778898726/
Web
Audio
API
http://www.w3.org/TR/webaudio/
ウェブブラウザが
直接サポートする
音声信号処理API
CC BY-ND Hector Lazo http://www.flickr.com/photos/hector-lazo/3101873296/
Web Audio API

•音そのものをJavaScriptで直接操作
•プラグイン不要で環境依存しにくい
•由緒正しい(W3C)
注目度が高く進化が速い
•
CC BY-ND Hector Lazo http://www.flickr.com/photos/hector-lazo/4109744948/
モジュール指向
モジュール同士を接続してプログラミング

• オシレーター
• オーディオバッファソース
• ゲイン
• フィルター
• ディレイ
• スクリプトプロセッサー

• パン
• コンプレッサー
• コンボルバー
• アナライザー
• ウェーブシェイパー

等のモジュールが用意されている
CC BY-NC cutwithflourish http://www.flickr.com/photos/26735065@N00/4229039436/
これによって
何が変わるの?
△

これまでできなかった
何かができるようになる

◎

サウンドプログラミングの
ハードルが飛躍的に下がる!
Web Audio API
• 特殊な開発環境不要
• 必要なのは普通のブラウザだけ
• 無料
• コンパイル不要
• 速いデバッグサイクルで試行錯誤しやすい
• 特殊な実行環境不要
• メールやウェブで共有した相手も同じ音が聞ける
サウンド
プログラミング
の自由化
Public Domain Eugène_Delacroix http://en.wikipedia.org/wiki/Liberty_Leading_the_People
誰でも今すぐ
サウンド
プログラミングが
始められる!
簡単な
プログラミング例
オシレーターで音を出してみる
var ctx = new webkitAudioContext();
var osc = ctx.createOscillator();
osc.type = 1; // 矩形波
osc.connect(ctx.destination);
osc.start(0);
http://aikelab.net/webaudiodemo/osc1/
やかましい

CC BY-NC-SA Timothy Hart http://www.flickr.com/photos/tmhart/6229873723/
ゲインノードで音量ダウン
	

 var ctx = new webkitAudioContext();
	

 	

 var osc = ctx.createOscillator();
osc.type = 1;
	

 	

 var vol = ctx.createGain();
	

 	

 vol.gain.value = 0.2; // 0.0 ∼ 1.0
	

 	

 osc.connect(vol);
	

 	

 vol.connect(ctx.destination)
	

 osc.start(0);
http://aikelab.net/webaudiodemo/osc2/
wavファイルを再生する
BufferSource

CC BY Jason Ralston http://www.flickr.com/photos/jasonrphotography/2885155839/
wavファイルを再生(1/2)
XHRでサーバからwavファイルを取得する関数

var loadwav = function(file, callback) {
var xhr = new XMLHttpRequest();
xhr.open("GET", file, true);
xhr.responseType = "arraybuffer";
xhr.onload = function() {
ctx.decodeAudioData(xhr.response,function(buf){
callback(buf);
}, function(){});
};
xhr.send();
}
wavファイルを再生(2/2)
このloadwav関数でwavをバッファに読み込み

var kacha;
loadwav('kacha.wav', function(buf) { kacha = buf; });

BufferSourceを生成してバッファを指定(毎回必要)

var src = ctx.createBufferSource();
src.buffer = kacha;
src.connect(ctx.destination);
src.start(0);
キーを押すたびにwavを再生
window.document.onkeyup = function(evt){
var src = ctx.createBufferSource();
if (evt.keyCode == 13)
src.buffer = tan;
// returnキーは「ターン」
else
src.buffer = kacha; // 他のキーは「カチャ」
src.connect(ctx.destination);
src.start(0);
return false;
}
http://aikelab.net/webaudiodemo/kachatan/
WebRTCで
マイク入力した
音声を加工する
CC BY-NC-ND National Film and Sound Archive Australia http://www.flickr.com/photos/nfsa/4580070895/
マイク入力の基本
GetUserMedia()の第2引数に関数を渡す
渡した関数でMediaStreamSourceノード生成
var audioproc = function(stream) {
var mic = ctx.createMediaStreamSource(stream);
mic.connect(delay);
delay.connect(ctx.destination);
};
navigator.webkitGetUserMedia({audio : true},
audioproc,
function(e) { console.log(e); }
);
ディレイは
声が遅れて聞こえるよ
でもなんか違くない?

MediaStreamSource
(Mic)

Delay

destination

http://aikelab.net/webaudiodemo/delay1/
ディレイとゲインで
フィードバックループを作る
var mic = ctx.createMediaStreamSource(stream);
mic.connect(delay);
mic.connect(ctx.destination);
delay.connect(gain);
gain.connect(delay);
gain.connect(ctx.destination);
Feedback

MediaStreamSource
(Mic)

Delay

Gain

Wet

destination
Dry

http://aikelab.net/webaudiodemo/delay2/
コンボルバーで簡単リバーブ
XHRでサーバからIRファイルを取得して設定

var convolver = ctx.createConvolver();
var xhr = new XMLHttpRequest();
xhr.open("GET", "ir.wav", true);
xhr.responseType = "arraybuffer";
xhr.onload = function() {
ctx.decodeAudioData(xhr.response,function(buf){
convolver.buffer = buf;
}, function(){});
};
xhr.send();
http://aikelab.net/webaudiodemo/reverb/
IRファイルとは、実在の
残響音の特徴をwavファイル
として記録したもの
ある日のIR収録風景
波形を直接加工する
ScriptProcessor

CC BY-NC thaths http://www.flickr.com/photos/thaths/5852964925/
みんな大好きディストーション
波形をブーストしてからクリップ
var fuzz = ctx.createScriptProcessor(1024, 1, 1);
fuzz.onaudioprocess = function(event) {
var sin = event.inputBuffer.getChannelData(0);
var sout = event.outputBuffer.getChannelData(0);
var limit = 0.2;
for (var i = 0; i < sin.length; i++) {
var sig = sin[i] * 6;
// Boost
if (sig > limit) sig = limit;
// Clip
if (sig < -limit) sig = -limit;
// Clip
sout[i] = sig;
}
};
http://aikelab.net/webaudodemo/fuzz/
FFTでピッチチェンジャー
var pshift = function(val, indata) {
this.fft.forward(indata);
for (var i = 0; i < stream_length; i++) {
a_real[i] = 0;
a_imag[i] = 0;
}
for (var i = 0; i < stream_length; i++) {
var index = parseInt(i * val);
var eq = 1.0;
if (i > stream_length / 2) {
eq = 0;
}
if ((index >= 0) && (index < stream_length)) {
a_real[index] += fft.real[i] * eq;
a_imag[index] += fft.imag[i] * eq;
}
}
return this.fft.inverse(this.a_real, this.a_imag);
}

pitchShifter.onaudioprocess = function(event) {
var sin
= event.inputBuffer.getChannelData(0);
var sout
= event.outputBuffer.getChannelData(0);
var data = pshift(2.0, sin);
for (var i = 0; i < sin.length; i++) {
sout[i] = data[i];
}
};
DSP.js by cobanbrook
https://github.com/corbanbrook/dsp.js/

http://aikelab.net/webaudiodemo/pitch/
はまりやすい
落とし穴
CC BY-NC-SA @notnixon http://www.flickr.com/photos/sansbury/3274031514/
Oscillatorや
BufferSourceは
1音鳴らすごとに使い捨て
wav,mp3ファイル
を鳴らすにはWeb
サーバが必要
ベンダープレフィックス問題
var ctx = new webkitAudioContext();
var ctx = new AudioContext();

window.AudioContext
= window.AudioContext || window.webkitAudioContext;
var ctx = new AudioContext();
旧API名問題
createJavaScriptNode

createScriptProcessor

createGainNode

createGain

createDelayNode

createDelay
Panが3次元
手軽な2次元Panを作るのは
けっこう面倒だったり
pan.setPosition( 1.0, 0, -1.0);
pan.setPosition(-1.0, 0, -1.0);
こうするとそれっぽいけど普通の2次元Panとは微妙に違う
参考 http://www.g200kg.com/jp/docs/webaudio/panner.html
テストしづらい
• 上限値、下限値のチェックなど音にな
る前のおおまかな検証は可能

• 本当に意図した音色(波形)になって
いるかの自動チェックは難しい
バッドノウハウ集
• ScriptProcessorの入力数0はNG
• 特にiOSの場合ダミーで手前に

BufferSourceを接続する必要あり

• iOSでは音を鳴らす前にユーザーの
アクションが必須

• IRファイルは48kHzステレオのみ
※これらはAPIのバージョンアップによって今後変わる可能性もあります
楽器アプリ
作ってみる
マルチトラック
シーケンサー
CC BY-NC-SA Matthew Davidson http://www.flickr.com/photos/stretta/531963218/
簡易シーケンサーの作成 (ドラム音源)
ゲイン生成、wavファイル読み込み
var Drum = function(ctx) {
this.ctx = ctx;
this.vol = ctx.createGain();
this.vol.gain.value = 0.4;
this.vol.connect(ctx.destination);

}

this.kick = null;
this.hat = null;
var self = this;
loadwav('wav/kick.wav', function(buf) { self.kick = buf; });
loadwav('wav/hat.wav', function(buf) { self.hat = buf; });
簡易シーケンサーの作成 (ドラム音源)
16分音符4回ごとにBufferSource生成、キック、ハットを鳴らす

Drum.prototype.play = function(n, tim) {
if (n % 4 == 0) {
var src = ctx.createBufferSource();
src.buffer = this.kick;
src.connect(this.vol);
src.start(tim);
}
if (n % 4 == 2) {
var src = ctx.createBufferSource();
src.buffer = this.hat;
src.connect(this.vol);
src.start(tim);
}
http://aikelab.net/webaudiodemo/seq1/
}
簡易シーケンサーの作成 (ベース音源)
ゲインの生成、MIDIノートナンバーでシーケンス設定

var Bass = function(ctx) {
	

 this.ctx = ctx;
	

 this.vol = ctx.createGain(); // Gain Node
	

 this.vol.gain.value = 0.3;
	

 this.vol.connect(ctx.destination);
	

 this.seq = [ 33, 33, 40, 33, 33, 40, 33, 33,
	

 	

33, 33, 40, 33, 33, 40, 33, 33,
	

 	

31, 31, 31, 38, 38, 31, 31, 38,
	

 	

29, 29, 36, 29, 36, 29, 29, 29 ];
}
簡易シーケンサーの作成 (ベース音源)
毎回オシレーターノード生成
MIDIノートナンバーから周波数算出
Bass.prototype.play = function(n, tim) {
	

 var osc = ctx.createOscillator();
	

 osc.type = 2; // ノコギリ波
	

 osc.frequency.value
= 440.0 * Math.pow(2.0, (this.seq[n % 32] - 69.0) / 12.0);
	

 osc.connect(this.vol);
	

 osc.start(tim);
	

 osc.stop(tim + 0.08);	

}
http://aikelab.net/webaudiodemo/seq2/
簡易シーケンサーの作成 (シンセ音源その1)
シーケンスが違うだけでベース音源とほぼ同じ
	

 this.seq = [69, 72, 76, 74, 71, 69, 72, 76];
}
Synth.prototype.play = function(n, tim) {
	

 var osc = ctx.createOscillator();
	

 osc.type = 2; // ノコギリ波
	

 osc.frequency.value
= 440.0 * Math.pow(2.0, (this.seq[n % 32] - 69.0) / 12.0);
	

 osc.connect(this.vol);
	

 osc.start(tim);
	

 osc.stop(tim + 0.10);	

}
http://aikelab.net/webaudiodemo/seq3/
簡易シーケンサーの作成 (シンセ音源その2)
ディレイを追加
	

	

	

	


this.delay = ctx.createDelay();
this.delay.delayTime.value = 0.2;
this.feedback = ctx.createGain();
this.feedback.gain.value = 0.3;

	

	

	

	

	


this.vol.connect(ctx.destination);
this.vol.connect(this.delay);
this.delay.connect(this.feedback);
this.feedback.connect(this.delay);
this.feedback.connect(ctx.destination);
http://aikelab.net/webaudiodemo/seq4/
簡易シーケンサーの作成 (シンセ音源その3)
周波数をずらしたオシレーターを3個重ねる
Synth.prototype.play = function(n, tim) {
	

 for (i = 0; i < 3; i++) {	

// 3 Oscillators
	

 	

 var osc = ctx.createOscillator();
	

 	

 osc.type = 2;
	

 	

 var detune = 3 * i;	

	

 // 3Hz周波数をずらす
	

 	

 osc.frequency.value
= 440.0 * Math.pow(2.0, (this.seq[n % 8] - 69.0) / 12.0)
+ detune;
	

 	

 osc.connect(this.vol);
	

 	

 osc.start(tim);
	

 	

 osc.stop(tim + 0.10);
	

 }
http://aikelab.net/webaudiodemo/seq5/
}
簡易シーケンサーの作成 (シンセ音源その4)
フィルターを追加してLFOでゆっくり動かす
	

	

	

	

	

	

	

	

	

	

	


this.lpf = ctx.createBiquadFilter();
this.lpf.type = 0; // LPF
this.lpf.Q.value = 20;
this.lpf.frequency.value = 4000;
this.angle = 0.0;
var self = this;
this.lfo = function() {
	

 self.angle += 0.1;
	

 if (self.angle > 2 * Math.PI)
	

 	

 self.angle -= 2 * Math.PI;
	

 self.lpf.frequency.value
= 4000 + Math.sin(self.angle) * 3000;
	

 }
http://aikelab.net/webaudiodemo/seq6/
	

 setInterval(this.lfo, 100);
できた。
簡易シーケンサーの作成 (完成版)
全部鳴らす
var drum = new Drum(ctx);
var bass = new Bass(ctx);
var synth = new Synth(ctx);
var play = function() {
	

 var t = ctx.currentTime;
	

 for (var i = 0; i < 128; i++) {
	

 	

 t += 0.1;
	

 	

 drum.play(i, t);
	

 	

 bass.play(i, t);
	

 	

 synth.play(i, t);
	

 }
}

http://aikelab.net/webaudiodemo/seq7/
GUIをつけてパターンを
選べるようにすれば
本格的な楽器になります
Webrhy
GUIをつけてパターンを選べるようにしたらこんな感じ

http://aikelab.net/webrhy/
あとは自由な発想で
音楽をハックするだけ
Public Domain Eugène_Delacroix http://en.wikipedia.org/wiki/Liberty_Leading_the_People
Thank You!
@aike1000
http://d.hatena.ne.jp/aike/
1 of 64

Recommended

Interactive Music II SuperCollider入門 2 - 関数とUGen by
Interactive Music II SuperCollider入門 2 - 関数とUGenInteractive Music II SuperCollider入門 2 - 関数とUGen
Interactive Music II SuperCollider入門 2 - 関数とUGenAtsushi Tadokoro
4.9K views37 slides
ラズベリー・パイでプログラミングと電子工作を体験してみよう by
ラズベリー・パイでプログラミングと電子工作を体験してみようラズベリー・パイでプログラミングと電子工作を体験してみよう
ラズベリー・パイでプログラミングと電子工作を体験してみようTakashi Kanamaru
14.8K views66 slides
2015年12月19日 Unity Asset Touch and Tryアセット一覧 by
2015年12月19日 Unity Asset Touch and Tryアセット一覧2015年12月19日 Unity Asset Touch and Tryアセット一覧
2015年12月19日 Unity Asset Touch and Tryアセット一覧Takashi Jona
978 views80 slides
Interactive Music II - SuperCollider入門 by
Interactive Music II - SuperCollider入門Interactive Music II - SuperCollider入門
Interactive Music II - SuperCollider入門Atsushi Tadokoro
11.8K views46 slides
Interactive Music II SuperCollider入門 5 時間構造をつくる by
Interactive Music II SuperCollider入門 5  時間構造をつくるInteractive Music II SuperCollider入門 5  時間構造をつくる
Interactive Music II SuperCollider入門 5 時間構造をつくるAtsushi Tadokoro
3.8K views33 slides
LEDやモーターをArduinoで制御しよう by
LEDやモーターをArduinoで制御しようLEDやモーターをArduinoで制御しよう
LEDやモーターをArduinoで制御しようTakashi Kanamaru
8.4K views35 slides

More Related Content

What's hot

20130804 OSC京都 Raspberry Piに何かつないで遊ぼう by
20130804 OSC京都 Raspberry Piに何かつないで遊ぼう20130804 OSC京都 Raspberry Piに何かつないで遊ぼう
20130804 OSC京都 Raspberry Piに何かつないで遊ぼうYasuhiro Ishii
10.7K views31 slides
ハードウェアを用いてPythonを学ぶ by
ハードウェアを用いてPythonを学ぶハードウェアを用いてPythonを学ぶ
ハードウェアを用いてPythonを学ぶYuta Kitagami
12.6K views38 slides
Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef) by
Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)
Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)Atsushi Tadokoro
5.2K views32 slides
I2CでRaspberry Piから 複数の周辺機器を制御する by
I2CでRaspberry Piから複数の周辺機器を制御するI2CでRaspberry Piから複数の周辺機器を制御する
I2CでRaspberry Piから 複数の周辺機器を制御するHirokazu Nishio
22.9K views63 slides
coma Study Room vol.2 Arduino Workshop by
coma Study Room vol.2 Arduino Workshopcoma Study Room vol.2 Arduino Workshop
coma Study Room vol.2 Arduino WorkshopEto Haruhiko
5.1K views50 slides
[Road to Stingray] Stingrayで進めるアニメーションワークフローについて by
[Road to Stingray] Stingrayで進めるアニメーションワークフローについて[Road to Stingray] Stingrayで進めるアニメーションワークフローについて
[Road to Stingray] Stingrayで進めるアニメーションワークフローについてue_ta
5.9K views32 slides

What's hot(7)

20130804 OSC京都 Raspberry Piに何かつないで遊ぼう by Yasuhiro Ishii
20130804 OSC京都 Raspberry Piに何かつないで遊ぼう20130804 OSC京都 Raspberry Piに何かつないで遊ぼう
20130804 OSC京都 Raspberry Piに何かつないで遊ぼう
Yasuhiro Ishii10.7K views
ハードウェアを用いてPythonを学ぶ by Yuta Kitagami
ハードウェアを用いてPythonを学ぶハードウェアを用いてPythonを学ぶ
ハードウェアを用いてPythonを学ぶ
Yuta Kitagami12.6K views
Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef) by Atsushi Tadokoro
Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)
Interactive Music II SuperCollider入門 3 - 音を混ぜる(Mix)、楽器を定義(SynthDef)
Atsushi Tadokoro5.2K views
I2CでRaspberry Piから 複数の周辺機器を制御する by Hirokazu Nishio
I2CでRaspberry Piから複数の周辺機器を制御するI2CでRaspberry Piから複数の周辺機器を制御する
I2CでRaspberry Piから 複数の周辺機器を制御する
Hirokazu Nishio22.9K views
coma Study Room vol.2 Arduino Workshop by Eto Haruhiko
coma Study Room vol.2 Arduino Workshopcoma Study Room vol.2 Arduino Workshop
coma Study Room vol.2 Arduino Workshop
Eto Haruhiko5.1K views
[Road to Stingray] Stingrayで進めるアニメーションワークフローについて by ue_ta
[Road to Stingray] Stingrayで進めるアニメーションワークフローについて[Road to Stingray] Stingrayで進めるアニメーションワークフローについて
[Road to Stingray] Stingrayで進めるアニメーションワークフローについて
ue_ta5.9K views
平成26年度熊本高専Arduino講座 第2週 XBeeを用いた遠隔放射線量計測 by Katsuhiro Morishita
平成26年度熊本高専Arduino講座 第2週 XBeeを用いた遠隔放射線量計測平成26年度熊本高専Arduino講座 第2週 XBeeを用いた遠隔放射線量計測
平成26年度熊本高専Arduino講座 第2週 XBeeを用いた遠隔放射線量計測
Katsuhiro Morishita4.6K views

Similar to Practical Web Audio API Programming

Web Audio APIでシンセサイザーの作成 by
Web Audio APIでシンセサイザーの作成Web Audio APIでシンセサイザーの作成
Web Audio APIでシンセサイザーの作成aike
2.6K views27 slides
Web socketドロンくん その後- by
Web socketドロンくん その後-Web socketドロンくん その後-
Web socketドロンくん その後-Yuuichi Akagawa
1.8K views27 slides
FM音源をいじれるWebサービスを作った by
FM音源をいじれるWebサービスを作ったFM音源をいじれるWebサービスを作った
FM音源をいじれるWebサービスを作ったCHY72
2.9K views68 slides
ネットワークAPI のあれこれ (ENOG37) by
ネットワークAPI のあれこれ (ENOG37)ネットワークAPI のあれこれ (ENOG37)
ネットワークAPI のあれこれ (ENOG37)Kentaro Ebisawa
5.5K views32 slides
ScalableCore system at SWoPP2010 BoF-2 by
ScalableCore system at SWoPP2010 BoF-2ScalableCore system at SWoPP2010 BoF-2
ScalableCore system at SWoPP2010 BoF-2Shinya Takamaeda-Y
508 views19 slides
Firefox5+HTML5×5 by
Firefox5+HTML5×5Firefox5+HTML5×5
Firefox5+HTML5×5dynamis
2.1K views84 slides

Similar to Practical Web Audio API Programming(20)

Web Audio APIでシンセサイザーの作成 by aike
Web Audio APIでシンセサイザーの作成Web Audio APIでシンセサイザーの作成
Web Audio APIでシンセサイザーの作成
aike2.6K views
Web socketドロンくん その後- by Yuuichi Akagawa
Web socketドロンくん その後-Web socketドロンくん その後-
Web socketドロンくん その後-
Yuuichi Akagawa1.8K views
FM音源をいじれるWebサービスを作った by CHY72
FM音源をいじれるWebサービスを作ったFM音源をいじれるWebサービスを作った
FM音源をいじれるWebサービスを作った
CHY722.9K views
ネットワークAPI のあれこれ (ENOG37) by Kentaro Ebisawa
ネットワークAPI のあれこれ (ENOG37)ネットワークAPI のあれこれ (ENOG37)
ネットワークAPI のあれこれ (ENOG37)
Kentaro Ebisawa5.5K views
Firefox5+HTML5×5 by dynamis
Firefox5+HTML5×5Firefox5+HTML5×5
Firefox5+HTML5×5
dynamis 2.1K views
WebRTC meetup Tokyo 1 by mganeko
WebRTC meetup  Tokyo 1WebRTC meetup  Tokyo 1
WebRTC meetup Tokyo 1
mganeko4.2K views
おれが考えた見やすい通知 by Yoshiyuki MIKAMI
おれが考えた見やすい通知おれが考えた見やすい通知
おれが考えた見やすい通知
Yoshiyuki MIKAMI1.1K views
ハードウェアによる仮想化支援機能を利用したハイパバイザーIPS by FFRI, Inc.
ハードウェアによる仮想化支援機能を利用したハイパバイザーIPSハードウェアによる仮想化支援機能を利用したハイパバイザーIPS
ハードウェアによる仮想化支援機能を利用したハイパバイザーIPS
FFRI, Inc.6.2K views
ネットワーク機器のAPIあれこれ入門 (NetOpsCoding#2) by Kentaro Ebisawa
ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)ネットワーク機器のAPIあれこれ入門(NetOpsCoding#2)
ネットワーク機器のAPIあれこれ入門 (NetOpsCoding#2)
Kentaro Ebisawa11.1K views
スタート低レイヤー #0 by Kiwamu Okabe
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
Kiwamu Okabe3.1K views
Cell/B.E. プログラミング事始め by You&I
Cell/B.E. プログラミング事始めCell/B.E. プログラミング事始め
Cell/B.E. プログラミング事始め
You&I572 views
Develop Web Application with Node.js + Express by Akinari Tsugo
Develop Web Application with Node.js + ExpressDevelop Web Application with Node.js + Express
Develop Web Application with Node.js + Express
Akinari Tsugo394 views
ブラウザでWebRTC - iOSゲートウェイ作ってみた by mganeko
ブラウザでWebRTC - iOSゲートウェイ作ってみたブラウザでWebRTC - iOSゲートウェイ作ってみた
ブラウザでWebRTC - iOSゲートウェイ作ってみた
mganeko6.3K views
SORACOM Conference Discovery 2017 | F1. F3. IoTシステム入門 〜IoTシステム構築・運用の課題とSORACO... by SORACOM,INC
SORACOM Conference Discovery 2017 | F1. F3. IoTシステム入門 〜IoTシステム構築・運用の課題とSORACO...SORACOM Conference Discovery 2017 | F1. F3. IoTシステム入門 〜IoTシステム構築・運用の課題とSORACO...
SORACOM Conference Discovery 2017 | F1. F3. IoTシステム入門 〜IoTシステム構築・運用の課題とSORACO...
SORACOM,INC1.7K views
ストリーム処理とSensorBee by Daisuke Tanaka
ストリーム処理とSensorBeeストリーム処理とSensorBee
ストリーム処理とSensorBee
Daisuke Tanaka3.2K views
Assembly Tanka on Web - Aiko Kenji by asmtanka
Assembly Tanka on Web - Aiko KenjiAssembly Tanka on Web - Aiko Kenji
Assembly Tanka on Web - Aiko Kenji
asmtanka1.9K views
あんしんなWebサーバーのためのSSL設定 by Takayuki Ino
あんしんなWebサーバーのためのSSL設定あんしんなWebサーバーのためのSSL設定
あんしんなWebサーバーのためのSSL設定
Takayuki Ino13.7K views

Recently uploaded

「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化 by
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化Knowledge & Experience
8 views34 slides
概念モデリングワークショップ 基礎編 by
概念モデリングワークショップ 基礎編概念モデリングワークショップ 基礎編
概念モデリングワークショップ 基礎編Knowledge & Experience
19 views71 slides
JJUG CCC.pptx by
JJUG CCC.pptxJJUG CCC.pptx
JJUG CCC.pptxKanta Sasaki
6 views14 slides
さくらのひやおろし2023 by
さくらのひやおろし2023さくらのひやおろし2023
さくらのひやおろし2023法林浩之
83 views58 slides
01Booster Studio ご紹介資料 by
01Booster Studio ご紹介資料01Booster Studio ご紹介資料
01Booster Studio ご紹介資料ssusere7a2172
220 views19 slides
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料) by
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)NTT DATA Technology & Innovation
217 views33 slides

Recently uploaded(8)

「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化 by Knowledge & Experience
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
「概念モデリング自動化に向けた第一歩」 ~ ChatGPT・Open AI 活用による開発対象のモデル化
さくらのひやおろし2023 by 法林浩之
さくらのひやおろし2023さくらのひやおろし2023
さくらのひやおろし2023
法林浩之83 views
01Booster Studio ご紹介資料 by ssusere7a2172
01Booster Studio ご紹介資料01Booster Studio ご紹介資料
01Booster Studio ご紹介資料
ssusere7a2172220 views
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料) by NTT DATA Technology & Innovation
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料) by NTT DATA Technology & Innovation
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)

Practical Web Audio API Programming