summaryrefslogtreecommitdiff
path: root/parser.js
diff options
context:
space:
mode:
Diffstat (limited to 'parser.js')
-rw-r--r--parser.js79
1 files changed, 79 insertions, 0 deletions
diff --git a/parser.js b/parser.js
new file mode 100644
index 0000000..e7e8f15
--- /dev/null
+++ b/parser.js
@@ -0,0 +1,79 @@
+
+ var song;
+ var emu8910 = new PSG49(YM_CLOCK_ZX, 50);
+
+ Array.prototype.shuffle = function() {
+ var m = this.length, t, i;
+ while(m) {
+ i = Math.floor(Math.random() * m--);
+ t = this[m];
+ this[m] = this[i];
+ this[i] = t;
+ }
+ return this;
+ }
+
+ var songs = [
+ "01_scalesmannmisfire.fym"
+ ].shuffle();
+
+ var currentSong = 0;
+
+ loadAndPlay = function() {
+ emu8910.driver.device.resume()
+ var oReq = new XMLHttpRequest();
+ oReq.open('GET', 'music/' + songs[currentSong], true);
+ oReq.responseType = 'arraybuffer';
+ oReq.onload = function(e) {
+ if(oReq.response) play(oReq.response);
+ }
+ oReq.send();
+ }
+
+ updateState = function() {
+ var r = song.getNextFrame();
+
+ emu8910.register.A_FINE = r[0];
+ emu8910.register.A_COARSE = r[1];
+
+ emu8910.register.B_FINE = r[2];
+ emu8910.register.B_COARSE = r[3];
+
+ emu8910.register.C_FINE = r[4];
+ emu8910.register.C_COARSE = r[5];
+ emu8910.register.NOISE_PERIOD = r[6];
+
+ var mix_tone_A = (r[7] & 1) << 0;
+ var mix_tone_B = ((r[7] >> 1) & 1) << 1;
+ var mix_tone_C = ((r[7] >> 2) & 1) << 2;
+
+ var mix_noise_A = ((r[7] >> 3) & 1) << 3;
+ var mix_noise_B = ((r[7] >> 4) & 1) << 4;
+ var mix_noise_C = ((r[7] >> 5) & 1) << 5;
+
+ var MIXER = (mix_tone_A | mix_tone_B | mix_tone_C
+ | mix_noise_A | mix_noise_B | mix_noise_C);
+
+ emu8910.register.MIXER = MIXER;
+
+ emu8910.register.A_VOL = r[8];
+ emu8910.register.B_VOL = r[9];
+ emu8910.register.C_VOL = r[10];
+
+ emu8910.register.ENV_FINE = r[11];
+ emu8910.register.ENV_COURSE = r[12];
+
+ if (r[13] != 0xff) {
+ emu8910.register.ENV_SHAPE = r[13];
+ }
+ }
+
+ play = function(fym) {
+ song = new FYMReader(fym);
+ emu8910.interrupt.routine = updateState;
+ emu8910.clock.frequency = song.getClockRate()
+ emu8910.interrupt.frequency = song.getFrameRate()
+ }
+
+ document.addEventListener('click', loadAndPlay, false);
+ document.addEventListener('touchend', loadAndPlay, false);