Compare commits
3 Commits
9329c1c439
...
54340ef585
Author | SHA1 | Date |
---|---|---|
Halfdan | 54340ef585 | |
Halfdan | bb354fc4f8 | |
Halfdan | 8a31150c1a |
|
@ -1,85 +0,0 @@
|
|||
import { amsynth } from "./modules/instruments/amsynth.js"
|
||||
import { duosynth } from "./modules/instruments/duosynth.js"
|
||||
import { monosynth } from "./modules/instruments/monosynth.js"
|
||||
import { plucksynth } from "./modules/instruments/plucksynth.js"
|
||||
|
||||
let FILTER_FREQ = 400
|
||||
let REV_RANGE = 12
|
||||
let REV = Math.random() * REV_RANGE
|
||||
|
||||
let NOTES = ["A3", "A2", "C4", "C3", "F3", "F2"]
|
||||
let NOTE = NOTES[ Math.floor(Math.random() * NOTES.length)]
|
||||
|
||||
let SPACING = ["7h", "8h", "9h", "10h"]
|
||||
let SPACE = SPACING[Math.floor(Math.random() * SPACING.length)]
|
||||
|
||||
Tone.Transport.bpm.value = 60;
|
||||
|
||||
let INSTRUMENTS = [amsynth, monosynth, plucksynth]
|
||||
let INSTRUMENT = INSTRUMENTS[Math.floor(Math.random() * INSTRUMENTS.length)]
|
||||
|
||||
const channel = new Tone.Channel();
|
||||
const freeverb = new Tone.Freeverb({ roomSize: 0.98, wet : 0.4 })
|
||||
const filter = new Tone.Filter({type:"lowpass", frequency:800})
|
||||
|
||||
channel.chain(freeverb, filter, Tone.Master)
|
||||
|
||||
for (let inst of INSTRUMENTS) {
|
||||
inst.connect(channel)
|
||||
}
|
||||
|
||||
const play = () => {
|
||||
let r = Math.random()
|
||||
if (r > 0.7) {
|
||||
const a = new Tone.Loop((time) => {
|
||||
INSTRUMENT.triggerAttackRelease(NOTE, "16n")
|
||||
}, SPACE).start(0)
|
||||
} else if (r > 0.3) {
|
||||
const a = new Tone.Loop((time) => {
|
||||
amsynth.triggerAttack(NOTE, "16n")
|
||||
}, SPACE).start(0)
|
||||
|
||||
} else {
|
||||
freeverb.wet.value = 0.0
|
||||
const bassPart = new Tone.Sequence(((time, note) => {
|
||||
plucksynth.triggerAttack(note);
|
||||
}), ["C7", "C8", "C7", "C5", "C#8"], "8n").start(0);
|
||||
|
||||
bassPart.probability = 0.6;
|
||||
}
|
||||
}
|
||||
|
||||
let ac_x = document.getElementById("ac_x")
|
||||
let ac_y = document.getElementById("ac_y")
|
||||
let ac_z = document.getElementById("ac_z")
|
||||
|
||||
if (window.DeviceOrientationEvent) {
|
||||
window.addEventListener(
|
||||
"deviceorientation",
|
||||
(event) => {
|
||||
const rotateDegrees = event.alpha; // alpha: rotation around z-axis
|
||||
const leftToRight = event.gamma; // gamma: left to right
|
||||
const frontToBack = event.beta; // beta: front back motion
|
||||
|
||||
// ac_x.innerHTML = rotateDegrees
|
||||
ac_y.innerHTML = leftToRight
|
||||
// ac_z.innerHTML = frontToBack
|
||||
|
||||
filter.frequency.value = (180 + leftToRight) * 6
|
||||
|
||||
ac_x.innerHTML = filter.frequency.value
|
||||
},
|
||||
true,
|
||||
);
|
||||
}
|
||||
|
||||
(function() {
|
||||
document.getElementById('start').addEventListener('click', function() {
|
||||
Tone.context.resume().then(() => {
|
||||
Tone.start()
|
||||
Tone.Transport.start()
|
||||
|
||||
play()
|
||||
})
|
||||
})
|
||||
})()
|
|
@ -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")
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
export const duosynth = new Tone.DuoSynth({
|
||||
volume : -9
|
||||
volume : -12
|
||||
})
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
export const play = () => {
|
||||
synth.triggerAttackRelease("C4", "16n");
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
Binary file not shown.
|
@ -2,22 +2,51 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta charset="utf8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Admin</title>
|
||||
<style>
|
||||
html, body {
|
||||
padding : 0;
|
||||
margin : 0;
|
||||
width : 100%;
|
||||
height : 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-direction: column;
|
||||
|
||||
background : #222;
|
||||
color : #aaa;
|
||||
}
|
||||
|
||||
button {
|
||||
font-size : 2em;
|
||||
padding : 1em;
|
||||
margin : 1em;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<button id="action">Action</button>
|
||||
<button id="noise">Noise</button>
|
||||
<button id="stop">Stop</button>
|
||||
<script src="static/js/lib/socket.io.js"></script>
|
||||
<script>
|
||||
const socket = io();
|
||||
|
||||
document.getElementById('action').addEventListener('click', () => {
|
||||
socket.emit('action')
|
||||
})
|
||||
|
||||
document.getElementById('noise').addEventListener('click', () => {
|
||||
socket.emit('noise')
|
||||
})
|
||||
|
||||
document.getElementById('stop').addEventListener('click', () => {
|
||||
socket.emit('stop')
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
Loading…
Reference in New Issue