function Protracker(){ var i, t; this.initialize(); this.clearsong(); _AN_Write_url('url', this, false , ""); this.loading = false ; this.ready = false ; this.playing = false ; this.buffer = 0; this.mixerNode = 0; this.paused = false ; this.repeat = false ; this.separation = true ; this.palclock = true ; this.autostart = false ; this.onReady = function (){ } ; this.onPlay = function (){ } ; this.onStop = function (){ } ; this.baseperiodtable = new Array(856, 808, 762, 720, 678, 640, 604, 570, 538, 508, 480, 453, 428, 404, 381, 360, 339, 320, 302, 285, 269, 254, 240, 226, 214, 202, 190, 180, 170, 160, 151, 143, 135, 127, 120, 113); this.finetunetable = new Array(); for (t = 0; t < 16; t++ )this.finetunetable[t] = Math.pow(2, (t - 8) / 12 / 8); this.vibratotable = new Array(); for (t = 0; t < 4; t++ ){ this.vibratotable[t] = new Array(); for (i = 0; i < 64; i++ ){ switch (t){ case 0: this.vibratotable[t][i] = 127 * Math.sin(Math.PI * 2 * (i / 64)); break ; case 1: this.vibratotable[t][i] = 127 - 4 * i; break ; case 2: this.vibratotable[t][i] = (i < 32)? 127: -127; break ; case 3: this.vibratotable[t][i] = (1 - 2 * Math.random()) * 127; break ; } } } this.effects_t0 = new Array(this.effect_t0_0, this.effect_t0_1, this.effect_t0_2, this.effect_t0_3, this.effect_t0_4, this.effect_t0_5, this.effect_t0_6, this.effect_t0_7, this.effect_t0_8, this.effect_t0_9, this.effect_t0_a, this.effect_t0_b, this.effect_t0_c, this.effect_t0_d, this.effect_t0_e, this.effect_t0_f); this.effects_t0_e = new Array(this.effect_t0_e0, this.effect_t0_e1, this.effect_t0_e2, this.effect_t0_e3, this.effect_t0_e4, this.effect_t0_e5, this.effect_t0_e6, this.effect_t0_e7, this.effect_t0_e8, this.effect_t0_e9, this.effect_t0_ea, this.effect_t0_eb, this.effect_t0_ec, this.effect_t0_ed, this.effect_t0_ee, this.effect_t0_ef); this.effects_t1 = new Array(this.effect_t1_0, this.effect_t1_1, this.effect_t1_2, this.effect_t1_3, this.effect_t1_4, this.effect_t1_5, this.effect_t1_6, this.effect_t1_7, this.effect_t1_8, this.effect_t1_9, this.effect_t1_a, this.effect_t1_b, this.effect_t1_c, this.effect_t1_d, this.effect_t1_e, this.effect_t1_f); this.effects_t1_e = new Array(this.effect_t1_e0, this.effect_t1_e1, this.effect_t1_e2, this.effect_t1_e3, this.effect_t1_e4, this.effect_t1_e5, this.effect_t1_e6, this.effect_t1_e7, this.effect_t1_e8, this.effect_t1_e9, this.effect_t1_ea, this.effect_t1_eb, this.effect_t1_ec, this.effect_t1_ed, this.effect_t1_ee, this.effect_t1_ef); this.context = null ; this.samplerate = 44100; this.bufferlen = 2048; } Protracker.prototype.createContext = function (){ this.context = new webkitAudioContext(); this.samplerate = this.context.sampleRate; this.bufferlen = (this.samplerate > 44100)? 4096: 2048; this.filterNode = this.context.createBiquadFilter(); this.filterNode.frequency.value = 6000; this.lowpassNode = this.context.createBiquadFilter(); this.lowpassNode.frequency.value = 28867; this.mixerNode = this.context.createJavaScriptNode(this.bufferlen, 1, 2); this.mixerNode.module = this; this.mixerNode.onaudioprocess = Protracker.prototype.mix; this.compressorNode = this.context.createDynamicsCompressor(); this.mixerNode.connect(this.filterNode); this.filterNode.connect(this.lowpassNode); this.lowpassNode.connect(this.compressorNode); this.compressorNode.connect(this.context.destination); } ; Protracker.prototype.play = function (){ if (this.context == null ) this.createContext(); if (!this.ready) return false ; if (this.paused) { this.paused = false ; return true ; } this.paused = false ; this.initialize(); this.flags = 3; this.playing = true ; this.onPlay(); return true ; } ; Protracker.prototype.pause = function (){ if (!this.paused) { this.paused = true ; } else { this.paused = false ; } } ; Protracker.prototype.stop = function (){ this.playing = false ; this.onStop(); } ; Protracker.prototype.jump = function (step){ this.tick = 0; this.row = 0; this.position += step; this.flags = 3; if (this.position < 0) this.position = 0; if (this.position >= this.songlen) this.stop(); } ; Protracker.prototype.setrepeat = function (rep){ this.repeat = rep; } ; Protracker.prototype.setseparation = function (sep){ this.separation = sep; } ; Protracker.prototype.setamigatype = function (clock){ this.palclock = clock; } ; Protracker.prototype.setautostart = function (st){ this.autostart = st; } ; Protracker.prototype.clearsong = function (){ this.title = ""; this.signature = ""; this.songlen = 1; this.repeatpos = 0; this.patterntable = new ArrayBuffer(128); for (i = 0; i < 128; i++ )this.patterntable[i] = 0; this.channels = 4; this.sample = new Array(); this.samples = 31; for (i = 0; i < 31; i++ ){ this.sample[i] = new Object(); this.sample[i].name = ""; this.sample[i].length = 0; this.sample[i].finetune = 0; this.sample[i].volume = 64; this.sample[i].loopstart = 0; this.sample[i].looplength = 0; this.sample[i].data = 0; } this.patterns = 0; this.pattern = new Array(); this.note = new Array(); this.looprow = 0; this.loopstart = 0; this.loopcount = 0; this.patterndelay = 0; this.patternwait = 0; } ; Protracker.prototype.initialize = function (){ this.tick = 0; this.position = 0; this.row = 0; this.offset = 0; this.flags = 0; this.speed = 6; this.bpm = 125; this.breakrow = 0; this.patternjump = 0; this.patterndelay = 0; this.patternwait = 0; this.channel = new Array(); for (i = 0; i < this.channels; i++ ){ this.channel[i] = new Object(); this.channel[i].sample = 0; this.channel[i].period = 214; this.channel[i].voiceperiod = 214; this.channel[i].note = 24; this.channel[i].volume = 64; this.channel[i].command = 0; this.channel[i].data = 0; this.channel[i].samplepos = 0; this.channel[i].samplespeed = 0; this.channel[i].flags = 0; this.channel[i].noteon = 0; this.channel[i].slidespeed = 0; this.channel[i].slideto = 214; this.channel[i].slidetospeed = 0; this.channel[i].arpeggio = 0; this.channel[i].semitone = 12; this.channel[i].vibratospeed = 0; this.channel[i].vibratodepth = 0; this.channel[i].vibratopos = 0; this.channel[i].vibratowave = 0; } this.vu = new Array(); } ; Protracker.prototype.load = function (url){ _AN_Write_url("url", this, false , url); this.clearsong(); var request = new XMLHttpRequest(); _AN_Call_open("open", request, "GET", _AN_Read_url("url", this), true ); request.responseType = "arraybuffer"; this.request = request; this.loading = true ; var asset = this; request.onload = function (){ asset.buffer = new Uint8Array(request.response); asset.parse(); if (asset.autostart) asset.play(); } ; _AN_Call_send("send", request); } ; Protracker.prototype.parse = function (){ var i, j, c; if (!this.buffer) return false ; for (i = 0; i < 4; i++ )this.signature += String.fromCharCode(this.buffer[1080 + i]); switch (this.signature){ case "M.K.": case "M!K!": case "4CHN": case "FLT4": break ; case "6CHN": this.channels = 6; break ; case "8CHN": case "FLT8": this.channels = 8; break ; case "28CH": this.channels = 28; break ; default : { return false ; } } this.vu = new Array(); for (i = 0; i < this.channels; i++ )this.vu[i] = 0; i = 0; while (this.buffer[i] && i < 20)this.title = this.title + String.fromCharCode(this.buffer[i++ ]); for (i = 0; i < this.samples; i++ ){ var st = 20 + i * 30; j = 0; while (this.buffer[st + j] && j < 22){ this.sample[i].name += ((this.buffer[st + j] > 31) && (this.buffer[st + j] < 127))? (String.fromCharCode(this.buffer[st + j])): (" "); j++ ; } this.sample[i].length = 2 * (this.buffer[st + 22] * 256 + this.buffer[st + 23]); this.sample[i].finetune = this.buffer[st + 24]; if (this.sample[i].finetune > 7) this.sample[i].finetune = this.sample[i].finetune - 16; this.sample[i].volume = this.buffer[st + 25]; this.sample[i].loopstart = 2 * (this.buffer[st + 26] * 256 + this.buffer[st + 27]); this.sample[i].looplength = 2 * (this.buffer[st + 28] * 256 + this.buffer[st + 29]); if (this.sample[i].looplength == 2) this.sample[i].looplength = 0; if (this.sample[i].loopstart > _AN_Read_length("length", this.sample[i])) { this.sample[i].loopstart = 0; this.sample[i].looplength = 0; } } this.songlen = this.buffer[950]; if (this.buffer[951] != 127) this.repeatpos = this.buffer[951]; for (i = 0; i < 128; i++ ){ this.patterntable[i] = this.buffer[952 + i]; if (this.patterntable[i] > this.patterns) this.patterns = this.patterntable[i]; } this.patterns += 1; var patlen = 4 * 64 * this.channels; this.pattern = new Array(); this.note = new Array(); for (i = 0; i < this.patterns; i++ ){ this.pattern[i] = new Uint8Array(patlen); this.note[i] = new Uint8Array(this.channels * 64); for (j = 0; j < patlen; j++ )this.pattern[i][j] = this.buffer[1084 + i * patlen + j]; for (j = 0; j < 64; j++ )for (c = 0; c < this.channels; c++ ){ this.note[i][j * this.channels + c] = 0; var n = (this.pattern[i][j * 4 * this.channels + c * 4] & 15) << 8 | this.pattern[i][j * 4 * this.channels + c * 4 + 1]; for (var np = 0; np < _AN_Read_length("length", this.baseperiodtable); np++ )if (n == this.baseperiodtable[np]) this.note[i][j * this.channels + c] = np; } } var sst = 1084 + this.patterns * patlen; for (i = 0; i < this.samples; i++ ){ this.sample[i].data = new Float32Array((_AN_Read_length("length", this.sample[i]))); for (j = 0; j < _AN_Read_length("length", this.sample[i]); j++ ){ var q = this.buffer[sst + j]; if (q < 128) { q = q / 128; } else { q = ((q - 128) / 128) - 1; } this.sample[i].data[j] = q; } sst += _AN_Read_length("length", this.sample[i]); } this.ready = true ; this.loading = false ; this.buffer = 0; if (this.context) this.lowpassNode.frequency.value = 28867; this.onReady(); return true ; } ; Protracker.prototype.advance = function (mod){ var spd = (((mod.samplerate * 60) / mod.bpm) / 4) / 6; if (mod.offset > spd) { mod.tick++ ; mod.offset = 0; mod.flags |= 1; } if (mod.tick >= mod.speed) { if (mod.patterndelay) { if (mod.tick < ((mod.patternwait + 1) * mod.speed)) { mod.patternwait++ ; } else { mod.row++ ; mod.tick = 0; mod.flags |= 2; mod.patterndelay = 0; } } else { if (mod.flags & (112)) { if (mod.flags & 64) { mod.row = mod.looprow; mod.flags &= 161; mod.flags |= 2; } else { if (mod.flags & 16) { mod.position = mod.patternjump; mod.row = mod.breakrow; mod.patternjump = 0; mod.breakrow = 0; mod.flags &= 225; mod.flags |= 2; } } mod.tick = 0; } else { mod.row++ ; mod.tick = 0; mod.flags |= 2; } } } if (mod.row >= 64) { mod.position++ ; mod.row = 0; mod.flags |= 4; } if (mod.position >= mod.songlen) { if (mod.repeat) { mod.position = 0; } else { mod.stop(); } return ; } } ; Protracker.prototype.mix = function (ape){ var f; var p, pp, n, nn; var mod = ape.srcElement.module; outp = new Array(); var bufs = new Array(ape.outputBuffer.getChannelData(0), ape.outputBuffer.getChannelData(1)); var buflen = _AN_Read_length("length", ape.outputBuffer); for (var s = 0; s < buflen; s++ ){ outp[0] = 0; outp[1] = 0; if (!mod.paused && mod.playing) { mod.advance(mod); var och = 0; for (var ch = 0; ch < mod.channels; ch++ ){ p = mod.patterntable[mod.position]; pp = mod.row * 4 * mod.channels + ch * 4; if (mod.flags & 2) { modrow = mod.row; mod.channel[ch].command = mod.pattern[p][pp + 2] & 15; mod.channel[ch].data = mod.pattern[p][pp + 3]; if (!(mod.channel[ch].command == 14 && (mod.channel[ch].data & 240) == 208)) { n = (mod.pattern[p][pp] & 15) << 8 | mod.pattern[p][pp + 1]; if (n) { if ((mod.channel[ch].command != 3) && (mod.channel[ch].command != 5)) { mod.channel[ch].period = n; mod.channel[ch].samplepos = 0; if (mod.channel[ch].vibratowave > 3) mod.channel[ch].vibratopos = 0; mod.channel[ch].flags |= 3; mod.channel[ch].noteon = 1; } else { mod.channel[ch].slideto = n; } } nn = mod.pattern[p][pp + 0] & 240 | mod.pattern[p][pp + 2] >> 4; if (nn) { mod.channel[ch].sample = nn - 1; mod.channel[ch].volume = mod.sample[nn - 1].volume; if (!n && (mod.channel[ch].samplepos > _AN_Read_length("length", mod.sample[nn - 1]))) mod.channel[ch].samplepos = 0; } } } mod.channel[ch].voiceperiod = mod.channel[ch].period; if (mod.channel[ch].samplepos == 0) modsample[ch] = mod.channel[ch].sample; if (!_AN_Read_length("length", mod.sample[mod.channel[ch].sample])) mod.channel[ch].noteon = 0; if (mod.flags & 1) { if (!mod.tick) { mod.effects_t0[mod.channel[ch].command](mod, ch); } else { mod.effects_t1[mod.channel[ch].command](mod, ch); } } if (mod.channel[ch].flags & 2) { for (var np = 0; np < _AN_Read_length("length", mod.baseperiodtable); np++ )if (mod.baseperiodtable[np] >= mod.channel[ch].period) mod.channel[ch].note = np; mod.channel[ch].semitone = 7; if (mod.channel[ch].period >= 120) mod.channel[ch].semitone = mod.baseperiodtable[mod.channel[ch].note] - mod.baseperiodtable[mod.channel[ch].note + 1]; } if ((mod.channel[ch].flags & 1 || mod.flags & 2) && mod.channel[ch].voiceperiod) mod.channel[ch].samplespeed = (mod.palclock? 7093789.2: 7159090.5) / (mod.channel[ch].voiceperiod * 2) * mod.finetunetable[mod.sample[mod.channel[ch].sample].finetune + 8] / mod.samplerate; if (mod.flags & 1) { mod.channel[ch].vibratopos += mod.channel[ch].vibratospeed; mod.channel[ch].vibratopos &= 63; } och = och ^ (ch & 1); f = 0; if (mod.channel[ch].noteon) { if (_AN_Read_length("length", mod.sample[mod.channel[ch].sample]) > mod.channel[ch].samplepos) f = (1 / mod.channels) * (mod.sample[mod.channel[ch].sample].data[Math.floor(mod.channel[ch].samplepos)] * mod.channel[ch].volume) / 64; outp[och] += f; mod.channel[ch].samplepos += mod.channel[ch].samplespeed; } if (s == 0) mod.vu[ch] = Math.abs(f); if (mod.channel[ch].noteon) { if (mod.sample[mod.channel[ch].sample].loopstart || mod.sample[mod.channel[ch].sample].looplength) { if (mod.channel[ch].samplepos >= (mod.sample[mod.channel[ch].sample].loopstart + mod.sample[mod.channel[ch].sample].looplength)) { mod.channel[ch].samplepos = mod.sample[mod.channel[ch].sample].loopstart; } } else { if (mod.channel[ch].samplepos >= _AN_Read_length("length", mod.sample[mod.channel[ch].sample])) { mod.channel[ch].noteon = 0; } } } mod.channel[ch].flags = 0; } mod.offset++ ; mod.flags &= 112; } if (mod.separation) { t = outp[0]; outp[0] = outp[0] * 0.6 + outp[1] * 0.4; outp[1] = outp[1] * 0.6 + t * 0.4; } bufs[0][s] = outp[0]; bufs[1][s] = outp[1]; } } ; Protracker.prototype.effect_t0_0 = function (mod, ch){ mod.channel[ch].arpeggio = mod.channel[ch].data; } ; Protracker.prototype.effect_t0_1 = function (mod, ch){ if (mod.channel[ch].data) mod.channel[ch].slidespeed = mod.channel[ch].data; } ; Protracker.prototype.effect_t0_2 = function (mod, ch){ if (mod.channel[ch].data) mod.channel[ch].slidespeed = mod.channel[ch].data; } ; Protracker.prototype.effect_t0_3 = function (mod, ch){ if (mod.channel[ch].data) mod.channel[ch].slidetospeed = mod.channel[ch].data; } ; Protracker.prototype.effect_t0_4 = function (mod, ch){ if (mod.channel[ch].data & 15 && mod.channel[ch].data & 240) { mod.channel[ch].vibratodepth = (mod.channel[ch].data & 15); mod.channel[ch].vibratospeed = (mod.channel[ch].data & 240) >> 4; } mod.channel[ch].voiceperiod += (mod.channel[ch].vibratodepth / 32) * mod.channel[ch].semitone * (mod.vibratotable[mod.channel[ch].vibratowave & 3][mod.channel[ch].vibratopos] / 127); mod.channel[ch].flags |= 1; } ; Protracker.prototype.effect_t0_5 = function (mod, ch){ } ; Protracker.prototype.effect_t0_6 = function (mod, ch){ } ; Protracker.prototype.effect_t0_7 = function (mod, ch){ } ; Protracker.prototype.effect_t0_8 = function (mod, ch){ } ; Protracker.prototype.effect_t0_9 = function (mod, ch){ mod.channel[ch].samplepos = mod.channel[ch].data * 256; } ; Protracker.prototype.effect_t0_a = function (mod, ch){ } ; Protracker.prototype.effect_t0_b = function (mod, ch){ mod.breakrow = 0; mod.patternjump = mod.channel[ch].data; mod.flags |= 16; } ; Protracker.prototype.effect_t0_c = function (mod, ch){ mod.channel[ch].volume = mod.channel[ch].data; } ; Protracker.prototype.effect_t0_d = function (mod, ch){ mod.breakrow = ((mod.channel[ch].data & 240) >> 4) * 10 + (mod.channel[ch].data & 15); if (!(mod.flags & 16)) mod.patternjump = mod.position + 1; mod.flags |= 16; } ; Protracker.prototype.effect_t0_e = function (mod, ch){ var i = (mod.channel[ch].data & 240) >> 4; mod.effects_t0_e[i](mod, ch); } ; Protracker.prototype.effect_t0_f = function (mod, ch){ if (mod.channel[ch].data > 32) { mod.bpm = mod.channel[ch].data; } else { if (mod.channel[ch].data) mod.speed = mod.channel[ch].data; } } ; Protracker.prototype.effect_t0_e0 = function (mod, ch){ if (mod.channel[ch].data & 15) { mod.lowpassNode.frequency.value = 4280; } else { mod.lowpassNode.frequency.value = 28867; } } ; Protracker.prototype.effect_t0_e1 = function (mod, ch){ mod.channel[ch].period -= mod.channel[ch].data & 15; if (mod.channel[ch].period < 113) mod.channel[ch].period = 113; } ; Protracker.prototype.effect_t0_e2 = function (mod, ch){ mod.channel[ch].period += mod.channel[ch].data & 15; if (mod.channel[ch].period > 856) mod.channel[ch].period = 856; mod.channel[ch].flags |= 1; } ; Protracker.prototype.effect_t0_e3 = function (mod, ch){ } ; Protracker.prototype.effect_t0_e4 = function (mod, ch){ mod.channel[ch].vibratowave = mod.channel[ch].data & 7; } ; Protracker.prototype.effect_t0_e5 = function (mod, ch){ } ; Protracker.prototype.effect_t0_e6 = function (mod, ch){ if (mod.channel[ch].data & 15) { if (mod.loopcount) { mod.loopcount-- ; } else { mod.loopcount = mod.channel[ch].data & 15; } if (mod.loopcount) mod.flags |= 64; } else { mod.looprow = mod.row; } } ; Protracker.prototype.effect_t0_e7 = function (mod, ch){ } ; Protracker.prototype.effect_t0_e8 = function (mod, ch){ } ; Protracker.prototype.effect_t0_e9 = function (mod, ch){ } ; Protracker.prototype.effect_t0_ea = function (mod, ch){ mod.channel[ch].volume += mod.channel[ch].data & 15; if (mod.channel[ch].volume > 64) mod.channel[ch].volume = 64; } ; Protracker.prototype.effect_t0_eb = function (mod, ch){ mod.channel[ch].volume -= mod.channel[ch].data & 15; if (mod.channel[ch].volume < 0) mod.channel[ch].volume = 0; } ; Protracker.prototype.effect_t0_ec = function (mod, ch){ } ; Protracker.prototype.effect_t0_ed = function (mod, ch){ if (mod.tick == (mod.channel[ch].data & 15)) { var p = mod.patterntable[mod.position]; var pp = mod.row * 4 * mod.channels + ch * 4; n = (mod.pattern[p][pp] & 15) << 8 | mod.pattern[p][pp + 1]; if (n) { mod.channel[ch].period = n; mod.channel[ch].voiceperiod = mod.channel[ch].period; mod.channel[ch].samplepos = 0; if (mod.channel[ch].vibratowave > 3) mod.channel[ch].vibratopos = 0; mod.channel[ch].flags |= 3; mod.channel[ch].noteon = 1; } n = mod.pattern[p][pp + 0] & 240 | mod.pattern[p][pp + 2] >> 4; if (n) { mod.channel[ch].sample = n - 1; mod.channel[ch].volume = mod.sample[n - 1].volume; } } } ; Protracker.prototype.effect_t0_ee = function (mod, ch){ mod.patterndelay = mod.channel[ch].data & 15; mod.patternwait = 0; } ; Protracker.prototype.effect_t0_ef = function (mod, ch){ } ; Protracker.prototype.effect_t1_0 = function (mod, ch){ if (mod.channel[ch].data) { var apn = mod.channel[ch].note; if ((mod.tick % 3) == 1) apn += mod.channel[ch].arpeggio >> 4; if ((mod.tick % 3) == 2) apn += mod.channel[ch].arpeggio & 15; if (apn >= 0 && apn <= _AN_Read_length("length", mod.baseperiodtable)) mod.channel[ch].voiceperiod = mod.baseperiodtable[apn]; mod.channel[ch].flags |= 1; } } ; Protracker.prototype.effect_t1_1 = function (mod, ch){ mod.channel[ch].period -= mod.channel[ch].slidespeed; if (mod.channel[ch].period < 113) mod.channel[ch].period = 113; mod.channel[ch].flags |= 3; } ; Protracker.prototype.effect_t1_2 = function (mod, ch){ mod.channel[ch].period += mod.channel[ch].slidespeed; if (mod.channel[ch].period > 856) mod.channel[ch].period = 856; mod.channel[ch].flags |= 3; } ; Protracker.prototype.effect_t1_3 = function (mod, ch){ if (mod.channel[ch].period < mod.channel[ch].slideto) { mod.channel[ch].period += mod.channel[ch].slidetospeed; if (mod.channel[ch].period > mod.channel[ch].slideto) mod.channel[ch].period = mod.channel[ch].slideto; } if (mod.channel[ch].period > mod.channel[ch].slideto) { mod.channel[ch].period -= mod.channel[ch].slidetospeed; if (mod.channel[ch].period < mod.channel[ch].slideto) mod.channel[ch].period = mod.channel[ch].slideto; } mod.channel[ch].flags |= 3; } ; Protracker.prototype.effect_t1_4 = function (mod, ch){ mod.channel[ch].voiceperiod += (mod.channel[ch].vibratodepth / 16) * mod.channel[ch].semitone * (mod.vibratotable[mod.channel[ch].vibratowave & 3][mod.channel[ch].vibratopos] / 127); mod.channel[ch].flags |= 1; } ; Protracker.prototype.effect_t1_5 = function (mod, ch){ mod.effect_t1_3(mod, ch); mod.effect_t1_a(mod, ch); } ; Protracker.prototype.effect_t1_6 = function (mod, ch){ mod.effect_t1_4(mod, ch); mod.effect_t1_a(mod, ch); } ; Protracker.prototype.effect_t1_7 = function (mod, ch){ } ; Protracker.prototype.effect_t1_8 = function (mod, ch){ } ; Protracker.prototype.effect_t1_9 = function (mod, ch){ } ; Protracker.prototype.effect_t1_a = function (mod, ch){ if (!(mod.channel[ch].data & 15)) { mod.channel[ch].volume += (mod.channel[ch].data >> 4); if (mod.channel[ch].volume > 64) mod.channel[ch].volume = 64; } if (!(mod.channel[ch].data & 240)) { mod.channel[ch].volume -= (mod.channel[ch].data & 15); if (mod.channel[ch].volume < 0) mod.channel[ch].volume = 0; } } ; Protracker.prototype.effect_t1_b = function (mod, ch){ } ; Protracker.prototype.effect_t1_c = function (mod, ch){ } ; Protracker.prototype.effect_t1_d = function (mod, ch){ } ; Protracker.prototype.effect_t1_e = function (mod, ch){ var i = (mod.channel[ch].data & 240) >> 4; mod.effects_t1_e[i](mod, ch); } ; Protracker.prototype.effect_t1_f = function (mod, ch){ } ; Protracker.prototype.effect_t1_e0 = function (mod, ch){ } ; Protracker.prototype.effect_t1_e1 = function (mod, ch){ } ; Protracker.prototype.effect_t1_e2 = function (mod, ch){ } ; Protracker.prototype.effect_t1_e3 = function (mod, ch){ } ; Protracker.prototype.effect_t1_e4 = function (mod, ch){ } ; Protracker.prototype.effect_t1_e5 = function (mod, ch){ } ; Protracker.prototype.effect_t1_e6 = function (mod, ch){ } ; Protracker.prototype.effect_t1_e7 = function (mod, ch){ } ; Protracker.prototype.effect_t1_e8 = function (mod, ch){ } ; Protracker.prototype.effect_t1_e9 = function (mod, ch){ if (mod.tick % (mod.channel[ch].data & 15) == 0) mod.channel[ch].samplepos = 0; } ; Protracker.prototype.effect_t1_ea = function (mod, ch){ } ; Protracker.prototype.effect_t1_eb = function (mod, ch){ } ; Protracker.prototype.effect_t1_ec = function (mod, ch){ if (mod.tick == (mod.channel[ch].data & 15)) mod.channel[ch].volume = 0; } ; Protracker.prototype.effect_t1_ed = function (mod, ch){ mod.effect_t0_ed(mod, ch); } ; Protracker.prototype.effect_t1_ee = function (mod, ch){ } ; Protracker.prototype.effect_t1_ef = function (mod, ch){ } ;