mirror of
https://github.com/nucular/sfxrlua.git
synced 2024-12-24 18:44:20 +00:00
Mighty API change!
This commit is contained in:
parent
d0a644ecbc
commit
f86be65536
@ -48,5 +48,4 @@ are of less priority or it is unknown if they should be handled as a bug.
|
|||||||
- ! The Lowpass and Highpass filters sounds distorted.
|
- ! The Lowpass and Highpass filters sounds distorted.
|
||||||
- ! Changing is broken when the amount is < 0.
|
- ! Changing is broken when the amount is < 0.
|
||||||
- Sometimes (sometimes!) the generator yields nil, which causes setSample to fail.
|
- Sometimes (sometimes!) the generator yields nil, which causes setSample to fail.
|
||||||
- ? `Sound.repeatSpeed`, `Sound.waveType` and `Sound.frequency.deltaSlide` should be lowercased instead of camelcased.
|
|
||||||
- ? Everything seems to be pitched slightly higher than at the original (floating point error?)
|
- ? Everything seems to be pitched slightly higher than at the original (floating point error?)
|
||||||
|
81
sfxr.lua
81
sfxr.lua
@ -95,9 +95,11 @@ function sfxr.Sound:__init()
|
|||||||
self.highpass = {}
|
self.highpass = {}
|
||||||
|
|
||||||
-- Phaser and noise buffers
|
-- Phaser and noise buffers
|
||||||
self.phaserBuffer = {}
|
self.phaserbuffer = {}
|
||||||
self.noiseBuffer = {}
|
self.noisebuffer = {}
|
||||||
|
|
||||||
|
-- These won't be affected by Sound.resetParameters()
|
||||||
|
self.supersamples = 8
|
||||||
self.volume.master = 0.5
|
self.volume.master = 0.5
|
||||||
self.volume.sound = 0.5
|
self.volume.sound = 0.5
|
||||||
|
|
||||||
@ -107,9 +109,8 @@ end
|
|||||||
|
|
||||||
function sfxr.Sound:resetParameters()
|
function sfxr.Sound:resetParameters()
|
||||||
-- Set all parameters to the default values
|
-- Set all parameters to the default values
|
||||||
self.repeatSpeed = 0.0
|
self.repeatspeed = 0.0
|
||||||
self.waveType = sfxr.SQUARE
|
self.wavetype = sfxr.SQUARE
|
||||||
self.superSamples = 8
|
|
||||||
|
|
||||||
self.envelope.attack = 0.0
|
self.envelope.attack = 0.0
|
||||||
self.envelope.sustain = 0.3
|
self.envelope.sustain = 0.3
|
||||||
@ -119,7 +120,7 @@ function sfxr.Sound:resetParameters()
|
|||||||
self.frequency.start = 0.3
|
self.frequency.start = 0.3
|
||||||
self.frequency.min = 0.0
|
self.frequency.min = 0.0
|
||||||
self.frequency.slide = 0.0
|
self.frequency.slide = 0.0
|
||||||
self.frequency.deltaSlide = 0.0
|
self.frequency.dslide = 0.0
|
||||||
|
|
||||||
self.vibrato.depth = 0.0
|
self.vibrato.depth = 0.0
|
||||||
self.vibrato.speed = 0.0
|
self.vibrato.speed = 0.0
|
||||||
@ -144,11 +145,11 @@ end
|
|||||||
function sfxr.Sound:resetBuffers()
|
function sfxr.Sound:resetBuffers()
|
||||||
-- Reset the sample buffers
|
-- Reset the sample buffers
|
||||||
for i=1, 1025 do
|
for i=1, 1025 do
|
||||||
self.phaserBuffer[i] = 0
|
self.phaserbuffer[i] = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
for i=1, 33 do
|
for i=1, 33 do
|
||||||
self.noiseBuffer[i] = random(-1, 1)
|
self.noisebuffer[i] = random(-1, 1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -172,7 +173,7 @@ function sfxr.Sound:generate(freq, bits)
|
|||||||
period = trunc(fperiod)
|
period = trunc(fperiod)
|
||||||
|
|
||||||
slide = 1.0 - self.frequency.slide^3 * 0.01
|
slide = 1.0 - self.frequency.slide^3 * 0.01
|
||||||
dslide = -self.frequency.deltaSlide^3 * 0.000001
|
dslide = -self.frequency.dslide^3 * 0.000001
|
||||||
|
|
||||||
square_duty = 0.5 - self.duty.ratio * 0.5
|
square_duty = 0.5 - self.duty.ratio * 0.5
|
||||||
square_slide = -self.duty.sweep * 0.00005
|
square_slide = -self.duty.sweep * 0.00005
|
||||||
@ -226,8 +227,8 @@ function sfxr.Sound:generate(freq, bits)
|
|||||||
local vib_amp = self.vibrato.depth * 0.5
|
local vib_amp = self.vibrato.depth * 0.5
|
||||||
|
|
||||||
local rep_time = 0
|
local rep_time = 0
|
||||||
local rep_limit = trunc((1 - self.repeatSpeed)^2 * 20000 + 32)
|
local rep_limit = trunc((1 - self.repeatspeed)^2 * 20000 + 32)
|
||||||
if self.repeatSpeed == 0 then
|
if self.repeatspeed == 0 then
|
||||||
rep_limit = 0
|
rep_limit = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -308,7 +309,7 @@ function sfxr.Sound:generate(freq, bits)
|
|||||||
-- And finally the actual tone generation and supersampling
|
-- And finally the actual tone generation and supersampling
|
||||||
|
|
||||||
local ssample = 0
|
local ssample = 0
|
||||||
for si = 0, self.superSamples do
|
for si = 0, self.supersamples do
|
||||||
local sample = 0
|
local sample = 0
|
||||||
|
|
||||||
phase = phase + 1
|
phase = phase + 1
|
||||||
@ -317,9 +318,9 @@ function sfxr.Sound:generate(freq, bits)
|
|||||||
if phase >= period then
|
if phase >= period then
|
||||||
--phase = 0
|
--phase = 0
|
||||||
phase = phase % period
|
phase = phase % period
|
||||||
if self.waveType == sfxr.NOISE then
|
if self.wavetype == sfxr.NOISE then
|
||||||
for i = 1, 33 do
|
for i = 1, 33 do
|
||||||
self.noiseBuffer[i] = random(-1, 1)
|
self.noisebuffer[i] = random(-1, 1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -329,21 +330,21 @@ function sfxr.Sound:generate(freq, bits)
|
|||||||
-- update the base waveform
|
-- update the base waveform
|
||||||
local fp = phase / period
|
local fp = phase / period
|
||||||
|
|
||||||
if self.waveType == sfxr.SQUARE then
|
if self.wavetype == sfxr.SQUARE then
|
||||||
if fp < square_duty then
|
if fp < square_duty then
|
||||||
sample = 0.5
|
sample = 0.5
|
||||||
else
|
else
|
||||||
sample = -0.5
|
sample = -0.5
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif self.waveType == sfxr.SAWTOOTH then
|
elseif self.wavetype == sfxr.SAWTOOTH then
|
||||||
sample = 1 - fp * 2
|
sample = 1 - fp * 2
|
||||||
|
|
||||||
elseif self.waveType == sfxr.SINE then
|
elseif self.wavetype == sfxr.SINE then
|
||||||
sample = math.sin(fp * 2 * math.pi)
|
sample = math.sin(fp * 2 * math.pi)
|
||||||
|
|
||||||
elseif self.waveType == sfxr.NOISE then
|
elseif self.wavetype == sfxr.NOISE then
|
||||||
sample = self.noiseBuffer[trunc(phase * 32 / period) % 32 + 1]
|
sample = self.noisebuffer[trunc(phase * 32 / period) % 32 + 1]
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Apply the lowpass filter to the sample
|
-- Apply the lowpass filter to the sample
|
||||||
@ -367,8 +368,8 @@ function sfxr.Sound:generate(freq, bits)
|
|||||||
|
|
||||||
-- Apply the phaser to the sample
|
-- Apply the phaser to the sample
|
||||||
|
|
||||||
self.phaserBuffer[bit.band(ipp, 1023) + 1] = sample
|
self.phaserbuffer[bit.band(ipp, 1023) + 1] = sample
|
||||||
sample = sample + self.phaserBuffer[bit.band(ipp - iphase + 1024, 1023) + 1]
|
sample = sample + self.phaserbuffer[bit.band(ipp - iphase + 1024, 1023) + 1]
|
||||||
ipp = bit.band(ipp + 1, 1023)
|
ipp = bit.band(ipp + 1, 1023)
|
||||||
|
|
||||||
-- Accumulation and envelope application
|
-- Accumulation and envelope application
|
||||||
@ -376,7 +377,7 @@ function sfxr.Sound:generate(freq, bits)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Apply the volumes
|
-- Apply the volumes
|
||||||
ssample = (ssample / self.superSamples) * self.volume.master
|
ssample = (ssample / self.supersamples) * self.volume.master
|
||||||
ssample = (ssample * 2) * self.volume.sound
|
ssample = (ssample * 2) * self.volume.sound
|
||||||
|
|
||||||
-- Hard limit
|
-- Hard limit
|
||||||
@ -460,7 +461,7 @@ function sfxr.Sound:randomize(seed)
|
|||||||
if seed then setseed(seed) end
|
if seed then setseed(seed) end
|
||||||
self:resetParameters()
|
self:resetParameters()
|
||||||
if maybe() then
|
if maybe() then
|
||||||
self.repeatSpeed = random(0, 1)
|
self.repeatspeed = random(0, 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
if maybe() then
|
if maybe() then
|
||||||
@ -475,7 +476,7 @@ function sfxr.Sound:randomize(seed)
|
|||||||
elseif self.frequency.start < 0.2 and self.frequency.slide <-0.05 then
|
elseif self.frequency.start < 0.2 and self.frequency.slide <-0.05 then
|
||||||
self.frequency.slide = -self.frequency.slide
|
self.frequency.slide = -self.frequency.slide
|
||||||
end
|
end
|
||||||
self.frequency.deltaSlide = random(-1, 1)^3
|
self.frequency.dslide = random(-1, 1)^3
|
||||||
|
|
||||||
self.duty.ratio = random(-1, 1)
|
self.duty.ratio = random(-1, 1)
|
||||||
self.duty.sweep = random(-1, 1)^3
|
self.duty.sweep = random(-1, 1)^3
|
||||||
@ -520,7 +521,7 @@ function sfxr.Sound:mutate(amount, seed, changeFreq)
|
|||||||
if changeFreq == true then
|
if changeFreq == true then
|
||||||
if maybe(b) then self.frequency.start = self.frequency.start + random(-a, a) end
|
if maybe(b) then self.frequency.start = self.frequency.start + random(-a, a) end
|
||||||
if maybe(b) then self.frequency.slide = self.frequency.slide + random(-a, a) end
|
if maybe(b) then self.frequency.slide = self.frequency.slide + random(-a, a) end
|
||||||
if maybe(b) then self.frequency.deltaSlide = self.frequency.deltaSlide + random(-a, a) end
|
if maybe(b) then self.frequency.dslide = self.frequency.dslide + random(-a, a) end
|
||||||
end
|
end
|
||||||
|
|
||||||
if maybe(b) then self.duty.ratio = self.duty.ratio + random(-a, a) end
|
if maybe(b) then self.duty.ratio = self.duty.ratio + random(-a, a) end
|
||||||
@ -547,7 +548,7 @@ function sfxr.Sound:mutate(amount, seed, changeFreq)
|
|||||||
if maybe(b) then self.change.speed = self.change.speed + random(-a, a) end
|
if maybe(b) then self.change.speed = self.change.speed + random(-a, a) end
|
||||||
if maybe(b) then self.change.amount = self.change.amount + random(-a, a) end
|
if maybe(b) then self.change.amount = self.change.amount + random(-a, a) end
|
||||||
|
|
||||||
if maybe(b) then self.repeatSpeed = self.repeatSpeed + random(-a, a) end
|
if maybe(b) then self.repeatspeed = self.repeatspeed + random(-a, a) end
|
||||||
end
|
end
|
||||||
|
|
||||||
function sfxr.Sound:randomPickup(seed)
|
function sfxr.Sound:randomPickup(seed)
|
||||||
@ -568,9 +569,9 @@ end
|
|||||||
function sfxr.Sound:randomLaser(seed)
|
function sfxr.Sound:randomLaser(seed)
|
||||||
if seed then setseed(seed) end
|
if seed then setseed(seed) end
|
||||||
self:resetParameters()
|
self:resetParameters()
|
||||||
self.waveType = trunc(random(0, 2)) + 1
|
self.wavetype = trunc(random(0, 2)) + 1
|
||||||
if self.waveType == sfxr.SINE and maybe() then
|
if self.wavetype == sfxr.SINE and maybe() then
|
||||||
self.waveType = trunc(random(0, 1)) + 1
|
self.wavetype = trunc(random(0, 1)) + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
if maybe(2) then
|
if maybe(2) then
|
||||||
@ -612,7 +613,7 @@ end
|
|||||||
function sfxr.Sound:randomExplosion(seed)
|
function sfxr.Sound:randomExplosion(seed)
|
||||||
if seed then setseed(seed) end
|
if seed then setseed(seed) end
|
||||||
self:resetParameters()
|
self:resetParameters()
|
||||||
self.waveType = sfxr.NOISE
|
self.wavetype = sfxr.NOISE
|
||||||
|
|
||||||
if maybe() then
|
if maybe() then
|
||||||
self.frequency.start = random(0.1, 0.5)
|
self.frequency.start = random(0.1, 0.5)
|
||||||
@ -627,7 +628,7 @@ function sfxr.Sound:randomExplosion(seed)
|
|||||||
self.frequency.slide = 0
|
self.frequency.slide = 0
|
||||||
end
|
end
|
||||||
if maybe(2) then
|
if maybe(2) then
|
||||||
self.repeatSpeed = random(0.3, 0.8)
|
self.repeatspeed = random(0.3, 0.8)
|
||||||
end
|
end
|
||||||
|
|
||||||
self.envelope.attack = 0
|
self.envelope.attack = 0
|
||||||
@ -652,7 +653,7 @@ function sfxr.Sound:randomPowerup(seed)
|
|||||||
if seed then setseed(seed) end
|
if seed then setseed(seed) end
|
||||||
self:resetParameters()
|
self:resetParameters()
|
||||||
if maybe() then
|
if maybe() then
|
||||||
self.waveType = sfxr.SAWTOOTH
|
self.wavetype = sfxr.SAWTOOTH
|
||||||
else
|
else
|
||||||
self.duty.ratio = random(0, 0.6)
|
self.duty.ratio = random(0, 0.6)
|
||||||
end
|
end
|
||||||
@ -660,7 +661,7 @@ function sfxr.Sound:randomPowerup(seed)
|
|||||||
if maybe() then
|
if maybe() then
|
||||||
self.frequency.start = random(0.2, 0.5)
|
self.frequency.start = random(0.2, 0.5)
|
||||||
self.frequency.slide = random(0.1, 0.5)
|
self.frequency.slide = random(0.1, 0.5)
|
||||||
self.repeatSpeed = random(0.4, 0.8)
|
self.repeatspeed = random(0.4, 0.8)
|
||||||
else
|
else
|
||||||
self.frequency.start = random(0.2, 0.5)
|
self.frequency.start = random(0.2, 0.5)
|
||||||
self.frequency.slide = random(0.1, 0.5)
|
self.frequency.slide = random(0.1, 0.5)
|
||||||
@ -677,11 +678,11 @@ end
|
|||||||
function sfxr.Sound:randomHit(seed)
|
function sfxr.Sound:randomHit(seed)
|
||||||
if seed then setseed(seed) end
|
if seed then setseed(seed) end
|
||||||
self:resetParameters()
|
self:resetParameters()
|
||||||
self.waveType = trunc(random(0, 2)) + 1
|
self.wavetype = trunc(random(0, 2)) + 1
|
||||||
|
|
||||||
if self.waveType == sfxr.SINE then
|
if self.wavetype == sfxr.SINE then
|
||||||
self.waveType = 3
|
self.wavetype = 3
|
||||||
elseif self.waveType == sfxr.SQUARE then
|
elseif self.wavetype == sfxr.SQUARE then
|
||||||
self.duty.ratio = random(0, 0.6)
|
self.duty.ratio = random(0, 0.6)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -699,7 +700,7 @@ end
|
|||||||
function sfxr.Sound:randomJump(seed)
|
function sfxr.Sound:randomJump(seed)
|
||||||
if seed then setseed(seed) end
|
if seed then setseed(seed) end
|
||||||
self:resetParameters()
|
self:resetParameters()
|
||||||
self.waveType = sfxr.SQUARE
|
self.wavetype = sfxr.SQUARE
|
||||||
|
|
||||||
self.duty.value = random(0, 0.6)
|
self.duty.value = random(0, 0.6)
|
||||||
self.frequency.cutoff = random(0.3, 0.6)
|
self.frequency.cutoff = random(0.3, 0.6)
|
||||||
@ -720,9 +721,9 @@ end
|
|||||||
function sfxr.Sound:randomBlip(seed)
|
function sfxr.Sound:randomBlip(seed)
|
||||||
if seed then setseed(seed) end
|
if seed then setseed(seed) end
|
||||||
self:resetParameters()
|
self:resetParameters()
|
||||||
self.waveType = trunc(random(0, 1)) + 1
|
self.wavetype = trunc(random(0, 1)) + 1
|
||||||
|
|
||||||
if self.waveType == 0 then
|
if self.wavetype == 0 then
|
||||||
self.duty.ratio = random(0, 0.6)
|
self.duty.ratio = random(0, 0.6)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user