esaruoho / org.lackluster.Paketti.xrnx

Quality-of-Life (QoL) Workflow suite of tools for Renoise written with LUA - Continually ingesting and porting features from other tracker software (Impulse Tracker, Scream Tracker, ModPlugTracker, PlayerPro etc)
Other
16 stars 0 forks source link

Reprint on current instrument with FX #356

Open tkna91 opened 1 month ago

tkna91 commented 1 month ago

I noticed today, isn't this mostly achieved with "Render To Sample"? In other words, it seems to me that there is nothing wrong with the standard feature itself. It appears that this could be efficient with Paketti in the way that AFX has pointed out. What do you think?

https://github.com/user-attachments/assets/11fd9c20-d11e-40ad-b362-a5e27a21fd20

Perhaps the following steps could be taken?

  1. add a new pattern with any number of lines next to the current pattern
  2. add C4 to the beginning of that pattern
  3. Render Pattern to Sample that pattern
  4. delete the pattern
  5. delete the original Instrument
  6. Change the newly created Instrument to the original Instrument number

Yeah, a simple test looks fine from an EQ perspective.

https://github.com/user-attachments/assets/128a494e-07bd-49e3-a5dc-bde56a889c0c

tkna91 commented 1 month ago

I'm not sure, but isn't this it?

options = {
  start_pos,     -- renoise.SongPos object. by default the song start.
  end_pos,       -- renoise.SongPos object. by default the song end.
  sample_rate,   -- one of 22050, 44100, 48000, 88200, 96000, 192000. \
                 -- by default the players current rate.
  bit_depth ,    -- number, one of 16, 24 or 32. by default 32.
  interpolation, -- string, one of 'default', 'precise'. by default default'.
  priority,      -- string, one "low", "realtime", "high". \
                 -- by default "high".
}

Parameter 'rendering_done_callback' is ONLY called when rendering has succeeded. You can do something with the file you've passed to the renderer here, like for example loading the file into a sample buffer.

renoise.song():render([options, ] filename, rendering_done_callback)
-> [boolean, error_message or nil]

https://files.renoise.com/xrnx/documentation/Renoise.Song.API.lua.html#h2_36

tkna91 commented 1 week ago

This also appears to be another standard feature.

https://tutorials.renoise.com/wiki/Sampler_Waveform#Process_Track_FX

  • TFX / SFX - (Renoise only) Apply the selected track/sample fx chain directly to the sample's waveform (applies both native and plugin effects). Note that this will not automatically extend the length of the sample for reverbs, delays etc. that last longer than the original sample.

https://github.com/user-attachments/assets/43a1eeef-8ff0-4a07-84c6-e40bdb9dd561

Indeed, although Note that this will not automatically extend the length of the sample for reverbs, delays etc. that last longer than the original sample. It seems to be able to print destructively quite well. In the case of reverbs, delays, etc., there is also the issue of how much of that will be left, and I feel that it is implemented quite well.

But should it be in the form of an API request, since it is not a shortcut key?

esaruoho commented 1 week ago

api request please. i can hack my way around it, somehow, by creating a new pattern, inputting notes to it, rendering it, and stuff, but it's not quite the same as having it as a api function.

i mean, it WILL work. but it'll be very twiddly.

tkna91 commented 1 week ago

And it seems to me that if we use pattern-based rendering as in the above post, we can print destructively with reverb and delay samples without any problems. This is assuming reverbs and delays, so it makes sense to implement.

esaruoho commented 1 week ago

yeah the tails will be there. won't be limited to "sample length = print with reverb = same sample length".

tkna91 commented 1 week ago

Yes, the length of the sample to be rendered may be specified in the following way

It seems to me that it could be fixed at the length of the current pattern. However, direct designation is also hard to discard.

tkna91 commented 1 week ago

Perhaps the “double the current pattern and render it in half, then delete the first half and use only the second half” method you spoke of sometime ago would be a good idea?

esaruoho commented 1 week ago

Am thinking exactly that yes. I hope tomorrow will be productive, I need to get below 100 tickets soon.

tkna91 commented 1 week ago

It appears to be even better because it also has the following advantages

esaruoho commented 1 week ago

@tkna91 can you specify what the difference is between SFX and TFX - the terms are not immediately obvious to me.

is sfx sample fx chain and tfx "track fx" aka track dsp stuff?

tkna91 commented 1 week ago

Yes, it is. It is track DSP and sample DSP.

20240904-033142_screenshot

image

erroreyes commented 2 days ago

(Sorry if I haven't read the entire thread but I think I got the gist of it)

Because it rubs me the wrong way to create a separate entry in a pattern in order to render a sample with effects and retain the tail, what I've done is create a tool that adds space at the end of a sample so that I can then render the sample with effect from the editor. The issue with that is that adding that extra space at the end of a sample takes a second to do, which is weird. It could be possible that I programmed the function wrongly, or it could be a limitation of the API, idk.

function add_silence()
    local buffer = renoise.song().selected_sample.sample_buffer
    local sr = buffer.sample_rate
    local bd = buffer.bit_depth
    local nc = buffer.number_of_channels
    local nf = buffer.number_of_frames
    -- len is the new length of the processed sample, which is the length of the original sample
    -- times some 'value' chosen by the user, for example selecting 4 from a dropdown menu
    local len = nf * value

    -- Temp table to hold the original sample data
    local tmpL = {}
    local tmpR = {}

    -- Save buffer to temp table
    for i = 1, nf do
        tmpL[i] = buffer:sample_data(LEFT, i)
        if nc == 2 then
            tmpR[i] = buffer:sample_data(RIGHT, i)
        end
    end

    -- Remove sample data from the buffer and set it with the orignal
    -- buffer's properties.
    buffer:create_sample_data(sr, bd, nc, len)

    -- Prepare the buffer for new sample data;
    -- Set sample data from the temp table to the current buffer;
    -- Finalize the buffer.
    buffer:prepare_sample_data_changes()

    for i = 1, len do
        if i <= nf then
            buffer:set_sample_data(LEFT, i, tmpL[i])
            if nc == 2 then buffer:set_sample_data(RIGHT, i, tmpR[i]) end                
        else
            buffer:set_sample_data(LEFT, i, 0)
            if nc == 2 then buffer:set_sample_data(RIGHT, i, 0) end 
        end
    end

    buffer:finalize_sample_data_changes()
end

Peek 2024-09-11 15-33

I also know that there is a tool shared somewhere in the forum that allows to do the 'add note -> render to new sample/instrument -> remove note' from one go, but I can't remember what it is called.