adding a mechanism to stop (and reset) the transport
This commit is contained in:
@ -16,12 +16,14 @@ export class TransportNode extends AudioWorkletNode {
|
|||||||
this.executionLatency = 0;
|
this.executionLatency = 0;
|
||||||
this.lastLatencies = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
this.lastLatencies = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||||
this.indexOfLastLatencies = 0;
|
this.indexOfLastLatencies = 0;
|
||||||
setInterval(() => this.ping(), 1000);
|
// setInterval(() => this.ping(), 1000);
|
||||||
|
this.startTime = null;
|
||||||
|
this.elapsedTime = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ping() {
|
// ping() {
|
||||||
this.port.postMessage({ type: "ping", t: performance.now() })
|
// this.port.postMessage({ type: "ping", t: performance.now() })
|
||||||
}
|
// }
|
||||||
|
|
||||||
/** @type {(this: MessagePort, ev: MessageEvent<any>) => any} */
|
/** @type {(this: MessagePort, ev: MessageEvent<any>) => any} */
|
||||||
handleMessage = (message) => {
|
handleMessage = (message) => {
|
||||||
@ -29,7 +31,12 @@ export class TransportNode extends AudioWorkletNode {
|
|||||||
const delay = performance.now() - message.data.t;
|
const delay = performance.now() - message.data.t;
|
||||||
// console.log(delay);
|
// console.log(delay);
|
||||||
} else if (message.data && message.data.type === "bang") {
|
} else if (message.data && message.data.type === "bang") {
|
||||||
let { futureTimeStamp, timeToNextPulse, nextPulsePosition } = this.convertTimeToNextBarsBeats(message.data.currentTime);
|
if (this.startTime === null) {
|
||||||
|
this.startTime = message.data.currentTime;
|
||||||
|
}
|
||||||
|
this.elapsedTime = message.data.currentTime - this.startTime;
|
||||||
|
this.prevCurrentTime = message.data.currentTime;
|
||||||
|
let { futureTimeStamp, timeToNextPulse, nextPulsePosition } = this.convertTimeToNextBarsBeats(this.elapsedTime);
|
||||||
|
|
||||||
// Evaluate the global buffer only once per ppqn value
|
// Evaluate the global buffer only once per ppqn value
|
||||||
if (this.nextPulsePosition !== nextPulsePosition) {
|
if (this.nextPulsePosition !== nextPulsePosition) {
|
||||||
@ -62,6 +69,13 @@ export class TransportNode extends AudioWorkletNode {
|
|||||||
this.port.postMessage("pause");
|
this.port.postMessage("pause");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stop() {
|
||||||
|
this.startTime = null;
|
||||||
|
this.elapsedTime = null;
|
||||||
|
this.app.clock.tick = 0;
|
||||||
|
this.port.postMessage("stop");
|
||||||
|
}
|
||||||
|
|
||||||
convertTimeToBarsBeats(currentTime) {
|
convertTimeToBarsBeats(currentTime) {
|
||||||
const beatDuration = 60 / this.app.clock.bpm;
|
const beatDuration = 60 / this.app.clock.bpm;
|
||||||
const beatNumber = (currentTime) / beatDuration;
|
const beatNumber = (currentTime) / beatDuration;
|
||||||
@ -76,6 +90,7 @@ export class TransportNode extends AudioWorkletNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
convertTimeToNextBarsBeats(currentTime) {
|
convertTimeToNextBarsBeats(currentTime) {
|
||||||
|
|
||||||
const beatDuration = 60 / this.app.clock.bpm;
|
const beatDuration = 60 / this.app.clock.bpm;
|
||||||
const beatNumber = (currentTime) / beatDuration;
|
const beatNumber = (currentTime) / beatDuration;
|
||||||
const beatsPerBar = this.app.clock.time_signature[0];
|
const beatsPerBar = this.app.clock.time_signature[0];
|
||||||
@ -91,6 +106,7 @@ export class TransportNode extends AudioWorkletNode {
|
|||||||
beat: Math.floor(futureBeatNumber) % beatsPerBar + 1,
|
beat: Math.floor(futureBeatNumber) % beatsPerBar + 1,
|
||||||
pulse: Math.floor(this.nextPulsePosition) % this.app.clock.ppqn
|
pulse: Math.floor(this.nextPulsePosition) % this.app.clock.ppqn
|
||||||
};
|
};
|
||||||
|
|
||||||
this.app.clock.tick++
|
this.app.clock.tick++
|
||||||
return {
|
return {
|
||||||
futureTimeStamp,
|
futureTimeStamp,
|
||||||
|
|||||||
@ -16,6 +16,7 @@ class TransportProcessor extends AudioWorkletProcessor {
|
|||||||
this.started = false;
|
this.started = false;
|
||||||
} else if (message.data === "stop") {
|
} else if (message.data === "stop") {
|
||||||
this.started = false;
|
this.started = false;
|
||||||
|
this.currentTime = 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user