Alright so after fumbling around struggling to get the proper "edit smoothing" behavior in Reaper, I resorted to coding some actions myself to get the behavior I missed from Beat Detective in Pro Tools, while adding a ton of functionality people have been asking for in Beat Detective for years.
The bulk of it is this action:
SWS/AdamWathan: Fill gaps between selected items (advanced)
It's purpose is to intelligently fill the gaps between items that have been cut up and repositioned in the timeline, usually for drum editing purposes (ie. cutting all the hits and snapping them to the grid.) It does this by trimming the starts of items left to fill gaps, time stretching items if the gap is too big, etc. all according to preferences laid out by the user in the initial dialog.
Here's a YouTube video demonstrating my entire drum editing workflow using what I've added to Reaper. Skip to about 6:00 for the details about the action itself:
Trigger Pad: This is a leading pad added to the beginning of each chunk and subtracted from the end of the previous chunk. The snap offset is adjusted to compensate so that your media will still snap to the transient. It is a sort of safety buffer. Imagine you have a section where the snare and ride hits at the same time, but the ride is a tiny bit early. Dynamic split cut at the snare transient though for one of a variety of reasons. This buffer would ensure that the ride transient is preserved directly before the snare and that it is cut out of the previous item. It basically just lets you be lazier when checking the quality of your splits
Crossfade Length: This is the length of the crossfade created between the tail of any item and the beginning of the next item. It is always placed to the left and is in addition to any trigger pad (ie. a trigger pad of 5ms and a crossfade length of 5ms will result in a minimum of 10ms between the start of the crossfade and the transient in the next item.)
Maximum Gap: This is the maximum allowable gap before the code attempts to time stretch the previous item. If you set a max gap of 20ms and the code detects a gap of 50ms, it will timestretch the previous item until either a) the gap has been reduced to 20ms, or b) the Maximum Stretch value has been reached. If the detected gap is less than the Maximum Gap, the following item is simply trimmed back to fill it with no stretching applied whatsoever.
Maximum Stretch: This is the maximum amount that an item will stretch. The value corresponds with the "Rate" value displayed in a media item when timestretching it, so 0.85 means the item will stretch to a maximum rate of 0.85 In my experience, it usually sounds better to allow more stretching than it does to allow a larger Maximum Gap, so don't be afraid to set this value low. A value of 0 will let the item stretch as much as it needs to while a value of 1 will disable stretching entirely.
Preserve Transient: This is the amount of the item you want to prevent from stretching no matter what. Stretching the initial attack of a media item usually sounds poor, so this will prevent that initial attack from stretching and only stretch the tail of the item. If this is set to 35ms for example, a split is placed 35ms after the transient and only the item to the right of the split will be stretched, leaving the initial attack untouched. A value of 0 disables this function completely. The default value of 35ms is usually pretty good.
Transient Crossfade Length: This is simply the length of the crossfade used when splitting at the "Preserve Transient" point.
Fade Shape: This determines the shape of the fades used when performing any crossfades. It is an integer from 0 to 5, the following chart explains which is which.
Mark possible artifacts?: This is a value of 0 (no) or 1 (yes). If 1 is entered, the action will insert a marker everywhere that the gap exceeded the maximum allowable gap AND the maximum stretch value was reached, which means it had to trim the start of the following item more than expected. This allows you to easily identify areas where there might be an audible glitch so you can listen to them with special attention and either time stretch more to fix it, or copy and paste a better hit from a different part of the song.
The bulk of it is this action:
SWS/AdamWathan: Fill gaps between selected items (advanced)
It's purpose is to intelligently fill the gaps between items that have been cut up and repositioned in the timeline, usually for drum editing purposes (ie. cutting all the hits and snapping them to the grid.) It does this by trimming the starts of items left to fill gaps, time stretching items if the gap is too big, etc. all according to preferences laid out by the user in the initial dialog.
Here's a YouTube video demonstrating my entire drum editing workflow using what I've added to Reaper. Skip to about 6:00 for the details about the action itself:
Trigger Pad: This is a leading pad added to the beginning of each chunk and subtracted from the end of the previous chunk. The snap offset is adjusted to compensate so that your media will still snap to the transient. It is a sort of safety buffer. Imagine you have a section where the snare and ride hits at the same time, but the ride is a tiny bit early. Dynamic split cut at the snare transient though for one of a variety of reasons. This buffer would ensure that the ride transient is preserved directly before the snare and that it is cut out of the previous item. It basically just lets you be lazier when checking the quality of your splits
Crossfade Length: This is the length of the crossfade created between the tail of any item and the beginning of the next item. It is always placed to the left and is in addition to any trigger pad (ie. a trigger pad of 5ms and a crossfade length of 5ms will result in a minimum of 10ms between the start of the crossfade and the transient in the next item.)
Maximum Gap: This is the maximum allowable gap before the code attempts to time stretch the previous item. If you set a max gap of 20ms and the code detects a gap of 50ms, it will timestretch the previous item until either a) the gap has been reduced to 20ms, or b) the Maximum Stretch value has been reached. If the detected gap is less than the Maximum Gap, the following item is simply trimmed back to fill it with no stretching applied whatsoever.
Maximum Stretch: This is the maximum amount that an item will stretch. The value corresponds with the "Rate" value displayed in a media item when timestretching it, so 0.85 means the item will stretch to a maximum rate of 0.85 In my experience, it usually sounds better to allow more stretching than it does to allow a larger Maximum Gap, so don't be afraid to set this value low. A value of 0 will let the item stretch as much as it needs to while a value of 1 will disable stretching entirely.
Preserve Transient: This is the amount of the item you want to prevent from stretching no matter what. Stretching the initial attack of a media item usually sounds poor, so this will prevent that initial attack from stretching and only stretch the tail of the item. If this is set to 35ms for example, a split is placed 35ms after the transient and only the item to the right of the split will be stretched, leaving the initial attack untouched. A value of 0 disables this function completely. The default value of 35ms is usually pretty good.
Transient Crossfade Length: This is simply the length of the crossfade used when splitting at the "Preserve Transient" point.
Fade Shape: This determines the shape of the fades used when performing any crossfades. It is an integer from 0 to 5, the following chart explains which is which.
Mark possible artifacts?: This is a value of 0 (no) or 1 (yes). If 1 is entered, the action will insert a marker everywhere that the gap exceeded the maximum allowable gap AND the maximum stretch value was reached, which means it had to trim the start of the following item more than expected. This allows you to easily identify areas where there might be an audible glitch so you can listen to them with special attention and either time stretch more to fix it, or copy and paste a better hit from a different part of the song.
Last edited by a moderator: