From 2e862f62edeaa557ae5b10af555228725646ed3c Mon Sep 17 00:00:00 2001 From: David Whiting Date: Tue, 20 Apr 2021 10:50:16 +0200 Subject: [PATCH] First public version --- .gitignore | 1 + 909BD.mp3 | Bin 0 -> 8358 bytes 909CH.mp3 | Bin 0 -> 4596 bytes 909OH.mp3 | Bin 0 -> 13373 bytes 909SD.mp3 | Bin 0 -> 5850 bytes README.md | 21 +++ build.sh | 6 + index.html | 34 +++++ preview.png | Bin 0 -> 97266 bytes src/app.ts | 256 ++++++++++++++++++++++++++++++++++ src/audio.ts | 340 +++++++++++++++++++++++++++++++++++++++++++++ src/boilerplate.ts | 93 +++++++++++++ src/dial.ts | 122 ++++++++++++++++ src/interface.ts | 111 +++++++++++++++ src/math.ts | 18 +++ src/pattern.ts | 153 ++++++++++++++++++++ src/ui.ts | 335 ++++++++++++++++++++++++++++++++++++++++++++ tsconfig.json | 14 ++ ui.css | 193 +++++++++++++++++++++++++ 19 files changed, 1697 insertions(+) create mode 100644 .gitignore create mode 100644 909BD.mp3 create mode 100644 909CH.mp3 create mode 100644 909OH.mp3 create mode 100644 909SD.mp3 create mode 100644 README.md create mode 100755 build.sh create mode 100644 index.html create mode 100644 preview.png create mode 100644 src/app.ts create mode 100644 src/audio.ts create mode 100644 src/boilerplate.ts create mode 100644 src/dial.ts create mode 100644 src/interface.ts create mode 100644 src/math.ts create mode 100644 src/pattern.ts create mode 100644 src/ui.ts create mode 100644 tsconfig.json create mode 100644 ui.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8d98f9d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.* diff --git a/909BD.mp3 b/909BD.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..414f9a2554d3825c9a8d51ec6c2adeb52d3d1990 GIT binary patch literal 8358 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 E56-{LdjJ3c literal 0 HcmV?d00001 diff --git a/909CH.mp3 b/909CH.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..73db73cd795c3571f32459b844994b6b23c6f98b GIT binary patch literal 4596 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 literal 0 HcmV?d00001 diff --git a/909OH.mp3 b/909OH.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7d9ff0c06d17091f4ef4504ea80d97004129ed2c GIT binary patch literal 13373 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 J{(n0I{}0_1icJ6j literal 0 HcmV?d00001 diff --git a/909SD.mp3 b/909SD.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..584c5c140ef37f485c20977b32e4a63397b262df GIT binary patch literal 5850 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 + + + + + + + The Endless Acid Banger + + + + + + + + + + + +

The Endless Acid Banger

+

+ The music you hear is generated in your browser by a randomised algorithm, below you can see the notes and parameters that are currently in use. + You can also interact with various parameters and buttons manually. + The green autopilot switches change how automatic playback is. Leave them on for a lean-back experience. + Buttons labelled ⟳ will generate new patterns. +

+

+ The Endless Acid Banger was created by Vitling. + If you want to support my work, please consider + buying my music or + sponsoring my GitHub. +

+ + \ No newline at end of file diff --git a/preview.png b/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..545a337a60cbf7c33b5f9dd3272b9006d6edd64c GIT binary patch literal 97266 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 w-%z8-BIj=^7~At>BS2dJY&7L){O*RE_u_6 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�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 j|DpMB=K4Pyn%&3to { + if (previousValue != param.value) { + // Something else has touched this parameter + diff = 0; + previousValue = param.value; + touchCountdown = 200 + } else { + if (touchCountdown > 0) { + touchCountdown--; + } + + if (touchCountdown < 100) { + diff *= touchCountdown > 0 ? 0.8 : 0.98; + diff += (Math.random() - 0.5) * scale; + param.value += diff; + + + previousValue = param.value + if (param.value > min + 0.8 * (max - min)) { + diff -= Math.random() * scale; + } else if (param.value < min + 0.2 * (max - min)) { + diff += Math.random() * scale; + } + } + } + } + + return { + step + } +} + +function ThreeOhUnit(audio: AudioT, waveform: OscillatorType, output: AudioNode, gen: NoteGenerator, patternLength: number=16): ThreeOhMachine { + const synth = audio.ThreeOh(waveform, output); + const pattern = genericParameter("Pattern", []); + const newPattern = trigger("New Pattern Trigger", true); + + gen.newNotes.subscribe(newNotes => { + if (newNotes == true) newPattern.value = true; + }) + + function step(index: number) { + if ((index === 0 && newPattern.value == true) || pattern.value.length == 0) { + pattern.value = gen.createPattern(); + newPattern.value = false; + } + + const slot = pattern.value[index % patternLength]; + if (slot.note != "-") { + synth.noteOn(slot.note, slot.accent, slot.glide); + } else { + synth.noteOff(); + } + } + + const parameters = { + cutoff: parameter("Cutoff", [30,700],400), + resonance: parameter("Resonance", [1,30],15), + envMod: parameter("Env Mod", [0,8000], 4000), + decay: parameter("Decay", [0.1,0.9], 0.5) + }; + + parameters.cutoff.subscribe(v => synth.params.cutoff.value = v); + parameters.resonance.subscribe(v => synth.params.resonance.value = v); + parameters.envMod.subscribe(v => synth.params.envMod.value = v); + parameters.decay.subscribe(v => synth.params.decay.value = v); + + return { + step, + pattern, + parameters, + newPattern + } +} + +async function NineOhUnit(audio: AudioT): Promise { + const drums = await audio.SamplerDrumMachine(["909BD.mp3","909OH.mp3","909CH.mp3","909SD.mp3"]) + const pattern = genericParameter("Drum Pattern", []); + const mutes = [ + genericParameter("Mute BD", false), + genericParameter("Mute OH", false), + genericParameter("Mute CH", false), + genericParameter("Mute SD", false) + ]; + const newPattern = trigger("New Pattern Trigger", true); + const gen = NineOhGen(); + + function step(index: number) { + if ((index == 0 && newPattern.value == true) || pattern.value.length == 0) { + pattern.value = gen.createPatterns(true); + newPattern.value = false; + } + for (let i in pattern.value) { + const entry = pattern.value[i][index % pattern.value[i].length]; + if (entry && !mutes[i].value) { + drums.triggers[i].play(entry); + } + } + } + + return { + step, + pattern, + mutes, + newPattern + } +} + +function DelayUnit(audio: AudioT): DelayUnit { + const dryWet = parameter("Dry/Wet", [0,0.5], 0.5); + const feedback = parameter("Feedback", [0,0.9], 0.3); + const delayTime = parameter("Time", [0,2], 0.3); + const delay = audio.DelayInsert(delayTime.value, dryWet.value, feedback.value); + dryWet.subscribe(w => delay.wet.value = w); + feedback.subscribe(f => delay.feedback.value = f); + delayTime.subscribe(t => delay.delayTime.value = t); + + return { + dryWet, + feedback, + delayTime, + inputNode: delay.in, + } +} + +function AutoPilot(state: ProgramState): AutoPilotUnit { + const nextMeasure = parameter("upcomingMeasure", [0, Infinity],0); + const currentMeasure = parameter("measure", [0, Infinity], 0); + const patternEnabled = genericParameter("Alter Patterns", true); + const dialsEnabled = genericParameter("Twiddle With Knobs", true); + const mutesEnabled = genericParameter("Mute Drum Parts", true); + state.clock.currentStep.subscribe(step => { + if (step === 4) { + nextMeasure.value = nextMeasure.value + 1; + } else if (step === 15) { // slight hack to get mutes functioning as expected + currentMeasure.value = currentMeasure.value + 1; + } + }); + + nextMeasure.subscribe(measure => { + if (patternEnabled.value) { + if (measure % 64 === 0) { + if (Math.random() < 0.2) { + state.gen.newNotes.value = true; + } + } + if (measure % 16 === 0) { + state.notes.forEach((n, i) => { + if (Math.random() < 0.5) { + n.newPattern.value = true; + } + }); + if (Math.random() < 0.3) { + state.drums.newPattern.value = true; + } + } + } + }) + + currentMeasure.subscribe(measure => { + if (mutesEnabled.value) { + if (measure % 8 == 0) { + const drumMutes = [Math.random() < 0.2, Math.random() < 0.5, Math.random() < 0.5, Math.random() < 0.5]; + state.drums.mutes[0].value = drumMutes[0]; + state.drums.mutes[1].value = drumMutes[1]; + state.drums.mutes[2].value = drumMutes[2]; + state.drums.mutes[3].value = drumMutes[3]; + } + } + }) + const noteParams = state.notes.flatMap(x => Object.values(x.parameters)) + const delayParams = [state.delay.feedback, state.delay.dryWet]; + + const wanderers = [...noteParams, ...delayParams].map(param => WanderingParameter(param)); + window.setInterval(() => { if (dialsEnabled.value) wanderers.forEach(w => w.step());},100); + + + return { + switches: [ + patternEnabled, + dialsEnabled, + mutesEnabled + ] + } +} + +function ClockUnit(): ClockUnit { + const bpm = parameter("BPM", [70,200],142); + const currentStep = parameter("Current Step", [0,15],0); + const clockImpl = Clock(bpm.value, 4, 0.0); + bpm.subscribe(clockImpl.setBpm); + clockImpl.bind((time, step) => { + currentStep.value = step % 16; + }) + return { + bpm, + currentStep + } +} + +async function start() { + const audio = Audio(); + const clock = ClockUnit(); + const delay = DelayUnit(audio); + clock.bpm.subscribe(b => delay.delayTime.value = (3/4) * (60/b)); + + const gen = ThreeOhGen(); + const programState: ProgramState = { + notes: [ + ThreeOhUnit(audio, "sawtooth", delay.inputNode, gen),ThreeOhUnit(audio, "square", delay.inputNode, gen) + ], + drums: await NineOhUnit(audio), + gen, + delay, + clock + } + + clock.currentStep.subscribe(step => [...programState.notes, programState.drums].forEach(d => d.step(step))); + const autoPilot = AutoPilot(programState); + const ui = UI(programState, autoPilot, audio.master.analyser); + document.body.append(ui); +} + +pressToStart(start, "The Endless Acid Banger", "A collaboration between human and algorithm by Vitling"); diff --git a/src/audio.ts b/src/audio.ts new file mode 100644 index 0000000..dcbfa14 --- /dev/null +++ b/src/audio.ts @@ -0,0 +1,340 @@ +/* + Copyright 2021 David Whiting + This work is licensed under a Creative Commons Attribution 4.0 International License + https://creativecommons.org/licenses/by/4.0/ +*/ + +import {biRnd} from "./math.js"; + +export type Note = 'A' | 'A#' | 'B' | 'C' | 'C#' | 'D' | 'D#' | 'E' | 'F' | 'F#' | 'G' | 'G#'; +export type Octave = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8'; +export type FullNote = `${Note}${Octave}` + +const lookupTable: Map = new Map(); +const revLook: Map = new Map(); +(()=>{ + function add(note: Note, n: number) { + lookupTable.set(note, n); + revLook.set(n, note); + } + add('A', 9); + add('A#', 10); + add('B', 11); + add('C', 0); + add('C#', 1); + add('D', 2); + add('D#', 3); + add('E', 4); + add('F', 5); + add('F#', 6); + add('G', 7); + add('G#', 8); +})(); + + +export function textNoteToNumber(note: FullNote) { + const o: Octave = note.substring(note.length - 1) as Octave; + const n: Note = note.substring(0,note.length -1) as Note; + + // @ts-ignore + return parseInt(o) * 12 + lookupTable.get(n) + 12; +} + +function midiNoteToFrequency(noteNumber: number) { + return 440 * Math.pow(2, (noteNumber - 69) / 12); +} + +export function midiNoteToText(note: number): FullNote { + const octave = Math.floor(note / 12); + const n = Math.floor(note % 12); + const noteName = revLook.get(n) as Note; + return `${noteName}${octave}` as FullNote; +} + +export function pitch(note: FullNote | number) { + if (typeof(note) === 'number') { + return midiNoteToFrequency(note); + } else { + return midiNoteToFrequency(textNoteToNumber(note)); + } +} + +// @ts-ignore +export function Audio(au: AudioContext = new (window.AudioContext || window.webkitAudioContext)()) { + function masterChannel() { + const gain = au.createGain(); + gain.gain.value = 0.5; + const limiter = au.createDynamicsCompressor(); + limiter.attack.value = 0.005; + limiter.release.value = 0.1; + limiter.ratio.value = 15.0; + limiter.knee.value = 0.0; + limiter.threshold.value = -0.5; + + const analyser = au.createAnalyser(); + analyser.fftSize = 2048; + limiter.connect(analyser); + + + gain.connect(limiter); + limiter.connect(au.destination); + + return { + in: gain, + analyser + } + } + + function constantSourceCompatible(): AudioNode & {offset: AudioParam, start: () => void} { + if (au.createConstantSource) { + return au.createConstantSource(); + } else { + const src = au.createBufferSource(); + src.buffer = au.createBuffer(1, 256, au.sampleRate); + const array = src.buffer.getChannelData(0); + for (let i = 0; i < array.length; i++) { + array[i] = 1.0; + } + const gain = au.createGain(); + const offsetParam = gain.gain; + src.loop = true; + src.connect(gain); + return Object.assign(gain, {offset: offsetParam, start: () => src.start()}); + } + } + + function decodeAudioDataCompatible(audioData: ArrayBuffer): Promise { + return new Promise((resolve, reject) => { + return au.decodeAudioData(audioData, resolve, reject); + }); + } + + const master = masterChannel(); + + function time(s: number) { + return new Promise(resolve => {setTimeout(()=> resolve(), s * 1000)}) + } + + async function tone(pitch: number, attack: number, sustain: number, release:number, pan: number = 0.0, destination: AudioNode = master.in) { + const osc = au.createOscillator(); + osc.type = "sawtooth"; + osc.frequency.value = pitch; + osc.start(); + + const filter = au.createBiquadFilter(); + filter.type = "lowpass"; + filter.frequency.value = pitch * 4; + filter.Q.value = 5; + + const gain = au.createGain(); + gain.gain.value = 0.0; + + const panner = au.createPanner(); + panner.panningModel = "equalpower"; + panner.setPosition(pan, 0, 1-Math.abs(pan)); + + osc.connect(filter); + filter.connect(gain); + gain.connect(panner); + panner.connect(destination); + + gain.gain.linearRampToValueAtTime(0.1, au.currentTime + attack); + + await time(sustain + attack); + gain.gain.setValueAtTime(0.1, au.currentTime); + gain.gain.linearRampToValueAtTime(0,au.currentTime + release); + filter.frequency.linearRampToValueAtTime(Math.max(pitch/2, 400), au.currentTime + release); + + await time(release + 0.01); + osc.stop(au.currentTime); + panner.disconnect(); + } + + function SimpleToneSynth(attack: number, sustain: number, release:number, destination: AudioNode = master.in) { + + + function play(note: FullNote) { + tone(pitch(note), attack, sustain, release, biRnd(), destination); + } + return { + play + } + } + + function DelayInsert(time: number, feedback: number, wet: number, destination: AudioNode = master.in) { + const delayNode = au.createDelay(1); + delayNode.delayTime.value = time; + const feedbackGain = au.createGain(); + feedbackGain.gain.value = feedback; + delayNode.connect(feedbackGain); + feedbackGain.connect(delayNode); + const delayGain = au.createGain(); + delayGain.gain.value = wet; + delayNode.connect(delayGain); + delayGain.connect(destination); + const synthOut = au.createGain(); + synthOut.gain.value = 1.0; + synthOut.connect(delayNode); + synthOut.connect(destination); + return { + in: synthOut, + feedback: feedbackGain.gain, + wet: delayGain.gain, + delayTime: delayNode.delayTime + } + } + + function ThreeOh(type: OscillatorType = "sawtooth", out: AudioNode = master.in) { + const filter = au.createBiquadFilter(); + filter.type = "lowpass"; + filter.Q.value = 20; + filter.frequency.value = 300; + const pResonance = filter.Q; + const pCutoff = filter.frequency; + + const decayTimeNode = constantSourceCompatible(); + decayTimeNode.start(); + const pDecay = decayTimeNode.offset; + + const env = constantSourceCompatible(); + env.start(); + env.offset.value = 0.0; + + function trigger() { + + } + + const scaleNode = au.createGain(); + scaleNode.gain.value = 4000; + const pEnvMod = scaleNode.gain; + env.connect(scaleNode); + scaleNode.connect(filter.detune); + + const osc = au.createOscillator(); + osc.type = type; + + osc.frequency.value = 440; + osc.start(); + + const vca = au.createGain(); + vca.gain.value = 0.0; + + osc.connect(vca); + vca.connect(filter); + filter.connect(out); + + + function noteOn(note: FullNote, accent: boolean = false, glide: boolean = false) { + if (accent) { + env.offset.cancelScheduledValues(au.currentTime); + //env.offset.setTargetAtTime(1.0,au.currentTime, 0.001); + env.offset.setValueAtTime(1.0, au.currentTime); + env.offset.exponentialRampToValueAtTime(0.01, au.currentTime + pDecay.value/3); + } else { + env.offset.cancelScheduledValues(au.currentTime); + //env.offset.setTargetAtTime(1.0,au.currentTime, 0.001); + env.offset.setValueAtTime(1.0, au.currentTime); + env.offset.exponentialRampToValueAtTime(0.01, au.currentTime + pDecay.value); + } + osc.frequency.cancelScheduledValues(au.currentTime); + osc.frequency.setTargetAtTime(midiNoteToFrequency(textNoteToNumber(note)),au.currentTime, glide ? 0.02 : 0.002); + vca.gain.cancelScheduledValues(au.currentTime); + vca.gain.setValueAtTime(accent ? 0.2 : 0.15, au.currentTime); + //vca.gain.setTargetAtTime(accent ? 0.5 : 0.3,au.currentTime, 0.001); + //vca.gain.setValueAtTime(0.2, au.currentTime); + vca.gain.linearRampToValueAtTime(0.1, au.currentTime + 0.2); + trigger(); + } + + function noteOff() { + vca.gain.cancelScheduledValues(au.currentTime); + vca.gain.setTargetAtTime(0.0,au.currentTime,0.01); + } + + return { + noteOn, + noteOff, + params: { + cutoff: pCutoff, + resonance: pResonance, + envMod: pEnvMod, + decay: pDecay + } + } + } + + function kick(out: AudioNode = master.in) { + const osc = au.createOscillator(); + osc.frequency.value = 400; + const gain = au.createGain(); + gain.gain.value = 0.3; + osc.start(); + osc.frequency.exponentialRampToValueAtTime(50, au.currentTime + 0.04); + gain.gain.setValueCurveAtTime([0.5,0.5,0.45,0.4,0.25,0.0], au.currentTime, 0.09); + + osc.stop(au.currentTime + 0.1); + window.setTimeout(() => gain.disconnect(), 200); + + osc.connect(gain); + gain.connect(out); + } + + async function loadBuffer(filePath: string) { + const response = await fetch(filePath); + const arraybuffer = await response.arrayBuffer(); + + const audioBuffer = await decodeAudioDataCompatible(arraybuffer); + return audioBuffer; + } + + async function Sampler(file: string) { + const sampleBuffer = await loadBuffer(file); + function play(gain: number = 0.4, decay: number = 1.0, out: AudioNode = master.in) { + const bufferSource = au.createBufferSource(); + bufferSource.buffer = sampleBuffer; + bufferSource.loop = false; + + const gainNode = au.createGain(); + gainNode.gain.setValueAtTime(gain,au.currentTime); + gainNode.gain.linearRampToValueAtTime(0.0, au.currentTime + decay); + + bufferSource.connect(gainNode); + gainNode.connect(out); + bufferSource.start(au.currentTime); + } + return { + play + } + } + + async function SamplerDrumMachine(files: string[], out: AudioNode = master.in) { + const sum = au.createGain(); + sum.gain.value = 1.0; + sum.connect(out); + + const promisedMachines = files.map(Sampler) + const samplers = await Promise.all(promisedMachines); + const mapped = samplers.map(sampler => ({ + play: (vel: number) => sampler.play(0.7 * vel, vel * 0.5, sum) + })); + + return { + triggers: mapped + } + } + + + return { + tone, + SimpleToneSynth, + DelayInsert, + ThreeOh, + kick, + Sampler, + SamplerDrumMachine, + master, + context: au + } +} + +export type AudioT = ReturnType diff --git a/src/boilerplate.ts b/src/boilerplate.ts new file mode 100644 index 0000000..91d3ac5 --- /dev/null +++ b/src/boilerplate.ts @@ -0,0 +1,93 @@ +/* + Copyright 2021 David Whiting + This work is licensed under a Creative Commons Attribution 4.0 International License + https://creativecommons.org/licenses/by/4.0/ +*/ + +export function pressToStart(fn: () => void, title: string, description: string, callToAction: string = "Click, tap or press any key to start") { + + const button = document.createElement("button"); + button.id="_start_button"; + const introText = document.createElement("div"); + introText.id = "_intro_text"; + button.append(introText); + introText.innerHTML = title + "

" + description + "

" + callToAction; + + document.head.insertAdjacentHTML("beforeend", ` + + `); + document.body.append(button); + + let started = false; + function handleStartAction() { + if (!started) { + started = true; + fn(); + button.style.display = "none"; + } + } + button.addEventListener("click", handleStartAction); + window.addEventListener("keydown", handleStartAction); + +} + +export function repeat(seconds: number, fn: (time: number, step: number) => void) { + let time = new Date().getTime(); + let n = 0; + function step() { + const t = new Date().getTime() - time; + fn(t, n); + n++; + } + + step(); + window.setInterval(step, seconds * 1000); +} + +export function Clock(bpm: number, subdivision: number =4, shuffle: number = 0) { + let currentBpm = bpm; + let fn = (time: number, step: number) => {}; + let time = new Date().getTime(); + let n = 0; + function bind(newFn: (time: number, step: number) => void) { + fn = newFn; + } + function step() { + const t = new Date().getTime() - time; + fn(t, n); + const shuffleFactor = n % 2 == 0 ? 1 + shuffle : 1 - shuffle; + n++; + + window.setTimeout(step, shuffleFactor * (60000 / currentBpm) / subdivision); + } + + window.setTimeout(step, (60000 / bpm) / subdivision); + return { + bind, + setBpm: (bpm: number) => currentBpm = bpm + } +} \ No newline at end of file diff --git a/src/dial.ts b/src/dial.ts new file mode 100644 index 0000000..cc9b3bc --- /dev/null +++ b/src/dial.ts @@ -0,0 +1,122 @@ +/* + Copyright 2021 David Whiting + This work is licensed under a Creative Commons Attribution 4.0 International License + https://creativecommons.org/licenses/by/4.0/ +*/ + +function clamp(n: number): number { + return n < 0 ? 0 : n > 1 ? 1 : n; +} + +export function Dial(bounds: [number, number], text?: string, dialColor: string = "red", textColor: string="white"){ + const element = document.createElement("canvas"); + element.classList.add("dial"); + const w = element.width = 70; + const h = element.height = 50; + const size = 20; + const g = element.getContext("2d") as CanvasRenderingContext2D; + let normalizedValue = 0.5; + let previousNormalisedValue = 0.5; + let fadeCounter = 0; + let fadeTimerHandler: number | null = null; + + function paint() { + g.clearRect(0,0,w,h); + + const arc = [Math.PI * 0.8, Math.PI * 2.2]; + g.strokeStyle = dialColor; + g.lineWidth = 2; + g.beginPath(); + g.arc(w/2, h/2, size, arc[0], arc[1]); + g.stroke(); + + g.lineWidth = w / 8; + const pos = arc[0] + normalizedValue * (arc[1] - arc[0]); + g.beginPath(); + g.arc(w/2, h/2, size, pos - 0.2, pos + 0.2); + g.stroke(); + + if (fadeCounter > 0) { + g.strokeStyle = "rgba(0,255,0," + clamp(fadeCounter/10) + ")"; + g.lineWidth = w / 8; + const pos = arc[0] + normalizedValue * (arc[1] - arc[0]); + g.beginPath(); + g.arc(w/2, h/2, size, pos - 0.2, pos + 0.2); + g.stroke(); + } + + if (text) { + g.fillStyle = textColor; + g.font = "10px Orbitron"; + const tw = g.measureText(text).width; + g.fillText(text, w/2 - tw / 2, h/2 + size); + } + } + + function fade(frames: number) { + if (fadeTimerHandler) window.clearInterval(fadeTimerHandler); + fadeCounter = Math.min(frames, 10); + fadeTimerHandler = window.setInterval(() => { + fadeCounter--; + paint() + }, 100); + } + + + function normalise(v: number) { + return (v - bounds[0]) / (bounds[1] - bounds[0]); + } + + function denormalise(n: number) { + return bounds[0] + (bounds[1] - bounds[0]) * n; + } + + function setValue(n: number) { + normalizedValue = normalise(n); + paint(); + if (Math.abs(normalizedValue - previousNormalisedValue) > 0.002) { + fade(4 + Math.floor(Math.abs(normalizedValue - previousNormalisedValue) / 0.001)); + } + previousNormalisedValue = normalizedValue; + } + + function getValue(): number { + return denormalise(normalizedValue); + } + + const state = {isDragging: false, handler: [(v: number) => {}]}; + + + function bind(h: (v: number) => void) { + state.handler.push(h); + } + + element.addEventListener("mousedown", (e) => { + state.isDragging = true; + }); + + window.addEventListener("mousemove", (e) => { + if (state.isDragging) { + const delta = (e.movementX - e.movementY)/100; + normalizedValue = clamp(normalizedValue+delta); + const actualValue = denormalise(normalizedValue); + setValue(actualValue); + state.handler.forEach(h => h(actualValue)); + } + }) + + window.addEventListener("mouseup", (e) => { + state.isDragging = false; + }) + + paint(); + + + return { + element, + get value(): number { return getValue(); }, + set value(v: number) { setValue(v); }, + bind + }; +} +export type DialT = ReturnType \ No newline at end of file diff --git a/src/interface.ts b/src/interface.ts new file mode 100644 index 0000000..cc4b4a9 --- /dev/null +++ b/src/interface.ts @@ -0,0 +1,111 @@ +/* + Copyright 2021 David Whiting + This work is licensed under a Creative Commons Attribution 4.0 International License + https://creativecommons.org/licenses/by/4.0/ +*/ + +import {FullNote} from "./audio.js"; +export type Slot = { + note: FullNote | "-"; + accent: boolean, + glide: boolean +} + +export type Pattern = Slot[] + +export type DrumPattern = number[][]; +type ParameterCallback = (v: T) => any; + +export type GeneralisedParameter = { + value: T, + name: string, + subscribe: (callback: ParameterCallback) => any +} + +export type Trigger = GeneralisedParameter + +export type NumericParameter = GeneralisedParameter & { + bounds: [number,number] +} + +export type PatternParameter = GeneralisedParameter; + +export type ThreeOhMachine = { + pattern: GeneralisedParameter, + newPattern: Trigger + step: (step: number) => void + parameters: { + cutoff: NumericParameter, + resonance: NumericParameter, + envMod: NumericParameter, + decay: NumericParameter + } +} + +export type NineOhMachine = { + pattern: GeneralisedParameter, + newPattern: Trigger, + mutes: GeneralisedParameter[], + step: (step: number) => void +} + +export type NoteGenerator = { + noteSet: GeneralisedParameter + newNotes: Trigger + createPattern: () => Pattern +} + +export type DelayUnit = { + dryWet: NumericParameter, + feedback: NumericParameter, + delayTime: NumericParameter, + inputNode: AudioNode, + // outputNode: AudioNode +} + + +export type ClockUnit = { + currentStep: NumericParameter, + bpm: NumericParameter +} + +export type AutoPilotUnit = { + switches: GeneralisedParameter[] +} + +export function genericParameter(name: string, value: T): GeneralisedParameter { + let listeners: ParameterCallback[] = []; + const state = {value}; + function subscribe(callback: ParameterCallback) { + callback(state.value); + listeners.push(callback); + } + + function publish() { + for (let l of listeners) { + l(state.value); + } + } + return { + name, + subscribe, + get value() { return state.value; }, + set value(v: T) { state.value = v; publish(); } + } +} + +export function trigger(name: string, value: boolean = false): Trigger { + return genericParameter(name, value); +} + +export function parameter(name: string, bounds: [number, number], value: number): NumericParameter { + return Object.assign(genericParameter(name, value), {bounds}); +} + +export type ProgramState = { + notes: ThreeOhMachine[], + drums: NineOhMachine, + gen: NoteGenerator, + delay: DelayUnit + clock: ClockUnit +} \ No newline at end of file diff --git a/src/math.ts b/src/math.ts new file mode 100644 index 0000000..0db07c3 --- /dev/null +++ b/src/math.ts @@ -0,0 +1,18 @@ +/* + Copyright 2021 David Whiting + This work is licensed under a Creative Commons Attribution 4.0 International License + https://creativecommons.org/licenses/by/4.0/ +*/ + +export function rndInt(maxExcl: number): number { + return Math.floor(Math.random() * (maxExcl-0.01)); +} + +export function biRnd(): number { + return Math.random() * 2 - 1; +} + +export function choose(array: T[]):T { + return array[rndInt(array.length)]; +} + diff --git a/src/pattern.ts b/src/pattern.ts new file mode 100644 index 0000000..a512013 --- /dev/null +++ b/src/pattern.ts @@ -0,0 +1,153 @@ +/* + Copyright 2021 David Whiting + This work is licensed under a Creative Commons Attribution 4.0 International License + https://creativecommons.org/licenses/by/4.0/ +*/ + +import {FullNote, midiNoteToText} from "./audio.js"; +import {choose, rndInt} from "./math.js"; +import { + GeneralisedParameter, + genericParameter, + NoteGenerator, + parameter, + Pattern, + Slot, + trigger, + Trigger +} from "./interface.js"; + + +export function ThreeOhGen(): NoteGenerator { + + let noteSet: GeneralisedParameter = genericParameter("note set", ['C1']); + let newNotes: Trigger = trigger("new note set", true); + const density = 1.0; + + const offsetChoices = [ + [0,0,12,24,27], + [0,0,0,12,10,19,26,27], + [0,1,7,10,12,13], + [0], + [0,0,0,12], + [0,0,12,14,15,19], + [0,0,0,0,12,13,16,19,22,24,25], + [0,0,0,7,12,15,17,20,24], + ]; + + function changeNotes() { + const root = rndInt(15) + 16; + const offsets: number[] = choose(offsetChoices); + noteSet.value = offsets.map(o => midiNoteToText(o + root)); + } + + function createPattern(): Pattern { + if (newNotes.value == true) { + changeNotes(); + newNotes.value = false; + } + const pattern: Slot[] = []; + + for (let i = 0; i < 16; i++) { + const chance = density * (i % 4 === 0 ? 0.6 : (i % 3 === 0 ? 0.5 : (i % 2 === 0 ? 0.3 : 0.1))); + if (Math.random() < chance) { + pattern.push({ + note: choose(noteSet.value), + accent: Math.random() < 0.3, + glide: Math.random() < 0.1 + }) + } else { + pattern.push({ + note: "-", + accent: false, + glide: false + }) + } + } + + return pattern; + } + return { + createPattern, + newNotes, + noteSet + } +} + +export function NineOhGen() { + function createPatterns(full: boolean = false) { + const kickPattern: number[] = new Array(16); + const ohPattern: number[] = new Array(16); + const chPattern: number[] = new Array(16); + const sdPattern: number[] = new Array(16); + const kickMode: string = choose(["electro", "fourfloor"]); + const hatMode: string = choose(["offbeats", "closed", full ? "offbeats" : "none"]); + const snareMode: string = choose(["backbeat","skip", full ? "backbeat" : "none"]); + + if (kickMode == "fourfloor") { + for (let i = 0; i < 16; i++) { + if (i % 4 == 0) { + kickPattern[i] = 0.9; + } else if (i % 2 == 0 && Math.random() < 0.1) { + kickPattern[i] = 0.6; + } + } + } else if (kickMode == "electro") { + for (let i = 0; i < 16; i++) { + if (i == 0) { + kickPattern[i] = 1; + } else if (i % 2 == 0 && i % 8 != 4 && Math.random() < 0.5) { + kickPattern[i] = Math.random() * 0.9; + } else if (Math.random() < 0.05) { + kickPattern[i] = Math.random() * 0.9; + } + } + } + + if (snareMode == "backbeat") { + for (let i = 0; i < 16; i++) { + if (i % 8 === 4) { + sdPattern[i] = 1; + } + } + } else if (snareMode == "skip") { + for (let i = 0; i < 16; i++) { + if (i % 8 === 3 || i % 8 === 6) { + sdPattern[i] = 0.6 + Math.random() * 0.4; + } else if (i % 2 === 0 && Math.random() < 0.2) { + sdPattern[i] = 0.4 + Math.random() * 0.2; + } else if (Math.random() < 0.1) { + sdPattern[i] = 0.2 + Math.random() * 0.2; + } + } + } + + if (hatMode == "offbeats") { + for (let i = 0; i < 16; i++) { + if (i % 4 == 2) { + ohPattern[i] = 0.4; + } else if (Math.random() < 0.3) { + if (Math.random() < 0.5) { + chPattern[i] = Math.random() * 0.2; + } else { + ohPattern[i] = Math.random() * 0.2; + } + } + + } + } else if (hatMode == "closed") { + for (let i = 0; i < 16; i++) { + if (i % 2 === 0) { + chPattern[i] = 0.4; + } else if (Math.random() < 0.5) { + chPattern[i] = Math.random() * 0.3; + } + + } + } + return [kickPattern,ohPattern,chPattern,sdPattern] + } + return { + createPatterns + } +} \ No newline at end of file diff --git a/src/ui.ts b/src/ui.ts new file mode 100644 index 0000000..5c3e7ec --- /dev/null +++ b/src/ui.ts @@ -0,0 +1,335 @@ +/* + Copyright 2021 David Whiting + This work is licensed under a Creative Commons Attribution 4.0 International License + https://creativecommons.org/licenses/by/4.0/ +*/ + +import { + DelayUnit, + DrumPattern, + GeneralisedParameter, ClockUnit, NineOhMachine, NoteGenerator, + NumericParameter, + PatternParameter, ProgramState, + ThreeOhMachine, Trigger, AutoPilotUnit +} from "./interface.js"; +import {textNoteToNumber} from "./audio.js"; +import {Dial} from "./dial.js"; + +const defaultColors = { + bg: "#222266", + note: "#88aacc", + accent: "#AA88CC", + glide: "#CCAA88", + text: "#CCCCFF", + highlight: "rgba(255,255,255,0.2)", + grid: "rgba(255,255,255,0.2)", + dial: "#AA88CC" +} +type ColorScheme = { [color in keyof typeof defaultColors]: string; }; + + +function DialSet(parameters: {[key: string]: NumericParameter} | NumericParameter[], ...classes: string[]) { + const params = Array.isArray(parameters) ? parameters : Object.keys(parameters).map(k => parameters[k]); + + const container = document.createElement("div"); + container.classList.add("params", ...classes); + + params.forEach(param => { + //const param = parameters[p]; + const dial = Dial(param.bounds, param.name, defaultColors.dial, defaultColors.text); + + // Change the parameter if we move the dial + dial.bind(v => { param.value = v }); + + // Move the dial if the parameter changes elsewhere + param.subscribe(v => dial.value = v); + + container.append(dial.element); + }) + + return container; +} + +function triggerButton(target: Trigger) { + const but = document.createElement("button"); + but.classList.add("trigger-button") + but.innerText = "⟳"; + + target.subscribe(v => { + if (v) but.classList.add("waiting"); else but.classList.remove("waiting"); + }); + + but.addEventListener("click", function () { + target.value = true; + }) + + return but; +} + +function toggleButton(param: GeneralisedParameter, ...classes: string[]) { + const button = document.createElement("button"); + button.classList.add(...classes); + button.innerText = param.name; + button.addEventListener("click", () => param.value = !param.value); + param.subscribe(v => { + if (v) { + button.classList.add("on"); + button.classList.remove("off"); + } else { + button.classList.add("off"); + button.classList.remove("on"); + } + }) + return button; +} + +function label(text: string) { + const element = document.createElement("div"); + element.classList.add("label"); + element.innerText = text; + return element; +} + +function machine(...contents: HTMLElement[]) { + const element = document.createElement("div"); + element.classList.add("machine"); + element.append(...contents); + return element +} + +function controlGroup(label: HTMLElement, content: HTMLElement, ...classes: string[]) { + const element = document.createElement("div"); + element.classList.add("control-group", ...classes); + element.append(label, content); + return element +} + +function controls(...contents: HTMLElement[]) { + const element = document.createElement("div"); + element.classList.add("controls"); + element.append(...contents); + return element +} + +function group(...contents: HTMLElement[]) { + const element = document.createElement("div"); + element.classList.add("group"); + element.append(...contents); + return element; +} + + +function PatternDisplay(patternParam: PatternParameter, stepParam: NumericParameter, colors: ColorScheme = defaultColors) { + const canvas = document.createElement("canvas"); + canvas.classList.add("pattern"); + function repaint() { + const pattern = patternParam.value; + const w = canvas.width = canvas.clientWidth; + const h = canvas.height = 200; + const vScale = h / 50; + const g = canvas.getContext("2d") as CanvasRenderingContext2D; + + g.font = "10px Orbitron"; + + g.fillStyle = colors.bg; + g.fillRect(0, 0, w, h); + + g.strokeStyle = colors.grid; + for (let i = 0; i < pattern.length; i++) { + const x = w * i / pattern.length; + g.beginPath(); + g.moveTo(x, 0); + g.lineTo(x, h); + g.stroke(); + } + for (let i = 0; i < 80; i++) { + const y = h - (i * vScale); + g.beginPath(); + g.moveTo(0, y); + g.lineTo(w, y); + g.stroke(); + } + + for (let i = 0; i < pattern.length; i++) { + const s = pattern[i]; + if (s.note === "-") { + } else { + const n = textNoteToNumber(s.note) - 24; + const x = w * i / pattern.length; + const y = h - (n * vScale); + const bw = w / pattern.length; + const bh = 5; + + g.fillStyle = s.glide ? colors.glide : (s.accent ? colors.accent : colors.note); + g.fillRect(x, y, bw, bh); + + g.fillStyle = colors.text; + const xt = (x + bw / 2) - g.measureText(s.note).width / 2; + g.fillText(s.note, xt, y); + } + } + + g.fillStyle = colors.highlight; + g.fillRect(w * stepParam.value / pattern.length, 0, w / pattern.length, h); + } + + patternParam.subscribe(repaint); + stepParam.subscribe(repaint); + + return canvas; +} + +function DrumDisplay(pattern: GeneralisedParameter, mutes: GeneralisedParameter[], stepParam: NumericParameter, colors: ColorScheme = defaultColors) { + const canvas = document.createElement("canvas"); + canvas.classList.add("pattern"); + + function repaint() { + const w = canvas.width = canvas.clientWidth; + const h = canvas.height = 100; + const g = canvas.getContext("2d") as CanvasRenderingContext2D; + g.fillStyle = colors.bg; + g.fillRect(0, 0, w, h); + + for (let i = 0; i < 16; i++) { + const x = w * i / 16; + for (let p = 0; p < pattern.value.length; p++) { + const y = (p / pattern.value.length) * h; + if (pattern.value[p][i]) { + if (mutes[p].value) { + g.fillStyle = "rgba(128,0,0,0.4)"; + } else { + g.fillStyle = "rgba(136,170,204," + pattern.value[p][i] + ")"; + } + g.fillRect(x, y, w / 16, h / pattern.value.length); + } + } + } + + g.fillStyle = colors.highlight; + g.fillRect(w * stepParam.value / 16, 0, w / 16, h); + } + + pattern.subscribe(repaint); + stepParam.subscribe(repaint); + + return canvas; +} + + + +function NoteGen(noteGenerator: NoteGenerator) { + const currentNotes = document.createElement("div"); + currentNotes.classList.add("parameter-controlled", "notegen-note-display"); + noteGenerator.noteSet.subscribe(notes => { + currentNotes.innerText = notes.join(", "); + }) + + return controlGroup( + label("Notegen"), + group( + triggerButton(noteGenerator.newNotes), + currentNotes + ), + "notegen-box" + ) +} + +function Mutes(params: GeneralisedParameter[]) { + const container = document.createElement("div"); + container.classList.add("mutes"); + + container.append(...params.map(p => toggleButton(p))); + return container; +} + +function DelayControls(delayUnit: DelayUnit) { + const controls = DialSet([delayUnit.dryWet, delayUnit.feedback]); + controls.classList.add("horizontal"); + + return controlGroup( + label("Delay"), + controls, + ) +} + + +function AutopilotControls(autoPilot: AutoPilotUnit) { + return controlGroup( + label("Autopilot"), + group( + ...autoPilot.switches.map(p => toggleButton(p, "autopilot-button")) + ) + ) +} + +function AudioMeter(analyser: AnalyserNode) { + const canvas = document.createElement("canvas"); + canvas.style.width = "100%"; + let w = canvas.width = 200; + const h = canvas.height = 100; + const g = canvas.getContext("2d") as CanvasRenderingContext2D; + + const output = new Uint8Array(analyser.fftSize); + + function draw() { + //w = canvas.width = canvas.clientWidth; + analyser.getByteTimeDomainData(output); + + g.clearRect(0,0,w,h); + g.strokeStyle = "white"; + g.beginPath(); + g.moveTo(0,h/2); + for (let i =0 ; i < output.length; i++) { + const v = (output[i] / 128) - 1; + g.lineTo(w * i/output.length, h/2 + (1.5 * v* h/2)); + } + + g.stroke(); + window.requestAnimationFrame(draw); + } + window.requestAnimationFrame(draw); + + return canvas; +} + + +export function UI(state: ProgramState, autoPilot: AutoPilotUnit, analyser: AnalyserNode) { + const ui = document.createElement("div"); + ui.id = "ui"; + + const otherControls = controls( + AutopilotControls(autoPilot), + NoteGen(state.gen), + DelayControls(state.delay), + controlGroup(label("Clock"), DialSet([state.clock.bpm], "horizontal")), + controlGroup(label("Meter"), group(AudioMeter(analyser)), "meter") + ) + + + + const machineContainer = document.createElement("div"); + machineContainer.classList.add("machines"); + + const noteMachines = state.notes.map((n, i) => machine( + label("303-0" + (i+1)), + group( + triggerButton(n.newPattern), + PatternDisplay(n.pattern, state.clock.currentStep), + DialSet(n.parameters) + ) + )); + + const drumMachine = machine( + label("909-XX"), + group( + triggerButton(state.drums.newPattern), + DrumDisplay(state.drums.pattern, state.drums.mutes, state.clock.currentStep), + Mutes(state.drums.mutes) + ) + ) + + machineContainer.append(...noteMachines, drumMachine) + ui.append(machineContainer, otherControls); + + return ui; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..d88cf4e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "module": "es2015", + "target": "es6", + "lib": ["dom", "esnext"], + "sourceMap": true, + "outDir": "./js", + "strict": true + }, + "compileOnSave": true, + "include": [ + "src/**/*" + ] +} \ No newline at end of file diff --git a/ui.css b/ui.css new file mode 100644 index 0000000..c2df6cf --- /dev/null +++ b/ui.css @@ -0,0 +1,193 @@ +/* + Copyright 2021 David Whiting + This work is licensed under a Creative Commons Attribution 4.0 International License + https://creativecommons.org/licenses/by/4.0/ +*/ + +@import url('https://fonts.googleapis.com/css2?family=Orbitron&display=swap'); + +body { + background-color: #111; + color:white; + font-family: Orbitron, monospace; +} + +#ui { + max-width: 1200px; + margin-left: auto; + margin-right: auto; + +} + +p { + max-width: 1200px; + margin-left: auto; + margin-right:auto; + font-family: monospace; +} + +a { + color:white; +} + +@media (max-width: 500px) { + p { + font-size: 0.8em; + } +} + +.machine,.control-group { + + background-color: black; + display: grid; + grid-template-columns: 20px auto; + border: 1px solid #444444; + margin:5px; +} + +.label { + writing-mode: vertical-rl; + transform: rotate(180deg); + text-align: center; + /* left because we're 180 rotated */ + border-left: 1px solid #444444; +} + +.machine .group { + display: grid; + grid-template-columns: 25px auto 70px; +} + +.controls { + display: flex; + flex-wrap: wrap; +} + +.control-group { + height: 100px; +} + +.control-group .group { + display: flex; + flex-direction: column; + align-items: stretch; +} + +.control-group .group button { + flex-grow: 1; +} + +.pattern { + width:100%; + height: 200px; + /*min-height: 150px;*/ + /*border-right:1px solid rgba(255,255,255,0.3);*/ +} + +button { + color:white; + background-color: #111; + border: 1px solid #444; + text-align: center; + cursor: pointer; + font-family: Orbitron, monospace +} + +button:hover { + background-color: #222; +} + +.dial { + display: block; +} +.mutes button { + height: 50px; + display: block; +} + +.mutes .on { + background-color: #770000; +} + +.trigger-button { + font-size:20px; + padding:0; + text-align: center; +} + +.params.horizontal .dial { + display: inline-block; +} + +.control-group .params { + height: 50px; + margin-top: auto; + margin-bottom: auto; + text-align: center; +} +.control-group { + flex-grow: 1; +} + +.meter canvas { + object-fit: fill; + height: 100px; + width:100px; +} + + +@keyframes wait-animate { + 0% { background-color: black } + 50% { background-color: red } + 100% { background-color: black } +} + +button.waiting { + background-color: red; + animation: wait-animate 0.2s infinite; +} + +.parameter-controlled { + background-color: #222266; +} + + +.notegen-note-display { + width: 200px; + height: 50px; + margin-left: auto; + margin-right: auto; + padding:5px; +} +.controls button { + width: 100%; +} + +@keyframes autopilot-animate { + 0% { background-color: #113311 } + 50% { background-color: green } + 100% { background-color: #113311 } +} +/*@keyframes autopilot-border-animate {*/ +/* 0% { border: 1px solid #444 }*/ +/* 50% { border: 1px solid #494 }*/ +/* 100% { border: 1px solid #444 }*/ +/*}*/ + +.autopilot-button.on { + animation: autopilot-animate 2s infinite; +} + + +h2 { + text-align: center; + font-size:1.5em; +} + +/*@media (max-width: 640px) {*/ +/* h2 {*/ +/* font-size: 1.2em;*/ +/* }*/ +/*}*/ + +