diff --git a/index.html b/index.html index ad8ed09..0827785 100644 --- a/index.html +++ b/index.html @@ -72,7 +72,7 @@ code: github.com/a1k0n/jsxm todo: - missing XM effects: - - E3x, E4x, E5x, E6x, E7x, E9x, EDx, EEx + - E3x, E4x, E6x, E7x, E9x, EDx, EEx - 7xy - tremolo - Kxx, Lxx, Pxy, Txy - render pattern with the wider fonts for fewer channels diff --git a/test/all.js b/test/all.js index aed5085..e84bc0c 100644 --- a/test/all.js +++ b/test/all.js @@ -17,7 +17,7 @@ exports['test XM startup'] = function(assert) { assert.equal(XMPlayer.cur_songpos, 0, 'advance to initial song position'); assert.equal(XMPlayer.cur_pat, 0, 'advance to pattern 0'); assert.equal(XMPlayer.cur_tick, 0, 'advance to tick 0'); - assert.equal(XMPlayer.cur_row, 1, 'advance to row 1'); + assert.equal(XMPlayer.cur_row, 0, 'advance to row 0'); }; exports['test non-existing song position'] = function(assert) { @@ -33,7 +33,7 @@ exports['test non-existing song position'] = function(assert) { XMPlayer.nextTick(); assert.equal(XMPlayer.cur_songpos, 0, 'advance to initial song position'); assert.equal(XMPlayer.cur_pat, 0, 'advance to pattern 0'); - assert.equal(XMPlayer.cur_row, 1, 'advance to row 1'); + assert.equal(XMPlayer.cur_row, 0, 'advance to row 0'); XMPlayer.nextTick(); assert.equal(XMPlayer.cur_songpos, 1, 'advance to song position 1'); assert.equal(XMPlayer.cur_pat, 1, 'advance to pattern 1'); @@ -92,7 +92,7 @@ exports['test non-existing song position with loop'] = function(assert) { XMPlayer.nextTick(); assert.equal(XMPlayer.cur_songpos, 0, 'advance to initial song position'); assert.equal(XMPlayer.cur_pat, 0, 'advance to pattern 0'); - assert.equal(XMPlayer.cur_row, 1, 'advance to row 1'); + assert.equal(XMPlayer.cur_row, 0, 'advance to row 0'); XMPlayer.nextTick(); assert.equal(XMPlayer.cur_songpos, 1, 'advance to song position 1'); assert.equal(XMPlayer.cur_pat, 1, 'advance to pattern 1'); @@ -115,7 +115,7 @@ exports['test non-existing song position with invalid loop'] = function(assert) XMPlayer.nextTick(); assert.equal(XMPlayer.cur_songpos, 0, 'advance to initial song position'); assert.equal(XMPlayer.cur_pat, 0, 'advance to pattern 0'); - assert.equal(XMPlayer.cur_row, 1, 'advance to row 1'); + assert.equal(XMPlayer.cur_row, 0, 'advance to row 0'); XMPlayer.nextTick(); assert.equal(XMPlayer.cur_songpos, 1, 'advance to song position 1'); assert.equal(XMPlayer.cur_pat, 1, 'advance to pattern 1'); diff --git a/test/instrument.js b/test/instrument.js index a7d399b..5bf1948 100644 --- a/test/instrument.js +++ b/test/instrument.js @@ -26,9 +26,9 @@ exports['test instrument trigger'] = function(assert) { XMPlayer.nextRow(); ch.pan = 1; // forcibly override panning ch.off = 100; // and sample offset - assert.equal(XMPlayer.cur_row, 1, 'row 1'); + assert.equal(XMPlayer.cur_row, 0, 'row 0'); XMPlayer.nextRow(); - assert.equal(XMPlayer.cur_row, 2, 'row 2'); + assert.equal(XMPlayer.cur_row, 1, 'row 1'); assert.equal(ch.note, 48, 'note same after inst trigger'); assert.equal(ch.period, 1152, 'period same after inst trigger'); assert.equal(ch.vol, 64, 'vol reset after inst trigger'); diff --git a/xm.js b/xm.js index 45f6e9c..b6dcfeb 100644 --- a/xm.js +++ b/xm.js @@ -133,6 +133,7 @@ function setCurrentPattern() { } function nextRow() { + player.cur_row++; if (player.cur_pat == -1 || player.cur_row >= player.xm.patterns[player.cur_pat].length) { player.cur_row = 0; player.cur_songpos++; @@ -142,7 +143,6 @@ function nextRow() { } var p = player.xm.patterns[player.cur_pat]; var r = p[player.cur_row]; - player.cur_row++; for (var i = 0; i < r.length; i++) { var ch = player.xm.channelinfo[i]; var inst = ch.inst; @@ -331,13 +331,13 @@ function nextTick() { } if (isNaN(ch.period)) { console.log(prettify_notedata( - player.xm.patterns[player.cur_pat][player.cur_row-1][j]), + player.xm.patterns[player.cur_pat][player.cur_row][j]), "set channel", j, "period to NaN"); } if (inst === undefined) continue; if (ch.env_vol === undefined) { console.log(prettify_notedata( - player.xm.patterns[player.cur_pat][player.cur_row-1][j]), + player.xm.patterns[player.cur_pat][player.cur_row][j]), "set channel", j, "env_vol to undefined, but note is playing"); continue; } @@ -590,7 +590,7 @@ function audio_cb(e) { scopes: scopes, songpos: player.cur_songpos, pat: player.cur_pat, - row: player.cur_row - 1 + row: player.cur_row }); offset += tickduration; player.cur_ticksamp += tickduration; diff --git a/xmeffects.js b/xmeffects.js index 45b6319..e6fe747 100644 --- a/xmeffects.js +++ b/xmeffects.js @@ -121,7 +121,7 @@ function eff_t0_d(ch, data) { // pattern jump if (player.cur_songpos >= player.xm.songpats.length) player.cur_songpos = player.xm.song_looppos; player.cur_pat = player.xm.songpats[player.cur_songpos]; - player.cur_row = data; + player.cur_row = data - 1; } function eff_t0_e(ch, data) { // extended effects!