ad711b15a0
Change-Id: I9ab0336450519648f7a8edeec94bd64b78e2f05b Reviewed-on: https://cl.tvl.fyi/c/depot/+/12554 Tested-by: BuildkiteCI Reviewed-by: Profpatsch <mail@profpatsch.de>
72 lines
2.5 KiB
TypeScript
72 lines
2.5 KiB
TypeScript
// create a node command line listener that allows the user to press any key , and averages the distances between the key presses to determine the BPM (with a window of 4 key presses). If the user presses q, the program should exit and print the final BPM.
|
|
|
|
// Import the necessary modules
|
|
import * as readline from 'readline';
|
|
|
|
export function tapBpm() {
|
|
// Set up readline interface to listen for keypresses
|
|
readline.emitKeypressEvents(process.stdin);
|
|
process.stdin.setRawMode(true);
|
|
// accept SIGINT on stdin
|
|
|
|
// Array to store the time differences between the last 4 key presses
|
|
const timeDifferences: number[] = [];
|
|
let lastPressTime: number | null = null;
|
|
|
|
// Function to calculate BPM based on average time between keypresses
|
|
function calculateBPM() {
|
|
if (timeDifferences.length < 1) {
|
|
return 0;
|
|
}
|
|
const averageTimeDiff =
|
|
timeDifferences.reduce((acc, curr) => acc + curr, 0) / timeDifferences.length;
|
|
return (60 * 1000) / averageTimeDiff;
|
|
}
|
|
|
|
// Handle the SIGINT (Ctrl+C) event manually
|
|
process.on('SIGINT', () => {
|
|
console.log('\nExiting via SIGINT (Ctrl+C)... Final BPM:', calculateBPM().toFixed(2));
|
|
process.exit();
|
|
});
|
|
|
|
// Listen for keypress events
|
|
process.stdin.on('keypress', (str, key: { name: string; sequence: string }) => {
|
|
// Exit if 'q' is pressed
|
|
if (key.name === 'q') {
|
|
console.log('Exiting... Final BPM:', calculateBPM().toFixed(2));
|
|
process.exit();
|
|
}
|
|
|
|
// Handle Ctrl+C (SIGINT)
|
|
if (key.sequence === '\u0003') {
|
|
// '\u0003' is the raw code for Ctrl+C
|
|
console.log('\nExiting via Ctrl+C... Final BPM:', calculateBPM().toFixed(2));
|
|
process.exit();
|
|
}
|
|
|
|
// Capture the current time of the keypress
|
|
const currentTime = Date.now();
|
|
|
|
// If it's not the first keypress, calculate the time difference
|
|
if (lastPressTime !== null) {
|
|
const timeDiff = currentTime - lastPressTime;
|
|
|
|
// Add the time difference to the array (limit to last 10 key presses)
|
|
if (timeDifferences.length >= 10) {
|
|
timeDifferences.shift(); // Remove the oldest time difference
|
|
}
|
|
timeDifferences.push(timeDiff);
|
|
|
|
// Calculate and display the BPM
|
|
const bpm = calculateBPM();
|
|
console.log('Current BPM:', bpm.toFixed(2));
|
|
} else {
|
|
console.log('Waiting for more key presses to calculate BPM...');
|
|
}
|
|
|
|
// Update the lastPressTime to the current time
|
|
lastPressTime = currentTime;
|
|
});
|
|
|
|
console.log('Press any key to calculate BPM, press "q" to quit.');
|
|
}
|