diff --git a/static/js/main.js b/static/js/main.js index 6812641..d215e02 100644 --- a/static/js/main.js +++ b/static/js/main.js @@ -1,27 +1,29 @@ -const socket = io(); - -import { NOTE, SPACE } from "./settings.js" +const socket = io() import { pick } from "./modules/utils.js" +import { NOTE, SPACE, RECORDING } from "./settings.js" + import { amsynth } from "./modules/instruments/amsynth.js" import { duosynth } from "./modules/instruments/duosynth.js" import { monosynth } from "./modules/instruments/monosynth.js" import { membranesynth } from "./modules/instruments/membranesynth.js" import { plucksynth } from "./modules/instruments/plucksynth.js" -const instrument = pick([amsynth, duosynth, monosynth, membranesynth, plucksynth]) - import { reverb } from "./modules/effects/reverb.js" -Tone.Transport.bpm.value = 60; +// Pick an instrument +const instrument = pick([amsynth, duosynth, monosynth, membranesynth, plucksynth]) // A channel to chain instruments and effects -const channel = new Tone.Channel(); +const channel = new Tone.Channel() // This is a hack to have something running, which makes the reverb work const pingpong = new Tone.PingPongDelay({delayTime : 2, feedback : 0, wet : 0}) +// A filter +const filter = new Tone.Filter({type:"lowpass", frequency:800}) + // Chain the channel and effects to the master out channel.connect(pingpong) pingpong.connect(reverb) @@ -35,28 +37,107 @@ voice.playbackRate = 0.75 voice.loop = true voice.autostart = false +const noise = new Tone.Noise("brown") +noise.connect("channel") + let playloop = undefined -const pathway = pick([0, 1, 2]) +const pathway = pick([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) + const play = () => { // Determine which of our patterns to play switch(pathway) { case 0: + const autoFilter = new Tone.AutoFilter("3m", "200", 3.6).start() + const cChord = ['C4', 'E4', 'G4', 'B4'] + const dChord = ['D4', 'F4', 'A4', 'C5'] + const gChord = ['B3', 'D4', 'E4', 'A4'] + + const piano = new Tone.PolySynth(Tone.Synth, { + oscillator: { + partials: [3, 2, 1] + }, + volume: -9 + }).connect(autoFilter) + + autoFilter.connect(channel) + + const pianoPart = new Tone.Part({ + callback: (time, chord) => { + piano.triggerAttackRelease(chord, '8n', time) + }, + events: [ + ['0:0:2', cChord], + ['0:1', cChord], + ['0:1:3', dChord], + ['0:2:2', cChord], + ['0:3', cChord], + ['0:3:2', gChord] + ], + loop: false, + }) + + const interval = pick(["5m", "6m", "7m"]) + + const schedule = Tone.Transport.scheduleRepeat((time) => { + pianoPart.stop() + pianoPart.start() + }, interval, "0") + + break + + case 1: + playloop = new Tone.Player("/static/recordings/" + RECORDING).connect(channel) + playloop.loop = true + playloop.autostart = true + break + + case 2: + playloop = new Tone.Player("/static/recordings/" + RECORDING).connect(channel) + playloop.loop = true + playloop.autostart = true + break + + case 3: playloop = new Tone.Loop((time) => { instrument.triggerAttackRelease(NOTE, "16n") }, SPACE).start(0) break - case 1: + case 4: + playloop = new Tone.Loop((time) => { + instrument.triggerAttackRelease(NOTE, "16n") + }, SPACE).start(0) + break + + case 5: + playloop = new Tone.Loop((time) => { + instrument.triggerAttackRelease(NOTE, "9n") + }, SPACE).start(0) + break + + case 6: playloop = new Tone.Loop((time) => { instrument.triggerAttackRelease(NOTE, "8n") }, SPACE).start(0) break - case 2: - playloop = new Tone.Player("/static/recordings/birds.mp3").connect(channel) - playloop.loop = true - playloop.autostart = true + case 7: + playloop = new Tone.Loop((time) => { + instrument.triggerAttackRelease(NOTE, "8n") + }, SPACE).start(0) + break + + case 8: + playloop = new Tone.Loop((time) => { + instrument.triggerAttackRelease(NOTE, "6n") + }, SPACE).start(0) + break + + case 9: + playloop = new Tone.Loop((time) => { + instrument.triggerAttackRelease(NOTE, "6n") + }, SPACE).start(0) break default: @@ -66,19 +147,29 @@ const play = () => { (function() { socket.on('all_action', () => { - console.log('ACTION') document.body.style.background = "orange" voice.start() }) + socket.on('all_noise', () => { + document.body.style.background = "black" + voice.stop() + noise.start() + }) + + socket.on('all_stop', () => { + + }) + const flowers = ["🌼", "🌸", "💮", "🌺", "🪷", "🏵️"] const playbutton = document.getElementById('play') playbutton.addEventListener('click', () => { if (playbutton.className == 'paused') { - playbutton.className = 'playing'; - playbutton.innerHTML = pick(flowers); + playbutton.className = 'playing' + playbutton.innerHTML = pick(flowers) + Tone.context.resume().then(() => { Tone.start() Tone.Transport.start("+0.1") diff --git a/static/js/modules/instruments/duosynth.js b/static/js/modules/instruments/duosynth.js index 3196108..59f8a40 100644 --- a/static/js/modules/instruments/duosynth.js +++ b/static/js/modules/instruments/duosynth.js @@ -1,3 +1,3 @@ export const duosynth = new Tone.DuoSynth({ - volume : -9 + volume : -12 }) diff --git a/static/js/settings.js b/static/js/settings.js index c1d8ab1..c7625d2 100644 --- a/static/js/settings.js +++ b/static/js/settings.js @@ -1,7 +1,12 @@ import { pick } from "./modules/utils.js" -export const NOTES = ["A3", "A2", "C4", "C3", "F3", "F2"] +const NOTES = ["A3", "A2", "C4", "C3", "F3", "F2"] export const NOTE = pick(NOTES) -export const SPACING = ["7h", "8h", "9h", "10h"] -export const SPACE = SPACING[Math.floor(Math.random() * SPACING.length)] +const SPACING = ["7h", "8h", "9h", "10h"] +export const SPACE = pick(SPACING) + +const RECORDINGS = ["birds.mp3", "stairs.mp3"] +export const RECORDING = pick(RECORDINGS) + +Tone.Transport.bpm.value = 60; diff --git a/static/recordings/stairs.mp3 b/static/recordings/stairs.mp3 new file mode 100644 index 0000000..37ed289 Binary files /dev/null and b/static/recordings/stairs.mp3 differ diff --git a/templates/spe.html b/templates/spe.html index c7e394a..d4f40e8 100644 --- a/templates/spe.html +++ b/templates/spe.html @@ -2,22 +2,51 @@
+