Pattern Iterator
As a quick and efficient way to access the pattern data in phrases and the Renoise song, you can use the existing pattern iterators. Here are a few examples of how to use them.
See also API docs for renoise.PatternIterator.
Change notes in selection
changes all "C-4"s to "E-4" in the selection in the current pattern
local pattern_iter = renoise.song().pattern_iterator
local pattern_index = renoise.song().selected_pattern_index
for pos,line in pattern_iter:lines_in_pattern(pattern_index) do
for _,note_column in pairs(line.note_columns) do
if (note_column.is_selected and
note_column.note_string == "C-4") then
note_column.note_string = "E-4"
end
end
end
Generate a simple arp sequence
... repeating in the current pattern & track from line 0 to the pattern end
local pattern_iter = renoise.song().pattern_iterator
local pattern_index = renoise.song().selected_pattern_index
local track_index = renoise.song().selected_track_index
local instrument_index = renoise.song().selected_instrument_index
local EMPTY_VOLUME = renoise.PatternLine.EMPTY_VOLUME
local EMPTY_INSTRUMENT = renoise.PatternLine.EMPTY_INSTRUMENT
local arp_sequence = {
{note="C-4", instrument = instrument_index, volume = 0x20},
{note="E-4", instrument = instrument_index, volume = 0x40},
{note="G-4", instrument = instrument_index, volume = 0x80},
{note="OFF", instrument = EMPTY_INSTRUMENT, volume = EMPTY_VOLUME},
{note="G-4", instrument = instrument_index, volume = EMPTY_VOLUME},
{note="---", instrument = EMPTY_INSTRUMENT, volume = EMPTY_VOLUME},
{note="E-4", instrument = instrument_index, volume = 0x40},
{note="C-4", instrument = instrument_index, volume = 0x20},
}
for pos,line in pattern_iter:lines_in_pattern_track(pattern_index, track_index) do
if not table.is_empty(line.note_columns) then
local note_column = line:note_column(1)
note_column:clear()
local arp_index = math.mod(pos.line - 1, #arp_sequence) + 1
note_column.note_string = arp_sequence[arp_index].note
note_column.instrument_value = arp_sequence[arp_index].instrument
note_column.volume_value = arp_sequence[arp_index].volume
end
end
Hide empty volume, panning, and delay colums
for track_index, track in pairs(renoise.song().tracks) do
-- Set some bools
local found_volume = false
local found_panning = false
local found_delay = false
local found_sample_effects = false
-- Check whether or not this is a regular track
if
track.type ~= renoise.Track.TRACK_TYPE_MASTER and
track.type ~= renoise.Track.TRACK_TYPE_SEND
then
-- Iterate through the regular track
local iter = renoise.song().pattern_iterator:lines_in_track(track_index)
for _,line in iter do
-- Check whether or not the line is empty
if not line.is_empty then
-- Check each column on the line
for _,note_column in ipairs(line.note_columns) do
-- Check for volume
if note_column.volume_value ~= renoise.PatternLine.EMPTY_VOLUME then
found_volume = true
end
-- Check for panning
if note_column.panning_value ~= renoise.PatternLine.EMPTY_PANNING then
found_panning = true
end
-- Check for delay
if note_column.delay_value ~= renoise.PatternLine.EMPTY_DELAY then
found_delay = true
end
-- Check for sample effects
if note_column.effect_number_value ~= renoise.PatternLine.EMPTY_EFFECT_NUMBER then
found_sample_effects = true
end
if note_column.effect_amount_value ~= renoise.PatternLine.EMPTY_EFFECT_AMOUNT then
found_sample_effects = true
end
end
-- If we found something in all three vol, pan, and del
-- Then there's no point in continuing down the rest of the track
-- We break this loop and move on to the next track
if found_volume and found_panning and found_delay and found_sample_effects then
break
end
end
end
-- Set some properties
track.volume_column_visible = found_volume
track.panning_column_visible = found_panning
track.delay_column_visible = found_delay
track.sample_effects_column_visible = found_sample_effects
end
end