From 6c4da7fac6ea909adac1be00e238d213e84c0ec6 Mon Sep 17 00:00:00 2001 From: Brian Picciano Date: Sun, 26 Apr 2020 18:15:15 -0600 Subject: [PATCH] add trading in the rain post --- _posts/2020-04-26-trading-in-the-rain.md | 55 +++ assets/trading-in-the-rain/CW.js | 43 ++ assets/trading-in-the-rain/Distributor.js | 42 ++ .../trading-in-the-rain/MIDI.js/LICENSE.txt | 21 + .../MIDI.js/inc/shim/Base64.js | 61 +++ .../MIDI.js/inc/shim/Base64binary.js | 81 ++++ .../MIDI.js/inc/shim/WebAudioAPI.js | 111 +++++ .../MIDI.js/inc/shim/WebMIDIAPI.js | 421 ++++++++++++++++++ .../MIDI.js/js/midi/audioDetect.js | 101 +++++ .../trading-in-the-rain/MIDI.js/js/midi/gm.js | 161 +++++++ .../MIDI.js/js/midi/loader.js | 199 +++++++++ .../MIDI.js/js/midi/player.js | 380 ++++++++++++++++ .../MIDI.js/js/midi/plugin.audiotag.js | 150 +++++++ .../MIDI.js/js/midi/plugin.webaudio.js | 326 ++++++++++++++ .../MIDI.js/js/midi/plugin.webmidi.js | 93 ++++ .../MIDI.js/js/midi/synesthesia.js | 320 +++++++++++++ .../MIDI.js/js/util/dom_request_script.js | 225 ++++++++++ .../MIDI.js/js/util/dom_request_xhr.js | 146 ++++++ assets/trading-in-the-rain/MusicBox.js | 70 +++ assets/trading-in-the-rain/RainCanvas.js | 74 +++ assets/trading-in-the-rain/SeriesComposer.js | 51 +++ assets/trading-in-the-rain/key.gpg | Bin 0 -> 669 bytes assets/trading-in-the-rain/main.js | 144 ++++++ .../soundfont/acoustic_grand_piano-mp3.js | 93 ++++ .../soundfont/acoustic_grand_piano-mp3/A0.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/A1.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/A2.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/A3.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/A4.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/A5.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/A6.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/A7.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Ab1.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Ab2.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Ab3.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Ab4.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Ab5.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Ab6.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Ab7.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/B0.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/B1.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/B2.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/B3.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/B4.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/B5.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/B6.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/B7.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Bb0.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Bb1.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Bb2.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Bb3.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Bb4.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Bb5.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Bb6.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Bb7.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/C1.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/C2.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/C3.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/C4.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/C5.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/C6.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/C7.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/C8.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/D1.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/D2.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/D3.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/D4.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/D5.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/D6.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/D7.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Db1.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Db2.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Db3.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Db4.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Db5.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Db6.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Db7.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Db8.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/E1.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/E2.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/E3.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/E4.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/E5.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/E6.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/E7.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Eb1.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Eb2.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Eb3.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Eb4.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Eb5.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Eb6.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Eb7.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/F1.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/F2.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/F3.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/F4.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/F5.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/F6.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/F7.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/G1.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/G2.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/G3.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/G4.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/G5.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/G6.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-mp3/G7.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Gb1.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Gb2.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Gb3.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Gb4.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Gb5.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Gb6.mp3 | Bin 0 -> 12065 bytes .../acoustic_grand_piano-mp3/Gb7.mp3 | Bin 0 -> 12065 bytes .../soundfont/acoustic_grand_piano-ogg.js | 93 ++++ 114 files changed, 3461 insertions(+) create mode 100644 _posts/2020-04-26-trading-in-the-rain.md create mode 100644 assets/trading-in-the-rain/CW.js create mode 100644 assets/trading-in-the-rain/Distributor.js create mode 100644 assets/trading-in-the-rain/MIDI.js/LICENSE.txt create mode 100644 assets/trading-in-the-rain/MIDI.js/inc/shim/Base64.js create mode 100644 assets/trading-in-the-rain/MIDI.js/inc/shim/Base64binary.js create mode 100644 assets/trading-in-the-rain/MIDI.js/inc/shim/WebAudioAPI.js create mode 100644 assets/trading-in-the-rain/MIDI.js/inc/shim/WebMIDIAPI.js create mode 100644 assets/trading-in-the-rain/MIDI.js/js/midi/audioDetect.js create mode 100644 assets/trading-in-the-rain/MIDI.js/js/midi/gm.js create mode 100644 assets/trading-in-the-rain/MIDI.js/js/midi/loader.js create mode 100644 assets/trading-in-the-rain/MIDI.js/js/midi/player.js create mode 100644 assets/trading-in-the-rain/MIDI.js/js/midi/plugin.audiotag.js create mode 100644 assets/trading-in-the-rain/MIDI.js/js/midi/plugin.webaudio.js create mode 100644 assets/trading-in-the-rain/MIDI.js/js/midi/plugin.webmidi.js create mode 100644 assets/trading-in-the-rain/MIDI.js/js/midi/synesthesia.js create mode 100644 assets/trading-in-the-rain/MIDI.js/js/util/dom_request_script.js create mode 100644 assets/trading-in-the-rain/MIDI.js/js/util/dom_request_xhr.js create mode 100644 assets/trading-in-the-rain/MusicBox.js create mode 100644 assets/trading-in-the-rain/RainCanvas.js create mode 100644 assets/trading-in-the-rain/SeriesComposer.js create mode 100644 assets/trading-in-the-rain/key.gpg create mode 100644 assets/trading-in-the-rain/main.js create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3.js create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/A0.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/A1.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/A2.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/A3.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/A4.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/A5.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/A6.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/A7.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Ab1.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Ab2.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Ab3.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Ab4.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Ab5.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Ab6.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Ab7.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/B0.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/B1.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/B2.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/B3.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/B4.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/B5.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/B6.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/B7.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Bb0.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Bb1.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Bb2.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Bb3.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Bb4.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Bb5.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Bb6.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Bb7.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/C1.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/C2.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/C3.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/C4.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/C5.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/C6.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/C7.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/C8.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/D1.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/D2.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/D3.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/D4.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/D5.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/D6.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/D7.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Db1.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Db2.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Db3.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Db4.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Db5.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Db6.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Db7.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Db8.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/E1.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/E2.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/E3.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/E4.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/E5.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/E6.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/E7.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Eb1.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Eb2.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Eb3.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Eb4.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Eb5.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Eb6.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Eb7.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/F1.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/F2.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/F3.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/F4.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/F5.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/F6.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/F7.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/G1.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/G2.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/G3.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/G4.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/G5.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/G6.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/G7.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Gb1.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Gb2.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Gb3.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Gb4.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Gb5.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Gb6.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-mp3/Gb7.mp3 create mode 100644 assets/trading-in-the-rain/soundfont/acoustic_grand_piano-ogg.js diff --git a/_posts/2020-04-26-trading-in-the-rain.md b/_posts/2020-04-26-trading-in-the-rain.md new file mode 100644 index 0000000..3a31a95 --- /dev/null +++ b/_posts/2020-04-26-trading-in-the-rain.md @@ -0,0 +1,55 @@ +--- +title: >- + Trading in the Rain +description: >- + All those... gains... will be lost like... tears... +--- + + + + + + + + + + + + + + + + + + + + + + + + + + +
+For each pair listed below, live trade data will be pulled down from the +Cryptowat.ch Websocket +API and used to generate musical rain drops. The price of each trade +determines both the musical note and position of the rain drop on the screen, +while the volume of each trade determines how long the note is held and how big +the rain drop is. + +

Pairs to be generated, by color:

+ + +

+ + +
+ + + diff --git a/assets/trading-in-the-rain/CW.js b/assets/trading-in-the-rain/CW.js new file mode 100644 index 0000000..043c1a8 --- /dev/null +++ b/assets/trading-in-the-rain/CW.js @@ -0,0 +1,43 @@ +function CW(resource) { + this.conn = new WebSocket('wss://stream.cryptowat.ch/connect?apikey=GPDLXH702E1NAD96OSBO'); + this.conn.binaryType = "arraybuffer"; + + this.conn.onopen = () => { + console.log("CW websocket connected"); + if (this.onconnect) this.onconnect(); + } + + let decoder = new TextDecoder(); + this.conn.onmessage = (msg) => { + let d = JSON.parse(decoder.decode(msg.data)); + + // The server will always send an AUTHENTICATED signal when you establish a valid connection + // At this point you can subscribe to resources + if (d.authenticationResult && d.authenticationResult.status === 'AUTHENTICATED') { + if (this.onauth) this.onauth(); + this.conn.send(JSON.stringify({ + subscribe: { + subscriptions: [ + {streamSubscription: {resource: resource}}, + ], + } + })); + return; + } + + // Market data comes in a marketUpdate + // In this case, we're expecting trades so we look for marketUpdate.tradesUpdate + if (!d.marketUpdate || !d.marketUpdate.tradesUpdate) { + return; + } + + let trades = d.marketUpdate.tradesUpdate.trades; + for (let i in trades) { + trades[i].price = parseFloat(trades[i].priceStr); + trades[i].volume = parseFloat(trades[i].amountStr); + } + if (this.ontrades) this.ontrades(trades); + } + + this.close = () => this.conn.close(); +} diff --git a/assets/trading-in-the-rain/Distributor.js b/assets/trading-in-the-rain/Distributor.js new file mode 100644 index 0000000..fa6e9f2 --- /dev/null +++ b/assets/trading-in-the-rain/Distributor.js @@ -0,0 +1,42 @@ +function distribute(val, minOld, maxOld, minNew, maxNew) { + let scalar = (val - minOld) / (maxOld - minOld); + return minNew + ((maxNew - minNew) * scalar); +} + +function Distributor(capacity) { + this.cap = capacity; + + this.reset = () => { + this.arr = []; + this.arrSorted = []; + this.length = 0; + }; + this.reset(); + + // add adds the given value into the series, shifting off the oldest value if + // the series is at capacity. + this.add = (val) => { + this.arr.push(val); + if (this.arr.length >= this.cap) this.arr.shift(); + this.arrSorted = this.arr.slice(); // copy array + this.arrSorted.sort(); + this.length = this.arr.length; + }; + + // distribute finds where the given value falls within the series, and then + // scales that into the given range (inclusive). + this.distribute = (val, min, max) => { + if (this.length == 0) throw "cannot locate within empty Distributor"; + + let idx = this.length; + for (i in this.arrSorted) { + if (val < this.arrSorted[i]) { + idx = i; + break; + } + } + + return distribute(idx, 0, this.length, min, max); + }; +} + diff --git a/assets/trading-in-the-rain/MIDI.js/LICENSE.txt b/assets/trading-in-the-rain/MIDI.js/LICENSE.txt new file mode 100644 index 0000000..0dca6fb --- /dev/null +++ b/assets/trading-in-the-rain/MIDI.js/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2010-2013 MIDI.js Authors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/assets/trading-in-the-rain/MIDI.js/inc/shim/Base64.js b/assets/trading-in-the-rain/MIDI.js/inc/shim/Base64.js new file mode 100644 index 0000000..b5a59ce --- /dev/null +++ b/assets/trading-in-the-rain/MIDI.js/inc/shim/Base64.js @@ -0,0 +1,61 @@ +//https://github.com/davidchambers/Base64.js + +;(function () { + var object = typeof exports != 'undefined' ? exports : this; // #8: web workers + var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + + function InvalidCharacterError(message) { + this.message = message; + } + InvalidCharacterError.prototype = new Error; + InvalidCharacterError.prototype.name = 'InvalidCharacterError'; + + // encoder + // [https://gist.github.com/999166] by [https://github.com/nignag] + object.btoa || ( + object.btoa = function (input) { + for ( + // initialize result and counter + var block, charCode, idx = 0, map = chars, output = ''; + // if the next input index does not exist: + // change the mapping table to "=" + // check if d has no fractional digits + input.charAt(idx | 0) || (map = '=', idx % 1); + // "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8 + output += map.charAt(63 & block >> 8 - idx % 1 * 8) + ) { + charCode = input.charCodeAt(idx += 3/4); + if (charCode > 0xFF) { + throw new InvalidCharacterError("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range."); + } + block = block << 8 | charCode; + } + return output; + }); + + // decoder + // [https://gist.github.com/1020396] by [https://github.com/atk] + object.atob || ( + object.atob = function (input) { + input = input.replace(/=+$/, '') + if (input.length % 4 == 1) { + throw new InvalidCharacterError("'atob' failed: The string to be decoded is not correctly encoded."); + } + for ( + // initialize result and counters + var bc = 0, bs, buffer, idx = 0, output = ''; + // get next character + buffer = input.charAt(idx++); + // character found in table? initialize bit storage and add its ascii value; + ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, + // and if not first of each 4 characters, + // convert the first 8 bits to one ascii character + bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0 + ) { + // try to find character in table (0-63, not found => -1) + buffer = chars.indexOf(buffer); + } + return output; + }); + +}()); \ No newline at end of file diff --git a/assets/trading-in-the-rain/MIDI.js/inc/shim/Base64binary.js b/assets/trading-in-the-rain/MIDI.js/inc/shim/Base64binary.js new file mode 100644 index 0000000..2c59f8f --- /dev/null +++ b/assets/trading-in-the-rain/MIDI.js/inc/shim/Base64binary.js @@ -0,0 +1,81 @@ +/** + * @license ------------------------------------------------------------------- + * module: Base64Binary + * src: http://blog.danguer.com/2011/10/24/base64-binary-decoding-in-javascript/ + * license: Simplified BSD License + * ------------------------------------------------------------------- + * Copyright 2011, Daniel Guerrero. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL DANIEL GUERRERO BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +var Base64Binary = { + _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", + + /* will return a Uint8Array type */ + decodeArrayBuffer: function(input) { + var bytes = Math.ceil( (3*input.length) / 4.0); + var ab = new ArrayBuffer(bytes); + this.decode(input, ab); + + return ab; + }, + + decode: function(input, arrayBuffer) { + //get last chars to see if are valid + var lkey1 = this._keyStr.indexOf(input.charAt(input.length-1)); + var lkey2 = this._keyStr.indexOf(input.charAt(input.length-1)); + + var bytes = Math.ceil( (3*input.length) / 4.0); + if (lkey1 == 64) bytes--; //padding chars, so skip + if (lkey2 == 64) bytes--; //padding chars, so skip + + var uarray; + var chr1, chr2, chr3; + var enc1, enc2, enc3, enc4; + var i = 0; + var j = 0; + + if (arrayBuffer) + uarray = new Uint8Array(arrayBuffer); + else + uarray = new Uint8Array(bytes); + + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); + + for (i=0; i> 4); + chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); + chr3 = ((enc3 & 3) << 6) | enc4; + + uarray[i] = chr1; + if (enc3 != 64) uarray[i+1] = chr2; + if (enc4 != 64) uarray[i+2] = chr3; + } + + return uarray; + } +}; \ No newline at end of file diff --git a/assets/trading-in-the-rain/MIDI.js/inc/shim/WebAudioAPI.js b/assets/trading-in-the-rain/MIDI.js/inc/shim/WebAudioAPI.js new file mode 100644 index 0000000..17e9eb9 --- /dev/null +++ b/assets/trading-in-the-rain/MIDI.js/inc/shim/WebAudioAPI.js @@ -0,0 +1,111 @@ +/** + * @license ------------------------------------------------------------------- + * module: WebAudioShim - Fix naming issues for WebAudioAPI supports + * src: https://github.com/Dinahmoe/webaudioshim + * author: Dinahmoe AB + * ------------------------------------------------------------------- + * Copyright (c) 2012 DinahMoe AB + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +window.AudioContext = window.AudioContext || window.webkitAudioContext || null; +window.OfflineAudioContext = window.OfflineAudioContext || window.webkitOfflineAudioContext || null; + +(function (Context) { + var isFunction = function (f) { + return Object.prototype.toString.call(f) === "[object Function]" || + Object.prototype.toString.call(f) === "[object AudioContextConstructor]"; + }; + var contextMethods = [ + ["createGainNode", "createGain"], + ["createDelayNode", "createDelay"], + ["createJavaScriptNode", "createScriptProcessor"] + ]; + /// + var proto; + var instance; + var sourceProto; + /// + if (!isFunction(Context)) { + return; + } + instance = new Context(); + if (!instance.destination || !instance.sampleRate) { + return; + } + proto = Context.prototype; + sourceProto = Object.getPrototypeOf(instance.createBufferSource()); + + if (!isFunction(sourceProto.start)) { + if (isFunction(sourceProto.noteOn)) { + sourceProto.start = function (when, offset, duration) { + switch (arguments.length) { + case 0: + throw new Error("Not enough arguments."); + case 1: + this.noteOn(when); + break; + case 2: + if (this.buffer) { + this.noteGrainOn(when, offset, this.buffer.duration - offset); + } else { + throw new Error("Missing AudioBuffer"); + } + break; + case 3: + this.noteGrainOn(when, offset, duration); + } + }; + } + } + + if (!isFunction(sourceProto.noteOn)) { + sourceProto.noteOn = sourceProto.start; + } + + if (!isFunction(sourceProto.noteGrainOn)) { + sourceProto.noteGrainOn = sourceProto.start; + } + + if (!isFunction(sourceProto.stop)) { + sourceProto.stop = sourceProto.noteOff; + } + + if (!isFunction(sourceProto.noteOff)) { + sourceProto.noteOff = sourceProto.stop; + } + + contextMethods.forEach(function (names) { + var name1; + var name2; + while (names.length) { + name1 = names.pop(); + if (isFunction(this[name1])) { + this[names.pop()] = this[name1]; + } else { + name2 = names.pop(); + this[name1] = this[name2]; + } + } + }, proto); +})(window.AudioContext); \ No newline at end of file diff --git a/assets/trading-in-the-rain/MIDI.js/inc/shim/WebMIDIAPI.js b/assets/trading-in-the-rain/MIDI.js/inc/shim/WebMIDIAPI.js new file mode 100644 index 0000000..000a916 --- /dev/null +++ b/assets/trading-in-the-rain/MIDI.js/inc/shim/WebMIDIAPI.js @@ -0,0 +1,421 @@ +/* Copyright 2013 Chris Wilson + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +// Initialize the MIDI library. +(function (global) { + 'use strict'; + var midiIO, _requestMIDIAccess, MIDIAccess, _onReady, MIDIPort, MIDIInput, MIDIOutput, _midiProc; + + function Promise() { + + } + + Promise.prototype.then = function(accept, reject) { + this.accept = accept; + this.reject = reject; + } + + Promise.prototype.succeed = function(access) { + if (this.accept) + this.accept(access); + } + + Promise.prototype.fail = function(error) { + if (this.reject) + this.reject(error); + } + + function _JazzInstance() { + this.inputInUse = false; + this.outputInUse = false; + + // load the Jazz plugin + var o1 = document.createElement("object"); + o1.id = "_Jazz" + Math.random() + "ie"; + o1.classid = "CLSID:1ACE1618-1C7D-4561-AEE1-34842AA85E90"; + + this.activeX = o1; + + var o2 = document.createElement("object"); + o2.id = "_Jazz" + Math.random(); + o2.type="audio/x-jazz"; + o1.appendChild(o2); + + this.objRef = o2; + + var e = document.createElement("p"); + e.appendChild(document.createTextNode("This page requires the ")); + + var a = document.createElement("a"); + a.appendChild(document.createTextNode("Jazz plugin")); + a.href = "http://jazz-soft.net/"; + + e.appendChild(a); + e.appendChild(document.createTextNode(".")); + o2.appendChild(e); + + var insertionPoint = document.getElementById("MIDIPlugin"); + if (!insertionPoint) { + // Create hidden element + var insertionPoint = document.createElement("div"); + insertionPoint.id = "MIDIPlugin"; + insertionPoint.style.position = "absolute"; + insertionPoint.style.visibility = "hidden"; + insertionPoint.style.left = "-9999px"; + insertionPoint.style.top = "-9999px"; + document.body.appendChild(insertionPoint); + } + insertionPoint.appendChild(o1); + + if (this.objRef.isJazz) + this._Jazz = this.objRef; + else if (this.activeX.isJazz) + this._Jazz = this.activeX; + else + this._Jazz = null; + if (this._Jazz) { + this._Jazz._jazzTimeZero = this._Jazz.Time(); + this._Jazz._perfTimeZero = window.performance.now(); + } + } + + _requestMIDIAccess = function _requestMIDIAccess() { + var access = new MIDIAccess(); + return access._promise; + }; + + // API Methods + + MIDIAccess = function() { + this._jazzInstances = new Array(); + this._jazzInstances.push( new _JazzInstance() ); + this._promise = new Promise; + + if (this._jazzInstances[0]._Jazz) { + this._Jazz = this._jazzInstances[0]._Jazz; + window.setTimeout( _onReady.bind(this), 3 ); + } else { + window.setTimeout( _onNotReady.bind(this), 3 ); + } + }; + + _onReady = function _onReady() { + if (this._promise) + this._promise.succeed(this); + }; + + function _onNotReady() { + if (this._promise) + this._promise.fail( { code: 1 } ); + }; + + MIDIAccess.prototype.inputs = function( ) { + if (!this._Jazz) + return null; + var list=this._Jazz.MidiInList(); + var inputs = new Array( list.length ); + + for ( var i=0; i1)) { + var sendObj = new Object(); + sendObj.jazz = this._jazzInstance; + sendObj.data = data; + + window.setTimeout( _sendLater.bind(sendObj), delayBeforeSend ); + } else { + this._jazzInstance.MidiOutLong( data ); + } + return true; + }; + + //init: create plugin + if (!window.navigator.requestMIDIAccess) + window.navigator.requestMIDIAccess = _requestMIDIAccess; + +}(window)); + +// Polyfill window.performance.now() if necessary. +(function (exports) { + var perf = {}, props; + + function findAlt() { + var prefix = ['moz', 'webkit', 'o', 'ms'], + i = prefix.length, + //worst case, we use Date.now() + props = { + value: (function (start) { + return function () { + return Date.now() - start; + }; + }(Date.now())) + }; + + //seach for vendor prefixed version + for (; i >= 0; i--) { + if ((prefix[i] + "Now") in exports.performance) { + props.value = function (method) { + return function () { + exports.performance[method](); + } + }(prefix[i] + "Now"); + return props; + } + } + + //otherwise, try to use connectionStart + if ("timing" in exports.performance && "connectStart" in exports.performance.timing) { + //this pretty much approximates performance.now() to the millisecond + props.value = (function (start) { + return function() { + Date.now() - start; + }; + }(exports.performance.timing.connectStart)); + } + return props; + } + + //if already defined, bail + if (("performance" in exports) && ("now" in exports.performance)) + return; + if (!("performance" in exports)) + Object.defineProperty(exports, "performance", { + get: function () { + return perf; + }}); + //otherwise, performance is there, but not "now()" + + props = findAlt(); + Object.defineProperty(exports.performance, "now", props); +}(window)); diff --git a/assets/trading-in-the-rain/MIDI.js/js/midi/audioDetect.js b/assets/trading-in-the-rain/MIDI.js/js/midi/audioDetect.js new file mode 100644 index 0000000..957605d --- /dev/null +++ b/assets/trading-in-the-rain/MIDI.js/js/midi/audioDetect.js @@ -0,0 +1,101 @@ +/* + ---------------------------------------------------------- + MIDI.audioDetect : 0.3.2 : 2015-03-26 + ---------------------------------------------------------- + https://github.com/mudcube/MIDI.js + ---------------------------------------------------------- + Probably, Maybe, No... Absolutely! + Test to see what types of