local group_settings = {
ten_octaves = {
name = "Octaves",
color = { 0xFF, 0xFF, 0xFF },
color_blend = 0,
collapsed = false,
tracks = {
{ name = "Oct 0", volume_column_visible = true, delay_column_visible = true, collapsed = false, color = { 0xFF,0xFF,0xFF }, color_blend = 5 },
{ name = "Oct 1", volume_column_visible = true, delay_column_visible = true, collapsed = true, color = { 0xFF,0xFF,0xFF }, color_blend = 15 },
{ name = "Oct 2", volume_column_visible = true, delay_column_visible = true, collapsed = true, color = { 0xFF,0xFF,0xFF }, color_blend = 5 },
{ name = "Oct 3", volume_column_visible = true, delay_column_visible = true, collapsed = true, color = { 0xFF,0xFF,0xFF }, color_blend = 15 },
{ name = "Oct 4", volume_column_visible = true, delay_column_visible = true, collapsed = true, color = { 0xFF,0xFF,0xFF }, color_blend = 5 },
{ name = "Oct 5", volume_column_visible = true, delay_column_visible = true, collapsed = true, color = { 0xFF,0xFF,0xFF }, color_blend = 15 },
{ name = "Oct 6", volume_column_visible = true, delay_column_visible = true, collapsed = true, color = { 0xFF,0xFF,0xFF }, color_blend = 5 },
{ name = "Oct 7", volume_column_visible = true, delay_column_visible = true, collapsed = true, color = { 0xFF,0xFF,0xFF }, color_blend = 15 },
{ name = "Oct 8", volume_column_visible = true, delay_column_visible = true, collapsed = true, color = { 0xFF,0xFF,0xFF }, color_blend = 5 },
{ name = "Oct 9", volume_column_visible = true, delay_column_visible = true, collapsed = true, color = { 0xFF,0xFF,0xFF }, color_blend = 15 },
},
},
}
local column_names = {
"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"
}
function insert_track(track_index, group_index, track_setting)
renoise.song():insert_track_at(track_index)
local track = renoise.song():track(track_index)
track.visible_effect_columns, track.visible_note_columns = 0, 12, false -- track.volume_column_visible
for parameter_name, parameter_value in pairs(track_setting) do
track[parameter_name] = parameter_value
end
for note_column = 1, 12 do
track:set_column_name(note_column, column_names[note_column])
end
renoise.song():add_track_to_group(track_index, group_index)
end
function insert_gt(group_setting)
local song = renoise.song()
local i, group_index, group_setting = 1, song.selected_track_index + 1, group_settings[group_setting]
song:insert_group_at(group_index)
for parameter_name, parameter_value in pairs(group_setting) do
if not (parameter_name == "tracks") then
song:track(group_index)[parameter_name] = parameter_value
end
end
for _, track_setting in ipairs(group_setting.tracks) do
local group_index = group_index + i
i = i + 1
insert_track(song.selected_track_index, group_index, track_setting)
end
song.tracks[song.selected_track_index + 1].group_parent.collapsed = true -- collapse FX in Group
end
function explode_pitches(track_index, first_octave_track_index)
local song = renoise.song()
local track = song:track(song.selected_track_index)
local pattern_iterator = song.pattern_iterator:note_columns_in_track(track_index, true)
local notes = { }
local sort_per_column = function(a,b)
if a.column < b.column then return true
elseif a.column > b.column then return false
elseif a.pattern < b.pattern then return true
elseif a.pattern > b.pattern then return false
elseif a.line < b.line then return true
elseif a.line > b.line then return false
end
end
for pos, note_column in pattern_iterator do
if not note_column.is_empty then
table.insert(notes, { note_column = note_column, pattern = pos.pattern, track = pos.track, column = pos.column, line = pos.line })
end
end
table.sort(notes, sort_per_column)
for i, note in ipairs(notes) do
if not (note.note_column.note_value == 120) then
local dest_track = first_octave_track_index + math.floor(note.note_column.note_value/12)
local dest_column = (note.note_column.note_value % 12) + 1
song:pattern(note.pattern):track(dest_track):line(note.line):note_column(dest_column):copy_from(song:pattern(note.pattern):track(note.track):line(note.line):note_column(note.column))
if notes[i+1] then
if (notes[i].column == notes[i+1].column) and (song:pattern(notes[i+1].pattern):track(dest_track):line(notes[i+1].line):note_column(dest_column).note_value == 121) then
-- if (notes[i].column == notes[i+1].column) then
local next_note = song:pattern(notes[i+1].pattern):track(dest_track):line(notes[i+1].line):note_column(dest_column)
next_note.note_value = 120
next_note.delay_value = notes[i+1].note_column.delay_value
end
end
end
end
--song:delete_track_at(song.selected_track_index) -- delete original track
local first_octave_track = renoise.song().selected_track_index + 1
local track_index = first_octave_track + 9, first_octave_track, -1
local was_empty = true
for _, pattern in ipairs(renoise.song().patterns) do
if not pattern:track(track_index).is_empty then
was_empty = false
end
end
if not was_empty then
delete_track_at(track_index +1)
end
end
function rebuild_menu()
local song, menu_entry = renoise.song(), "Pattern Editor:Track:Explode Pitches To Octaves"
if renoise.tool():has_menu_entry(menu_entry) then
renoise.tool():remove_menu_entry(menu_entry)
end
if (song.selected_track.type == renoise.Track.TRACK_TYPE_SEQUENCER) then
renoise.tool():add_menu_entry {
name = menu_entry,
invoke = function() insert_gt("ten_octaves")
explode_pitches(song.selected_track_index, song.selected_track_index + 1)
end }
end
end
function start()
renoise.song().selected_track_observable:add_notifier(rebuild_menu)
rebuild_menu()
end
renoise.tool().app_new_document_observable:add_notifier(start)
Now I have the code in this way.I have added some details…
On the line 101I have added your loop,within the function explode_pitches, below:
local next_note = song:pattern(notes[i+1].pattern):track(dest_track):line(notes[i+1].line):note_column(dest_column)
next_note.note_value = 120
next_note.delay_value = notes[i+1].note_column.delay_value
end
end
end
end
--song:delete_track_at(song.selected_track_index) -- delete original track
local first_octave_track = renoise.song().selected_track_index + 1
local track_index = first_octave_track + 9, first_octave_track, -1
local was_empty = true
for _, pattern in ipairs(renoise.song().patterns) do
if not pattern:track(track_index).is_empty then
was_empty = false
end
end
if not was_empty then
delete_track_at(track_index +1)
end
end
The code does not error, but does nothing.I understand that the location of the loop is correct,just after build and sort notes by octave…
Is this correct? :
local track_index = first_octave_track + 9, first_octave_track, -1