Skip to content

Instantly share code, notes, and snippets.

View ken107's full-sized avatar

Sarsa Parilla ken107

View GitHub Profile
@ken107
ken107 / createWavHeader.ts
Created February 25, 2024 19:59
Create WAV header for PCM data
export function createWavHeader(dataLength: number, sampleRate: number, bitDepth: number, channels: number) {
const headerLength = 44; // Standard size of WAV header
const totalLength = headerLength + dataLength;
const buffer = new ArrayBuffer(headerLength);
const view = new DataView(buffer);
// RIFF chunk descriptor
writeString(view, 0, 'RIFF'); // ChunkID
view.setUint32(4, totalLength - 8, true); // ChunkSize (file size - 8 bytes)
function makeAudioPlayer(audio) {
audio.oncanplay = () => sm.trigger("onCanPlay")
audio.onerror = () => sm.trigger("onError", new Error(audio.error.message || audio.error.code))
audio.onended = () => sm.trigger("onEnd")
const sm = new StateMachine({
IDLE: {
load(url) {
audio.src = url
return "LOADING_PAUSED"
@ken107
ken107 / valid-getter.ts
Last active February 9, 2023 15:42
A getter that calls generator() to create a new instance and subsequently returns the same instance while it isValid()
export function makeValidGetter<T extends {isValid(): boolean}>(generator: () => Promise<T>): () => Promise<T> {
let value: T|undefined
let promise: Promise<T>|undefined
return async function() {
if (value?.isValid()) return value
if (promise) return await promise
promise = generator()
.then(result => {
value = result
promise = undefined
function simulate(element, eventName, options) {
var opt = {
pointerX: 0,
pointerY: 0,
button: 0,
ctrlKey: false,
altKey: false,
shiftKey: false,
metaKey: false,
bubbles: true,
@ken107
ken107 / repeat.js
Last active September 8, 2021 17:46
Repeat an action `max` number of times or `until` some condition, with optional `delay` between repetitions
/**
* Repeat an action
* @param {Object} opt - options
* @param {Function} opt.action - action to repeat
* @param {Function} opt.until - termination condition
* @param {Number} opt.delay - delay between actions
* @param {Number} opt.max - maximum number of repetitions
* @returns {Promise}
*/
function repeat(opt) {
@ken107
ken107 / set-idle-timeout.js
Last active July 21, 2022 17:13
Execute on user idle
function setIdleTimeout(millis, onIdle, onUnidle) {
var timeout = 0;
startTimer();
function startTimer() {
timeout = setTimeout(onExpires, millis);
document.addEventListener("mousemove", onActivity);
document.addEventListener("keydown", onActivity);
document.addEventListener("touchstart", onActivity);
}