aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDevine Lu Linvega <[email protected]>2020-10-01 13:35:37 -0700
committerGitHub <[email protected]>2020-10-01 13:35:37 -0700
commit0050b537975c47204becdc9ad3208c08d30f3c56 (patch)
tree10b6cebf3d02450d0894c52e9bb0acd5352662f4
parentd082282681e1fc6610950bac274251f5f4314745 (diff)
parentbf36c798817bb17b11cfa395cc3bf2a39d28d754 (diff)
downloadOrca-0050b537975c47204becdc9ad3208c08d30f3c56.tar.gz
Orca-0050b537975c47204becdc9ad3208c08d30f3c56.zip
Merge pull request #240 from njanssen/midi-input-switching
MIDI clock stability and usability improvements
-rw-r--r--desktop/sources/scripts/clock.js57
-rw-r--r--desktop/sources/scripts/core/io/midi.js5
2 files changed, 43 insertions, 19 deletions
diff --git a/desktop/sources/scripts/clock.js b/desktop/sources/scripts/clock.js
index 1739dd0..95086cf 100644
--- a/desktop/sources/scripts/clock.js
+++ b/desktop/sources/scripts/clock.js
@@ -56,31 +56,48 @@ function Clock (client) {
client.update()
}
- this.play = function (msg = false) {
- console.log('Clock', 'Play', msg)
- if (this.isPaused === false) { return }
- if (this.isPuppet === true) { console.warn('Clock', 'External Midi control'); return }
+ this.play = function (msg = false, midiStart = false) {
+ console.log('Clock', 'Play', msg, midiStart)
+ if (this.isPaused === false && !midiStart) { return }
this.isPaused = false
- if (msg === true) { client.io.midi.sendClockStart() }
- this.setSpeed(this.speed.target, this.speed.target, true)
+ if (this.isPuppet === true) {
+ console.warn('Clock', 'External Midi control')
+ if (!pulse.frame || midiStart) { // no frames counted while paused (starting from no clock, unlikely) or triggered by MIDI clock START
+ this.setFrame(0) // make sure frame aligns with pulse count for an accurate beat
+ pulse.frame = 0
+ pulse.count = 5 // by MIDI standard next pulse is the beat
+ }
+ } else {
+ if (msg === true) { client.io.midi.sendClockStart() }
+ this.setSpeed(this.speed.target, this.speed.target, true)
+ }
}
this.stop = function (msg = false) {
console.log('Clock', 'Stop')
if (this.isPaused === true) { return }
- if (this.isPuppet === true) { console.warn('Clock', 'External Midi control'); return }
this.isPaused = true
- if (msg === true || client.io.midi.isClock) { client.io.midi.sendClockStop() }
+ if (this.isPuppet === true) {
+ console.warn('Clock', 'External Midi control')
+ } else {
+ if (msg === true || client.io.midi.isClock) { client.io.midi.sendClockStop() }
+ this.clearTimer()
+ }
client.io.midi.allNotesOff()
- this.clearTimer()
client.io.midi.silence()
}
// External Clock
- const pulse = { count: 0, last: null, timer: null }
+ const pulse = {
+ count: 0,
+ last: null,
+ timer: null,
+ frame: 0 // paused frame counter
+ }
this.tap = function () {
+ pulse.count = (pulse.count + 1) % 6
pulse.last = performance.now()
if (!this.isPuppet) {
console.log('Clock', 'Puppeteering starts..')
@@ -91,11 +108,15 @@ function Clock (client) {
this.untap()
}, 2000)
}
- if (this.isPaused) { return }
- pulse.count = pulse.count + 1
- if (pulse.count % 6 === 0) {
- client.run()
- pulse.count = 0
+ if (pulse.count == 0) {
+ if (this.isPaused) { pulse.frame++ }
+ else {
+ if (pulse.frame > 0) {
+ this.setFrame(client.orca.f + pulse.frame)
+ pulse.frame = 0
+ }
+ client.run()
+ }
}
}
@@ -103,9 +124,11 @@ function Clock (client) {
console.log('Clock', 'Puppeteering stops..')
clearInterval(pulse.timer)
this.isPuppet = false
- pulse.count = 1
+ pulse.frame = 0
pulse.last = null
- this.setTimer(this.speed.value)
+ if (!this.isPaused) {
+ this.setTimer(this.speed.value)
+ }
}
// Timer
diff --git a/desktop/sources/scripts/core/io/midi.js b/desktop/sources/scripts/core/io/midi.js
index d5fb1d7..7f4875a 100644
--- a/desktop/sources/scripts/core/io/midi.js
+++ b/desktop/sources/scripts/core/io/midi.js
@@ -129,7 +129,7 @@ function Midi (client) {
break
case 0xFA:
console.log('MIDI', 'Start Received')
- client.clock.play()
+ client.clock.play(false, true)
break
case 0xFB:
console.log('MIDI', 'Continue Received')
@@ -176,7 +176,8 @@ function Midi (client) {
}
this.selectNextInput = () => {
- this.inputIndex = this.inputIndex < this.inputs.length ? this.inputIndex + 1 : 0
+ const id = this.inputIndex < this.inputs.length - 1 ? this.inputIndex + 1 : -1
+ this.selectInput(id)
client.update()
}