=================== UNFINISHED DOCUMENT =================== Version 2.3 Concept for a MIDI-looper The MIDI-looper is a realtime phrase recorder/player, mostly intended for making improvisational music in a stage/live situation. The aspect of the live situation is essential. It records MIDI-NoteEvents in realtime while a defined time range, and starts playing them back in a loop as soon as the recording ends (for time range and record end see below). All handling and all functions must be achievable while the player is running - no matter whether on own clock or as a MIDI-clock slave. There is an internal tempo (clock) generator, which can be overridden by using an external MIDI-clock. There are separate MIDI-input sockets for Clock and Note data. Note-Data from the Sync-Input are ignored. The looper can handle several tracks in parallel. Such a group of tracks is called a pattern. Each track of a pattern can have its own length. There are several parameters of the track data which can be changed non destructively while playing back. * Transpose * MIDI-Channel * Quantize (details see below) * Position offset shifts the recorded note data for the amount of the selected quantize grid (see below). * Velocity amount. * Velocity offset. Tracks can be * deleted * copied to other tracks * merged with other tracks * shortened or lengthened (by adding copies of itselfs or by simply extending the end of the loop) * copied to tracks in other patterns * normalized (=write the nondestructive changes into a temporary track and write this temp-track back to the original track) The incoming data are recorded on a temporary track. Editing an existing track also is done in this temp-track. This temp-track is written into the real track of the pattern as soon as another function is invoked, which requires the usage of the temp-track. There is an undo button, which clears the temp-track and blocks the overwriting of the real track by the temp-track data. The length of a tracks is always related to a note grid. The values of this grid are the same as for quantizing (1/1, 1/2, 1/4, 1/6, 1/8, 1/12, 1/16, 1/24, 1/32, off(=1/192). In fact the length grid defines when a record-off order is executed. One track is defined as "master track" of the pattern. The only function of this attribute is to define, that the loop-end of this track defines the moment when the pattern changes. Example: Pattern A contains three tracks: * track-1 = 4 bars of 4/4 * track-2 = 2 bars of 4/4 * track 3 = 2 bars of 7/8 track-2 is the master track. If we select pattern B while pattern A is running, the pattern B will start after track-2 has finished its second bar. Track-1 will be interrupted at its half, track-3 will be interrupted befor the third eigth of its third bar. The first track that is recorded in a pattern will be the master track by default, but any other track of the pattern can be selected as master track later. The MIDI data are recorded in their original place in the loop time = unquantized (in fact this will mean a quantizing by the internal resolution of the recorder). It is possible to quantize note events while playback. This quantizing does not affect the position of the recorded note, it affects only the playback! The quantizing always affects note-on events; the corresponding note-off events can be handled in different ways (selectable in track settings): * the note-off is moved for the same amount as the note-on (note length is kept - this is the default behaviour) * the note-off stays where it was (the note length changes) * the note-off is quantized too. * fixed note length The quantizing will be defined by three parameters: * quantizing grid (1/1, 1/2, 1/4, 1/6, 1/8, 1/12, 1/16, 1/24, 1/32, off(=1/192) * swing / shuffle: Swing is delayed 16th off-beat notes. Shuffle is delayed 8th off-beat notes. possible values are "off", "swg1" to "swg9", and "shf1" to "shf9". With quantizing grid 1/6, 1/12 and 1/24 the shuffle/swing will be deactivated, but the value set before will be remembered. * catch area offset in values from 25% to 50% to 75% This catch-area-offset parameter takes in acount that a player may be generally playing laid back or be playing basically rushing. The catch area is the range before and after the exact position. Example: Lets assume a quantizing grid of 1/8, then the usual quantizing would catch all events from the 16th before and the 16th after the exact 8th position. The value of 75% will shift this range to later events, a value of 25% to earlier events. A graphic may explain this. The "8" marks the point where the notes are pulled to, the range arrows mark the area where from the note are pulled to the quantized position: 1 2 3 |.......|.......|.......|.......|.......|.......|.......|.......|... <-------8------><-------8------> offset=50% <---8----------><---8---------> offset=75% <---------8----><---------8----> offset=25% Userinterface: ============= Track [1] [2] [3] [4] Trackparameters: Channel Transpose Quantizegrid Quantizeoffset NoteOff-Quantize Swing Position offset Velocity amount Velocity offset Systemsettings Clock int/ext Tempo (if clock=internal) QuantizeGrid Default QuantizeOffset Default