diff options
Diffstat (limited to 'users/Profpatsch/lyric/src')
-rw-r--r-- | users/Profpatsch/lyric/src/index.ts | 16 | ||||
-rw-r--r-- | users/Profpatsch/lyric/src/tap-bpm.ts | 79 |
2 files changed, 95 insertions, 0 deletions
diff --git a/users/Profpatsch/lyric/src/index.ts b/users/Profpatsch/lyric/src/index.ts new file mode 100644 index 000000000000..6bab1c4590cd --- /dev/null +++ b/users/Profpatsch/lyric/src/index.ts @@ -0,0 +1,16 @@ +import { tapBpm } from "./tap-bpm.js"; + +async function main() { + // subcommand for tap-bpm + if (process.argv[2] === "tap-bpm") { + await tapBpm(); + } +} + +await main(); + +// sleep in a loop to block nodejs +console.log("Blocking event loop..."); +while (true) { + await new Promise((resolve) => setTimeout(resolve, 1000)); +} diff --git a/users/Profpatsch/lyric/src/tap-bpm.ts b/users/Profpatsch/lyric/src/tap-bpm.ts new file mode 100644 index 000000000000..2062fb8bbca7 --- /dev/null +++ b/users/Profpatsch/lyric/src/tap-bpm.ts @@ -0,0 +1,79 @@ +// 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) => { + // 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.'); +} |