Is it possible to apply a fade to the end of a sample (like done in the sample editor) through the API?
I want to automatically try and remove all the clicks from the ends of destructively rendered slices.
Is it possible to apply a fade to the end of a sample (like done in the sample editor) through the API?
I want to automatically try and remove all the clicks from the ends of destructively rendered slices.
If I’m not mistaken, you can loop through the last n samples, and multiply their value by (n-i)/n (where i is the iteration). For fades in, you just do the inverse.
On my phone now, so coding it out is a pain, but if you need when I get back to a computer I can show you in code.
Edit : fixed erroneous logic
Ok, guessed I might need to do that thankyou.
Is there definitely not a means of selecting sample data and applying the Fade In/Fade Out (or indeed Maximise, Smooth etc)?
function fade_sample (sample, fade_length, bool_fade_in)
--[[--------------------|
--]]
bool_fade_in = (bool_fade_in ~= false) -- default: fade out
fade_length = fade_length or 15 -- frames
local b = sample.sample_buffer
local sample_length = b.number_of_frames
local data = 0
for c = 1, b.number_of_channels do
if bool_fade_in then
-- fade in
for n = 1, fade_length do
if n <= sample_length then
data = b:sample_data(c, n)
data = ((n - 1) / fade_length) * data -- linear fade in
b:set_sample_data(c, n, data)
end
end
else
-- fade out
for n = 1, fade_length do
local curr_frame = sample_length - fade_length + n
if n <= sample_length then
data = b:sample_data(c, curr_frame)
data = (1 - (n / fade_length)) * data -- linear fade out
b:set_sample_data(c, curr_frame, data)
end
end
end
end
return sample
end
--[[=====================================
Usage:
Fade IN selected sample over 25 frames (~0.5 ms):
fade_sample( renoise.song().selected_sample, 25, true )
Fade OUT selected sample over 500 frames (~10 ms):
fade_sample( renoise.song().selected_sample, 500 )
--===================================--]]
If you wanted to figure out fade times in ms instead of samples, you could do something like this:
function ms_to_frames( sample, milliseconds )
local frame_length_in_ms = (1000 / sample.sample_buffer.sample_rate)
return math.ceil( milliseconds / frame_length_in_ms )
end
Happy hacking!
As far as I know, there’s nothing in the API for calling these functions directly, so you’d need to roll your own.
Maximizing/normalizing a sample is easy enough: loop through the sample to find the highest value, then multiply every frame’s value in the sample by 1/highest_sample_value
to set the sample’s peak to 1 (0dB).
For smoothing, I guess you could look at every odd sample and set the even samples’ values to the midpoint/average between the surrounding odd samples. Or you could pick every n samples to read values from and then evenly ramp the values of the samples between them. The greater the value for n
, the “mushier” the sample smoothing.
Honestly, you could spend days writing algorithms here to get the effect you want, but these should basically work without having to do a terrible amount of math.
Thanks very much for this. Saved me a fair bit of work man! Probably should get this stuffed in a tool!
This topic was automatically closed 2 days after the last reply. New replies are no longer allowed.