Status: This specification is in drafting, however active work will begin immediately and continue through the summer. Please feel free to leave comments.
DJs often may wish to record loops and samples live from available output streams, which can then be used again in samplers and the main decks to play back later. This project aims to implement an easy to use, but powerful loop recorder for Mixxx, which will give DJs another tool to be creative in their live mixes.
This project is being undertaken by Carl Pillot for the Google Summer of Code 2013.
There are many possible options for an implementation of a loop recorder—everything from simple recording one section of audio into a sampler to a fully realized remix and slicing engine. As Mixxx is targeted to both beginner and advanced DJs, the best approach for a loop recorder in Mixxx is to create a very simple interface that is easy to understand and use for beginner users, but that can be combined with existing functionality (such as samplers) to give professional users plenty of power and flexibility. Considering the fairly limited time for GSoC and the complexity of the project, the simpler the approach that I take, the likelier it is that I’ll have a polished product by the end of the summer that DJs will actually be able to use.
A loop recorder offers DJs several creative possibilities:
1. Create new songs using existing loop libraries, by layering them together.
Example: DJ B has a set of loops that she’d like to combine into a new mix. She knows that there are a couple different grooves that she would like to use throughout the song. She loads several loops into samplers to create the basic groove for the first section of the song. She starts recording the loop through the headphone out and records 16 beats into the loop recorder. She adds several layers to the groove, then saves the loop, loads it into a main deck and starts playing, while that's playing she repeats the process for a several new grooves, until she has a couple of different sections, which she transitions between to develop the song. She uses more samplers to add extra layers and develop each section.
2. Make mashups/remixes on the fly by recording and layering loops from several different songs/loop libraries.
DJ X has several different sections from different songs that he knows he'd like to combine later in his set. While these songs are playing X records segments from main output to the loop recorder and saves each section he'd like to use. During the set he can also process and recombine some of the recorded loops by using the cue output and different signal processing. When the time comes to use the loops he can load them into samplers to play them back.
3. Create one-shot items from a song or loop on the fly to be triggered by either a hot key (probably in a sampler deck in Mixxx).
When a DJ clicks record for the first time the loop recorder locks the beat number menu, so that it cannot be changed. This is necessary to record second layers.
The recorder will record the specified number of beats then immediately begin playing those recorded beats back through the main output. The dry/wet knob controls the mix between the Main mix and the loop recorder.
If the record button is pressed again, the loop recorder will record a second layer that is punched into the first layer and can be of a length of 0 up to the length of the original loop. The DJ will have to press stop to stop recording the second layer, although I think that it might be good to have it stop automatically when the loop repeats (I’m going back and forth about this).
After a second layer is recorded, the undo button is activated and if pressed it reverts the loop recorder to the previous state before the most recent recording. If clicked, the undo button becomes a redo button. There will be one level of undo/redo available in the loop recorder. When the record button is clicked, the current state is committed, and the new layer being recorded is now what will be removed/restored by undo.
Once a DJ is satisfied with the loop she can save it to disk to be used in a sampler or main deck using the save button. I’ve also toyed with the idea of have a smart export feature which will automatically export the loop and add it to a sampler, but I need to flesh this idea out more.
LoopRecordingManager - Coordinates the UI and recording and playback of the loop recorder.
EngineLoopRecorder - Handles loop recording in a separate thread, which is fed from the Engine Master. All loops will be recorded as uncompressed audio for performance and quality reasons.
LoopRecorderDeck - subclass of BaseTrackPlayer, which handles playback of loops that have been recorded. Handles special mixing of recorded audio (maybe…).
LoopBuffer - class that provides an interface for manipulating loop buffer recording. Abstracts the details of loop recording away from the rest of the looper code.
Add audio routing to the loop recorder in Engine Master. This will need to be done in realtime, so the code will probably differ from the existing recording code, which does processing in side chains.
Modify buffering and channel code to allow continuous playback, which switches between buffers. This will be a pretty challenging task.
Implement new SoundSource class for internally stored loops?
|[Group]||Key/Control||Type||What it Does|
|[Loop_Recording]||toggle_loop_recording||Binary||On empty loop recorder, initiates loop recording.|
|[Loop_Recording]||toggle_loop_playback||Binary||Plays stored loop, disabled if nothing has been recorded.|
|[Loop_Recording]||toggle_loop_undo_redo||Binary||By default undo 1 layer of changes. If clicked undo changes to redo.|
|[Loop_Recording]||save_loop||Binary||Save the loop to the Mixxx library.|
|[Loop_Recording]||export_loop||Binary||Export the loop to a selected deck.|
|[Loop_Recording]||loop_export_destination||Float||Defines the destination of the currently loaded loop. Need to define a format for specifying decks and samplers.|
|[Loop_Recording]||clear_recorder||Binary||Clears all recorded loops.|
|[Loop_Recording]||loop_num_beats||Float||Sets beat length of a loop.|
|[Master]||loopRecSource||Float||Toggles the Mixxx output that is directed into the loop recorder.|
|[Master]||loop_mix_level||Float||Controls dry/wet level of recorder sent back into the main mix.|