Playing with starship noise
This commit is contained in:
parent
5c7fbee11b
commit
df5de42f9c
7
404.md
7
404.md
|
@ -3,8 +3,7 @@ title: 404 Not Found
|
|||
permalink: /404.html
|
||||
---
|
||||
|
||||
These pages have recently been rearranged,
|
||||
but let's see if we can't get you what you were looking for.
|
||||
Let's see if we can't get you what you were looking for.
|
||||
|
||||
Software
|
||||
--------
|
||||
|
@ -17,9 +16,9 @@ Something Else
|
|||
------------
|
||||
|
||||
Please [email me](mailto:neale@woozle.org) and I'll help you find it!
|
||||
Be sure to let me know what it is you're trying to locate.
|
||||
|
||||
If you have the original URL of the thing,
|
||||
that's very helpful.
|
||||
But if you don't, it's okay,
|
||||
just tell me as much detail as you can about what you're looking for.
|
||||
just tell me as much detail as you can about what you're trying to find.
|
||||
|
||||
|
|
|
@ -36,7 +36,6 @@
|
|||
<nav class="right">
|
||||
<ul>
|
||||
<li><a href="https://github.com/nealey/">GitHub</a></li>
|
||||
<li><a href="https://google.com/+NealePickett/">Google+</a></li>
|
||||
<li><a href="mailto:neale@woozle.org">Email</a></li>
|
||||
</nav>
|
||||
</footer>
|
||||
|
|
|
@ -5,7 +5,7 @@ title: Toys
|
|||
Here is some various junk I've done. Maybe you'll find it amusing.
|
||||
Maybe you'll just wonder why I spend so much time on this garbage.
|
||||
|
||||
* [Starship Noise Generator](starship.html)
|
||||
* [Starship Noise Generator](starship/)
|
||||
* If you need to write someone a letter but really don't want to, try my
|
||||
[social letter generator](letter.html)
|
||||
* [Crunt](crunt.html)
|
||||
|
|
|
@ -1,65 +0,0 @@
|
|||
---
|
||||
title: Starship Noise Generator
|
||||
---
|
||||
|
||||
<div>
|
||||
<input id="fader" type="range" min="0" max="10" step="0.01"> Gain
|
||||
</div>
|
||||
|
||||
I work in a building with no HVAC,
|
||||
which means we can hear *everything* people are saying,
|
||||
anywhere in the building.
|
||||
|
||||
This page is a low-CPU noise generator that runs entirely in JavaScript.
|
||||
Once it starts,
|
||||
you don't need an Internet connection to keep it going.
|
||||
You can leave it running forever, if you like.
|
||||
|
||||
For those interested,
|
||||
it uses the new (in 2017) and seriously powerful
|
||||
[Web Audio API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API).
|
||||
|
||||
<script>
|
||||
function whiteNoise(audioCtx) {
|
||||
var bufferSize = 17 * audioCtx.sampleRate,
|
||||
noiseBuffer = audioCtx.createBuffer(1, bufferSize, audioCtx.sampleRate),
|
||||
output = noiseBuffer.getChannelData(0);
|
||||
for (var i = 0; i < bufferSize; i++) {
|
||||
output[i] = Math.random() * 2 - 1;
|
||||
}
|
||||
var whiteNoise = audioCtx.createBufferSource();
|
||||
whiteNoise.buffer = noiseBuffer;
|
||||
whiteNoise.loop = true;
|
||||
whiteNoise.start(0);
|
||||
return whiteNoise;
|
||||
}
|
||||
|
||||
function bandpassFilter(audioCtx, freq, gain) {
|
||||
var filt = audioCtx.createBiquadFilter();
|
||||
filt.type = "bandpass";
|
||||
filt.frequency.value = freq;
|
||||
filt.gain.value = gain;
|
||||
return filt;
|
||||
}
|
||||
function boop() {
|
||||
var audioCtx = new window.AudioContext();
|
||||
var synth = whiteNoise(audioCtx);
|
||||
var filterA = bandpassFilter(audioCtx, 100, 20);
|
||||
var filterB = bandpassFilter(audioCtx, 50, 20);
|
||||
var gainA = audioCtx.createGain();
|
||||
whiteNoise(audioCtx).connect(filterA);
|
||||
filterA.connect(filterB);
|
||||
filterB.connect(gainA);
|
||||
gainA.connect(audioCtx.destination);
|
||||
|
||||
function setFade() {
|
||||
var faderPos = document.querySelector("#fader").value;
|
||||
gainA.gain.value = faderPos;
|
||||
}
|
||||
setFade();
|
||||
document.querySelector("#fader").addEventListener("input", setFade);
|
||||
}
|
||||
|
||||
|
||||
window.addEventListener("load", boop);
|
||||
</script>
|
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 13 KiB |
|
@ -0,0 +1,111 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en-US">
|
||||
<head>
|
||||
<meta charset='utf-8'>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:regular,bold,italic">
|
||||
<link rel="stylesheet" media="screen" href="/assets/css/default.css">
|
||||
<link rel="icon" href="icon.svg">
|
||||
<link rel="manifest" href="manifest.webmanifest">
|
||||
<style>
|
||||
#play {
|
||||
padding: 0;
|
||||
border: 0;
|
||||
margin: 1em;
|
||||
font-size: 2em;
|
||||
background: inherit;
|
||||
}
|
||||
</style>
|
||||
|
||||
<title>Starship Noise Generator</title>
|
||||
<script>
|
||||
function whiteNoise(audioCtx) {
|
||||
var bufferSize = 17 * audioCtx.sampleRate,
|
||||
noiseBuffer = audioCtx.createBuffer(1, bufferSize, audioCtx.sampleRate),
|
||||
output = noiseBuffer.getChannelData(0);
|
||||
for (var i = 0; i < bufferSize; i++) {
|
||||
output[i] = Math.random() * 2 - 1;
|
||||
}
|
||||
var whiteNoise = audioCtx.createBufferSource();
|
||||
whiteNoise.buffer = noiseBuffer;
|
||||
whiteNoise.loop = true;
|
||||
whiteNoise.start(0);
|
||||
return whiteNoise;
|
||||
}
|
||||
|
||||
function bandpassFilter(audioCtx, freq, gain) {
|
||||
var filt = audioCtx.createBiquadFilter();
|
||||
filt.type = "bandpass";
|
||||
filt.frequency.value = freq;
|
||||
filt.gain.value = gain;
|
||||
return filt;
|
||||
}
|
||||
|
||||
function init() {
|
||||
var audioCtx = new window.AudioContext();
|
||||
var synth = whiteNoise(audioCtx);
|
||||
var filterA = bandpassFilter(audioCtx, 100, 20);
|
||||
var filterB = bandpassFilter(audioCtx, 50, 20);
|
||||
var gainA = audioCtx.createGain();
|
||||
|
||||
whiteNoise(audioCtx).connect(filterA);
|
||||
filterA.connect(filterB);
|
||||
filterB.connect(gainA);
|
||||
gainA.connect(audioCtx.destination);
|
||||
audioCtx.suspend();
|
||||
|
||||
function setFade() {
|
||||
var faderPos = document.querySelector("#fader").value;
|
||||
gainA.gain.value = faderPos;
|
||||
}
|
||||
document.querySelector("#fader").addEventListener("input", setFade);
|
||||
setFade();
|
||||
|
||||
document.querySelector("#play").addEventListener("click", e => {
|
||||
console.log(audioCtx.state);
|
||||
if (audioCtx.state == 'running') {
|
||||
audioCtx.suspend();
|
||||
} else {
|
||||
audioCtx.resume();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (document.readyState === "loading") {
|
||||
document.addEventListener("DOMContentLoaded", init);
|
||||
} else {
|
||||
init();
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1 id="title">
|
||||
<span>Starship Noise Generator</span>
|
||||
</h1>
|
||||
|
||||
<main id="content">
|
||||
<div>
|
||||
<button id="play">⏯️</button>
|
||||
🔉
|
||||
<input id="fader" type="range" min="0" max="10" step="0.01" />
|
||||
🔊
|
||||
</div>
|
||||
|
||||
<p>I work in a building with no HVAC,
|
||||
which means we can hear <em>everything</em> people are saying,
|
||||
anywhere in the building.</p>
|
||||
|
||||
<p>This page is a low-CPU noise generator that runs entirely in JavaScript.
|
||||
Once it starts,
|
||||
you don’t need an Internet connection to keep it going.
|
||||
You can leave it running forever, if you like.</p>
|
||||
|
||||
<p>For those interested,
|
||||
it uses the new (in 2017) and seriously perfect for this application
|
||||
<a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API">Web Audio API</a>.</p>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"name": "Starship Noise Generator",
|
||||
"short_name": "Starship",
|
||||
"start_url": ".",
|
||||
"display": "standalone",
|
||||
"background_color": "#fff",
|
||||
"description": "Generates brown noise similar to a futuristic starship engine (or a modern HVAC system)",
|
||||
"icons": [
|
||||
{
|
||||
"src": "icon.svg",
|
||||
"sizes": "any"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Loading…
Reference in New Issue