<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
  Class: DXOpal::SoundEffect
  
    &mdash; Documentation by YARD 0.9.12
  
</title>

  <link rel="stylesheet" href="../css/style.css" type="text/css" charset="utf-8" />

  <link rel="stylesheet" href="../css/common.css" type="text/css" charset="utf-8" />

<script type="text/javascript" charset="utf-8">
  pathId = "DXOpal::SoundEffect";
  relpath = '../';
</script>


  <script type="text/javascript" charset="utf-8" src="../js/jquery.js"></script>

  <script type="text/javascript" charset="utf-8" src="../js/app.js"></script>


  </head>
  <body>
    <div class="nav_wrap">
      <iframe id="nav" src="../class_list.html?1"></iframe>
      <div id="resizer"></div>
    </div>

    <div id="main" tabindex="-1">
      <div id="header">
        <div id="menu">
  
    <a href="../_index.html">Index (S)</a> &raquo;
    <span class='title'><span class='object_link'><a href="../DXOpal.html" title="DXOpal (module)">DXOpal</a></span></span>
     &raquo; 
    <span class="title">SoundEffect</span>
  
</div>

        <div id="search">
  
    <a class="full_list_link" id="class_list_link"
        href="../class_list.html">

        <svg width="24" height="24">
          <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
          <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
          <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
        </svg>
    </a>
  
</div>
        <div class="clear"></div>
      </div>

      <div id="content"><h1>Class: DXOpal::SoundEffect
  
  
  
</h1>
<div class="box_info">
  
  <dl>
    <dt>Inherits:</dt>
    <dd>
      <span class="inheritName"><span class='object_link'><a href="Sound.html" title="DXOpal::Sound (class)">Sound</a></span></span>
      
        <ul class="fullTree">
          <li>Object</li>
          
            <li class="next"><span class='object_link'><a href="RemoteResource.html" title="DXOpal::RemoteResource (class)">RemoteResource</a></span></li>
          
            <li class="next"><span class='object_link'><a href="Sound.html" title="DXOpal::Sound (class)">Sound</a></span></li>
          
            <li class="next">DXOpal::SoundEffect</li>
          
        </ul>
        <a href="#" class="inheritanceTree">show all</a>
      
    </dd>
  </dl>
  

  
  
  
  
  

  

  
  <dl>
    <dt>Defined in:</dt>
    <dd>opal/dxopal/sound_effect.rb</dd>
  </dl>
  
</div>

<h2>Overview</h2><div class="docstring">
  <div class="discussion">
    
<p>User-generated sound</p>

<p>Example:</p>

<pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_v'>v</span> <span class='op'>=</span> <span class='int'>80</span>
<span class='const'>SoundEffect</span><span class='period'>.</span><span class='id identifier rubyid_register'><span class='object_link'><a href="RemoteResource.html#register-class_method" title="DXOpal::RemoteResource.register (method)">register</a></span></span><span class='lparen'>(</span><span class='symbol'>:sound1</span><span class='comma'>,</span> <span class='int'>4000</span><span class='comma'>,</span> <span class='const'>WAVE_RECT</span><span class='comma'>,</span> <span class='int'>5000</span><span class='rparen'>)</span> <span class='kw'>do</span>
  <span class='id identifier rubyid_v'>v</span> <span class='op'>=</span> <span class='id identifier rubyid_v'>v</span> <span class='op'>-</span> <span class='float'>0.03</span>
  <span class='lbracket'>[</span><span class='id identifier rubyid_rand'>rand</span><span class='lparen'>(</span><span class='int'>300</span><span class='rparen'>)</span><span class='comma'>,</span> <span class='id identifier rubyid_v'>v</span><span class='rbracket'>]</span>
<span class='kw'>end</span>
</code></pre>

<p>This will generate a sound with WebAudio.</p>


  </div>
</div>
<div class="tags">
  

</div><h2>Defined Under Namespace</h2>
<p class="children">
  
    
      <strong class="modules">Modules:</strong> <span class='object_link'><a href="SoundEffect/WaveTypes.html" title="DXOpal::SoundEffect::WaveTypes (module)">WaveTypes</a></span>
    
  
    
  
</p>






  <h2>Instance Attribute Summary</h2>
  
  <h3 class="inherited">Attributes inherited from <span class='object_link'><a href="Sound.html" title="DXOpal::Sound (class)">Sound</a></span></h3>
  <p class="inherited"><span class='object_link'><a href="Sound.html#decoded-instance_method" title="DXOpal::Sound#decoded (method)">#decoded</a></span></p>


  
    <h2>
      Class Method Summary
      <small><a href="#" class="summary_toggle">collapse</a></small>
    </h2>

    <ul class="summary">
      
        <li class="public ">
  <span class="summary_signature">
    
      <a href="#_load-class_method" title="_load (class method)">.<strong>_load</strong>(time, wave_type = WAVE_RECT, resolution = 1000, &amp;block)  &#x21d2; Object </a>
    

    
  </span>
  
  
  
  
  
  
  

  
    <span class="summary_desc"><div class='inline'>
<p>time : Total number of ticks   When resolution=1000(default), `time` is
equivalent to the    total length of the sound in milliseconds.</p>
</div></span>
  
</li>

      
    </ul>
  
    <h2>
      Instance Method Summary
      <small><a href="#" class="summary_toggle">collapse</a></small>
    </h2>

    <ul class="summary">
      
        <li class="public ">
  <span class="summary_signature">
    
      <a href="#add-instance_method" title="#add (instance method)">#<strong>add</strong>(wave_type = WAVE_RECT, resolution = 1000)  &#x21d2; Object </a>
    

    
  </span>
  
  
  
  
  
  
  

  
    <span class="summary_desc"><div class='inline'></div></span>
  
</li>

      
    </ul>
  


  
  
  
  
  
  
  
  
  <h3 class="inherited">Methods inherited from <span class='object_link'><a href="Sound.html" title="DXOpal::Sound (class)">Sound</a></span></h3>
  <p class="inherited"><span class='object_link'><a href="Sound.html#audio_context-class_method" title="DXOpal::Sound.audio_context (method)">audio_context</a></span>, <span class='object_link'><a href="Sound.html#initialize-instance_method" title="DXOpal::Sound#initialize (method)">#initialize</a></span>, <span class='object_link'><a href="Sound.html#play-instance_method" title="DXOpal::Sound#play (method)">#play</a></span>, <span class='object_link'><a href="Sound.html#stop-instance_method" title="DXOpal::Sound#stop (method)">#stop</a></span></p>

  
  
  
  
  
  
  
  
  <h3 class="inherited">Methods inherited from <span class='object_link'><a href="RemoteResource.html" title="DXOpal::RemoteResource (class)">RemoteResource</a></span></h3>
  <p class="inherited"><span class='object_link'><a href="RemoteResource.html#[]-class_method" title="DXOpal::RemoteResource.[] (method)">[]</a></span>, <span class='object_link'><a href="RemoteResource.html#_klass_name-class_method" title="DXOpal::RemoteResource._klass_name (method)">_klass_name</a></span>, <span class='object_link'><a href="RemoteResource.html#_load_resources-class_method" title="DXOpal::RemoteResource._load_resources (method)">_load_resources</a></span>, <span class='object_link'><a href="RemoteResource.html#add_class-class_method" title="DXOpal::RemoteResource.add_class (method)">add_class</a></span>, <span class='object_link'><a href="RemoteResource.html#register-class_method" title="DXOpal::RemoteResource.register (method)">register</a></span></p>
<div id="constructor_details" class="method_details_list">
  <h2>Constructor Details</h2>
  
    <p class="notice">This class inherits a constructor from <span class='object_link'><a href="Sound.html#initialize-instance_method" title="DXOpal::Sound#initialize (method)">DXOpal::Sound</a></span></p>
  
</div>


  <div id="class_method_details" class="method_details_list">
    <h2>Class Method Details</h2>

    
      <div class="method_details first">
  <h3 class="signature first" id="_load-class_method">
  
    .<strong>_load</strong>(time, wave_type = WAVE_RECT, resolution = 1000, &amp;block)  &#x21d2; <tt>Object</tt> 
  

  

  
</h3><div class="docstring">
  <div class="discussion">
    
<p>time : Total number of ticks</p>

<pre class="code ruby"><code class="ruby">When resolution=1000(default), `time` is equivalent to the 
total length of the sound in milliseconds.</code></pre>

<p>wave_type : Type of wave form resolution : Number of ticks per second block
: Should return [freq(0~44100), volume(0~255)]</p>


  </div>
</div>
<div class="tags">
  

</div><table class="source_code">
  <tr>
    <td>
      <pre class="lines">


28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81</pre>
    </td>
    <td>
      <pre class="code"><span class="info file"># File 'opal/dxopal/sound_effect.rb', line 28</span>

<span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid__load'>_load</span><span class='lparen'>(</span><span class='id identifier rubyid_time'>time</span><span class='comma'>,</span> <span class='id identifier rubyid_wave_type'>wave_type</span><span class='op'>=</span><span class='const'>WAVE_RECT</span><span class='comma'>,</span> <span class='id identifier rubyid_resolution'>resolution</span><span class='op'>=</span><span class='int'>1000</span><span class='comma'>,</span> <span class='op'>&amp;</span><span class='id identifier rubyid_block'>block</span><span class='rparen'>)</span>
  <span class='id identifier rubyid_snd'>snd</span> <span class='op'>=</span> <span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>(soundeffect)</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
  <span class='id identifier rubyid_snd_promise'>snd_promise</span> <span class='op'>=</span> <span class='backtick'>%x{</span><span class='tstring_content'>
    new Promise(function(resolve, reject){
      var n_channels = 1;
      var context = </span><span class='embexpr_beg'>#{</span><span class='const'><span class='object_link'><a href="Sound.html" title="DXOpal::Sound (class)">Sound</a></span></span><span class='period'>.</span><span class='id identifier rubyid_audio_context'><span class='object_link'><a href="Sound.html#audio_context-class_method" title="DXOpal::Sound.audio_context (method)">audio_context</a></span></span><span class='embexpr_end'>}</span><span class='tstring_content'>;
      var n_ticks = </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_time'>time</span><span class='embexpr_end'>}</span><span class='tstring_content'>;
      var totalSeconds = </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_time'>time</span> <span class='op'>/</span> <span class='id identifier rubyid_resolution'>resolution</span><span class='embexpr_end'>}</span><span class='tstring_content'>;
      var valuesPerSecond = context.sampleRate;
      var n_values = totalSeconds * valuesPerSecond;
      var myArrayBuffer = context.createBuffer(n_channels, n_values, valuesPerSecond);
      var values = myArrayBuffer.getChannelData(0);
      var n = 0;
      for (var i = 0; i &lt; n_ticks; i++) {
        var ret = </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_block'>block</span><span class='period'>.</span><span class='id identifier rubyid_call'>call</span><span class='embexpr_end'>}</span><span class='tstring_content'>;
        var freq = ret[0], volume = ret[1];
        if (freq &lt; 0) freq = 0;
        if (freq &gt; 44100) freq = 44100;
        if (volume &lt; 0) volume = 0;
        if (volume &gt; 255) volume = 255;
        var vol = volume / 255;   // 0.0~1.0

        var period = valuesPerSecond * 1 / freq;
        for (; n &lt; ((i+1) / n_ticks * n_values); n++) {
          var phase = (n % period) / period; // 0.0~1.0
          var value; // -1.0~1.0
          switch(</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_wave_type'>wave_type</span><span class='embexpr_end'>}</span><span class='tstring_content'>) {
          case &quot;sine&quot;:
            value = Math.sin(2 * Math.PI * phase) * 2 - 1;
            break;
          case &quot;sawtooth&quot;:
            value = phase * 2 - 1;
            break;
          case &quot;triangle&quot;:
            value = phase &lt; 0.25 ?  0+phase*4 :
                    phase &lt; 0.5  ?  1-(phase-0.25)*4 :
                    phase &lt; 0.75 ?  0-(phase-0.5)*4 :
                                   -1+(phase-0.75)*4;
            break;
          case &quot;square&quot;:
            value = (phase &lt; 0.5 ? 1 : -1);
            break;
          default:
            </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_raise'>raise</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unknown wave_type: </span><span class='tstring_end'>&quot;</span></span> <span class='op'>+</span> <span class='id identifier rubyid_wave_type'>wave_type</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span><span class='embexpr_end'>}</span><span class='tstring_content'>;
          }
          values[n] = value * vol;
        }
      }
      snd[&#39;$decoded=&#39;](myArrayBuffer);
      resolve();
    });
  </span><span class='tstring_end'>}</span></span>
  <span class='kw'>return</span> <span class='id identifier rubyid_snd'>snd</span><span class='comma'>,</span> <span class='id identifier rubyid_snd_promise'>snd_promise</span>
<span class='kw'>end</span></pre>
    </td>
  </tr>
</table>
</div>
    
  </div>

  <div id="instance_method_details" class="method_details_list">
    <h2>Instance Method Details</h2>

    
      <div class="method_details first">
  <h3 class="signature first" id="add-instance_method">
  
    #<strong>add</strong>(wave_type = WAVE_RECT, resolution = 1000)  &#x21d2; <tt>Object</tt> 
  

  

  
</h3><table class="source_code">
  <tr>
    <td>
      <pre class="lines">


83
84
85</pre>
    </td>
    <td>
      <pre class="code"><span class="info file"># File 'opal/dxopal/sound_effect.rb', line 83</span>

<span class='kw'>def</span> <span class='id identifier rubyid_add'>add</span><span class='lparen'>(</span><span class='id identifier rubyid_wave_type'>wave_type</span><span class='op'>=</span><span class='const'>WAVE_RECT</span><span class='comma'>,</span> <span class='id identifier rubyid_resolution'>resolution</span><span class='op'>=</span><span class='int'>1000</span><span class='rparen'>)</span>
  <span class='const'>TODO</span>
<span class='kw'>end</span></pre>
    </td>
  </tr>
</table>
</div>
    
  </div>

</div>

      <div id="footer">
  Generated on Wed May 16 19:58:24 2018 by
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
  0.9.12 (ruby-2.4.2).
</div>

    </div>
  </body>
</html>