From 7ddeea3f9d77dd36491a68c1f7cc5fc520d8441b Mon Sep 17 00:00:00 2001 From: toszlanyi Date: Sun, 30 May 2021 12:00:10 +0200 Subject: add SLIP relese after scratch --- res/controllers/Denon-MC7000-scripts.js | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/res/controllers/Denon-MC7000-scripts.js b/res/controllers/Denon-MC7000-scripts.js index 9381cb9365..b2d87cebe0 100644 --- a/res/controllers/Denon-MC7000-scripts.js +++ b/res/controllers/Denon-MC7000-scripts.js @@ -37,7 +37,7 @@ var MC7000 = {}; // 1) Beat LED in Slicer mode (counts every 8 beats AFTER the CUE point) // only works for CONSTANT TEMPO tracks // needs beat grid and CUE point set -MC7000.experimental = false; +MC7000.experimental = true; // Wanna have Needle Search active while playing a track ? // In any case Needle Search is available holding "SHIFT" down. @@ -496,12 +496,12 @@ MC7000.PadButtons = function(channel, control, value, status, group) { // activate and clear Hot Cues if (MC7000.PADModeCue[deckNumber] && engine.getValue(group, "track_loaded") === 1) { for (i = 1; i <= 8; i++) { - if (control === 0x14 + i - 1 && value >= 0x01) { + if (control === 0x14 + i - 1 && value === 0x7F) { engine.setValue(group, "hotcue_" + i + "_activate", true); - } else { + } else if (control === 0x14 + i - 1 && value === 0x00) { engine.setValue(group, "hotcue_" + i + "_activate", false); - } - if (control === 0x1C + i - 1 && value >= 0x01) { + engine.setValue(group, "slip_enabled", 0); + } else if (control === 0x1C + i - 1 && value === 0x7F) { engine.setValue(group, "hotcue_" + i + "_clear", true); midi.sendShortMsg(0x94 + deckOffset, 0x1C + i - 1, MC7000.padColor.hotcueoff); } @@ -562,6 +562,11 @@ MC7000.PadButtons = function(channel, control, value, status, group) { if (engine.getValue("[Sampler" + i + "]", "track_loaded") === 0) { engine.setValue("[Sampler" + i + "]", "LoadSelectedTrack", 1); } else if (engine.getValue("[Sampler" + i + "]", "track_loaded") === 1) { + // STOP PLAYING SAMPLERS ... + for (j = 1; j <=8; j++) { + engine.setValue("[Sampler" + j + "]", "cue_gotoandstop", 1); + } + // ... BEFORE THE ACTUAL SAMPLER TO PLAY GETS STARTED engine.setValue("[Sampler" + i + "]", "cue_gotoandplay", 1); } } else if (control === 0x1C + i - 1 && value >= 0x01) { @@ -648,6 +653,7 @@ MC7000.wheelTouch = function(channel, control, value, status, group) { MC7000.scratchParams.beta); } else { engine.scratchDisable(deckNumber); + engine.setValue(group, "slip_enabled", 0); } } }; @@ -659,7 +665,7 @@ MC7000.wheelTurn = function(channel, control, value, status, group) { // A: For a control that centers on 0: var numTicks = (value < 0x64) ? value : (value - 128); - var adjustedSpeed = numTicks * MC7000.jogSensitivity * 25; + var adjustedSpeed = numTicks * MC7000.jogSensitivity / 10; var deckNumber = script.deckFromGroup(group); var deckOffset = deckNumber - 1; if (engine.isScratching(deckNumber)) { @@ -668,13 +674,11 @@ MC7000.wheelTurn = function(channel, control, value, status, group) { } else { if (MC7000.shift[deckOffset]) { // While Shift Button pressed -> Search through track - var jogSearch = 300 * adjustedSpeed / MC7000.jogWheelTicksPerRevolution; + var jogSearch = 100 * adjustedSpeed; engine.setValue(group, "jog", jogSearch); } else { // While Shift Button released -> Pitch Bend - var jogDelta = adjustedSpeed / MC7000.jogWheelTicksPerRevolution; - var jogAbsolute = jogDelta + engine.getValue(group, "jog"); - engine.setValue(group, "jog", jogAbsolute); + engine.setValue(group, "jog", adjustedSpeed); } } }; -- cgit v1.2.3 From 08bb0a0224c60dcbd4d3f679691c3a78afde8514 Mon Sep 17 00:00:00 2001 From: toszlanyi Date: Sun, 30 May 2021 12:10:43 +0200 Subject: changed scratch parameters --- res/controllers/Denon-MC7000-scripts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/controllers/Denon-MC7000-scripts.js b/res/controllers/Denon-MC7000-scripts.js index b2d87cebe0..3a88e90629 100644 --- a/res/controllers/Denon-MC7000-scripts.js +++ b/res/controllers/Denon-MC7000-scripts.js @@ -69,8 +69,8 @@ MC7000.VinylModeOn = true; // default: true // Scratch algorithm parameters MC7000.scratchParams = { recordSpeed: 33 + 1/3, // default: 33 + 1/3 - alpha: (1.0/10), // default: (1.0/10) - beta: (1.0/10)/32 // default: (1.0/10)/32 + alpha: (1.0/100), // default: (1.0/10) + beta: (1.0/100)/32 // default: (1.0/10)/32 }; // Sensitivity factor of the jog wheel (also depends on audio latency) -- cgit v1.2.3 From ff225fe54f0bd1f2daaca077302f218d80210f98 Mon Sep 17 00:00:00 2001 From: toszlanyi Date: Sun, 30 May 2021 16:10:07 +0200 Subject: slip mode for backspin --- res/controllers/Denon-MC7000-scripts.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/res/controllers/Denon-MC7000-scripts.js b/res/controllers/Denon-MC7000-scripts.js index 3a88e90629..255192adbf 100644 --- a/res/controllers/Denon-MC7000-scripts.js +++ b/res/controllers/Denon-MC7000-scripts.js @@ -814,11 +814,20 @@ MC7000.stopTime = function(channel, control, value, status, group) { MC7000.reverse = function(channel, control, value, status, group) { var deckNumber = script.deckFromGroup(group); if (value > 0) { - // while the button is pressed spin back - engine.brake(deckNumber, true, MC7000.factor[deckNumber], - 15); // start at a rate of -15 and decrease by "factor" + if (engine.getValue(group, "slip_enabled")) { + // backspin while button is pressed at a rate of -15 and decrease by "factor" + engine.brake(deckNumber, value > 0, MC7000.factor[deckNumber], - 15); + } else { + engine.brake(deckNumber, true, MC7000.factor[deckNumber], - 15); + } } else { - // when releasing the button the track starts softly again - engine.softStart(deckNumber, true, MC7000.factor[deckNumber]); + if (engine.getValue(group, "slip_enabled")) { + engine.brake(deckNumber, false); // disable brake effect + engine.setValue(group, "play", 1); + engine.setValue(group, "slip_enabled", 0); + } else { + engine.softStart(deckNumber, true, MC7000.factor[deckNumber]); + } } }; -- cgit v1.2.3 From 0f3f89c68d9bbc088badc7bda5ed43543a13cccd Mon Sep 17 00:00:00 2001 From: toszlanyi Date: Mon, 21 Jun 2021 10:40:58 +0200 Subject: improved SLIP, Rate Range and other minor details --- res/controllers/Denon-MC7000-scripts.js | 37 +++++++++++++++++++-------------- res/controllers/Denon-MC7000.midi.xml | 4 ++-- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/res/controllers/Denon-MC7000-scripts.js b/res/controllers/Denon-MC7000-scripts.js index 255192adbf..3e75e6caa0 100644 --- a/res/controllers/Denon-MC7000-scripts.js +++ b/res/controllers/Denon-MC7000-scripts.js @@ -37,7 +37,7 @@ var MC7000 = {}; // 1) Beat LED in Slicer mode (counts every 8 beats AFTER the CUE point) // only works for CONSTANT TEMPO tracks // needs beat grid and CUE point set -MC7000.experimental = true; +MC7000.experimental = false; // Wanna have Needle Search active while playing a track ? // In any case Needle Search is available holding "SHIFT" down. @@ -99,10 +99,6 @@ MC7000.needleSearchTouched = [true, true, true, true]; // initial value for VINYL mode per Deck (see above for user input) MC7000.isVinylMode = [MC7000.VinylModeOn, MC7000.VinylModeOn, MC7000.VinylModeOn, MC7000.VinylModeOn]; -// used to keep track of which the rateRange of each slider. -// value used as an index to MC7000.rateRanges -MC7000.currentRateRangeIndex = [0, 0, 0, 0]; - // initialize the "factor" function for Spinback MC7000.factor = []; @@ -733,13 +729,17 @@ MC7000.nextRateRange = function(midichan, control, value, status, group) { if (value === 0) { return; // don't respond to note off messages } - var deckOffset = script.deckFromGroup(group) - 1; - // increment currentRateRangeIndex and check for overflow - if (++MC7000.currentRateRangeIndex[deckOffset] === - MC7000.rateRanges.length) { - MC7000.currentRateRangeIndex[deckOffset] = 0; + var currRateRange = engine.getValue(group, "rateRange"); + engine.setValue(group, "rateRange", MC7000.getNextRateRange(currRateRange)); +}; + +MC7000.getNextRateRange = function(currRateRange) { + for (var i = 0; i < MC7000.rateRanges.length; i++) { + if (MC7000.rateRanges[i] > currRateRange) { + return MC7000.rateRanges[i]; + } } - engine.setValue(group, "rateRange", MC7000.rateRanges[MC7000.currentRateRangeIndex[deckOffset]]); + return MC7000.rateRanges[0]; }; // Previous Rate range toggle @@ -747,12 +747,17 @@ MC7000.prevRateRange = function(midichan, control, value, status, group) { if (value === 0) { return; // don't respond to note off messages } - var deckOffset = script.deckFromGroup(group) - 1; - // decrement currentRateRangeIndex and check for underflow - if (--MC7000.currentRateRangeIndex[deckOffset] < 0) { - MC7000.currentRateRangeIndex[deckOffset] = MC7000.rateRanges.length - 1; + var currRateRange = engine.getValue(group, "rateRange"); + engine.setValue(group, "rateRange", MC7000.getPrevRateRange(currRateRange)); +}; + +MC7000.getPrevRateRange = function(currRateRange) { + for (var i = MC7000.rateRanges.length; i >= 0; i--) { + if (MC7000.rateRanges[i] < currRateRange) { + return MC7000.rateRanges[i]; + } } - engine.setValue(group, "rateRange", MC7000.rateRanges[MC7000.currentRateRangeIndex[deckOffset]]); + return MC7000.rateRanges[MC7000.rateRanges.length - 1]; }; // Key & Waveform zoom Select diff --git a/res/controllers/Denon-MC7000.midi.xml b/res/controllers/Denon-MC7000.midi.xml index 1f661b723b..09c388ba54 100644 --- a/res/controllers/Denon-MC7000.midi.xml +++ b/res/controllers/Denon-MC7000.midi.xml @@ -3,7 +3,7 @@ Denon MC7000 OsZ - Denon MC7000 mapping. Check your Linux Kernel version to get the Audio Interface working - see WIKI + Denon MC7000 mapping. Check your Linux Kernel version to get the Audio Interface working - Details in user manual https://mixxx.discourse.group/t/denon-mc7000-mapping/18235 https://github.com/mixxxdj/mixxx/wiki/Denon-MC7000 denon_mc7000 @@ -939,7 +939,7 @@ - + [Channel1] MC7000.wheelTouch MIDI Learned from 759 messages. -- cgit v1.2.3 From 6266395781bccde090484dc02ed892482e092324 Mon Sep 17 00:00:00 2001 From: toszlanyi Date: Mon, 12 Jul 2021 20:51:48 +0200 Subject: added timer to reactivate SLIP mode 250ms after actions --- res/controllers/Denon-MC7000-scripts.js | 35 ++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/res/controllers/Denon-MC7000-scripts.js b/res/controllers/Denon-MC7000-scripts.js index 3e75e6caa0..5dfa51e05d 100644 --- a/res/controllers/Denon-MC7000-scripts.js +++ b/res/controllers/Denon-MC7000-scripts.js @@ -37,7 +37,7 @@ var MC7000 = {}; // 1) Beat LED in Slicer mode (counts every 8 beats AFTER the CUE point) // only works for CONSTANT TEMPO tracks // needs beat grid and CUE point set -MC7000.experimental = false; +MC7000.experimental = true; // Wanna have Needle Search active while playing a track ? // In any case Needle Search is available holding "SHIFT" down. @@ -46,6 +46,7 @@ MC7000.needleSearchPlay = false; // Possible pitchfader rate ranges given in percent. // can be cycled through by the RANGE buttons. +// All default values are the same as selectable in Preferences MC7000.rateRanges = [ 4/100, // default: 4/100 6/100, // default: 6/100 @@ -53,6 +54,8 @@ MC7000.rateRanges = [ 10/100, // default: 10/100 16/100, // default: 16/100 24/100, // default: 24/100 + 50/100, // default: 50/100 + 90/100, // default: 90/100 ]; // Platter Ring LED mode @@ -79,7 +82,7 @@ MC7000.scratchParams = { // set to 1 with audio buffer set to 25ms // set to 3 with audio buffer set to 5ms -MC7000.jogSensitivity = 1; // default: 1.0 with audio buffer set to 23ms +MC7000.jogSensitivity = 1.4; /*///////////////////////////////// // USER VARIABLES END // @@ -208,13 +211,10 @@ MC7000.init = function() { } // send Controller Status SysEx message delayed to avoid conflicts with Softtakeover - engine.beginTimer(2000, MC7000.delayedSysEx, true); -}; - -// SysEx message to receive all knob and fader positions -MC7000.delayedSysEx = function() { - var ControllerStatusSysex = [0xF0, 0x00, 0x20, 0x7F, 0x03, 0x01, 0xF7]; - midi.sendSysexMsg(ControllerStatusSysex, ControllerStatusSysex.length); + engine.beginTimer(2000, function() { + var ControllerStatusSysex = [0xF0, 0x00, 0x20, 0x7F, 0x03, 0x01, 0xF7]; + midi.sendSysexMsg(ControllerStatusSysex, ControllerStatusSysex.length); + }, true); }; // Sampler Volume Control @@ -496,7 +496,12 @@ MC7000.PadButtons = function(channel, control, value, status, group) { engine.setValue(group, "hotcue_" + i + "_activate", true); } else if (control === 0x14 + i - 1 && value === 0x00) { engine.setValue(group, "hotcue_" + i + "_activate", false); - engine.setValue(group, "slip_enabled", 0); + if (engine.getValue(group, "slip_enabled")) { + engine.setValue(group, "slip_enabled", false); + engine.beginTimer(250, function() { + engine.setValue(group, "slip_enabled", true); + }, true); + } } else if (control === 0x1C + i - 1 && value === 0x7F) { engine.setValue(group, "hotcue_" + i + "_clear", true); midi.sendShortMsg(0x94 + deckOffset, 0x1C + i - 1, MC7000.padColor.hotcueoff); @@ -649,7 +654,12 @@ MC7000.wheelTouch = function(channel, control, value, status, group) { MC7000.scratchParams.beta); } else { engine.scratchDisable(deckNumber); - engine.setValue(group, "slip_enabled", 0); + if (engine.getValue(group, "slip_enabled")) { + engine.setValue(group, "slip_enabled", false); + engine.beginTimer(250, function() { + engine.setValue(group, "slip_enabled", true); + }, true); + } } } }; @@ -845,6 +855,9 @@ MC7000.censor = function(channel, control, value, status, group) { } else { engine.setValue(group, "reverseroll", 0); } + engine.beginTimer(250, function() { + engine.setValue(group, "slip_enabled", true); + }, true); } else { // reverse play while button pressed if (value > 0) { -- cgit v1.2.3 From 5a29ee5e3a7c05a57a324a6a0bf8d65c89d0c022 Mon Sep 17 00:00:00 2001 From: toszlanyi Date: Tue, 20 Jul 2021 12:57:20 +0200 Subject: correct default values --- res/controllers/Denon-MC7000-scripts.js | 12 ++++++------ res/controllers/Denon-MC7000.midi.xml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/res/controllers/Denon-MC7000-scripts.js b/res/controllers/Denon-MC7000-scripts.js index 5dfa51e05d..116c93717c 100644 --- a/res/controllers/Denon-MC7000-scripts.js +++ b/res/controllers/Denon-MC7000-scripts.js @@ -1,5 +1,5 @@ /** - * Denon DJ MC7000 DJ controller script for Mixxx 2.3 + * Denon DJ MC7000 DJ controller script for Mixxx 2.3.1 * * Started in Dec. 2019 by OsZ * @@ -37,7 +37,7 @@ var MC7000 = {}; // 1) Beat LED in Slicer mode (counts every 8 beats AFTER the CUE point) // only works for CONSTANT TEMPO tracks // needs beat grid and CUE point set -MC7000.experimental = true; +MC7000.experimental = false; // Wanna have Needle Search active while playing a track ? // In any case Needle Search is available holding "SHIFT" down. @@ -46,7 +46,7 @@ MC7000.needleSearchPlay = false; // Possible pitchfader rate ranges given in percent. // can be cycled through by the RANGE buttons. -// All default values are the same as selectable in Preferences +// All default values are the same as selectable in Mixxx Preferences MC7000.rateRanges = [ 4/100, // default: 4/100 6/100, // default: 6/100 @@ -72,8 +72,8 @@ MC7000.VinylModeOn = true; // default: true // Scratch algorithm parameters MC7000.scratchParams = { recordSpeed: 33 + 1/3, // default: 33 + 1/3 - alpha: (1.0/100), // default: (1.0/10) - beta: (1.0/100)/32 // default: (1.0/10)/32 + alpha: (1.0/10), // default: (1.0/10) + beta: (1.0/10)/32 // default: (1.0/10)/32 }; // Sensitivity factor of the jog wheel (also depends on audio latency) @@ -82,7 +82,7 @@ MC7000.scratchParams = { // set to 1 with audio buffer set to 25ms // set to 3 with audio buffer set to 5ms -MC7000.jogSensitivity = 1.4; +MC7000.jogSensitivity = 1; /*///////////////////////////////// // USER VARIABLES END // diff --git a/res/controllers/Denon-MC7000.midi.xml b/res/controllers/Denon-MC7000.midi.xml index 09c388ba54..2d07d4b175 100644 --- a/res/controllers/Denon-MC7000.midi.xml +++ b/res/controllers/Denon-MC7000.midi.xml @@ -1,5 +1,5 @@ - + Denon MC7000 OsZ -- cgit v1.2.3 From 6e207232c82fdf038a92f4bf273917ef2e1cf99e Mon Sep 17 00:00:00 2001 From: toszlanyi Date: Sat, 24 Jul 2021 05:45:45 +0200 Subject: adjustments after review --- res/controllers/Denon-MC7000-scripts.js | 6 +++--- res/controllers/Denon-MC7000.midi.xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/res/controllers/Denon-MC7000-scripts.js b/res/controllers/Denon-MC7000-scripts.js index 116c93717c..61fd8cc858 100644 --- a/res/controllers/Denon-MC7000-scripts.js +++ b/res/controllers/Denon-MC7000-scripts.js @@ -563,11 +563,11 @@ MC7000.PadButtons = function(channel, control, value, status, group) { if (engine.getValue("[Sampler" + i + "]", "track_loaded") === 0) { engine.setValue("[Sampler" + i + "]", "LoadSelectedTrack", 1); } else if (engine.getValue("[Sampler" + i + "]", "track_loaded") === 1) { - // STOP PLAYING SAMPLERS ... + // stop playing all other samplers ... for (j = 1; j <=8; j++) { engine.setValue("[Sampler" + j + "]", "cue_gotoandstop", 1); } - // ... BEFORE THE ACTUAL SAMPLER TO PLAY GETS STARTED + // ... before the actual sampler to play gets started engine.setValue("[Sampler" + i + "]", "cue_gotoandplay", 1); } } else if (control === 0x1C + i - 1 && value >= 0x01) { @@ -680,7 +680,7 @@ MC7000.wheelTurn = function(channel, control, value, status, group) { } else { if (MC7000.shift[deckOffset]) { // While Shift Button pressed -> Search through track - var jogSearch = 100 * adjustedSpeed; + var jogSearch = 100 * adjustedSpeed; // moves 100 times faster than normal jog engine.setValue(group, "jog", jogSearch); } else { // While Shift Button released -> Pitch Bend diff --git a/res/controllers/Denon-MC7000.midi.xml b/res/controllers/Denon-MC7000.midi.xml index 2d07d4b175..fa66ed534f 100644 --- a/res/controllers/Denon-MC7000.midi.xml +++ b/res/controllers/Denon-MC7000.midi.xml @@ -3,7 +3,7 @@ Denon MC7000 OsZ - Denon MC7000 mapping. Check your Linux Kernel version to get the Audio Interface working - Details in user manual + A professional 4-channel DJ controller featuring 2 separate audio interfaces. Please refer to the Mixxx user manual to get the audio interfaces working on Linux. https://mixxx.discourse.group/t/denon-mc7000-mapping/18235 https://github.com/mixxxdj/mixxx/wiki/Denon-MC7000 denon_mc7000 -- cgit v1.2.3 From b83b68626bb16974a803d2997de8db9766b6a46a Mon Sep 17 00:00:00 2001 From: toszlanyi Date: Fri, 6 Aug 2021 11:01:49 +0200 Subject: added user variable for sampler play --- res/controllers/Denon-MC7000-scripts.js | 38 +++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/res/controllers/Denon-MC7000-scripts.js b/res/controllers/Denon-MC7000-scripts.js index 61fd8cc858..b5c025a744 100644 --- a/res/controllers/Denon-MC7000-scripts.js +++ b/res/controllers/Denon-MC7000-scripts.js @@ -37,12 +37,17 @@ var MC7000 = {}; // 1) Beat LED in Slicer mode (counts every 8 beats AFTER the CUE point) // only works for CONSTANT TEMPO tracks // needs beat grid and CUE point set -MC7000.experimental = false; +MC7000.experimental = false; // default: false // Wanna have Needle Search active while playing a track ? // In any case Needle Search is available holding "SHIFT" down. // can be true or false (recommended: false) -MC7000.needleSearchPlay = false; +MC7000.needleSearchPlay = false; // default: false + +// select if the previous sampler shall stop before a new sampler starts +// true: a running sampler will stop before the new sampler starts +// false: all triggered samplers will play simultaniously +MC7000.prevSamplerStop = true; // default: true // Possible pitchfader rate ranges given in percent. // can be cycled through by the RANGE buttons. @@ -167,10 +172,9 @@ MC7000.init = function() { var i; - // Softtakeover for Pitch Faders - for (i = 1; i <= 4; i++) { - engine.softTakeover("[Channel" + i + "]", "rate", true); - } + // obtain all knob and slider positions + var ControllerStatusSysex = [0xF0, 0x00, 0x20, 0x7F, 0x03, 0x01, 0xF7]; + midi.sendSysexMsg(ControllerStatusSysex, ControllerStatusSysex.length); // VU meters engine.makeConnection("[Channel1]", "VuMeter", MC7000.VuMeter); @@ -210,10 +214,12 @@ MC7000.init = function() { engine.makeConnection("[Sampler"+i+"]", "play", MC7000.SamplerLED); } - // send Controller Status SysEx message delayed to avoid conflicts with Softtakeover + // send Softtakeover delayed to avoid conflicts with ControllerStatusSysex engine.beginTimer(2000, function() { - var ControllerStatusSysex = [0xF0, 0x00, 0x20, 0x7F, 0x03, 0x01, 0xF7]; - midi.sendSysexMsg(ControllerStatusSysex, ControllerStatusSysex.length); + // Softtakeover for Pitch Faders only + for (i = 1; i <= 4; i++) { + engine.softTakeover("[Channel" + i + "]", "rate", true); + } }, true); }; @@ -563,12 +569,16 @@ MC7000.PadButtons = function(channel, control, value, status, group) { if (engine.getValue("[Sampler" + i + "]", "track_loaded") === 0) { engine.setValue("[Sampler" + i + "]", "LoadSelectedTrack", 1); } else if (engine.getValue("[Sampler" + i + "]", "track_loaded") === 1) { - // stop playing all other samplers ... - for (j = 1; j <=8; j++) { - engine.setValue("[Sampler" + j + "]", "cue_gotoandstop", 1); + if (MC7000.prevSamplerStop) { + // stop playing all other samplers ... + for (j = 1; j <=8; j++) { + engine.setValue("[Sampler" + j + "]", "cue_gotoandstop", 1); + } + // ... before the actual sampler to play gets started + engine.setValue("[Sampler" + i + "]", "cue_gotoandplay", 1); + } else { + engine.setValue("[Sampler" + i + "]", "cue_gotoandplay", 1); } - // ... before the actual sampler to play gets started - engine.setValue("[Sampler" + i + "]", "cue_gotoandplay", 1); } } else if (control === 0x1C + i - 1 && value >= 0x01) { if (engine.getValue("[Sampler" + i + "]", "play") === 1) { -- cgit v1.2.3 From 9d05968de807de84cce2ad6695e0836e6c1fe466 Mon Sep 17 00:00:00 2001 From: toszlanyi Date: Sun, 8 Aug 2021 14:55:30 +0200 Subject: reduced slip timer values to 20ms and added timer to backspin --- res/controllers/Denon-MC7000-scripts.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/res/controllers/Denon-MC7000-scripts.js b/res/controllers/Denon-MC7000-scripts.js index b5c025a744..8e997ee371 100644 --- a/res/controllers/Denon-MC7000-scripts.js +++ b/res/controllers/Denon-MC7000-scripts.js @@ -504,7 +504,7 @@ MC7000.PadButtons = function(channel, control, value, status, group) { engine.setValue(group, "hotcue_" + i + "_activate", false); if (engine.getValue(group, "slip_enabled")) { engine.setValue(group, "slip_enabled", false); - engine.beginTimer(250, function() { + engine.beginTimer(20, function() { engine.setValue(group, "slip_enabled", true); }, true); } @@ -666,7 +666,7 @@ MC7000.wheelTouch = function(channel, control, value, status, group) { engine.scratchDisable(deckNumber); if (engine.getValue(group, "slip_enabled")) { engine.setValue(group, "slip_enabled", false); - engine.beginTimer(250, function() { + engine.beginTimer(20, function() { engine.setValue(group, "slip_enabled", true); }, true); } @@ -841,15 +841,18 @@ MC7000.reverse = function(channel, control, value, status, group) { if (value > 0) { if (engine.getValue(group, "slip_enabled")) { // backspin while button is pressed at a rate of -15 and decrease by "factor" - engine.brake(deckNumber, value > 0, MC7000.factor[deckNumber], - 15); + engine.brake(deckNumber, value > 0, MC7000.factor[deckNumber], - 10); } else { - engine.brake(deckNumber, true, MC7000.factor[deckNumber], - 15); + engine.brake(deckNumber, true, MC7000.factor[deckNumber], - 10); } } else { if (engine.getValue(group, "slip_enabled")) { engine.brake(deckNumber, false); // disable brake effect engine.setValue(group, "play", 1); - engine.setValue(group, "slip_enabled", 0); + engine.setValue(group, "slip_enabled", false); + engine.beginTimer(20, function() { + engine.setValue(group, "slip_enabled", true); + }, true); } else { engine.softStart(deckNumber, true, MC7000.factor[deckNumber]); } @@ -865,7 +868,7 @@ MC7000.censor = function(channel, control, value, status, group) { } else { engine.setValue(group, "reverseroll", 0); } - engine.beginTimer(250, function() { + engine.beginTimer(20, function() { engine.setValue(group, "slip_enabled", true); }, true); } else { -- cgit v1.2.3 From 9c88e5153203b5f1a0f985e44a9f569ac6d0e143 Mon Sep 17 00:00:00 2001 From: toszlanyi Date: Tue, 17 Aug 2021 15:45:21 +0200 Subject: last adjustments --- res/controllers/Denon-MC7000-scripts.js | 35 ++++++++++++++------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/res/controllers/Denon-MC7000-scripts.js b/res/controllers/Denon-MC7000-scripts.js index 8e997ee371..d540e02a2b 100644 --- a/res/controllers/Denon-MC7000-scripts.js +++ b/res/controllers/Denon-MC7000-scripts.js @@ -504,7 +504,7 @@ MC7000.PadButtons = function(channel, control, value, status, group) { engine.setValue(group, "hotcue_" + i + "_activate", false); if (engine.getValue(group, "slip_enabled")) { engine.setValue(group, "slip_enabled", false); - engine.beginTimer(20, function() { + engine.beginTimer(50, function() { engine.setValue(group, "slip_enabled", true); }, true); } @@ -574,11 +574,9 @@ MC7000.PadButtons = function(channel, control, value, status, group) { for (j = 1; j <=8; j++) { engine.setValue("[Sampler" + j + "]", "cue_gotoandstop", 1); } - // ... before the actual sampler to play gets started - engine.setValue("[Sampler" + i + "]", "cue_gotoandplay", 1); - } else { - engine.setValue("[Sampler" + i + "]", "cue_gotoandplay", 1); } + // ... before the actual sampler to play gets started + engine.setValue("[Sampler" + i + "]", "cue_gotoandplay", 1); } } else if (control === 0x1C + i - 1 && value >= 0x01) { if (engine.getValue("[Sampler" + i + "]", "play") === 1) { @@ -666,7 +664,7 @@ MC7000.wheelTouch = function(channel, control, value, status, group) { engine.scratchDisable(deckNumber); if (engine.getValue(group, "slip_enabled")) { engine.setValue(group, "slip_enabled", false); - engine.beginTimer(20, function() { + engine.beginTimer(50, function() { engine.setValue(group, "slip_enabled", true); }, true); } @@ -839,18 +837,15 @@ MC7000.stopTime = function(channel, control, value, status, group) { MC7000.reverse = function(channel, control, value, status, group) { var deckNumber = script.deckFromGroup(group); if (value > 0) { - if (engine.getValue(group, "slip_enabled")) { - // backspin while button is pressed at a rate of -15 and decrease by "factor" - engine.brake(deckNumber, value > 0, MC7000.factor[deckNumber], - 10); - } else { - engine.brake(deckNumber, true, MC7000.factor[deckNumber], - 10); - } + // while the button is pressed spin back + // start at a rate of -10 and decrease by "MC7000.factor" + engine.brake(deckNumber, true, MC7000.factor[deckNumber], -10); } else { if (engine.getValue(group, "slip_enabled")) { engine.brake(deckNumber, false); // disable brake effect engine.setValue(group, "play", 1); engine.setValue(group, "slip_enabled", false); - engine.beginTimer(20, function() { + engine.beginTimer(50, function() { engine.setValue(group, "slip_enabled", true); }, true); } else { @@ -868,7 +863,7 @@ MC7000.censor = function(channel, control, value, status, group) { } else { engine.setValue(group, "reverseroll", 0); } - engine.beginTimer(20, function() { + engine.beginTimer(50, function() { engine.setValue(group, "slip_enabled", true); }, true); } else { @@ -972,14 +967,14 @@ MC7000.TrackPositionLEDs = function(value, group) { } // now chose which PAD LED to turn on (+8 means shifted PAD LEDs) if (beatCountLED === 0) { - midi.sendShortMsg(0x94 + deckOffset, 0x14, MC7000.padColor.hotcueon); - midi.sendShortMsg(0x94 + deckOffset, 0x14 + 8, MC7000.padColor.hotcueon); + midi.sendShortMsg(0x94 + deckOffset, 0x14, MC7000.padColor.slicerJumpFwd); + midi.sendShortMsg(0x94 + deckOffset, 0x14 + 8, MC7000.padColor.slicerJumpFwd); } else if (beatCountLED === 7) { - midi.sendShortMsg(0x94 + deckOffset, 0x1B, MC7000.padColor.hotcueon); - midi.sendShortMsg(0x94 + deckOffset, 0x1B + 8, MC7000.padColor.hotcueon); + midi.sendShortMsg(0x94 + deckOffset, 0x1B, MC7000.padColor.slicerJumpFwd); + midi.sendShortMsg(0x94 + deckOffset, 0x1B + 8, MC7000.padColor.slicerJumpFwd); } else if (beatCountLED > 0 && beatCountLED < 7) { - midi.sendShortMsg(0x94 + deckOffset, 0x14 + beatCountLED, MC7000.padColor.hotcueon); - midi.sendShortMsg(0x94 + deckOffset, 0x14 + 8 + beatCountLED, MC7000.padColor.hotcueon); + midi.sendShortMsg(0x94 + deckOffset, 0x14 + beatCountLED, MC7000.padColor.slicerJumpFwd); + midi.sendShortMsg(0x94 + deckOffset, 0x14 + 8 + beatCountLED, MC7000.padColor.slicerJumpFwd); } } MC7000.prevPadLED[deckOffset] = beatCountLED; -- cgit v1.2.3 From 919a208c3fe715c1dccc28cd7817010974a7da43 Mon Sep 17 00:00:00 2001 From: toszlanyi Date: Mon, 23 Aug 2021 17:01:34 +0200 Subject: solve codespell check issues from last commit --- res/controllers/Denon-MC7000-scripts.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/res/controllers/Denon-MC7000-scripts.js b/res/controllers/Denon-MC7000-scripts.js index d540e02a2b..bd6f136b98 100644 --- a/res/controllers/Denon-MC7000-scripts.js +++ b/res/controllers/Denon-MC7000-scripts.js @@ -46,9 +46,14 @@ MC7000.needleSearchPlay = false; // default: false // select if the previous sampler shall stop before a new sampler starts // true: a running sampler will stop before the new sampler starts -// false: all triggered samplers will play simultaniously +// false: all triggered samplers will play simultaneously MC7000.prevSamplerStop = true; // default: true +// Set Vinyl Mode on ("true") or off ("false") when MIXXX starts. +// This sets the Jog Wheel touch detection / Vinyl Mode +// and the Jog LEDs ("VINYL" on = spinny, "VINYL" off = track position). +MC7000.VinylModeOn = true; // default: true + // Possible pitchfader rate ranges given in percent. // can be cycled through by the RANGE buttons. // All default values are the same as selectable in Mixxx Preferences @@ -69,11 +74,6 @@ MC7000.rateRanges = [ // use "SHIFT" + "DECK #" to toggle between both modes MC7000.modeSingleLED = 1; // default: 1 -// Set Vinyl Mode on ("true") or off ("false") when MIXXX starts. -// This sets the Jog Wheel touch detection / Vinyl Mode -// and the Jog LEDs ("VINYL" on = spinny, "VINYL" off = track position). -MC7000.VinylModeOn = true; // default: true - // Scratch algorithm parameters MC7000.scratchParams = { recordSpeed: 33 + 1/3, // default: 33 + 1/3 @@ -86,7 +86,6 @@ MC7000.scratchParams = { // set to 0.5 with audio buffer set to 50ms // set to 1 with audio buffer set to 25ms // set to 3 with audio buffer set to 5ms - MC7000.jogSensitivity = 1; /*///////////////////////////////// -- cgit v1.2.3 From 829caacce07e4624f65442f8270bcfbe33de837f Mon Sep 17 00:00:00 2001 From: toszlanyi Date: Wed, 25 Aug 2021 04:27:02 +0200 Subject: delete all default comments --- res/controllers/Denon-MC7000-scripts.js | 36 ++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/res/controllers/Denon-MC7000-scripts.js b/res/controllers/Denon-MC7000-scripts.js index bd6f136b98..45405d56f0 100644 --- a/res/controllers/Denon-MC7000-scripts.js +++ b/res/controllers/Denon-MC7000-scripts.js @@ -37,48 +37,48 @@ var MC7000 = {}; // 1) Beat LED in Slicer mode (counts every 8 beats AFTER the CUE point) // only works for CONSTANT TEMPO tracks // needs beat grid and CUE point set -MC7000.experimental = false; // default: false +MC7000.experimental = true; // Wanna have Needle Search active while playing a track ? // In any case Needle Search is available holding "SHIFT" down. -// can be true or false (recommended: false) -MC7000.needleSearchPlay = false; // default: false +// can be true or false +MC7000.needleSearchPlay = false; // select if the previous sampler shall stop before a new sampler starts // true: a running sampler will stop before the new sampler starts // false: all triggered samplers will play simultaneously -MC7000.prevSamplerStop = true; // default: true +MC7000.prevSamplerStop = true; // Set Vinyl Mode on ("true") or off ("false") when MIXXX starts. // This sets the Jog Wheel touch detection / Vinyl Mode // and the Jog LEDs ("VINYL" on = spinny, "VINYL" off = track position). -MC7000.VinylModeOn = true; // default: true +MC7000.VinylModeOn = true; // Possible pitchfader rate ranges given in percent. // can be cycled through by the RANGE buttons. // All default values are the same as selectable in Mixxx Preferences MC7000.rateRanges = [ - 4/100, // default: 4/100 - 6/100, // default: 6/100 - 8/100, // default: 8/100 - 10/100, // default: 10/100 - 16/100, // default: 16/100 - 24/100, // default: 24/100 - 50/100, // default: 50/100 - 90/100, // default: 90/100 + 4/100, + 6/100, + 8/100, + 10/100, + 16/100, + 24/100, + 50/100, + 90/100, ]; // Platter Ring LED mode // Mode 0 = Single "off" LED chase (all others "on") // Mode 1 = Single "on" LED chase (all others "off") // use "SHIFT" + "DECK #" to toggle between both modes -MC7000.modeSingleLED = 1; // default: 1 +MC7000.modeSingleLED = 1; // Scratch algorithm parameters MC7000.scratchParams = { - recordSpeed: 33 + 1/3, // default: 33 + 1/3 - alpha: (1.0/10), // default: (1.0/10) - beta: (1.0/10)/32 // default: (1.0/10)/32 + recordSpeed: 33 + 1/3, + alpha: (1.0/10), + beta: (1.0/10)/32 }; // Sensitivity factor of the jog wheel (also depends on audio latency) @@ -86,7 +86,7 @@ MC7000.scratchParams = { // set to 0.5 with audio buffer set to 50ms // set to 1 with audio buffer set to 25ms // set to 3 with audio buffer set to 5ms -MC7000.jogSensitivity = 1; +MC7000.jogSensitivity = 3; /*///////////////////////////////// // USER VARIABLES END // -- cgit v1.2.3 From 7912d937fb8944c92b3fdc91f57a05ce05be36c2 Mon Sep 17 00:00:00 2001 From: toszlanyi Date: Sun, 5 Sep 2021 07:58:00 +0200 Subject: add library search with jog wheel like in Traktor --- res/controllers/Denon-MC7000-scripts.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/res/controllers/Denon-MC7000-scripts.js b/res/controllers/Denon-MC7000-scripts.js index 45405d56f0..5ee83626fa 100644 --- a/res/controllers/Denon-MC7000-scripts.js +++ b/res/controllers/Denon-MC7000-scripts.js @@ -86,7 +86,7 @@ MC7000.scratchParams = { // set to 0.5 with audio buffer set to 50ms // set to 1 with audio buffer set to 25ms // set to 3 with audio buffer set to 5ms -MC7000.jogSensitivity = 3; +MC7000.jogSensitivity = 2; /*///////////////////////////////// // USER VARIABLES END // @@ -653,8 +653,9 @@ MC7000.loadButton = function(channel, control, value, status, group) { MC7000.wheelTouch = function(channel, control, value, status, group) { var deckNumber = script.deckFromGroup(group); var deckOffset = deckNumber - 1; + var maxLibrary = engine.getValue("[Master]", "maximize_library"); if (MC7000.isVinylMode[deckOffset]) { - if (value === 0x7F) { + if (value === 0x7F && maxLibrary === 0) { engine.scratchEnable(deckNumber, MC7000.jogWheelTicksPerRevolution, MC7000.scratchParams.recordSpeed, MC7000.scratchParams.alpha, @@ -681,7 +682,12 @@ MC7000.wheelTurn = function(channel, control, value, status, group) { var adjustedSpeed = numTicks * MC7000.jogSensitivity / 10; var deckNumber = script.deckFromGroup(group); var deckOffset = deckNumber - 1; - if (engine.isScratching(deckNumber)) { + var maxLibrary = engine.getValue("[Master]", "maximize_library"); + if (maxLibrary === 1 && numTicks > 0) { + engine.setValue("[Library]", "MoveUp", 1); + } else if (maxLibrary === 1 && numTicks < 0) { + engine.setValue("[Library]", "MoveDown", 1); + } else if (engine.isScratching(deckNumber)) { // Scratch! engine.scratchTick(deckNumber, numTicks * MC7000.jogSensitivity); } else { -- cgit v1.2.3 From a6a5f564a2370007b68c7d9de61b61f0f335633b Mon Sep 17 00:00:00 2001 From: toszlanyi Date: Sun, 5 Sep 2021 07:59:01 +0200 Subject: add library search with jog wheel like in Traktor --- res/controllers/Denon-MC7000-scripts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/controllers/Denon-MC7000-scripts.js b/res/controllers/Denon-MC7000-scripts.js index 5ee83626fa..bdeceeb3af 100644 --- a/res/controllers/Denon-MC7000-scripts.js +++ b/res/controllers/Denon-MC7000-scripts.js @@ -37,7 +37,7 @@ var MC7000 = {}; // 1) Beat LED in Slicer mode (counts every 8 beats AFTER the CUE point) // only works for CONSTANT TEMPO tracks // needs beat grid and CUE point set -MC7000.experimental = true; +MC7000.experimental = false; // Wanna have Needle Search active while playing a track ? // In any case Needle Search is available holding "SHIFT" down. @@ -86,7 +86,7 @@ MC7000.scratchParams = { // set to 0.5 with audio buffer set to 50ms // set to 1 with audio buffer set to 25ms // set to 3 with audio buffer set to 5ms -MC7000.jogSensitivity = 2; +MC7000.jogSensitivity = 1; /*///////////////////////////////// // USER VARIABLES END // -- cgit v1.2.3 From 2de7c5cb3760aa8b91006abb236f3b3acf083513 Mon Sep 17 00:00:00 2001 From: toszlanyi Date: Mon, 6 Sep 2021 06:25:27 +0200 Subject: fixed issue with SLIP + Jog Wheel --- res/controllers/Denon-MC7000-scripts.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/res/controllers/Denon-MC7000-scripts.js b/res/controllers/Denon-MC7000-scripts.js index bdeceeb3af..819e76b8a6 100644 --- a/res/controllers/Denon-MC7000-scripts.js +++ b/res/controllers/Denon-MC7000-scripts.js @@ -654,19 +654,21 @@ MC7000.wheelTouch = function(channel, control, value, status, group) { var deckNumber = script.deckFromGroup(group); var deckOffset = deckNumber - 1; var maxLibrary = engine.getValue("[Master]", "maximize_library"); - if (MC7000.isVinylMode[deckOffset]) { - if (value === 0x7F && maxLibrary === 0) { + if (MC7000.isVinylMode[deckOffset] && maxLibrary === 0) { + if (value === 0x7F) { engine.scratchEnable(deckNumber, MC7000.jogWheelTicksPerRevolution, MC7000.scratchParams.recordSpeed, MC7000.scratchParams.alpha, MC7000.scratchParams.beta); } else { - engine.scratchDisable(deckNumber); if (engine.getValue(group, "slip_enabled")) { + engine.scratchDisable(deckNumber, false); // stops scratching immediately engine.setValue(group, "slip_enabled", false); engine.beginTimer(50, function() { engine.setValue(group, "slip_enabled", true); }, true); + } else { + engine.scratchDisable(deckNumber); // continues scratching e.g. for backspin } } } @@ -684,9 +686,9 @@ MC7000.wheelTurn = function(channel, control, value, status, group) { var deckOffset = deckNumber - 1; var maxLibrary = engine.getValue("[Master]", "maximize_library"); if (maxLibrary === 1 && numTicks > 0) { - engine.setValue("[Library]", "MoveUp", 1); - } else if (maxLibrary === 1 && numTicks < 0) { engine.setValue("[Library]", "MoveDown", 1); + } else if (maxLibrary === 1 && numTicks < 0) { + engine.setValue("[Library]", "MoveUp", 1); } else if (engine.isScratching(deckNumber)) { // Scratch! engine.scratchTick(deckNumber, numTicks * MC7000.jogSensitivity); -- cgit v1.2.3 From b0f67b15737a6b46ae29121e9fa81295eb84e080 Mon Sep 17 00:00:00 2001 From: toszlanyi Date: Thu, 9 Sep 2021 09:20:04 +0200 Subject: changes as wished by Swiftb0y --- res/controllers/Denon-MC7000-scripts.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/res/controllers/Denon-MC7000-scripts.js b/res/controllers/Denon-MC7000-scripts.js index 819e76b8a6..16d90ea6ab 100644 --- a/res/controllers/Denon-MC7000-scripts.js +++ b/res/controllers/Denon-MC7000-scripts.js @@ -653,8 +653,8 @@ MC7000.loadButton = function(channel, control, value, status, group) { MC7000.wheelTouch = function(channel, control, value, status, group) { var deckNumber = script.deckFromGroup(group); var deckOffset = deckNumber - 1; - var maxLibrary = engine.getValue("[Master]", "maximize_library"); - if (MC7000.isVinylMode[deckOffset] && maxLibrary === 0) { + var libraryMaximized = engine.getValue("[Master]", "maximize_library") > 0; + if (MC7000.isVinylMode[deckOffset] && !libraryMaximized) { if (value === 0x7F) { engine.scratchEnable(deckNumber, MC7000.jogWheelTicksPerRevolution, MC7000.scratchParams.recordSpeed, @@ -684,10 +684,10 @@ MC7000.wheelTurn = function(channel, control, value, status, group) { var adjustedSpeed = numTicks * MC7000.jogSensitivity / 10; var deckNumber = script.deckFromGroup(group); var deckOffset = deckNumber - 1; - var maxLibrary = engine.getValue("[Master]", "maximize_library"); - if (maxLibrary === 1 && numTicks > 0) { + var libraryMaximized = engine.getValue("[Master]", "maximize_library"); + if (libraryMaximized === 1 && numTicks > 0) { engine.setValue("[Library]", "MoveDown", 1); - } else if (maxLibrary === 1 && numTicks < 0) { + } else if (libraryMaximized === 1 && numTicks < 0) { engine.setValue("[Library]", "MoveUp", 1); } else if (engine.isScratching(deckNumber)) { // Scratch! -- cgit v1.2.3 From 6a07dcfbc9992769a6286b747c518617951b9ba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 19 Sep 2021 15:43:54 +0200 Subject: Improve some calls with [InternalClock],bpm --- src/engine/enginemaster.cpp | 2 +- src/engine/sync/basesyncablelistener.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/engine/enginemaster.cpp b/src/engine/enginemaster.cpp index 33cd29d5e4..3ec2d7afd0 100644 --- a/src/engine/enginemaster.cpp +++ b/src/engine/enginemaster.cpp @@ -83,7 +83,7 @@ EngineMaster::EngineMaster( // The last-used bpm value is saved in the destructor of EngineSync. double default_bpm = pConfig->getValue( ConfigKey("[InternalClock]", "bpm"), 124.0); - ControlObject::getControl(ConfigKey("[InternalClock]","bpm"))->set(default_bpm); + ControlObject::set(ConfigKey("[InternalClock]", "bpm"), default_bpm); // Crossfader m_pCrossfader = new ControlPotmeter(ConfigKey(group, "crossfader"), -1., 1.); diff --git a/src/engine/sync/basesyncablelistener.cpp b/src/engine/sync/basesyncablelistener.cpp index e2c309c6bc..f8bc458faf 100644 --- a/src/engine/sync/basesyncablelistener.cpp +++ b/src/engine/sync/basesyncablelistener.cpp @@ -20,8 +20,7 @@ BaseSyncableListener::BaseSyncableListener(UserSettingsPointer pConfig) BaseSyncableListener::~BaseSyncableListener() { // We use the slider value because that is never set to 0.0. - m_pConfig->set(ConfigKey("[InternalClock]", "bpm"), ConfigValue( - m_pInternalClock->getBpm())); + m_pConfig->setValue(ConfigKey(kInternalClockGroup, "bpm"), m_pInternalClock->getBpm()); delete m_pInternalClock; } -- cgit v1.2.3 From 7692d734dfdd8a3e0e4ed2524f4d73c614807154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 19 Sep 2021 15:44:46 +0200 Subject: Replace potentially long running while loop with fmod(), fixing lp:1943320 --- src/engine/sync/internalclock.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/engine/sync/internalclock.cpp b/src/engine/sync/internalclock.cpp index a0b15a9a8c..212764ae31 100644 --- a/src/engine/sync/internalclock.cpp +++ b/src/engine/sync/internalclock.cpp @@ -9,6 +9,7 @@ #include "moc_internalclock.cpp" #include "preferences/usersettings.h" #include "util/logger.h" +#include "util/math.h" namespace { const mixxx::Logger kLogger("InternalClock"); @@ -219,10 +220,7 @@ void InternalClock::onCallbackEnd(int sampleRate, int bufferSize) { m_dBeatLength = 21338; } - while (m_dClockPosition >= m_dBeatLength) { - m_dClockPosition -= m_dBeatLength; - } - + m_dClockPosition = fmod(m_dClockPosition, m_dBeatLength); double beat_distance = getBeatDistance(); m_pClockBeatDistance->set(beat_distance); m_pEngineSync->notifyBeatDistanceChanged(this, beat_distance); -- cgit v1.2.3 From 35de9d289024f98cbea206e4c2edebec0bcfeb1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 20 Sep 2021 00:00:49 +0200 Subject: Replace while loops with ceil() calls, do make the run time more deteministic. --- src/engine/controls/loopingcontrol.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/engine/controls/loopingcontrol.cpp b/src/engine/controls/loopingcontrol.cpp index 77010bcfff..b4bea95f1a 100644 --- a/src/engine/controls/loopingcontrol.cpp +++ b/src/engine/controls/loopingcontrol.cpp @@ -1277,24 +1277,25 @@ double LoopingControl::seekInsideAdjustedLoop( double new_loop_size = new_loop_out - new_loop_in; DEBUG_ASSERT(new_loop_size > 0); double adjusted_position = currentSample; - while (adjusted_position > new_loop_out) { - adjusted_position -= new_loop_size; + if (adjusted_position > new_loop_out) { + double adjust_steps = ceil((adjusted_position - new_loop_out) / new_loop_size); + adjusted_position -= adjust_steps * new_loop_size; + DEBUG_ASSERT(adjusted_position <= new_loop_out); VERIFY_OR_DEBUG_ASSERT(adjusted_position > new_loop_in) { // I'm not even sure this is possible. The new loop would have to be bigger than the // old loop, and the playhead was somehow outside the old loop. qWarning() << "SHOULDN'T HAPPEN: seekInsideAdjustedLoop couldn't find a new position --" << " seeking to in point"; adjusted_position = new_loop_in; - break; } - } - while (adjusted_position < new_loop_in) { - adjusted_position += new_loop_size; + } else if (adjusted_position < new_loop_in) { + double adjust_steps = ceil((new_loop_in - adjusted_position) / new_loop_size); + adjusted_position += adjust_steps * new_loop_size; + DEBUG_ASSERT(adjusted_position >= new_loop_in); VERIFY_OR_DEBUG_ASSERT(adjusted_position < new_loop_out) { qWarning() << "SHOULDN'T HAPPEN: seekInsideAdjustedLoop couldn't find a new position --" << " seeking to in point"; adjusted_position = new_loop_in; - break; } } if (adjusted_position != currentSample) { -- cgit v1.2.3 From c92d7b31fb5a2ecfaf4214cc7d94447ed12ff610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 20 Sep 2021 10:23:52 +0200 Subject: Add a comment that clariefied the ceil() call --- src/engine/controls/loopingcontrol.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/engine/controls/loopingcontrol.cpp b/src/engine/controls/loopingcontrol.cpp index b4bea95f1a..6486b65d1a 100644 --- a/src/engine/controls/loopingcontrol.cpp +++ b/src/engine/controls/loopingcontrol.cpp @@ -1278,6 +1278,8 @@ double LoopingControl::seekInsideAdjustedLoop( DEBUG_ASSERT(new_loop_size > 0); double adjusted_position = currentSample; if (adjusted_position > new_loop_out) { + // In case play head has already passed the new out position, seek in whole + // loop size steps back, as if playback has been looped within the boudaries double adjust_steps = ceil((adjusted_position - new_loop_out) / new_loop_size); adjusted_position -= adjust_steps * new_loop_size; DEBUG_ASSERT(adjusted_position <= new_loop_out); @@ -1289,6 +1291,8 @@ double LoopingControl::seekInsideAdjustedLoop( adjusted_position = new_loop_in; } } else if (adjusted_position < new_loop_in) { + // In case play head has already been looped back to the old loop in position, + // seek in whole loop size steps forward until we are in the new loop boundaries double adjust_steps = ceil((new_loop_in - adjusted_position) / new_loop_size); adjusted_position += adjust_steps * new_loop_size; DEBUG_ASSERT(adjusted_position >= new_loop_in); -- cgit v1.2.3 From 1931eb8db8706bf8155e09eb0d14a27b4f800950 Mon Sep 17 00:00:00 2001 From: Uwe Klotz Date: Fri, 24 Sep 2021 10:37:12 +0200 Subject: Fix typo --- src/engine/controls/loopingcontrol.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/controls/loopingcontrol.cpp b/src/engine/controls/loopingcontrol.cpp index 6486b65d1a..e055c0257c 100644 --- a/src/engine/controls/loopingcontrol.cpp +++ b/src/engine/controls/loopingcontrol.cpp @@ -1279,7 +1279,7 @@ double LoopingControl::seekInsideAdjustedLoop( double adjusted_position = currentSample; if (adjusted_position > new_loop_out) { // In case play head has already passed the new out position, seek in whole - // loop size steps back, as if playback has been looped within the boudaries + // loop size steps back, as if playback has been looped within the boundaries double adjust_steps = ceil((adjusted_position - new_loop_out) / new_loop_size); adjusted_position -= adjust_steps * new_loop_size; DEBUG_ASSERT(adjusted_position <= new_loop_out); -- cgit v1.2.3