-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsetMeter.js
More file actions
18 lines (15 loc) · 891 Bytes
/
setMeter.js
File metadata and controls
18 lines (15 loc) · 891 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// setMeter.js - Validate meter, compute meterRatio, emit meter MIDI event.
// Single responsibility: meter changes. Split from midiTiming.js for SRP (R43).
// Freezes meter snapshot after computation (R44 -- fail fast on mutation).
/** @type {{ numerator: number, denominator: number, meterRatio: number } | null} */
let lastMeterSnapshot = null;
setMeter = () => {
if (!Number.isFinite(numerator) || !Number.isFinite(denominator) || denominator === 0) {
throw new Error('setMeter: invalid meter ' + numerator + '/' + denominator);
}
meterRatio = numerator / denominator;
p(c, { timeInSeconds: measureStartTime, type: 'meter', vals: [numerator, denominator] });
lastMeterSnapshot = deepFreeze({ numerator, denominator, meterRatio });
};
/** @returns {{ numerator: number, denominator: number, meterRatio: number } | null} */
setMeter.getSnapshot = () => lastMeterSnapshot;