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!