<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Oscillator &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/oscillator/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Tue, 19 Aug 2014 01:00:50 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>Web Audio API の Oscillator で楽器を作りたい話</title>
		<link>https://blog.mach3.jp/2014/08/19/oscyjs.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 19 Aug 2014 01:00:50 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Oscillator]]></category>
		<category><![CDATA[Slides]]></category>
		<category><![CDATA[Web Audio API]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3867</guid>

					<description><![CDATA[横浜で行われたHTML5飯でWeb Audio APIでモールス信号を表現してみる話をさせて頂いたのが今月頭の話。 その際に「Oscillator使えばよい」というアドバイスを頂いたので調べてみたところ、 「これで楽器を [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>横浜で行われた<a href="http://level0.kayac.com/#!2014/08/5.php">HTML5飯</a>でWeb Audio APIでモールス信号を表現してみる話をさせて頂いたのが今月頭の話。 その際に「Oscillator使えばよい」というアドバイスを頂いたので調べてみたところ、 「これで楽器をつくってみたい」と思って試してみた話を <a href="http://togetter.com/li/707885">Yokohama.js</a> でしゃべらせていただきました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-ddF26QXnohM/U_H_wggI7yI/AAAAAAAAChg/ZMdQcqhlpf0/s400/2014-0818-00.png" alt="Web Audio API の Oscillator で楽器を作りたい話"/></figure>



<p></p>



<span id="more-3867"></span>



<h2 class="wp-block-heading">Oscillator で楽器を作りたい！</h2>



<p><iframe src="http://www.slideshare.net/slideshow/embed_code/38061901" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen=""> </iframe></p>



<p>こちらが当日の資料です。ざっくり言うと…</p>



<ul class="wp-block-list">
<li>Oscillator はオシレーターであってオスシレーターではない</li>



<li>Oscillator は周波数・デチューン・波形をいじることでいろんな音になる</li>



<li>作ってみた物の紹介・デモ</li>
</ul>



<p>といった内容をお話しました。</p>



<h2 class="wp-block-heading">作ってみたデモ（Oscy.js）</h2>



<p>そして作ってみたデモがこちら。 <strong>触ると音が出るのでご注意ください。</strong></p>



<ul class="wp-block-list">
<li><a href="http://mach3.github.io/oscy.js/">Oscy.js (http://mach3.github.io/oscy.js)</a></li>
</ul>



<p>Web Audio API に対応していない環境ではウンともスンとも言わないどころか描画もしませんのでご了承ください。 デスクトップのChromeやFirefox、iOS Safariなどで動きます。 Android は Chrome等であれば動くようです。</p>



<h2 class="wp-block-heading">Oscillator の使い方をものすごくざっくり説明する</h2>



<p>環境によってクラス名やメソッド名が違ったりするのでご注意ください。 AudioContext が webkitAudioContext だったり、createGain が createGainNode だったりします。</p>



<h3 class="wp-block-heading">とりあえず鳴らす</h3>



<p>まずはじめにAudioContextを用意します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> context = <span class="hljs-keyword">new</span> AudioContext();
</code></span></pre>


<p>次に、Oscillatorノード（音を生成する人）と Gainノード（音量を調節する人）を用意します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> oscillator = context.createOscillator();
<span class="hljs-keyword">var</span> gain = context.createGain();
</code></span></pre>


<p>これらを出力先（destination）に接続します。Gainノードは生成元と出力先の間に挟まってエフェクタのように機能します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// oscillator =&gt; gain =&gt; destination</span>
oscillator.connect(gain);
gain.connect(context.destination);
</code></span></pre>


<p>音を出します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">oscillator.start(<span class="hljs-number">0</span>); <span class="hljs-comment">// &lt; プーーーーーーーーー</span>
</code></span></pre>


<h3 class="wp-block-heading">音を変えてみる</h3>



<p>周波数（frequency）・デチューン（detune）・波形（type）を変える事で様々な音に変化します。 音量の調節は Gainノードで行います。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// AからA#の音にかわります</span>
oscillator.frequency.value = (<span class="hljs-number">440</span> * <span class="hljs-number">1.06</span>);

<span class="hljs-comment">// 微妙に音高がかわります</span>
oscillator.detune.value = <span class="hljs-number">100</span>;

<span class="hljs-comment">// "sine" から "triangle" の音に変わります。少し硬い音になります。</span>
oscillator.type = <span class="hljs-string">"triangle"</span>;

<span class="hljs-comment">// 音量の調節はGainノードで調節します。</span>
gain.gain.value = <span class="hljs-number">0.5</span>;
</code></span></pre>


<h2 class="wp-block-heading">調べていきたい事・課題など</h2>



<h3 class="wp-block-heading">リバーブエフェクト</h3>



<p>デモでは音量をイージング関数でいじって似非リバーブエフェクトをかけていますが、 Convolver を使う事でより自然な音響効果を付与する事が出来るようです。 その為には音響効果の元となるインパルスレスポンス（IR）データが必要になります。 IRデータをシェアするWebサイト等もあるので参考にしてみましょう。</p>



<ul class="wp-block-list">
<li><a href="http://www.voxengo.com/impulses/">Free Reverb Impulse Responses &#8211; Voxengo</a></li>



<li><a href="http://www.openairlib.net/">OpenAIR | The Open Acoustic Impulse Response Library</a></li>
</ul>



<h3 class="wp-block-heading">自作の波形テーブル</h3>



<p>createPeriodicWave / setPeriodicWave を使用して自作の波形テーブルを指定する事で様々な音色を出すことができます。 が、スペクトラムとかハーモニクスとかフーリエとかちょっとなにいってんのかぜんぜんわかんないので、今度の課題にしましょう。</p>



<p>Chromiumのリポジトリに波形テーブルのサンプルがありましたので、こちらも参考まで。</p>



<ul class="wp-block-list">
<li><a href="http://chromium.googlecode.com/svn/trunk/samples/audio/wave-tables">http://chromium.googlecode.com/svn/trunk/samples/audio/wave-tables</a></li>
</ul>



<h2 class="wp-block-heading">まとめ</h2>



<p>音の生成はちょっと踏み込むとドツボにはまりそうな奥深さがありますが、かなり面白いテーマですね。 またアップデートしていきたいと思います。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
