Fix envelope hacks and a bug (panning left on release)
This commit is contained in:
parent
5645739edb
commit
c3499eedaa
1 changed files with 13 additions and 22 deletions
35
xm.js
35
xm.js
|
|
@ -177,8 +177,8 @@ function next_row() {
|
||||||
ch.release = 0;
|
ch.release = 0;
|
||||||
ch.envtick = 0;
|
ch.envtick = 0;
|
||||||
ch.vibratopos = 0;
|
ch.vibratopos = 0;
|
||||||
ch.env_vol = new EnvelopeFollower(inst.env_vol, inst.fadeout);
|
ch.env_vol = new EnvelopeFollower(inst.env_vol);
|
||||||
ch.env_pan = new EnvelopeFollower(inst.env_pan, 0);
|
ch.env_pan = new EnvelopeFollower(inst.env_pan);
|
||||||
ch.period = PeriodForNote(ch, note);
|
ch.period = PeriodForNote(ch, note);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -214,23 +214,12 @@ Envelope.prototype.Get = function(ticks) {
|
||||||
return y0;
|
return y0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function EnvelopeFollower(env, fadeout) {
|
function EnvelopeFollower(env) {
|
||||||
this.env = env;
|
this.env = env;
|
||||||
this.fadeout = 64.0 * fadeout / 65536.0;
|
|
||||||
this.tick = 0;
|
this.tick = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
EnvelopeFollower.prototype.Tick = function(release, defaultval) {
|
EnvelopeFollower.prototype.Tick = function(release) {
|
||||||
// no envelope, just emit full volume
|
|
||||||
if (this.env === undefined) {
|
|
||||||
if (release) {
|
|
||||||
var value = Math.min(0, defaultval - this.tick * this.fadeout);
|
|
||||||
this.tick++;
|
|
||||||
return value;
|
|
||||||
} else {
|
|
||||||
return defaultval;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var value = this.env.Get(this.tick);
|
var value = this.env.Get(this.tick);
|
||||||
if (this.env.type & 1) { // sustain?
|
if (this.env.type & 1) { // sustain?
|
||||||
// if we're sustaining a note, stop advancing the tick counter
|
// if we're sustaining a note, stop advancing the tick counter
|
||||||
|
|
@ -262,13 +251,9 @@ function next_tick() {
|
||||||
if (cur_tick != 0 && ch.effectfn) {
|
if (cur_tick != 0 && ch.effectfn) {
|
||||||
ch.effectfn(ch);
|
ch.effectfn(ch);
|
||||||
}
|
}
|
||||||
if (inst == undefined) continue;
|
if (inst === undefined) continue;
|
||||||
if (ch.env_vol == undefined) {
|
ch.volE = ch.env_vol.Tick(ch.release);
|
||||||
console.log("channel", j, "env_vol defined but not inst?", ch);
|
ch.panE = ch.env_pan.Tick(ch.release);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
ch.volE = ch.env_vol.Tick(ch.release, 64);
|
|
||||||
ch.panE = ch.env_pan.Tick(ch.release, 32);
|
|
||||||
UpdateChannelPeriod(ch, ch.period + ch.periodoffset);
|
UpdateChannelPeriod(ch, ch.period + ch.periodoffset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -961,6 +946,9 @@ function playXM(arrayBuf) {
|
||||||
env_vol_sustain,
|
env_vol_sustain,
|
||||||
env_vol_loop_start,
|
env_vol_loop_start,
|
||||||
env_vol_loop_end);
|
env_vol_loop_end);
|
||||||
|
} else {
|
||||||
|
// create a default envelope w/ fadeout
|
||||||
|
inst.env_vol = new Envelope([0, 64, fadeout_ticks, 0], 1, 0, 0, 0);
|
||||||
}
|
}
|
||||||
if (env_pan_type) {
|
if (env_pan_type) {
|
||||||
inst.env_pan = new Envelope(
|
inst.env_pan = new Envelope(
|
||||||
|
|
@ -969,6 +957,9 @@ function playXM(arrayBuf) {
|
||||||
env_pan_sustain,
|
env_pan_sustain,
|
||||||
env_pan_loop_start,
|
env_pan_loop_start,
|
||||||
env_pan_loop_end);
|
env_pan_loop_end);
|
||||||
|
} else {
|
||||||
|
// create a default empty envelope
|
||||||
|
inst.env_pan = new Envelope([0, 32], 0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
instruments.push(inst);
|
instruments.push(inst);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue