diff --git a/share/scripts/midi_brutalize.lua b/share/scripts/midi_brutalize.lua new file mode 100644 index 0000000000..70faf4572b --- /dev/null +++ b/share/scripts/midi_brutalize.lua @@ -0,0 +1,41 @@ +ardour { ["type"] = "EditorAction", name = "MIDI Brutalize", + license = "MIT", + author = "Ardour Team", + description = [[Randomize MIDI Note position (de-quantize).]] +} + +function factory () return function () +local sel = Editor:get_selection () +-- iterate over all selected regions +for r in sel.regions:regionlist ():iter () do + local mr = r:to_midiregion () + if mr:isnil () then goto continue end + + local ticks_per_beat = Temporal.Beats (1, 0):to_ticks (); + local max_shift = ticks_per_beat / 4.0 + + -- get MIDI Model + local mm = mr:midi_source(0):model () + -- Prepare Undo command + local midi_command = mm:new_note_diff_command ("MIDI Note Brutalize") + + -- Iterate over all notes of the MIDI region + for note in ARDOUR.LuaAPI.note_list (mm):iter () do + -- note is-a https://manual.ardour.org/lua-scripting/class_reference/#Evoral:NotePtr + local old_pos = note:time () + + -- shift +/- 1/16th note + local tickdiff = math.floor ((math.random() - 0.5) * max_shift) + --print (old_pos:get_beats (), old_pos:get_ticks (), tickdiff) + + local new_pos = Temporal.Beats (old_pos:get_beats (), old_pos:get_ticks () + tickdiff) + if old_pos ~= new_pos and new_pos > Temporal.Beats (0, 0) then + local new_note = ARDOUR.LuaAPI.new_noteptr (note:channel (), new_pos, note:length (), note:note (), note:velocity ()) + midi_command:remove (note) + midi_command:add (new_note) + end + end + mm:apply_command (Session, midi_command) + ::continue:: +end +end end