fixes imprecise SinOsc
This commit is contained in:
parent
f240f3fbf6
commit
afe4e0d8be
2 changed files with 14 additions and 8 deletions
13
src/nodes.jl
13
src/nodes.jl
|
@ -29,10 +29,15 @@ SinOsc() = SinOsc(440)
|
|||
export SinOsc
|
||||
|
||||
function render(node::SinOscRenderer, device_input::AudioBuf, info::DeviceInfo)
|
||||
phase = AudioSample[0:(info.buf_size-1)] * 2pi * node.freq / info.sample_rate
|
||||
phase .+= node.phase
|
||||
node.phase = phase[end] + 2pi * node.freq / info.sample_rate
|
||||
return sin(phase)
|
||||
outbuf = Array(AudioSample, info.buf_size)
|
||||
phase = node.phase
|
||||
dt = 1/info.sample_rate
|
||||
for i in 1:info.buf_size
|
||||
outbuf[i] = sin(2pi*node.freq*phase)
|
||||
phase += dt
|
||||
end
|
||||
node.phase = phase
|
||||
return outbuf
|
||||
end
|
||||
|
||||
#### AudioMixer ####
|
||||
|
|
|
@ -56,13 +56,14 @@ render_output = render(mix, dev_input, test_info)
|
|||
|
||||
info("Testing SinOSC...")
|
||||
freq = 440
|
||||
t = linspace(0,
|
||||
(test_info.buf_size-1) / test_info.sample_rate,
|
||||
test_info.buf_size)
|
||||
# note that this range includes the end, which is why there are sample_rate+1 samples
|
||||
t = linspace(0, 1, test_info.sample_rate+1)
|
||||
test_vect = convert(AudioBuf, sin(2pi * t * freq))
|
||||
osc = SinOsc(freq)
|
||||
render_output = render(osc, dev_input, test_info)
|
||||
@test_approx_eq(render_output, test_vect)
|
||||
@test render_output == test_vect[1:test_info.buf_size]
|
||||
render_output = render(osc, dev_input, test_info)
|
||||
@test render_output == test_vect[test_info.buf_size+1:2*test_info.buf_size]
|
||||
stop(osc)
|
||||
render_output = render(osc, dev_input, test_info)
|
||||
@test render_output == AudioSample[]
|
||||
|
|
Loading…
Reference in a new issue