summaryrefslogtreecommitdiff
path: root/client/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'client/index.js')
-rw-r--r--client/index.js111
1 files changed, 97 insertions, 14 deletions
diff --git a/client/index.js b/client/index.js
index e9a0873..58185a5 100644
--- a/client/index.js
+++ b/client/index.js
@@ -8,13 +8,12 @@ import {
midi_init,
play_note,
play_sequence,
- play_interval_sequence,
export_pattern_as_midi,
note_values,
MidiWriter,
} from './lib/midi'
import {
- requestAudioContext, ftom, norm, dataURItoBlob,
+ requestAudioContext, norm, dataURItoBlob,
get_bounds, get_diff_bounds,
transpose,
} from './lib/util'
@@ -36,7 +35,16 @@ midi_init()
/* initialization */
-let i = 0, datasets = {}, dataset = {}, bounds = {}, diff = []
+const mass_fields = [
+ "date", "timestamp",
+ "fatalities", "injured", "total_victims",
+ "age", "case", "weapon_type", "weapon_details"
+].reduce((a,b,i) => {
+ a[b] = i
+ return a
+}, {})
+
+let i = 0, mass_i = 0, datasets = {}, dataset = {}, bounds = {}, diff = []
let play_fn = play_sequence
data.load().then(lists => {
console.log(lists)
@@ -48,12 +56,93 @@ data.load().then(lists => {
name,
h: [name],
lines: [row.map(n => parseInt(n))],
+ play_fn: play_sequence,
}
})
+ datasets["Mass Shootings"] = lists.mass_shootings_lite
+ datasets["Mass Shootings"].name = "Mass Shootings"
+ datasets["Mass Shootings"].play_fn = play_mass_shootings
+ const lines = datasets["Mass Shootings"].lines.reverse()
+ const [min_y, ...rest] = lines[0][mass_fields.date].split('/')
+
+ datasets["Mass Shootings"].dates = lines.map(row => {
+ const [y, m, d] = row[mass_fields.date].split('/')
+ return (parseInt(y) - parseInt(min_y)) * 12 + parseInt(m)
+ })
+ datasets["Mass Shootings"].lines = [lines.map(row => Math.log(row[mass_fields.total_victims]))]
requestAudioContext(ready)
})
-//
+/* play function for mass shooting data w/ custom timing */
+
+let mass_rest = 0
+
+// export const note_values = [
+// [8, '8 measures', 8 * 512],
+// [4, '4 measures', 4 * 512],
+// [2, '2 measures', 2 * 512],
+// [1, 'whole note', 512],
+// [1/2, 'half note', 256],
+// [1/3, 'third note', [170, 170, 171]],
+// [1/4, 'quarter note', 128],
+// [1/5, 'fifth note', [51,51,51,51,52]],
+// [1/6, 'sixth note', [85, 85, 86, 85, 85, 86]],
+// [1/8, 'eighth note', 64],
+// [1/10, 'tenth note', [25,26,26,25,26,25,26,26,25,26]],
+// [1/12, 'twelfth note', [21,21,22, 21,21,22, 21,21,22, 21,21,22]],
+// [1/16, 'sixteenth note', 32],
+// [1/32, 'thirtysecond note', 16],
+// ]
+
+function play_mass_shootings(i, bounds, diff, note_time, channel="all", exporting) {
+ const { rows, min, max } = bounds
+ const y = 0
+ const x = i % rows[0].length
+ const n = rows[y][x]
+ let notes = [], midi_notes = []
+ console.log(i, mass_i, dataset.dates[mass_i])
+ while (i === dataset.dates[mass_i]) {
+ notes.push(dataset.lines[mass_i])
+ mass_i += 1
+ }
+ switch (notes.length) {
+ default:
+ case 0:
+ mass_rest += 1
+ break
+ case 1:
+ midi_notes.push(play_note( norm(n, min, max) * nx.multiply.value, 128, channel, exporting, mass_rest, 0))
+ break
+ case 2:
+ midi_notes.push(play_note( norm(n, min, max) * nx.multiply.value, 64, channel, exporting, mass_rest, 0))
+ midi_notes.push(play_note( norm(n, min, max) * nx.multiply.value, 64, channel, exporting, 0, 64))
+ break
+ case 3:
+ midi_notes.push(play_note( norm(n, min, max) * nx.multiply.value, 43, channel, exporting, mass_rest))
+ midi_notes.push(play_note( norm(n, min, max) * nx.multiply.value, 43, channel, exporting, 0, 43))
+ midi_notes.push(play_note( norm(n, min, max) * nx.multiply.value, 42, channel, exporting, 0, 85))
+ break
+ case 4:
+ midi_notes.push(play_note( norm(n, min, max) * nx.multiply.value, 32, channel, exporting, mass_rest))
+ midi_notes.push(play_note( norm(n, min, max) * nx.multiply.value, 32, channel, exporting, 0, 32))
+ midi_notes.push(play_note( norm(n, min, max) * nx.multiply.value, 32, channel, exporting, 0, 64))
+ midi_notes.push(play_note( norm(n, min, max) * nx.multiply.value, 32, channel, exporting, 0, 96))
+ break
+ }
+ if (mass_i > dataset.dates.length-1) {
+ mass_rest = 0
+ mass_i = 0
+ i = 0
+ } else {
+ i += 1
+ }
+ if (notes.length) {
+ mass_rest = 0
+ return [i, midi_notes]
+ }
+ mass_rest += 128
+ return [i, []]
+}
/* play next note according to sonification */
@@ -74,16 +163,12 @@ function play_next(){
function pick_dataset(key){
console.log('pick dataset:', key, datasets[key])
i = 0
+ mass_i = 0
+ mass_rest = 0
dataset = datasets[key]
bounds = get_bounds(dataset)
diff = get_diff_bounds(bounds.rows)
-}
-var behaviors = {
- sequence: { name: 'Sequence', fn: play_sequence },
- interval: { name: 'Intervals', fn: play_interval_sequence },
-}
-function pick_behavior(name){
- play_fn = behaviors[name].fn
+ play_fn = dataset.play_fn
}
/* build and bind the UI */
@@ -91,9 +176,7 @@ function pick_behavior(name){
function ready() {
scales.build_options(document.querySelector('#scale'))
build_options(document.querySelector('#dataset'), datasets, pick_dataset)
- build_options(document.querySelector('#behavior'), behaviors, pick_behavior)
- console.log(Nexus)
const dial_size = [50, 50]
Tone.Transport.bpm.value = DEFAULT_BPM
@@ -184,7 +267,7 @@ function ready() {
document.querySelector('.loading').classList.remove('loading')
document.querySelector('#dataset').value = 'Surrenders'
- pick_dataset('Surrenders')
+ pick_dataset('Mass Shootings')
play_next()
}