beepody
Version:
Beep melody utilities.
1 lines • 15.4 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../src/version.ts","../src/config.ts","../src/Tone.ts","../src/Beep.ts","../src/index.ts"],"sourcesContent":["export default '0.3.33333333'\n","/**\n * Default beep frequency in hertz.\n */\nexport const DEFAULT_FREQUENCY = 440\n\n/**\n * Default beep length in milliseconds.\n */\nexport const DEFAULT_LENGTH = 200\n\n/**\n * Character to separate notes in beep sequence URL hash.\n */\nexport const NOTE_DELIMITER = '|'\n\n/**\n * Character to separate parameters in notes in beep sequence URL hash.\n */\nexport const PARAMETER_DELIMITER = '^'\n","/**\n * @class Tone player\n * @name Tone\n */\nexport class Tone {\n ctx: AudioContext\n gainNode: GainNode\n outNode: AudioDestinationNode\n\n /**\n * Initialize a tone beeper.\n */\n /* istanbul ignore next */\n constructor() {\n if (\n typeof window !== 'undefined' &&\n typeof window.AudioContext !== 'undefined'\n ) {\n this.ctx = new window.AudioContext()\n this.gainNode = this.ctx.createGain()\n this.gainNode.gain.value = 1 / 8\n this.outNode = this.ctx.destination\n this.gainNode.connect(this.outNode)\n } else {\n throw 'AudioContext is required'\n }\n }\n\n /**\n * Play a beep after wait seconds, stopping after length seconds.\n */\n /* istanbul ignore next */\n beepOnBeepOff(frequency: number, length: number, wait: number): void {\n const osc = this.ctx.createOscillator()\n osc.type = 'square'\n osc.frequency.value = frequency\n osc.connect(this.gainNode)\n osc.start(wait)\n osc.stop(wait + length)\n }\n}\n\nexport default Tone\n","import {\n DEFAULT_LENGTH,\n DEFAULT_FREQUENCY,\n NOTE_DELIMITER,\n PARAMETER_DELIMITER,\n} from './config'\nimport Tone from './Tone'\n\n/**\n * @class Beep utility\n * @name Beep\n */\nexport class Beep {\n frequency: number\n length: number\n repeats: number\n\n /**\n * Initialize a beep.\n */\n constructor(\n frequency: number = DEFAULT_FREQUENCY,\n length: number = DEFAULT_LENGTH,\n repeats = 1,\n ) {\n this.frequency = frequency\n this.length = length\n this.repeats = repeats\n }\n\n /**\n * The text representation.\n */\n toString(): string {\n return `Beep(${this.frequency} ${this.length} ${this.repeats})`\n }\n}\n\n/**\n * @class Beep sequence\n * @name BeepSequence\n */\nexport class BeepSequence {\n beeps: Beep[]\n tempo: number\n\n /**\n * Initialize a beep sequence.\n */\n constructor(beeps: Beep[]) {\n this.beeps = beeps\n this.tempo = 600\n }\n\n /**\n * Return the URL hash for the sequence.\n * Each note is \"frequency (Hz), length (ms), repeats\" separated by \"|\", with defaults (440 200 1).\n * Notes are separated by \",\".\n */\n toHash(): string {\n const notes: string[] = []\n for (const beep of this.beeps) {\n notes.push(`${beep.frequency}${PARAMETER_DELIMITER}${beep.length}`)\n }\n return notes.join(NOTE_DELIMITER)\n }\n\n /**\n * Return the `beep` command.\n */\n toBeepCommand(): string {\n const notes: string[] = []\n for (const beep of this.beeps) {\n let s = `-f ${beep.frequency} -l ${beep.length}`\n if (beep.repeats !== 1) {\n s += ` -r ${beep.repeats}`\n }\n notes.push(s)\n }\n return `beep ${notes.join(' -n ')}`\n }\n\n /**\n * Return the GRUB init tune.\n */\n toGRUBInitTune(): string {\n const notes: string[] = []\n let s = `play ${this.tempo}`\n for (const beep of this.beeps) {\n notes.push(`${beep.frequency} ${beep.length / 100}`)\n }\n if (notes.length) s += ` ${notes.join(' ')}`\n return s\n }\n\n /**\n * The text representation.\n */\n toString(): string {\n return `${this.constructor.name}(${this.toHash()})`\n }\n\n /**\n * The length of the playtime in seconds.\n */\n lengthInSeconds(): number {\n let s = 0\n for (const beep of this.beeps) {\n for (let r = -1; r < beep.repeats; r++) {\n s += beep.length\n }\n }\n return s * 0.001\n }\n}\n\n/**\n * Play a beep sequence to the browser audio.\n */\n/* istanbul ignore next */\nexport const playBeepSequence = (bs: BeepSequence): void => {\n if (typeof window === 'undefined') return\n let wait = 0\n const tone = new Tone()\n for (const beep of bs.beeps) {\n const seconds = beep.length * 0.001\n tone.beepOnBeepOff(beep.frequency, seconds, wait)\n wait += seconds\n }\n}\n\n/**\n * Play the default beep.\n */\nexport const playDefaultBeep = (): void => {\n playBeepSequence(new BeepSequence([new Beep()]))\n}\n\nconst BEEP_OPTIONS = [\n ['f', 'frequency', 'FREQ'],\n ['l', 'length', 'LEN'],\n ['r', 'repeats', 'REPEATS'],\n ['d', 'delay', 'DELAY'],\n]\n\nconst BEEP_COMMANDS = [['n', 'new', 'NEW']]\n\n/**\n * Parse a Linux \"beep\" command.\n */\nexport const parseBeepCommand = (s: string): BeepSequence => {\n const sequence = new BeepSequence([])\n const args = s.split(/\\s+/)\n console.assert(args.shift() === 'beep')\n let beep = new Beep()\n const processOption = (name: string, value: string): void => {\n switch (name) {\n case 'frequency':\n beep.frequency = parseFloat(value)\n break\n case 'length':\n beep.length = parseFloat(value)\n break\n case 'repeats':\n beep.repeats = parseInt(value, 10)\n break\n }\n }\n const processCommand = (name: string): void => {\n switch (name) {\n case 'new':\n sequence.beeps.push(beep)\n beep = new Beep()\n break\n }\n }\n let option\n for (const arg of args) {\n if (arg[0] === '-') {\n if (arg[1] === '-') {\n // # eg: --frequency\n const name = arg.substring(2)\n for (const opt of BEEP_OPTIONS) {\n if (opt[1] === name) {\n option = opt[1]\n }\n }\n for (const opt of BEEP_COMMANDS) {\n if (opt[1] === name) {\n processCommand(opt[1])\n }\n }\n } else {\n // # eg: -f\n const letter = arg[1]\n for (const opt of BEEP_OPTIONS) {\n if (opt[0] === letter) {\n option = opt[1]\n }\n }\n for (const opt of BEEP_COMMANDS) {\n if (opt[0] === letter && typeof opt[1] === 'string') {\n processCommand(opt[1])\n }\n }\n }\n } else {\n if (option) {\n processOption(option, arg)\n }\n }\n }\n sequence.beeps.push(beep)\n return sequence\n}\n\n/**\n * Parse a Grub init tune \"play\" line.\n */\nexport const parseGRUBInitTune = (s: string): BeepSequence => {\n const sequence = new BeepSequence([])\n const args = s.split(/\\s+/)\n console.assert(args.shift() === 'play')\n sequence.tempo = parseFloat(args.shift() || '60')\n let pitch\n for (const arg of args) {\n if (pitch) {\n const duration = parseFloat(arg) * 100\n const beep = new Beep()\n beep.frequency = pitch\n beep.length = duration\n sequence.beeps.push(beep)\n pitch = null\n } else {\n pitch = parseFloat(arg)\n }\n }\n return sequence\n}\n\n/**\n * Parse a beep sequence hash.\n */\nexport const parseBeepHash = (s: string): BeepSequence => {\n const sequence = new BeepSequence([])\n for (const note of s.split(NOTE_DELIMITER)) {\n const params = note\n .split(PARAMETER_DELIMITER)\n .map((s: string) => parseFloat(s))\n const beep = new Beep(...params)\n sequence.beeps.push(beep)\n }\n return sequence\n}\n\nexport default Beep\n","import version from './version'\n\nclass beepody {\n static get version(): string {\n return version\n }\n}\n\nexport default beepody\nexport { version }\nexport * from './Beep'\n"],"names":[],"mappings":"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"}