I've been trying Waveform again and have been really impressed. I've never been 100% happy with any DAW I've used but Waveform now does pretty much everything I would want a DAW to do. All the annoyances and pain points from when I tried it years ago seem to have since been resolved. One thing I do miss is being able to duplicate a time selection like in Ableton Live. Basically you select time across one or more tracks and as many times as you hit ctrl/cmd+d it will duplicate that selection. Like this: Waveform duplicate does not work like this but as you can see I've created a macro to mimic Live's functionality. I thought I would share the script in case anyone else is interested in it. Here it is:
Code: Select all
if(Tracktion.getPosition ('markOut')){
// There is a range set
// Comment this line to avoid splitting clips partially in the marked region (they will instead be ignored
// if they start before the marked region)
Tracktion.splitMarkedRegion();
// Select all marked clips, then get them in an array
Tracktion.selectClips ('marked');
var selectedClips = Tracktion.getSelectedEditElements ('clip');
if(selectedClips.length){
// There are clips in the marked region
// Iterate over the array to find the offset from markIn of the clip with the earliest start
var offset = Math.pow(10, 1000);
for(var i = 0; i < selectedClips.length; i++){
var clipOffset = selectedClips[i].getProperty ('start') - Tracktion.getPosition ('markIn');
if(clipOffset < offset){
offset = clipOffset;
}
if(offset === 0){
break;
}
}
if(offset < 0 || offset === Math.pow(10, 1000)){
offset = 0;
}
// Copy clips in the current time selection
Tracktion.copy();
// Paste in place - pasted clips are selected automatically
Tracktion.paste();
// Move the cursor to markOut plus the offset of the earliest clip
// and then move the selected clips (i.e. the ones that were just pasted) there as well
Tracktion.setPosition ('cursor', Tracktion.getPosition ('markOut') + offset);
Tracktion.moveStartOfSelectedClipsToCursor();
// Shift the marked region over by one length
// Grab current markOut position
var markOut = Tracktion.getPosition ('markOut');
// Move markOut one length forward
Tracktion.setPosition ('markOut', markOut + (markOut - Tracktion.getPosition('markIn')));
// Set markIn to the old markOut position
Tracktion.setPosition ('markIn', markOut);
}
// No marked clips - do nothing
}else{
// No range set - just call regular duplicate method
Tracktion.duplicate();
}