class DXOpal::SoundEffect
User-generated sound
Example:
v = 80 SoundEffect.register(:sound1, 4000, WAVE_RECT, 5000) do v = v - 0.03 [rand(300), v] end
This will generate a sound with WebAudio.
Public Class Methods
_load(time, wave_type=WAVE_RECT, resolution=1000, &block)
click to toggle source
time : Total number of ticks
When resolution=1000(default), `time` is equivalent to the total length of the sound in milliseconds.
wave_type : Type of wave form resolution : Number of ticks per second block : Should return [freq(0~44100), volume(0~255)]
# File lib/dxopal/sound_effect.rb, line 28 def self._load(time, wave_type=WAVE_RECT, resolution=1000, &block) snd = new("(soundeffect)") snd_promise = %x{ new Promise(function(resolve, reject){ var n_channels = 1; var context = #{Sound.audio_context}; var n_ticks = #{time}; var totalSeconds = #{time / resolution}; 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 < n_ticks; i++) { var ret = #{block.call}; var freq = ret[0], volume = ret[1]; if (freq < 0) freq = 0; if (freq > 44100) freq = 44100; if (volume < 0) volume = 0; if (volume > 255) volume = 255; var vol = volume / 255; // 0.0~1.0 var period = valuesPerSecond * 1 / freq; for (; n < ((i+1) / n_ticks * n_values); n++) { var phase = (n % period) / period; // 0.0~1.0 var value; // -1.0~1.0 switch(#{wave_type}) { case "sine": value = Math.sin(2 * Math.PI * phase) * 2 - 1; break; case "sawtooth": value = phase * 2 - 1; break; case "triangle": value = phase < 0.25 ? 0+phase*4 : phase < 0.5 ? 1-(phase-0.25)*4 : phase < 0.75 ? 0-(phase-0.5)*4 : -1+(phase-0.75)*4; break; case "square": value = (phase < 0.5 ? 1 : -1); break; default: #{raise "unknown wave_type: " + wave_type.inspect}; } values[n] = value * vol; } } snd['$decoded='](myArrayBuffer); resolve(); }); } return snd, snd_promise end
Public Instance Methods
add(wave_type=WAVE_RECT, resolution=1000)
click to toggle source
# File lib/dxopal/sound_effect.rb, line 83 def add(wave_type=WAVE_RECT, resolution=1000) TODO end