From 8b709705ba31e7e9c7f46c7c8d60fc143bfdccb3 Mon Sep 17 00:00:00 2001 From: Jules Laplace Date: Wed, 21 Nov 2018 14:22:26 +0100 Subject: site --- .gitignore | 7 + README.md | 4 + docs/fonts/NHaasGroteskTXPro-55Rg.ttf | Bin 0 -> 275008 bytes docs/fonts/NHaasGroteskTXPro-56It.ttf | Bin 0 -> 306228 bytes docs/fonts/NHaasGroteskTXPro-75Bd.ttf | Bin 0 -> 300820 bytes docs/fonts/NHaasGroteskTXPro-76BdIt.ttf | Bin 0 -> 297312 bytes docs/img/dreaming-city.jpg | Bin 0 -> 125438 bytes docs/img/escape-from-neukoelln.jpg | Bin 0 -> 167756 bytes docs/img/pause-button.png | Bin 0 -> 1174 bytes docs/img/pause-inv.png | Bin 0 -> 1337 bytes docs/img/pause.png | Bin 0 -> 1336 bytes docs/img/play-button.png | Bin 0 -> 1336 bytes docs/img/play-fill.png | Bin 0 -> 1801 bytes docs/img/play-inv.png | Bin 0 -> 1993 bytes docs/img/play.png | Bin 0 -> 1978 bytes docs/img/playbutton.psd | Bin 0 -> 50227 bytes docs/img/xena-vectra-logo-sm.png | Bin 0 -> 9139 bytes docs/img/xena-vectra-logo.png | Bin 0 -> 30091 bytes docs/img/xenavectra.gif | Bin 0 -> 41515 bytes docs/index.html | 410 ++++++++++++++++++++++++++++++++ docs/js/cielab.js | 70 ++++++ docs/js/shards.js | 98 ++++++++ docs/js/sounds.js | 17 ++ docs/js/stars.js | 63 +++++ docs/js/util.js | 132 ++++++++++ docs/sounds/click.mp3 | Bin 0 -> 2337 bytes docs/sounds/click.wav | Bin 0 -> 142582 bytes 27 files changed, 801 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100755 docs/fonts/NHaasGroteskTXPro-55Rg.ttf create mode 100755 docs/fonts/NHaasGroteskTXPro-56It.ttf create mode 100755 docs/fonts/NHaasGroteskTXPro-75Bd.ttf create mode 100755 docs/fonts/NHaasGroteskTXPro-76BdIt.ttf create mode 100644 docs/img/dreaming-city.jpg create mode 100644 docs/img/escape-from-neukoelln.jpg create mode 100644 docs/img/pause-button.png create mode 100644 docs/img/pause-inv.png create mode 100644 docs/img/pause.png create mode 100644 docs/img/play-button.png create mode 100644 docs/img/play-fill.png create mode 100644 docs/img/play-inv.png create mode 100644 docs/img/play.png create mode 100644 docs/img/playbutton.psd create mode 100644 docs/img/xena-vectra-logo-sm.png create mode 100644 docs/img/xena-vectra-logo.png create mode 100644 docs/img/xenavectra.gif create mode 100644 docs/index.html create mode 100644 docs/js/cielab.js create mode 100644 docs/js/shards.js create mode 100644 docs/js/sounds.js create mode 100644 docs/js/stars.js create mode 100644 docs/js/util.js create mode 100644 docs/sounds/click.mp3 create mode 100644 docs/sounds/click.wav diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c1d93bf --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +mp3 +wav +aif +aiff +mp4 + diff --git a/README.md b/README.md new file mode 100644 index 0000000..01741e2 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +xenavectra +========== + +static site 2018 diff --git a/docs/fonts/NHaasGroteskTXPro-55Rg.ttf b/docs/fonts/NHaasGroteskTXPro-55Rg.ttf new file mode 100755 index 0000000..e5ad72b Binary files /dev/null and b/docs/fonts/NHaasGroteskTXPro-55Rg.ttf differ diff --git a/docs/fonts/NHaasGroteskTXPro-56It.ttf b/docs/fonts/NHaasGroteskTXPro-56It.ttf new file mode 100755 index 0000000..8aa3443 Binary files /dev/null and b/docs/fonts/NHaasGroteskTXPro-56It.ttf differ diff --git a/docs/fonts/NHaasGroteskTXPro-75Bd.ttf b/docs/fonts/NHaasGroteskTXPro-75Bd.ttf new file mode 100755 index 0000000..d80c0ee Binary files /dev/null and b/docs/fonts/NHaasGroteskTXPro-75Bd.ttf differ diff --git a/docs/fonts/NHaasGroteskTXPro-76BdIt.ttf b/docs/fonts/NHaasGroteskTXPro-76BdIt.ttf new file mode 100755 index 0000000..81dfad5 Binary files /dev/null and b/docs/fonts/NHaasGroteskTXPro-76BdIt.ttf differ diff --git a/docs/img/dreaming-city.jpg b/docs/img/dreaming-city.jpg new file mode 100644 index 0000000..211a0a9 Binary files /dev/null and b/docs/img/dreaming-city.jpg differ diff --git a/docs/img/escape-from-neukoelln.jpg b/docs/img/escape-from-neukoelln.jpg new file mode 100644 index 0000000..dcd1180 Binary files /dev/null and b/docs/img/escape-from-neukoelln.jpg differ diff --git a/docs/img/pause-button.png b/docs/img/pause-button.png new file mode 100644 index 0000000..6ab7818 Binary files /dev/null and b/docs/img/pause-button.png differ diff --git a/docs/img/pause-inv.png b/docs/img/pause-inv.png new file mode 100644 index 0000000..9bec646 Binary files /dev/null and b/docs/img/pause-inv.png differ diff --git a/docs/img/pause.png b/docs/img/pause.png new file mode 100644 index 0000000..c2d30ae Binary files /dev/null and b/docs/img/pause.png differ diff --git a/docs/img/play-button.png b/docs/img/play-button.png new file mode 100644 index 0000000..c0fd3fc Binary files /dev/null and b/docs/img/play-button.png differ diff --git a/docs/img/play-fill.png b/docs/img/play-fill.png new file mode 100644 index 0000000..2205696 Binary files /dev/null and b/docs/img/play-fill.png differ diff --git a/docs/img/play-inv.png b/docs/img/play-inv.png new file mode 100644 index 0000000..4baaa5f Binary files /dev/null and b/docs/img/play-inv.png differ diff --git a/docs/img/play.png b/docs/img/play.png new file mode 100644 index 0000000..b5b4a08 Binary files /dev/null and b/docs/img/play.png differ diff --git a/docs/img/playbutton.psd b/docs/img/playbutton.psd new file mode 100644 index 0000000..e2dbed4 Binary files /dev/null and b/docs/img/playbutton.psd differ diff --git a/docs/img/xena-vectra-logo-sm.png b/docs/img/xena-vectra-logo-sm.png new file mode 100644 index 0000000..b42111b Binary files /dev/null and b/docs/img/xena-vectra-logo-sm.png differ diff --git a/docs/img/xena-vectra-logo.png b/docs/img/xena-vectra-logo.png new file mode 100644 index 0000000..4b3f810 Binary files /dev/null and b/docs/img/xena-vectra-logo.png differ diff --git a/docs/img/xenavectra.gif b/docs/img/xenavectra.gif new file mode 100644 index 0000000..fb81d57 Binary files /dev/null and b/docs/img/xenavectra.gif differ diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..0c5217f --- /dev/null +++ b/docs/index.html @@ -0,0 +1,410 @@ + + + +Xena Vectra + + + + +
+
+
+
+
+ +
+
+
Dreaming City
+
+
+
+
+

Biography

+

+ Xena Vectra is the alter ego of synth goddess Bethany Barrett. Born in the mountains of the Black Forest and raised in sunny California, Beth has a long history in Berlin's underground music scene. Over the years she has produced everything from shoegaze to noise, avant garde disco and synthwave alike. Her unique style as Xena Vectra is inspired by vintage horror soundtracks, driven by her love of analog electronics. +

+

+ Beth performs live using an all hardware setup without a laptop in sight. She is available for bookings throughout Europe. Her soundtrack work includes scoring indie film Figaros Wölfe (2017) and she is currently working on several upcoming projects with the German artist Hito Steyerl. +

+
+
+

Discography

+

+ As Xena Vectra +

+

+
+ Escape from Neukölln EP (2018)
+ 12" / digital on Bandcamp +
+
+

+

+
+ Dreaming City EP (2018)
+ Cassette / digital on Bandcamp +

+
+
+

Equipment

+

Monosynths

+ +

Polysynths

+ +

Drum machines

+ +

Pedals

+ + "So, are softsynths as nasty as they say?" —Cayde-6 +
+
+

Contact

+

+ Booking: +
+ Twitter: + @
+ Soundcloud: + xenavectra, + magisphere +
+ Bandcamp: xenavectra
+

+
+
+

Playlist

+
+ + + + + + + + diff --git a/docs/js/cielab.js b/docs/js/cielab.js new file mode 100644 index 0000000..2293f0d --- /dev/null +++ b/docs/js/cielab.js @@ -0,0 +1,70 @@ +var cielab = (function(){ + var cielab = {} + + var xyz = [0,0,0] + var rgb = [0,0,0] + + L_range = [0, 100] + a_range = [-86.185, 98.254] + b_range = [-107.863, 94.482] + + cielab.gradient = function (n) { + n = n || 100 + var k = 0 + + var L, a, b + + var L0 = randrange(L_range[0] + 50, L_range[1]) + var L1 = randrange(L_range[0]+ 50, L_range[1]) + var a0 = randrange(a_range[0], a_range[1]) + var a1 = randrange(a_range[0], a_range[1]) + var b0 = randrange(b_range[0], b_range[1]) + var b1 = randrange(b_range[0], b_range[1]) + return function next (aa){ + L = mix(k/n, L0, L1) + a = mix(k/n, a0, a1) + b = mix(k/n, b0, b1) + rgb = xyz2rgb(hunterlab2xyz(L, a, b)) + k += 1 + return rgba_string(rgb, aa) + } + } + function rgba_string (rgb, a) { return "rgb(" + rgb.map(Math.round).join(",") + "," + a + ")" } + function hex_string (rgb) { return "#" + rgb.map(Math.round).map(function(n){ var s = n.toString(16); return s.length == 1 ? "0"+s : s }).join("") } + + function mix(n,a,b){ return n*a + (1-n)*b } + function clamp(n,a,b){ return n 0.0031308 ) var_R = 1.055 * Math.pow( var_R, 1 / 2.4 ) - 0.055 + else var_R = 12.92 * var_R + if ( var_G > 0.0031308 ) var_G = 1.055 * Math.pow( var_G, 1 / 2.4 ) - 0.055 + else var_G = 12.92 * var_G + if ( var_B > 0.0031308 ) var_B = 1.055 * Math.pow( var_B, 1 / 2.4 ) - 0.055 + else var_B = 12.92 * var_B + + rgb[0] = clamp(var_R * 255, 0, 255) + rgb[1] = clamp(var_G * 255, 0, 255) + rgb[2] = clamp(var_B * 255, 0, 255) + return rgb + } + + return cielab +})() \ No newline at end of file diff --git a/docs/js/shards.js b/docs/js/shards.js new file mode 100644 index 0000000..44d2ecd --- /dev/null +++ b/docs/js/shards.js @@ -0,0 +1,98 @@ +const shards = (function(){ + let count + let delay = 120 * 1000 + let els = [] + let t = 0 + let rebuilding = false + let nextTimeout + let dark, light + const bg_el = document.querySelector('.bgs') + + function init(){ + bind() + build() + step() + setTimeout(next, 20) + bg_el.classList.remove('fade') + } + function bind(){ + document.querySelector('h1').addEventListener('click', rebuild) + } + function build(){ + count = choice([5,7,7,11,11,13,13]) + light = cielab.gradient(count) + dark = cielab.gradient(count) + let el + for (var i = 0; i < count; i++) { + el = append(i) + } + } + function destroy(){ + for (var i = 0; i < count; i++) { + els[i] && bg_el.removeChild(els[i]) + } + els.length = 0 + } + function rebuild(){ + if (rebuilding) return + rebuilding = true + sounds.play('click') + stars.rebuild() + next() + t = 0 + bg_el.classList.add('fade') + setTimeout(() => { + destroy() + build() + step() + setTimeout(next, 20) + bg_el.classList.remove('fade') + rebuilding = false + sounds.play('click') + }, 500) + } + function append(i){ + const el = document.createElement('div') + el.classList.add('bg') + els.push(el) + bg_el.appendChild(el) + return el + } + function next(){ + clearTimeout(nextTimeout) + nextTimeout = setTimeout(next, delay) + step() + } + function step() { + t += 1 + light = cielab.gradient(count) + let w = { min: randrange(20, 40), max: randrange(10, 90) } + if (w.min > w.max) { + w.min += 10 + } + let rot = { min: randint(360), max: randrange(720, 1080) } + for (var i = 0; i < count; i++) { + update(i, t, w, rot, dark, light) + } + document.body.style.backgroundColor = cielab.gradient(2)(0.05) + } + function update(i, t, w, rot){ + const el = els[i] + const n = i / count + const side = lerp(n, w.min, w.max) + const spin = lerp(i % 2 ? (1-n) : (n), rot.min, rot.max) + const rotation = "rotate3d(" + [randrange(-1,1), randrange(-1,1), randrange(-1,1)].join(',') + ',' + randint(360) + "deg)" + el.style.width = side + 'vmin' + el.style.height = side + 'vmin' + el.style.transform = "translate3d(-50%, -50%, 0) rotate(" + spin + "deg) translate3d(50%, 50%, 0) " + rotation + // el.style.transform = "translate3d(-50%, -50%, 0)" + if (t === 1) { + light = cielab.gradient(count) + el.style.backgroundImage = 'linear-gradient(' + dark(1) + ', ' + light(0) + ')' + } + el.style.backgroundColor = light(1) + el.style.opacity = lerp(n, randrange(0.1, 0.4), randrange(0.2, 0.5)) + } + init() + return { rebuild: rebuild, step: step, } +})() \ No newline at end of file diff --git a/docs/js/sounds.js b/docs/js/sounds.js new file mode 100644 index 0000000..39f725d --- /dev/null +++ b/docs/js/sounds.js @@ -0,0 +1,17 @@ +const sounds = (function(){ + let sounds = {} + let els = {} + sounds.add = (fn) => { + const el = document.createElement('audio') + el.src = 'sounds/' + fn + '.mp3' + els[fn] = el + } + sounds.play = (fn) => { + const el = els[fn] + el.currentTime = 0 + el.volume = 0.8 + el.play() + } + sounds.add('click') + return sounds +})() diff --git a/docs/js/stars.js b/docs/js/stars.js new file mode 100644 index 0000000..f1569eb --- /dev/null +++ b/docs/js/stars.js @@ -0,0 +1,63 @@ +const stars = (function(){ + var canvas = document.createElement("canvas"), ctx = canvas.getContext('2d') + var s = Math.sin, c = Math.cos + document.addEventListener("DOMContentLoaded", function(){ + document.body.appendChild(canvas) + canvas.classList.add('stars') + canvas.style.width="100%" + canvas.style.height="100%" + canvas.style.position="fixed" + canvas.style.top="0px" + canvas.style.left="0px" + canvas.style.zIndex=-1 + document.body.addEventListener("resize", build) + // document.body.parentNode.style.backgroundColor="black" + ctx.strokeStyle="white" + build() + }) + function ri(n){ return Math.random() * n } + function rr(a,b){ return (b-a) * Math.random() + a } + function build(){ + var w = canvas.width = window.innerWidth + var h = canvas.height = window.innerHeight + ctx.clearRect(0,0,w,h) + var n = Math.sqrt(w*h)|0 + while (n--) { + var x = ri(w) + var y = ri(h) + var r0 = rr(0, 1) + var r1 = rr(0, 1) + var r2 = rr(0, 1) + var t0 = ri(2*Math.PI) + var t1 = ri(2*Math.PI) + var t2 = ri(2*Math.PI) + var x0 = x+c(t0)*r0 + var y0 = y+s(t0)*r0 + var x1 = x+c(t1)*r1 + var y1 = y+s(t1)*r1 + var x2 = x+c(t2)*r2 + var y2 = y+s(t2)*r2 + ctx.beginPath() + ctx.moveTo(x,y) + ctx.bezierCurveTo(x0,y0,x1,y1,x2,y2) + var color = rr(0, 255)|0 + ctx.strokeStyle="rgb("+color+","+color+","+color+")" + ctx.stroke() + } + } + let rebuilding = false + function rebuild(){ + if (rebuilding) return + rebuilding = true + canvas.classList.add('fade') + document.body.classList.add('fade') + setTimeout(() => { + // destroy() + build() + canvas.classList.remove('fade') + document.body.classList.remove('fade') + rebuilding = false + }, 500) + } + return { rebuild: rebuild } +})() \ No newline at end of file diff --git a/docs/js/util.js b/docs/js/util.js new file mode 100644 index 0000000..9455825 --- /dev/null +++ b/docs/js/util.js @@ -0,0 +1,132 @@ +function avg(a,b,n){ return (a*(n-1) + b)/n } +function rand(n){ return Math.random()*n } +function randint(n) { return ~~(Math.random()*n) } +function randrange(a,b){ return a+rand(b-a) } +function choice(a) { return a[randint(a.length)] } +function clamp(n,a,b) { return a > n ? a : n > b ? b : n } +function sign(n){ return n < 0 ? -1 : 1 } +function mod(n,m){ return n-(m * Math.floor(n/m)) } +function lerp(n,a,b){ return (b-a)*n+a } +function quantize(m,n){ return n * ((m/n)|0) } + +function randgauss (obj, jog) { + var radius = Math.random() * jog + var angle = Math.random() * Math.PI * 2 + obj.left += Math.sin(angle) * radius + obj.top += Math.cos(angle) * radius +} + +function shuffle(a){ + for (var i = a.length; i > 0; i--){ + var r = randint(i) + var swap = a[i-1] + a[i-1] = a[r] + a[r] = swap + } + return a +} + +function toArray (els){ + return Array.prototype.slice.apply(els) +} + +// easing functions +function circular (t) { return Math.sqrt( 1 - ( --t * t ) ) } +function quadratic (t) { return t * ( 2 - t ) } +function back (t) { + var b = 4; + return ( t = t - 1 ) * t * ( ( b + 1 ) * t + b ) + 1; +} +function bounce (t) { + if (t >= 1) return 1; + if ( ( t /= 1 ) < ( 1 / 2.75 ) ) { + return 7.5625 * t * t; + } else if ( t < ( 2 / 2.75 ) ) { + return 7.5625 * ( t -= ( 1.5 / 2.75 ) ) * t + 0.75; + } else if ( t < ( 2.5 / 2.75 ) ) { + return 7.5625 * ( t -= ( 2.25 / 2.75 ) ) * t + 0.9375; + } else { + return 7.5625 * ( t -= ( 2.625 / 2.75 ) ) * t + 0.984375; + } +} +function elastic (t) { + var f = 0.22, + e = 0.4; + + if ( t === 0 ) { return 0; } + if ( t == 1 ) { return 1; } + + return ( e * Math.pow( 2, - 10 * t ) * Math.sin( ( t - f / 4 ) * ( 2 * Math.PI ) / f ) + 1 ); +} + +function preload (url) { + var img = new Image () + var loaded = false, _cb + img.onload = function(){ + if (loaded) return + loaded = true + if (_cb) { _cb(img) } + } + img.src = url + if (img.complete) { img.onload() } + return { + then: function(cb){ + if (loaded) { cb(img) } + else { _cb = cb } + } + } +} + +function preloadImages () { + var images = toArray(document.getElementById("images").children) + var count = 0, ready = false, _cb + images.forEach(function(img){ + var loaded = false + img.onload = function(){ + if (loaded) return + loaded = true + done(img) + } + if (img.complete) { img.onload() } + }) + function done () { + if (++count == images.length && ! ready) { + ready = true + _cb && _cb() + } + } + return { + then: function(cb){ + if (ready) { cb() } + else { _cb = cb } + } + } +} + +function smoothstep(min,max,n){ + var t = clamp((n - min) / (max - min), 0.0, 1.0); + return t * t * (3.0 - 2.0 * t) +} + +function detrand (x,y) { + return (Math.sin( x * 12.9898 + y * 78.233 ) * 43758.5453) % 1 +} + +function gray_to_transparency(img) { + var canvas = document.createElement("canvas") + var ctx = canvas.getContext('2d') + var nw = img.naturalWidth, nh = img.naturalHeight + canvas.width = nw + canvas.height = nh + ctx.drawImage(img,0,0) + var pixels = ctx.getImageData(0,0,nw,nh) + var data = pixels.data + for (var i = 0, len = nw*nh*4; i < len; i += 4) { + data[i+3] = data[i] + data[i] = data[i+1] = data[i+2] = 255 + } + ctx.putImageData(pixels,0,0) + return canvas +} + +var TWO_PI = 2*Math.PI \ No newline at end of file diff --git a/docs/sounds/click.mp3 b/docs/sounds/click.mp3 new file mode 100644 index 0000000..37e7df0 Binary files /dev/null and b/docs/sounds/click.mp3 differ diff --git a/docs/sounds/click.wav b/docs/sounds/click.wav new file mode 100644 index 0000000..7c45aed Binary files /dev/null and b/docs/sounds/click.wav differ -- cgit v1.2.3-70-g09d2