diff --git a/test/effects.js b/test/effects.js index 45ae79f..b64f8a2 100644 --- a/test/effects.js +++ b/test/effects.js @@ -90,12 +90,13 @@ exports['test 4xy vibrato'] = function(assert) { // vibrato 4xy: speed x, depth y // full cycle is 64/speed xm.patterns[0] = [ - [[48, 1, -1, 4, 0x81]], // C-4 1 -- 481 - [[-1, -1, -1, 4, 0x02]], // --- -- -- 402 - [[-1, -1, -1, 4, 0x10]], // --- -- -- 410 - [[-1, -1, -1, 4, 0x00]], // --- -- -- 400 - [[-1, -1, -1, 0, 0x00]], // --- -- -- 000 - no vibrato - [[-1, -1, -1, 4, 0x00]], // --- -- -- 400 - resume vibrato @ pos 0 + [[48, 1, -1, 4, 0x81]], // C-4 1 -- 481 + [[-1, -1, -1, 4, 0x02]], // --- -- -- 402 + [[-1, -1, -1, 4, 0x10]], // --- -- -- 410 + [[-1, -1, -1, 4, 0x00]], // --- -- -- 400 + [[-1, -1, -1, 0, 0x00]], // --- -- -- --- - no vibrato + [[-1, -1, -1, 4, 0x00]], // --- -- -- 400 - resume vibrato @ pos 0 + [[-1, -1, 0xb2, 0, 0x00]], // --- -- V2 --- - volume effect vibrato ]; // I should really be testing ch.doff directly XMPlayer.xm.tempo = 3; @@ -151,6 +152,12 @@ exports['test 4xy vibrato'] = function(assert) { XMPlayer.nextTick(); // row 5 tick 1 p = -16*12 * Math.log(ch.doff / p0) / Math.log(2); assert.equal(p.toFixed(3), "-1.546", 'row 5 tick 1 period -1.546'); + XMPlayer.nextTick(); // row 5 tick 2 + p = -16*12 * Math.log(ch.doff / p0) / Math.log(2); + assert.equal(p.toFixed(3), "-1.414", 'row 5 tick 2 period -1.414'); + XMPlayer.nextTick(); // row 6 tick 0 + p = -16*12 * Math.log(ch.doff / p0) / Math.log(2); + assert.equal(p.toFixed(3), "-1.269", 'row 6 tick 0 period -1.269'); }; exports['test Axy volume slide'] = function(assert) { diff --git a/xm.js b/xm.js index dbc89bc..cb9868e 100644 --- a/xm.js +++ b/xm.js @@ -207,6 +207,12 @@ function nextRow() { ch.vol = Math.max(0, ch.vol - (v & 0x0f)); } else if (v >= 0x90 && v < 0xa0) { // fine volume slide up ch.vol = Math.min(64, ch.vol + (v & 0x0f)); + } else if (v >= 0xa0 && v < 0xb0) { // vibrato speed + ch.vibratospeed = v & 0x0f; + } else if (v >= 0xb0 && v < 0xc0) { // vibrato w/ depth + ch.vibratodepth = v & 0x0f; + ch.voleffectfn = player.effects_t1[4]; // use vibrato effect directly + player.effects_t1[4](ch); // and also call it on tick 0 } else if (v >= 0xc0 && v < 0xd0) { // set panning ch.pan = (v & 0x0f) * 0x11; } else {