in charts/shared/sonic.js [482:608]
setupSonicData(data, keys = [], exclude = []) {
console.log("Setting up data and synth")
let self = this
self.note = getDuration(data.length)
const xFormat = this.settings.xFormat
if (self.settings.audioRendering) {
self.audioRendering = self.settings.audioRendering
}
// console.log("audioRendering", self.audioRendering)
if (self.audioRendering == "continuous") {
self.loadSynth('DefaultLine')
}
else {
self.loadSynth('Kalimba')
}
// console.log("note", self.note)
// console.log("data", self.data)
// set up the data structure we need, and the keys of data to be sonified
let synth = self.synth
let click = self.click
var hasRun = self.hasRun
let dataKeys = Object.keys(data[0])
self.xVar = dataKeys[0]
if (xFormat.date) {
self.timeSettings = analyseTime(data, self.settings)
}
self.interval = getInterval(self.settings, self.xVar, self.timeSettings)
// console.log("time settings", self.timeSettings)
// console.log("interval", self.interval)
let allDataValues = []
let hideNullValues = false
// Check if chart code set specific keys, otherwise just use the keys from the data
if (keys.length === 0) {
keys = dataKeys.slice(1)
}
// make keys available to other methods
self.dataKeys = keys
self.currentKey = keys[0]
// To store the highest and lowest data objects
// console.log("data", data)
let xVar = self.xVar
self.lowestVal = {"key":keys[0], "value":data[0][keys[0]], [xVar]:data[0][self.xVar]}
self.highestVal = {"key":keys[0], "value":data[0][keys[0]], [xVar]:data[0][self.xVar]}
// Format the data as needed, add to the sonicData dict
keys.forEach(function(key) {
self.sonicData[key] = []
data.forEach((d, i) => {
if (d[key] != null) {
let newData = {}
newData[self.xVar] = d[self.xVar]
newData[key] = d[key]
newData.sonic_index = i
self.sonicData[key].push(newData)
allDataValues.push(d[key])
if (newData[key] > self.highestVal.value) {
self.highestVal['key'] = key
self.highestVal['value'] = d[key]
self.highestVal[xVar] = d[self.xVar]
}
if (newData[key] < self.lowestVal.value) {
self.lowestVal['key'] = key
self.lowestVal['value'] = d[key]
self.lowestVal[xVar] = d[self.xVar]
}
} else if (!hideNullValues) {
let newData = {}
newData[self.xVar] = d[self.xVar]
newData[key] = d[key]
newData.sonic_index = i
self.sonicData[key].push(newData)
}
})
})
// Setting the scale range for linear scale
// console.log("allDataValues", allDataValues)
// console.log("sonicData", self.sonicData)
// console.log("highestVal", self.highestVal)
// console.log("lowestVal", self.lowestVal)
let range = [130.81,523.25]
self.domainY = d3.extent(allDataValues)
self.domainX = d3.extent(data, d => d[self.xVar])
// Invert if needed
// ranked charts use inverted scale, eg bird of the year
// https://interactive.guim.co.uk/embed/superyacht-testing/index.html?key=1WVTOMn-2BPVPUahzMzCM4H1inPM6oCT8w17GE5giDe8&location=docsdata
if ("invertY" in this.settings) {
if (this.settings.invertY) {
range = range.reverse()
}
}
// console.log("range", range, "domain", self.domainY)
self.scale = d3.scaleLinear()
.domain(self.domainY)
.range(range)
self.synthLoaded = true
}