New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feature request: "slip mode" #5753
Comments
Commented by: esbrandt That feature is also on some of newer CDJ`s (e.g. CDJ-900) , sounds useful |
Commented by: ywwg This would also be useful for momentary loops: hold down a key and it loops the current beat / half beat / whatever, let go and the music resumes where it would have been. I'll try to get this into 1.11. A newer implementation of this might involve a sampler somehow... not sure how we want to do it. |
Commented by: ywwg Here's a patch that implements slip mode and rolling beatloops.
The method for predicting the future position of the track is very simple. Enginebuffer remembers the rate and position at the time of activation and simply increments the position as if that rate had held constant. When slip mode is deactivated I just seekabs to that predicted position. In my brief testing it sounds good. |
Commented by: ywwg This patch has kind of grown! Now along with slip mode and rolling loops, I've added a crossfade for loops and seeks. What this means is that over the period of one buffer, I crossfade from the out point of the loop to the in point of the loop, and from the out point of a seek to the in point of the next seek. This is done without adding additional samples to the playback so there's no overlap. The two crossfades are implemented differently because loops are handled in RAMAN and seeks are in Engine Buffer. In RAMAN, I do this:
In Enginebuffer I do this:
I've checked my work with graphs and charts and it also sounds good to my ears. This is only one buffersize of crossfade (in my case, 2048 samples @96Khz), but even a very low number of samples at very low latencies should be enough to soften the worst pops. Also I now correctly hint the reader so that as slip mode is enabled, we're caching the samples at the virtual slip playposition. That way when slip is disabled, there's no cache miss when the seek occurs. |
Commented by: esbrandt Thanks, really like these features. |
Commented by: ywwg Here's a cool graph showing the crossfade. Blue shows the outgoing waveform, Cyan shows the incoming waveform, and green shows the result. (Blue and cyan are zero when crossfading doesn't occur) |
Commented by: rryan Well, this is too much fun not to include in 1.11 :). I made some minor tweaks to the patch and committed it. The main thing I'm confused about is why you add a read-log entry in the RAMAN. I don't think it's necessary since you're just getting extra audio data to mix into the current buffer. |
Commented by: daschuer Is this feature still working in lp:mixxx? I can see the tool tip of the loop buttons, but when I click them right, nothing happens. |
Commented by: esbrandt Works fine here with latest trunk. Tested on OSX + on Ubuntu Linux (VM). Maybe you load from a ressource folder which has still some old skins in it? E.g. for Deere1280x800-WXGA the skin version should be v1.11.0.07, see CHANGELOG.txt in the skins directory. |
Commented by: daschuer Thank you Jus, now it works! I just have not noticed the resource path is stored in mixxx.cfg. |
Issue closed with status Fix Released. |
Reported by: ywwg
Date: 2011-01-16T15:20:16Z
Status: Fix Released
Importance: Wishlist
Launchpad Issue: lp703585
Attachments: [Patch to add slip mode and rolling loops to Mixxx](https://bugs.launchpad.net/bugs/703585/+attachment/3173164/+files/Patch to add slip mode and rolling loops to Mixxx), [Patch Draft 2](https://bugs.launchpad.net/bugs/703585/+attachment/3175812/+files/Patch Draft 2), [Cool Graph](https://bugs.launchpad.net/bugs/703585/+attachment/3177630/+files/Cool Graph)
I was looking at videos of the new version of Serato and saw one feature that should be fairly easy to add, called "slip mode." Here's the use case:
This is how I'd implement it: when entering slip mode, assign the current (precise) playposition to a m_dSlipModePos variable, and the current rate to m_dSlipModeRate. Update that position on every loop no matter what else the dj is doing. When exiting the mode, just seek to that position.
The text was updated successfully, but these errors were encountered: