diff options
Diffstat (limited to 'client')
| -rw-r--r-- | client/data.js | 1 | ||||
| -rw-r--r-- | client/index.js | 18 | ||||
| -rw-r--r-- | client/lib/midi.js | 29 |
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') } |
