-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRepeatRandomizedItems.py
112 lines (91 loc) · 3.4 KB
/
RepeatRandomizedItems.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
from reaper_python import *
import random
RPR_ClearConsole()
errors = []
# Get selected items count
selItemsCount = RPR_CountSelectedMediaItems(0)
if( selItemsCount < 1 ):
errors.append("- You must select one or more items")
# Get time selection
timeRange = RPR_GetSet_LoopTimeRange(False, False, 0, 0, False)
if( timeRange[2] == timeRange[3] ):
errors.append("- You must select a time range to define the start and end of the sequence")
# Check for errors
if( len(errors) > 0 ):
msg = ""
for error in errors:
msg += error + "\n"
RPR_ShowMessageBox(msg, "Errors", 0)
# If no errors...
else:
# Randomly choose next item to place (avoiding same as last one placed)
def chooseItem():
global items, shuffledItems, lastItem
if( lastItem is None):
lastItem = items[0]
if( len(shuffledItems) == 0 ):
shuffledItems = items[:]
while( "1st element in shuffled array is the same as last placed item" ): # do...while
random.shuffle(shuffledItems)
if( shuffledItems[0] != lastItem or len(items) < 2 ):
break;
lastItem = shuffledItems.pop(0)
return lastItem
# Duplicate and place an item
def duplicateItem(sourceItem, position):
RPR_ShowConsoleMsg("placing item " + str(sourceItem) + " at position " + str(position) + "\n")
RPR_SetMediaItemSelected(sourceItem, True)
RPR_ApplyNudge(0, 1, 5, 1, position, False, 1);
RPR_SetMediaItemSelected(sourceItem, False)
return
# Get selected items
items = []
for i in range(0, selItemsCount):
items.append( RPR_GetSelectedMediaItem(0, i) )
for item in items:
RPR_SetMediaItemSelected(item, False)
# Get user input (period between items positions)
period = None
margin = None
cancel = False
while( (period is None or period <= 0) and not cancel ):
res = RPR_GetUserInputs("Settings", 2, "Repeat time (s),Error margin (s)", "1.0,0", 20)
# check if cancelled
if( res[0] == 0 ):
cancel = True
RPR_ShowConsoleMsg("Cancelled operation\n")
periodStr, marginStr = res[4].split(",")
# check for errors
errors = []
try:
period = float(periodStr)
except ValueError:
errors.append("- Repeat time needs to be a number (in seconds)")
if( period <= 0 ):
errors.append("- Repeat time needs to be > 0")
try:
margin = float(marginStr)
except ValueError:
errors.append("- Error margin needs to be a number (in seconds)")
if( margin < 0 ):
errors.append("- Error margin needs to be >= 0")
if( len(errors) > 0 ):
msg = ""
for error in errors:
msg += error + "\n"
RPR_ShowMessageBox(msg, "Errors", 0)
if( not cancel ):
RPR_PreventUIRefresh(1)
RPR_Undo_BeginBlock()
# Insert Items
cursor = timeRange[2]
lastItem = None
shuffledItems = []
while cursor <= timeRange[3]:
duplicateItem( chooseItem(), cursor + random.uniform(-margin/2, margin/2))
cursor += period
for item in items:
RPR_SetMediaItemSelected(item, True)
RPR_Undo_EndBlock("Repeat randomized items", -1)
RPR_UpdateArrange()
RPR_PreventUIRefresh(-1)