Yes, for example pressing Shift+Space(play from cursor) from line number 12, entering some more notes and hitting “play from last line chosen” would be nice. It’s not that big a hurdle going back and choosing line number 12, but it would be nice to just go for example CTRL+Space and it would remember the last play position. Hope this makes sense.
Something like this?:
Keyshortcut to define:Globals -> Transport -> Play from last position
Perfect! Is it possible to avoid the “jumping back”? Example: Tweaking on line 40 etc. and playing from line 28 without changing the position.
Commenting – renoise.song().transport.edit_pos = edit_pos" seems to work. Way cool vV!
Glad i could get you on the right track.
Hi again. Just wondering if it’s possible to stop the track and then “play from last line”? Something like: if stopped use the old position value.
You might want to change the line
edit_pos = renoise.song().transport.edit_pos
edit_pos = renoise.song().transport.playback_pos
Perhaps that works more properly or you need a specific fixed line to jump to?
Now I’m getting confused. It worked the first time but you couldn’t stop and edit and then “continue from last line played”. In “programming” terms it would be something like: Play from current line: register variable “linenumber”. Editing something. Play again from variable “linenumber.” That should make sense; kinda like a free Block Play.
Well, this function is called each time the playing is started or stopped:
local function isPlaying() edit_pos = renoise.song().transport.edit_pos end
Even though the position where the song starts playing is stored, the last position will be stored from the moment that you stop the song.
If you want this so called “edit_pos” to only contain the sequence position and line in that sequence when you “play” the song you could easily add a condition:
local function isPlaying() if renoise.song().transport.playing then edit_pos = renoise.song().transport.edit_pos end end
Now edit_pos will only register the position from where the playing starts. Remember that both the sequence position and line number reference are in edit_pos and you need to transfer from and to the edit_pos variable to allow to change the positions in Renoise itself.
If you want to lock down a specific position, you can always add a shortcut that simply records the current true edit position as the real offset that is being played from everytime you hit that shortcut to start from that specific line, rather than using the observable that calls the isPlaying function causing constantly changes to the last played position.
local my_pos = nil local function RegisterPosition() local song = renoise.song() my_pos = renoise.song().transport.edit_pos end local function PlayRegisteredPosition() if my_pos == nil then my_pos = renoise.song().transport.edit_pos end renoise.song().transport.playback_pos = my_pos renoise.song().transport.playing = true end
Would be nice though with one single shortcut.
Add a timer variant to it that measures how many times the shortcut is pressed within the same time.
If pressed two times in a row:register position, if pressed one time, play the position after 20msecs.
I haven’t tested this code, but you can try and fool around with it.
local grace_wait = 0 local short_cut_pressed = 0 local grace_turn = 0 if not renoise.tool().app_idle_observable:has_notifier(idle_handler) then renoise.tool().app_idle_observable:add_notifier(idle_handler) end function shortcut_pressed() grace_wait = os.clock() grace_turn = 1 end function idle_handler() if os.clock() - grace_wait > .1 and grace_turn ~= 0 then if short_cut_pressed == 0 then short_cut_pressed = 1 elseif short_cut_pressed == 1 then short_cut_pressed = 0 local song = renoise.song() my_pos = renoise.song().transport.edit_pos end end if os.clock() - grace_wait > .2 and short_cut_pressed == 1 then short_cut_pressed = 0 if my_pos == nil then my_pos = renoise.song().transport.edit_pos end renoise.song().transport.playback_pos = my_pos renoise.song().transport.playing = true end grace_turn = 0 end
Been trying to fool around with something like below. Can’t get it to work and your example swooshes me.
local number = 0 local aclock = nil local my_pos = nil local function SetMark() my_pos = renoise.song().transport.edit_pos end local function PlayMark() if my_pos == nil then my_pos = renoise.song().transport.edit_pos else renoise.song().transport.playback_pos = my_pos renoise.song().transport.playing = true end end local function MarkAndPlayZZZZZ() -- doubleclicker test number = number + 1 if number == 1 then -- start timer and play mark aclock = os.clock() PlayMark() print("1") elseif (number == 2) and (aclock < os.clock() -1) then PlayMark() print("2") else -- set mark number = 0 SetMark() PlayMark() print("3") end end
Time for sleep
You could try “os.clock() - aclock < .15” instead of “aclock < os.clock() -1”
But i experienced difficulties as well using such constructions, so used the idle notifier API function that takes care our designated function is called every 10msecs and responses are quicker handled if they are not caught the first time.