From a68dd8318345cdb0eab846572adf834e9aea79b8 Mon Sep 17 00:00:00 2001 From: teascade Date: Wed, 17 Apr 2019 21:24:05 +0300 Subject: [PATCH] Add /beeper --- src/resources/beeping/beep.ogg | Bin 0 -> 12707 bytes src/resources/beeping/index.html | 47 +++++++++ src/resources/beeping/main.js | 160 +++++++++++++++++++++++++++++++ src/resources/beeping/style.css | 154 +++++++++++++++++++++++++++++ 4 files changed, 361 insertions(+) create mode 100644 src/resources/beeping/beep.ogg create mode 100644 src/resources/beeping/index.html create mode 100644 src/resources/beeping/main.js create mode 100644 src/resources/beeping/style.css diff --git a/src/resources/beeping/beep.ogg b/src/resources/beeping/beep.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7ca36def1cda25de5d9e43ac2c19bde447018176 GIT binary patch literal 12707 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 + + + + + Beeper! + + + + + + + + +
+

0.00

+
+

Do a beep at

+
+

second intervals

+
+

+ +
+
+

Volume (100%):

+ + +
+
+ +

Custom audio file:

+ +

default audio

+
+
+ + +
+ + + \ No newline at end of file diff --git a/src/resources/beeping/main.js b/src/resources/beeping/main.js new file mode 100644 index 0000000..65dc275 --- /dev/null +++ b/src/resources/beeping/main.js @@ -0,0 +1,160 @@ +var beeperBegun = false; +var beepInterval = 0; +var beepTimeCounter = 0; +var intervalId = 0; +var timeChangedWhileBegun = false; +var lastSec = -1; + +var showBeep = 0; + +var audioCtx = new (window.AudioContext || window.webkitAudioContext)(); + +function main() { + timeChanged(); + updateInvalidness(); + + document.getElementById("plus").onclick = () => changeSeconds(1); + document.getElementById("minus").onclick = () => changeSeconds(-1); + document.getElementById("time-input").onchange = () => { + timeChanged(); + updateInvalidness(); + }; + document.getElementById("begin").onclick = toggle; + var audio = document.getElementById("audio"); + let slider = document.getElementById("volume-slider"); + document.getElementById("volume-slider").onchange = () => { + audio.volume = (slider.value / 100); + document.getElementById("volume").innerText = slider.value; + }; + + document.getElementById("file").addEventListener('change', () => { + var file = document.getElementById("file").files[0]; + document.getElementById("audiosource").setAttribute("src", URL.createObjectURL(file)); + document.getElementById("audio").load(); + }); + document.getElementById("audio").addEventListener("loadeddata", (event) => { + document.getElementById("audiotext").innerText = "Loaded audio"; + }); + document.getElementById("audio").addEventListener("loadstart", (event) => { + document.getElementById("audiotext").innerText = "Loading/Error"; + }); + + console.log("Beeper initialized!"); +} + +function isTimeValid() { + value = document.getElementById("time-input").value; + if (value != "" && (isNaN(value) || value < 1)) { + return false; + } + return true; +} + +function getTime() { + if (!isTimeValid()) { + return 1; + } + value = document.getElementById("time-input").value; + if (value == "") { + return 5; + } + return parseFloat(value); +} + + +function updateInvalidness() { + input = document.getElementById("time-input"); + if (!isTimeValid()) { + input.classList = "invalid"; + } else { + input.classList = ""; + } +} + +function changeSeconds(diff) { + value = document.getElementById("time-input").value; + if (!isNaN(value)) { + if (value == "") { + value = 5; + } + value = parseFloat(value); + if ((value + diff) >= 1 || diff > 0) { + input.value = value + diff; + updateInvalidness(); + timeChanged(); + } + } +} + +function timeChanged() { + if (isTimeValid()) { + if (beeperBegun) { + timeChangedWhileBegun = true; + return; + } + time = getTime(); + sec = Math.floor(time); + millis = Math.floor((time - sec) * 100) / 100; + millis = Intl.NumberFormat("en-US", { minimumFractionDigits: 2 }).format(millis); + millis = ("" + millis).slice(2); + + seconds = document.getElementById("seconds").innerText = sec; + milliseconds = document.getElementById("milliseconds").innerText = millis; + + beepInterval = getTime(); + beepTimeCounter = beepInterval; + } +} + +function toggle() { + var button = document.getElementById("begin"); + if (!beeperBegun && !isTimeValid()) { + return; + } + beeperBegun = !beeperBegun; + if (beeperBegun) { + button.innerText = "Stop!"; + intervalId = setInterval(update, 10); + } else { + button.innerText = "Begin!"; + clearInterval(intervalId); + if (timeChangedWhileBegun) { + timeChangedWhileBegun = false; + timeChanged(); + } + lastSec = -1; + showBeep = 0; + document.title = "Beeper!"; + + document.getElementById("audio").pause() + } +} + +function update() { + var seconds = document.getElementById("seconds"); + var milliseconds = document.getElementById("milliseconds"); + + beepTimeCounter -= 0.01; + showBeep -= 0.1; + if (beepTimeCounter <= 0) { + beepTimeCounter = beepInterval; + showBeep = 0.5; + document.getElementById("audio").fastSeek(0) + document.getElementById("audio").play() + } + var sec = Math.floor(beepTimeCounter); + seconds.innerText = sec; + var millis = Math.floor((beepTimeCounter - sec) * 100) / 100; + millis = Intl.NumberFormat("en-US", { minimumFractionDigits: 2 }).format(millis); + millis = ("" + millis).slice(2); + milliseconds.innerText = millis; + + if (lastSec != sec) { + lastSec = sec; + if (showBeep > 0) { + document.title = "Beeeep!"; + } else { + document.title = "Beeper - " + sec; + } + } +} \ No newline at end of file diff --git a/src/resources/beeping/style.css b/src/resources/beeping/style.css new file mode 100644 index 0000000..891646c --- /dev/null +++ b/src/resources/beeping/style.css @@ -0,0 +1,154 @@ +:root { + font-family: Helvetica, sans-serif; +} + +* { + margin: 0; + padding: 0; +} + +body { + width: 100%; + height: 100%; + background-color: #44444a; + font-size: 1.1em; +} + +.padding { + margin-bottom: 2em; +} + +.content { + padding-top: 10vh; + text-align: center; + color: #eee; +} + +.timer { + font-size: 15vw; + margin: 0; +} + +.timer-milliseconds { + font-size: 25%; + font-family: Iosevka, monospace; +} + +.inline { + display: inline-block; +} + +.input-container { + display: inline-block; + height: 1.9em; +} + +button { + display: inline-block; + border: none; + margin: 0; + padding: 0.3em; + padding-left: 0.6em; + padding-right: 0.6em; + font-size: 1em; + transition: 0.2s; + font-family: helvetica, sans-serif; + background-color: #ddd; + font-size: 1em; +} + +audio { + display: none; +} + +.scroller { + height: 100%; +} + +.scroller:first-child { + border-top-left-radius: 0.3em; + border-bottom-left-radius: 0.3em; + background-color: #eb6868; +} + +.scroller:last-child { + border-top-right-radius: 0.3em; + border-bottom-right-radius: 0.3em; + background-color: #77e777; +} + +.scroller:first-child:hover { + background-color: #dd5151; +} + +.scroller:last-child:hover { + background-color: #53db53; +} + +button:hover { + background-color: #c0c0c0; +} + +#time-input { + border: none; + background: none; + position: relative; + background-color: #eee; + max-width: 5ch; + height: 100%; + text-align: center; + transition: 0.2s; + font-size: 1em; + font-family: helvetica, sans-serif; +} + +#volume-slider { + display: inline-block; +} + +#time-input:hover { + background-color: #cbcbcb; +} + +#audiocontrols { + display: inline-flex; + width: 50vw; +} + +#audiocontrols > * { + width: 50%; +} + +#file { + width: 10em; +} + +.invalid { + background-color: #dd7979 +} + +.invalid:hover { + background-color: #c56161 +} + +.footnote { + position: absolute; + width: 100%; + text-align: center; + bottom: 0; + padding-bottom: 2em; +} + +.footnote a { + color: #c7c5ee; +} + +@media (max-width: 900px) { + .content { + padding: 0; + } + + .timer { + font-size: 40vw; + } +} \ No newline at end of file