summaryrefslogtreecommitdiff
path: root/client/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'client/index.js')
-rw-r--r--client/index.js80
1 files changed, 73 insertions, 7 deletions
diff --git a/client/index.js b/client/index.js
index 6a32627..eef40db 100644
--- a/client/index.js
+++ b/client/index.js
@@ -8,6 +8,8 @@ import { Grid, Views, HexFactory } from 'honeycomb-grid'
const gridSize = browser.isMobile ? 25 : 50
const hexagon = polygon(6, gridSize)
+const hertz_el = document.querySelector('#hertz')
+
const grid = Grid({
size: gridSize,
})
@@ -17,13 +19,13 @@ const Hex = HexFactory({
template: function(hex) {
return `
<svg class='hex'>
- <polygon points="${hexagon.pointString}" />
+ <polygon points='${hexagon.pointString}' />
</svg>
`
}
})
-const container = document.querySelector("#container")
+const container = document.querySelector('#container')
const origin = {
x: container.offsetWidth / 2 - hexagon.width / 2,
y: container.offsetHeight / 2 - hexagon.height / 2,
@@ -34,7 +36,7 @@ const view = Views.DOM({
})
let last = null, dragging = false
-let hexes
+let hexes, els = [], order = []
requestAudioContext(init)
@@ -49,6 +51,9 @@ function init () {
document.addEventListener('mousemove', move)
document.addEventListener('mouseup', up)
}
+ document.querySelector('#frequency').addEventListener('click', sortByFrequency)
+ document.querySelector('#color').addEventListener('click', sortByColor)
+ document.querySelector('#brightness').addEventListener('click', sortByBrightness)
build(colundi.list)
keys.listen(function(index){
index += 20
@@ -56,8 +61,23 @@ function init () {
kalimba.play(freq)
})
}
+function sortByBrightness () {
+ els.sort((a,b) => a.lum>b.lum?-1:a.lum==b.lum?0:1).map(resort)
+}
+function sortByColor () {
+ els.sort((a,b) => a.hue<b.hue?-1:a.hue==b.hue?0:1).map(resort)
+}
+function sortByFrequency () {
+ els.sort((a,b) => a.freq<b.freq?-1:a.freq==b.freq?0:1).map(resort)
+}
+function resort (tuple,i) {
+ const position = order[i]
+ hexes[position.id] = tuple
+ tuple.el.style.top = position.top
+ tuple.el.style.left = position.left
+}
function build (list) {
- container.innerHTML = ""
+ container.innerHTML = ''
let perimeter = [ Hex(0, 0, 0) ]
hexes = {}
for (let i = 0, len = list.length; i < len;) {
@@ -70,7 +90,11 @@ function build (list) {
view.renderHexes([ hex ])
const el = container.lastChild
el.querySelector('polygon').setAttribute('fill', pair.color)
- hexes[id] = { el: el, freq: pair.freq }
+ const hsl = rgbStringToHSL(pair.color)
+ const tuple = { el: el, freq: pair.freq, hue: (hsl[0]+0.2) % 1, lum: hsl[2] }
+ hexes[id] = tuple
+ els.push(tuple)
+ order.push({ id: id, top: el.style.top, left: el.style.left })
i++
}
}
@@ -83,6 +107,7 @@ function down (e){
const pair = find(hex)
if (! pair) return
pair.el.style.opacity = 0.5
+ hertz_el.innerHTML = pair.freq
kalimba.play( pair.freq )
}
function move (e){
@@ -96,12 +121,14 @@ function move (e){
if (last) last.el.style.opacity = 1
if (! pair) return
pair.el.style.opacity = 0.5
+ hertz_el.innerHTML = pair.freq
kalimba.play( pair.freq )
last = pair
}
function up (e){
if (last) last.el.style.opacity = 1
last = null
+ hertz_el.innerHTML = ''
dragging = false
}
function find(hex){
@@ -133,12 +160,51 @@ function polygon(n, side){
}
return {
points: points,
- pointString: points.map(p => p.toFixed(3)).join(" "),
+ pointString: points.map(p => p.toFixed(3)).join(' '),
width: max_x - min_x,
height: max_y - min_y
}
}
function hexToString(hex) {
- return [hex.x, hex.y, hex.z].join("_")
+ return [hex.x, hex.y, hex.z].join('_')
+}
+function rgbStringToHSL(s) {
+ const RGB = s.replace('rgb(','').replace(')','').split(', ').map((a) => parseInt(a))
+ var R = RGB[0]
+ var G = RGB[1]
+ var B = RGB[2]
+ var var_R = ( R / 255 ) //RGB from 0 to 255
+ var var_G = ( G / 255 )
+ var var_B = ( B / 255 )
+
+ var var_Min = Math.min( var_R, var_G, var_B ) //Min. value of RGB
+ var var_Max = Math.max( var_R, var_G, var_B ) //Max. value of RGB
+ var del_Max = var_Max - var_Min //Delta RGB value
+
+ var H, S
+ var L = ( var_Max + var_Min ) / 2
+
+ if ( del_Max == 0 ) //This is a gray, no chroma...
+ {
+ H = 0 //HSL results from 0 to 1
+ S = 0
+ }
+ else //Chromatic data...
+ {
+ if ( L < 0.5 ) S = del_Max / ( var_Max + var_Min )
+ else S = del_Max / ( 2 - var_Max - var_Min )
+
+ var del_R = ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max
+ var del_G = ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max
+ var del_B = ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max
+
+ if ( var_R == var_Max ) H = del_B - del_G
+ else if ( var_G == var_Max ) H = ( 1 / 3 ) + del_R - del_B
+ else if ( var_B == var_Max ) H = ( 2 / 3 ) + del_G - del_R
+
+ if ( H < 0 ) H += 1
+ if ( H > 1 ) H -= 1
+ }
+ return [H,S,L]
}