Difference between revisions of "SoundData:setSample"
(add Example: Play a sine wave) |
m |
||
(3 intermediate revisions by one other user not shown) | |||
Line 20: | Line 20: | ||
=== Arguments === | === Arguments === | ||
{{param|number|i|An integer value specifying the position of the sample (starting at 0).}} | {{param|number|i|An integer value specifying the position of the sample (starting at 0).}} | ||
− | {{param|number|channel|The index of the channel to set within the given sample.}} | + | {{param|number|channel|The index of the channel to set within the given sample (starting at 1). For stereo, 1 is left channel and 2 is right channel.}} |
{{param|number|sample|The normalized samplepoint (range -1.0 to 1.0).}} | {{param|number|sample|The normalized samplepoint (range -1.0 to 1.0).}} | ||
=== Returns === | === Returns === | ||
Nothing. | Nothing. | ||
− | == Example: | + | == Example: Generate notes with a sine wave == |
<source lang="lua"> | <source lang="lua"> | ||
− | local samplerate = 44100 | + | local tau = math.pi * 2 |
− | local bits = 8 | + | local samplerate = 44100 -- Hz |
− | local channels = | + | local bits = 16 -- 8 bits results in very low quality sound |
− | local buffercount = | + | local channels = 2 -- löve only supports mono or stereo |
− | local qsource = love.audio.newQueueableSource(samplerate, bits, channels, buffercount) | + | local buffercount = 2 -- don't need too many buffers |
− | local buffer = love.sound.newSoundData( | + | local qsource = love.audio.newQueueableSource(samplerate, bits, channels, buffercount) |
− | local | + | local samplepoints = samplerate/10 -- how many numbers does one buffer hold |
+ | local buffer = love.sound.newSoundData(samplepoints, samplerate, bits, channels) | ||
+ | local phase = 0.0 | ||
+ | local frequency = 220.00 -- Hz | ||
+ | local amplitude = 0.5 -- 50% | ||
− | |||
− | |||
− | local function synth( | + | local function synth() |
− | + | phase = phase + (tau * frequency / samplerate) | |
− | return math.sin( | + | return math.sin(phase) * amplitude |
end | end | ||
function love.update(dt) | function love.update(dt) | ||
− | |||
− | |||
while qsource:getFreeBufferCount() > 0 do | while qsource:getFreeBufferCount() > 0 do | ||
− | for i = 0, | + | for i = 0, samplepoints - 1 do |
− | + | buffer:setSample(i, synth()) | |
− | buffer:setSample(i, | ||
end | end | ||
− | |||
qsource:queue(buffer) | qsource:queue(buffer) | ||
+ | qsource:play() | ||
end | end | ||
− | |||
end | end | ||
function love.keypressed(key) | function love.keypressed(key) | ||
− | if key == | + | if key == 'k' then |
− | + | frequency = frequency * 2^(1/12) | |
− | elseif key == | + | elseif key == 'j' then |
− | + | frequency = frequency * 2^(-1/12) | |
end | end | ||
end | end | ||
</source> | </source> | ||
− | |||
== See Also == | == See Also == |
Latest revision as of 13:47, 19 March 2022
Sets the value of the sample-point at the specified position. For stereo SoundData objects, the data from the left and right channels are interleaved in that order.
Contents
Function
Synopsis
SoundData:setSample( i, sample )
Arguments
number i
- An integer value specifying the position of the sample (starting at 0).
number sample
- The normalized samplepoint (range -1.0 to 1.0).
Returns
Nothing.
Function
Available since LÖVE 11.0 |
This variant is not supported in earlier versions. |
Sets the value of a sample using an explicit sample index instead of interleaving them in the sample position parameter.
Synopsis
SoundData:setSample( i, channel, sample )
Arguments
number i
- An integer value specifying the position of the sample (starting at 0).
number channel
- The index of the channel to set within the given sample (starting at 1). For stereo, 1 is left channel and 2 is right channel.
number sample
- The normalized samplepoint (range -1.0 to 1.0).
Returns
Nothing.
Example: Generate notes with a sine wave
local tau = math.pi * 2
local samplerate = 44100 -- Hz
local bits = 16 -- 8 bits results in very low quality sound
local channels = 2 -- löve only supports mono or stereo
local buffercount = 2 -- don't need too many buffers
local qsource = love.audio.newQueueableSource(samplerate, bits, channels, buffercount)
local samplepoints = samplerate/10 -- how many numbers does one buffer hold
local buffer = love.sound.newSoundData(samplepoints, samplerate, bits, channels)
local phase = 0.0
local frequency = 220.00 -- Hz
local amplitude = 0.5 -- 50%
local function synth()
phase = phase + (tau * frequency / samplerate)
return math.sin(phase) * amplitude
end
function love.update(dt)
while qsource:getFreeBufferCount() > 0 do
for i = 0, samplepoints - 1 do
buffer:setSample(i, synth())
end
qsource:queue(buffer)
qsource:play()
end
end
function love.keypressed(key)
if key == 'k' then
frequency = frequency * 2^(1/12)
elseif key == 'j' then
frequency = frequency * 2^(-1/12)
end
end
See Also
Other Languages
Dansk –
Deutsch –
English –
Español –
Français –
Indonesia –
Italiano –
Lietuviškai –
Magyar –
Nederlands –
Polski –
Português –
Română –
Slovenský –
Suomi –
Svenska –
Türkçe –
Česky –
Ελληνικά –
Български –
Русский –
Српски –
Українська –
עברית –
ไทย –
日本語 –
正體中文 –
简体中文 –
Tiếng Việt –
한국어
More info