Skip to content

Instantly share code, notes, and snippets.

View jussi-kalliokoski's full-sized avatar

Jussi Kalliokoski jussi-kalliokoski

View GitHub Profile
@jussi-kalliokoski
jussi-kalliokoski / RouteParser.ts
Created March 21, 2024 08:35
A fully typed route parser.
// Usage:
// let parseRoute = routeParser("/users/{userId}/posts/{postId}");
// let params = parseRoute("/users/123/posts/456");
// console.log(params); // { userId: "123", postId: "456" }
const KIND_KEY = "key" as const;
const KIND_VALUE = "value" as const;
/**
* Create a route parser from a route string.
@jussi-kalliokoski
jussi-kalliokoski / getSheetSize.js
Created December 1, 2016 13:54
Ideal sprite sheet size resolver
export const getSheetSize = (spriteWidth, spriteHeight, spriteCount) => {
const a = Math.max(spriteWidth, spriteHeight);
const b = Math.min(spriteWidth, spriteHeight);
let sizeA = 1 << (32 - Math.clz32(a));
let sizeB = 1 << (32 - Math.clz32(b));
let countA = 1;
let countB = 1;
while (spriteCount > countA * countB) {
if (sizeA < sizeB) {
@jussi-kalliokoski
jussi-kalliokoski / 1-midi-stream-simple-example.js
Created February 15, 2016 07:42
Web MIDI Streams examples
const NOTE = 69;
const NOTE_ON = 0x90;
const NOTE_OFF = 0x80;
const SECONDS = 1000;
function startSequencer (destination) {
let active = false;
setInterval(() => {
const now = performance.now();
const type = active ? NOTE_OFF : NOTE_ON;
@jussi-kalliokoski
jussi-kalliokoski / async.js
Created May 3, 2015 13:02
Async iterators!!!
async function mapAsync (iterator, fn) {
let result = [];
for ( let itemPromise of await iterator ) {
let item = await itemPromise;
result.push(await fn(item));
}
return result;
}
async function filterAsync (iterator, fn) {
@jussi-kalliokoski
jussi-kalliokoski / main.js
Created November 9, 2014 13:07
Example of pre-initialized AudioWorker proposal
var context = new AudioContext();
var sineWorker = context.createAudioWorker("worker.js");
function createSineNode (frequency) {
var node = context.createAudioWorkerNode(sineWorker, {
numberOfInputChannels: 0,
numberOfOutputChannels: 1,
parameters: {
frequency: frequency || 440,
},
@jussi-kalliokoski
jussi-kalliokoski / draw-waveform.js
Created September 24, 2014 16:20
Draw waveform ahead of time (doesn't work)
function loadAudio (url, playbackRate) {
return new Promise(function (resolve, reject) {
var track = new Audio(url);
track.playbackRate = playbackRate;
track.oncanplaythrough = function () {
resolve(track);
};
track.onerror = reject;
@jussi-kalliokoski
jussi-kalliokoski / draw-waveform.js
Created September 24, 2014 06:41
Waveform drawing
function getAudioData (url, time) {
return new Promise(function (resolve, reject) {
var context = new AudioContext();
var track = new Audio(url);
var bufferLength = time * context.sampleRate;
var buffer = new Float32Array(bufferLength);
var collector = context.createScriptProcessor(0, 1);
var audioSource = context.createMediaElementSource(track);
var samplesCollected = 0;
@jussi-kalliokoski
jussi-kalliokoski / main.js
Created September 12, 2014 05:58
Single type, two nodes, closures
var context = new AudioContext();
var audioWorker = context.createAudioWorker("worker.js");
var sine1 = context.createAudioWorkerNode(audioWorker, {
numberOfInputChannels: 0,
numberOfOutputChannels: 1,
parameters: {
frequency: 440,
},
});
var sine2 = context.createAudioWorkerNode(audioWorker, {
@jussi-kalliokoski
jussi-kalliokoski / main.js
Last active August 29, 2015 14:06
Multiple different nodes on the same worker
var context = new AudioContext();
var audioWorker = context.createAudioWorker("worker.js");
var sine = context.createAudioWorkerNode(audioWorker, {
numberOfInputChannels: 0,
numberOfOutputChannels: 1,
parameters: {
frequency: 440,
},
data: {
type: "sine",
@jussi-kalliokoski
jussi-kalliokoski / example-a.js
Created July 3, 2014 10:44
Modules without circular dependencies
// localforage.js
// if the module exports a promise, the loader waits until the promise resolves into something,
// and that is what gets imported outside.
export System.import("./IndexedDbDriver")
.catch(=> System.import("./WebSqlDriver") )
.catch(=> System.import("./LocalStorageDriver") );
// IndexedDbDriver.js