Fix some clock properties, start cleaning up
This commit is contained in:
@ -53,15 +53,15 @@ export const beat = (app: Editor) => (n: number | number[] = 1, nudge: number =
|
|||||||
const nArray = Array.isArray(n) ? n : [n];
|
const nArray = Array.isArray(n) ? n : [n];
|
||||||
const results: boolean[] = nArray.map(
|
const results: boolean[] = nArray.map(
|
||||||
(value) =>
|
(value) =>
|
||||||
(app.clock.pulses_since_origin - Math.round(nudge * app.clock.ppqn)) %
|
(app.clock.time_position.grain - Math.round(nudge * app.clock.time_position.ppqn)) %
|
||||||
Math.round(value * app.clock.ppqn) === 0,
|
Math.round(value * app.clock.time_position.ppqn) === 0,
|
||||||
);
|
);
|
||||||
return results.some((value) => value === true);
|
return results.some((value) => value === true);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const bar = (app: Editor) => (n: number | number[] = 1, nudge: number = 0): boolean => {
|
export const bar = (app: Editor) => (n: number | number[] = 1, nudge: number = 0): boolean => {
|
||||||
const nArray = Array.isArray(n) ? n : [n];
|
const nArray = Array.isArray(n) ? n : [n];
|
||||||
const barLength = (app.clock.time_signature?.[1] ?? 4) * app.clock.ppqn;
|
const barLength = app.clock.time_position.num * app.clock.ppqn;
|
||||||
const nudgeInPulses = Math.floor(nudge * barLength);
|
const nudgeInPulses = Math.floor(nudge * barLength);
|
||||||
const results: boolean[] = nArray.map(
|
const results: boolean[] = nArray.map(
|
||||||
(value) =>
|
(value) =>
|
||||||
@ -82,7 +82,7 @@ export const pulse = (app: Editor) => (n: number | number[] = 1, nudge: number =
|
|||||||
export const tick = (app: Editor) => (tick: number | number[], offset: number = 0): boolean => {
|
export const tick = (app: Editor) => (tick: number | number[], offset: number = 0): boolean => {
|
||||||
const nArray = Array.isArray(tick) ? tick : [tick];
|
const nArray = Array.isArray(tick) ? tick : [tick];
|
||||||
const results: boolean[] = nArray.map(
|
const results: boolean[] = nArray.map(
|
||||||
(value) => app.clock.time_position.pulse === value + offset,
|
(value) => app.clock.time_position.tick === value + offset,
|
||||||
);
|
);
|
||||||
return results.some((value) => value === true);
|
return results.some((value) => value === true);
|
||||||
};
|
};
|
||||||
@ -111,7 +111,7 @@ export const flipbar = (app: Editor) => (chunk: number = 1): boolean => {
|
|||||||
|
|
||||||
export const onbar = (app: Editor) => (
|
export const onbar = (app: Editor) => (
|
||||||
bars: number[] | number,
|
bars: number[] | number,
|
||||||
n: number = app.clock.time_signature[0] || 4,
|
n: number = app.clock.time_position.num,
|
||||||
): boolean => {
|
): boolean => {
|
||||||
let current_bar = (app.clock.time_position.bar % n) + 1;
|
let current_bar = (app.clock.time_position.bar % n) + 1;
|
||||||
return typeof bars === "number"
|
return typeof bars === "number"
|
||||||
|
|||||||
@ -3,14 +3,9 @@ import TransportProcessor from "./ClockProcessor?worker&url";
|
|||||||
import { Editor } from "../main";
|
import { Editor } from "../main";
|
||||||
|
|
||||||
export interface TimePosition {
|
export interface TimePosition {
|
||||||
bpm: number;
|
bpm: number; ppqn: number; time: number;
|
||||||
ppqn: number;
|
tick: number; beat: number; bar: number;
|
||||||
time: number;
|
num: number; den: number; grain: number;
|
||||||
tick: number;
|
|
||||||
beat: number;
|
|
||||||
bar: number;
|
|
||||||
num: number;
|
|
||||||
den: number;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Clock {
|
export class Clock {
|
||||||
@ -31,6 +26,7 @@ export class Clock {
|
|||||||
bar: 0,
|
bar: 0,
|
||||||
num: 0,
|
num: 0,
|
||||||
den: 0,
|
den: 0,
|
||||||
|
grain: 0,
|
||||||
};
|
};
|
||||||
this.transportNode = null;
|
this.transportNode = null;
|
||||||
this.ctx = ctx;
|
this.ctx = ctx;
|
||||||
@ -46,6 +42,10 @@ export class Clock {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get grain(): number {
|
||||||
|
return this.time_position.grain;
|
||||||
|
}
|
||||||
|
|
||||||
get ticks_before_new_bar(): number {
|
get ticks_before_new_bar(): number {
|
||||||
/**
|
/**
|
||||||
* This function returns the number of ticks separating the current moment
|
* This function returns the number of ticks separating the current moment
|
||||||
@ -53,9 +53,9 @@ export class Clock {
|
|||||||
*
|
*
|
||||||
* @returns number of ticks until next bar
|
* @returns number of ticks until next bar
|
||||||
*/
|
*/
|
||||||
const ticksMissingFromBeat = this.ppqn - this.time_position.tick;
|
const ticksMissingFromBeat = this.time_position.ppqn - this.time_position.tick;
|
||||||
const beatsMissingFromBar = this.beats_per_bar - this.time_position.beat;
|
const beatsMissingFromBar = this.beats_per_bar - this.time_position.beat;
|
||||||
return beatsMissingFromBar * this.ppqn + ticksMissingFromBeat;
|
return beatsMissingFromBar * this.time_position.ppqn + ticksMissingFromBeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
get next_beat_in_ticks(): number {
|
get next_beat_in_ticks(): number {
|
||||||
@ -65,7 +65,7 @@ export class Clock {
|
|||||||
*
|
*
|
||||||
* @returns number of ticks until next beat
|
* @returns number of ticks until next beat
|
||||||
*/
|
*/
|
||||||
return this.app.clock.pulses_since_origin + this.time_position.tick;
|
return this.time_position.grain + this.time_position.tick;
|
||||||
}
|
}
|
||||||
|
|
||||||
get beats_per_bar(): number {
|
get beats_per_bar(): number {
|
||||||
@ -84,15 +84,6 @@ export class Clock {
|
|||||||
return Math.floor(this.time_position.tick / this.ppqn)
|
return Math.floor(this.time_position.tick / this.ppqn)
|
||||||
}
|
}
|
||||||
|
|
||||||
get pulses_since_origin(): number {
|
|
||||||
/**
|
|
||||||
* Returns the number of pulses since the origin.
|
|
||||||
*
|
|
||||||
* @returns number of pulses since origin
|
|
||||||
*/
|
|
||||||
return this.time_position.tick;
|
|
||||||
}
|
|
||||||
|
|
||||||
get pulse_duration(): number {
|
get pulse_duration(): number {
|
||||||
/**
|
/**
|
||||||
* Returns the duration of a pulse in seconds.
|
* Returns the duration of a pulse in seconds.
|
||||||
@ -169,6 +160,7 @@ export class Clock {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public stop(): void {
|
public stop(): void {
|
||||||
|
this.app.api.MidiConnection.sendStopMessage();
|
||||||
this.transportNode?.stop()
|
this.transportNode?.stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -23,6 +23,7 @@ export class ClockNode extends AudioWorkletNode {
|
|||||||
bar: message.data.bar,
|
bar: message.data.bar,
|
||||||
num: message.data.num,
|
num: message.data.num,
|
||||||
den: message.data.den,
|
den: message.data.den,
|
||||||
|
grain: message.data.grain,
|
||||||
}
|
}
|
||||||
this.app.settings.send_clock ?? this.app.api.MidiConnection.sendMidiClock();
|
this.app.settings.send_clock ?? this.app.api.MidiConnection.sendMidiClock();
|
||||||
tryEvaluate(
|
tryEvaluate(
|
||||||
|
|||||||
@ -1,5 +1,3 @@
|
|||||||
import { blinkScript } from "../DOM/Visuals/Blinkers";
|
|
||||||
|
|
||||||
class TransportProcessor extends AudioWorkletProcessor {
|
class TransportProcessor extends AudioWorkletProcessor {
|
||||||
constructor(options) {
|
constructor(options) {
|
||||||
super(options);
|
super(options);
|
||||||
@ -13,6 +11,7 @@ class TransportProcessor extends AudioWorkletProcessor {
|
|||||||
this.currentPulsePosition = 0;
|
this.currentPulsePosition = 0;
|
||||||
this.startTime = 0;
|
this.startTime = 0;
|
||||||
this.pauseTime = 0;
|
this.pauseTime = 0;
|
||||||
|
this.grain = 0;
|
||||||
this.totalPauseTime = 0;
|
this.totalPauseTime = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,6 +58,7 @@ class TransportProcessor extends AudioWorkletProcessor {
|
|||||||
const currentPulsePosition = Math.round(beatNumber * this.ppqn);
|
const currentPulsePosition = Math.round(beatNumber * this.ppqn);
|
||||||
|
|
||||||
if (currentPulsePosition > this.currentPulsePosition) {
|
if (currentPulsePosition > this.currentPulsePosition) {
|
||||||
|
this.grain += 1;
|
||||||
this.currentPulsePosition = currentPulsePosition;
|
this.currentPulsePosition = currentPulsePosition;
|
||||||
|
|
||||||
// Calculate current tick, beat, and bar
|
// Calculate current tick, beat, and bar
|
||||||
@ -81,6 +81,7 @@ class TransportProcessor extends AudioWorkletProcessor {
|
|||||||
bpm: this.bpm,
|
bpm: this.bpm,
|
||||||
num: this.timeSignature[0],
|
num: this.timeSignature[0],
|
||||||
den: this.timeSignature[1],
|
den: this.timeSignature[1],
|
||||||
|
grain: this.grain,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user