summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
Diffstat (limited to 'client')
-rw-r--r--client/data.js1
-rw-r--r--client/index.js18
-rw-r--r--client/lib/midi.js29
3 files changed, 34 insertions, 14 deletions
diff --git a/client/data.js b/client/data.js
index d2c19c6..b608483 100644
--- a/client/data.js
+++ b/client/data.js
@@ -2,6 +2,7 @@ const files = [
// "gun_violence",
"mass_shootings_from_columbine",
"gun_violence_by_month",
+ "firearms_manufactured",
]
const parse = require('csv-parse')
diff --git a/client/index.js b/client/index.js
index 81cb34c..00729e4 100644
--- a/client/index.js
+++ b/client/index.js
@@ -51,6 +51,13 @@ let datasets = {}, dataset = {}, bounds = {}, diff = []
let play_fn = play_sequence
data.load().then(lists => {
console.log(lists)
+ const fm = lists.firearms_manufactured
+ datasets['Firearms Manufactured'] = {}
+ datasets['Firearms Manufactured'].name = 'Firearms Manufactured'
+ datasets['Firearms Manufactured'].play_fn = play_sequence
+ datasets['Firearms Manufactured'].h = fm.h.slice(1, 5)
+ datasets['Firearms Manufactured'].labels = fm.lines.map(l => l.slice(0, 1))
+ datasets['Firearms Manufactured'].lines = fm.lines.map(l => l.slice(1, 5))
transpose(lists.gun_violence_by_month.lines).forEach((row, i) => {
const name = lists.gun_violence_by_month.h[i]
if (name === 'Date') return
@@ -64,6 +71,7 @@ data.load().then(lists => {
})
datasets["Mass Shootings"] = lists.mass_shootings_from_columbine
datasets["Mass Shootings"].name = "Mass Shootings"
+ datasets["Mass Shootings"].pedal = true
datasets["Mass Shootings"].play_fn = play_mass_shootings
const lines = datasets["Mass Shootings"].lines.reverse()
const [min_y, ...rest_a] = lines[0][mass_fields.date].split('/')
@@ -73,7 +81,7 @@ data.load().then(lists => {
const [y, m, d] = row[mass_fields.date].split('/')
return (parseInt(y) - parseInt(min_y)) * 12 + parseInt(m)
})
- max_i = (parseInt(max_y) - parseInt(min_y)) * 12 + parseInt(12)
+ datasets["Mass Shootings"].max_i = (parseInt(max_y) - parseInt(min_y)) * 12 + parseInt(12)
// console.log('max i', max_i)
datasets["Mass Shootings"].data = lines
datasets["Mass Shootings"].lines = [lines.map(row => row[mass_fields.total_victims])]
@@ -186,6 +194,11 @@ function play_next(){
clearTimeout(playTimeout)
playTimeout = setTimeout(play_next, note_time)
let [new_i, notes, timings] = play_fn(i, bounds, diff, note_time)
+ if (dataset.labels) {
+ const j = Math.floor(i / bounds.rows[0].length)
+ document.querySelector('#cases').innerHTML = dataset.labels[j]
+ }
+
i = new_i
if (recording) {
let timing = note_values[nx.timing.active][2]
@@ -214,6 +227,7 @@ function pick_dataset(key){
bounds = get_bounds(dataset)
diff = get_diff_bounds(bounds.rows)
play_fn = dataset.play_fn
+ max_i = dataset.max_i || (bounds.rows.length * bounds.rows[0].length)
}
/* build and bind the UI */
@@ -307,7 +321,7 @@ function ready() {
const export_midi_button = document.querySelector('#export_midi')
export_midi_button.addEventListener('click', () => {
- export_pattern_as_midi(dataset.name, bounds, diff, nx.tempo.value, nx.timing.active, play_fn, max_i)
+ export_pattern_as_midi(dataset, bounds, diff, nx.tempo.value, nx.timing.active, play_fn, max_i)
})
const record_midi_button = document.querySelector('#record_midi')
diff --git a/client/lib/midi.js b/client/lib/midi.js
index b22f2fe..1625368 100644
--- a/client/lib/midi.js
+++ b/client/lib/midi.js
@@ -116,8 +116,9 @@ export function play_sequence(i, bounds, diff, note_time, channel="all", exporti
i += 1
if (i >= count) i = 0
const midi_note = play_note( norm(n, min, max) * nx.multiply.value, note_time, channel, exporting)
- return [i, [midi_note]]
+ return [i, [midi_note], [128]]
}
+// [next_i, notes, timings, pedal_note]
/* play the next row as an interval */
@@ -142,7 +143,7 @@ export function play_interval_sequence(i, bounds, diff, note_time, channel="all"
/* generate a 1-track midi file by calling the play function repeatedly */
-export function export_pattern_as_midi(datasetName, bounds, diff, tempo, timingIndex, play_fn, max_i) {
+export function export_pattern_as_midi(dataset, bounds, diff, tempo, timingIndex, play_fn, max_i) {
// const behavior = document.querySelector('#behavior').value
const { rows } = bounds
// let count = behavior === 'sequence' ? rows[0].length * rows.length : rows.length
@@ -150,12 +151,14 @@ export function export_pattern_as_midi(datasetName, bounds, diff, tempo, timingI
let notes, timings
let note_time
// let timing = note_values[timingIndex][2]
- let pedal_note, next_i
+ let pedal_note, pedal_track, next_i
let wait = 0
let midi_track = new MidiWriter.Track()
midi_track.setTempo(tempo)
- let pedal_track = new MidiWriter.Track()
- pedal_track.setTempo(tempo)
+ if (dataset.pedal) {
+ pedal_track = new MidiWriter.Track()
+ pedal_track.setTempo(tempo)
+ }
for (let i = 0, len = max_i; i < len; i++) {
[next_i, notes, timings, pedal_note] = play_fn(i, bounds, diff, note_time, "all", true)
// if (timing.length) {
@@ -179,14 +182,16 @@ export function export_pattern_as_midi(datasetName, bounds, diff, tempo, timingI
midi_track.addEvent(new MidiWriter.NoteEvent(e))
wait = 0
}
- pedal_track.addEvent(new MidiWriter.NoteEvent({
- pitch: pedal_note,
- duration: 't128',
- velocity: 25,
- }))
+ if (dataset.pedal) {
+ pedal_track.addEvent(new MidiWriter.NoteEvent({
+ pitch: pedal_note,
+ duration: 't128',
+ velocity: 25,
+ }))
+ }
}
- let tracks = [midi_track, pedal_track]
+ let tracks = dataset.pedal ? [midi_track, pedal_track] : [midi_track]
const writer = new MidiWriter.Writer(tracks)
const blob = dataURItoBlob(writer.dataUri())
- saveAs(blob, 'Recording - ' + datasetName + '.mid')
+ saveAs(blob, 'Recording - ' + dataset.name + '.mid')
}