jsbasic/bell.js

64 lines
10 KiB
JavaScript

//
// Bell - play an audio file for the CHR$(7) "BEL" beep
//
var Bell;
if (typeof Bell !== 'function') {
Bell = function(base) {
// Prefer Web Audio
if ('AudioContext' in window) {
this.play = function() {
if (!this.ctx) {
this.ctx = new AudioContext();
this.gain = this.ctx.createGain();
this.gain.gain.value = 0.75;
this.gain.connect(this.ctx.destination);
}
if (this.osc)
this.osc.disconnect();
this.osc = this.ctx.createOscillator();
this.osc.type = 'square';
this.osc.frequency.value = 935;
this.osc.connect(this.gain);
this.osc.start(this.ctx.currentTime);
this.osc.stop(this.ctx.currentTime + 0.1);
};
this.stop = function() {};
return;
}
var DATA_MP3 = "data:audio/mp3;base64,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";
var DATA_OGG = "data:audio/ogg;base64,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zLrvDMfvpPvK09VtY5l93VlmX3eO4Rg6v/Djqaqvm64rDKcsC7/t68az+76yjK7r+6osC78q28Kx677z/L6wLKPs+sJqy8Kw2rYx3L5uLL9wHMtr68ox675RtnV8X3gKw/N0dV15Zl3H9nV040c4fsoAAIABBwCAABPKQKEhKwKAOAEAjySJomRZoihZliiKpui6omi6rqRppqlpnmlammeapmmqsimarixpmmlanmaamqeZpmiarmuapqyKpinLpmrKsmmasuy6sm27rmzbomnKsmmasmyapiy7sqvbruzquqRZpql5nmlqnmeapmrKsmmarqt5nmp6nmiqniiqqmqqqq2qqixbnmeamuippieKqmqqpq2aqirLpqrasmmqtmyqqm27quz6sm3rummqsm2qpi2bqmrbruzqsizbui9pmmlqnmeamueZpmmasmyaqitbnqeaniiqquaJpmqqqiybpqrKlueZqieKquqJnmuaqirLpmraqmmatmyqqi2bpirLrm37vuvKsm6qqmybqmrrpmrKsmzLvu/Kqu6KpinLpqrasmmqsi3bsu/Lsqz7omnKsmmqsm2qqi7Lsm0bs2z7umiasm2qpi2bqirbsi37uizbuu/Krm+rqqzrsi37uu76rnDrujC8smz7qqz6uivbum/rMtv2fUTTlGVTNW3bVFVZdmXZ9mXb9n3RNG1bVVVbNk3VtmVZ9n1Ztm1hNE3ZNlVV1k3VtG1Zlm1htmXhdmXZt2Vb9nXXlXVf133j12Xd5rqy7cuyrfuqq/q27vvCcOuu8AoAABhwAAAIMKEMFBqyEgCIAgAAjGGMMQiNUs45B6FRyjnnIGTOQQghlcw5CCGUkjkHoZSUMucglJJSCKGUlFoLIZSUUmsFAAAUOAAABNigKbE4QKEhKwGAVAAAg+NYlueZomrasmNJnieKqqmqtu1IlueJommqqm1bnieKpqmqruvrmueJommqquvqumiapqmqruu6ui6aoqmqquu6sq6bpqqqriu7suzrpqqqquvKriz7wqq6rivLsm3rwrCqruvKsmzbtm/cuq7rvu/7wpGt67ou/MIxDEcBAOAJDgBABTasjnBSNBZYaMhKACADAIAwBiGDEEIGIYSQUkohpZQSAAAw4AAAEGBCGSg0ZEUAECcAABhDKaSUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJIKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKqaSUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKZVSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUgoAkIpwAJB6MKEMFBqyEgBIBQAAjFFKKcacgxAx5hhj0EkoKWLMOcYclJJS5RyEEFJpLbfKOQghpNRSbZlzUlqLMeYYM+ekpBRbzTmHUlKLseaaa+6ktFZrrjXnWlqrNdecc825tBZrrjnXnHPLMdecc8455xhzzjnnnHPOBQDgNDgAgB7YsDrCSdFYYKEhKwGAVAAAAhmlGHPOOegQUow55xyEECKFGHPOOQghVIw55xx0EEKoGHPMOQghhJA55xyEEEIIIXMOOugghBBCBx2EEEIIoZTOQQghhBBKKCGEEEIIIYQQOgghhBBCCCGEEEIIIYRSSgghhBBCCaGUUAAAYIEDAECADasjnBSNBRYashIAAAIAgByWoFLOhEGOQY8NQcpRMw1CTDnRmWJOajMVU5A5EJ10EhlqQdleMgsAAIAgACDABBAYICj4QgiIMQAAQYjMEAmFVbDAoAwaHOYBwANEhEQAkJigSLu4gC4DXNDFXQdCCEIQglgcQAEJODjhhife8IQbnKBTVOogAAAAAAAMAOABAOCgACIimquwuMDI0Njg6PAIAAAAAAAWAPgAADg+gIiI5iosLjAyNDY4OjwCAAAAAAAAAACAgIAAAAAAAEAAAACAgE9nZ1MABL0gAAAAAAAAamQAAAIAAABD4CsyCyQgg36CgoiFioaONOd3TEz5E9c/BxTQ5CMBAfxqxhE1u0A9ShFqBijk8ADwSJsgJOdrr36cIisDfegSwtdPg4NgRha4D7s6Ov63ALfS2gOaDC+bZhb1sHHwL7bjeJU0mnbv86f0uPTETm4xfZ5OnyNgBuAEAMxwOAaAGpAFfJIAYQGgBqjq27PuNmVibfb+zTuMXFNQrRoCAIpqniUAAFBUwxUA8NUdAAAAoHlWAMr1QV59zAEAmIJ/ACaAtXUgA2gNoDxIABpgNvxXAdoQD/RAB34dnz8mEYG3wZR32Pvkdfd7fmT3Xr8Sj6RjEW2W+D0BHAOwN9wuAYBjAHgDJCSAsABQBoBtba+J/313W7st1vshZQYAAAAASOgBqNEBAAAAAFCIvQBwAgAAAMYKMFcnEr6MA+gESAAAE289AADIAPAJOoD56JsJNMAQAqB4AJ79Hv7ZRQreLt03Yrrzil4ZfM/ufHynEJ4hMDNaBPRECeAYgJ6GUyUAcAwA14AF+LQACAsAByDUWoF3tHhEl0/SRIQ3oAAAAADwvAX0pAAAAAAAAE0iCjj4hwAAAACUdgB/iWhNNSkslripsh7WatcBUBkgARJKQte2kkekOgAK0AB+HV8+JxGBrcGEb2zazgu/spY/2/28fys8KSR1O6eBnwaAYwBUwuEYAN4AWcCoAAgLADdAqK7y9CPIfL/jOG+aFonrBAAAAAD0AAAAcCpSAADyGgEAAADwcgCX9XiPpAAAq+6fNQvQ0fp1nR16CvgfA6BvAniAQgFKtWIxkUN4IBAAnh3vm3wTGVhvyr+w9ozU68c3u4/+V3qrjWHJE7mRmAsA67qVWKIsR4bv8TDU7uchf1jXN3UKAHpjAKYjnWsnelkm5etEe7YOtyJplbuVp4ZO0bnT/mZIDQCls8kJdNX1/1471gkdwFCSYM1u+mjkToa9fDC1DgA0LFiGXy4hCIFpUTMEHhIUAD79Pjf1KiKwJoRxApS88CsnKrvfgPA2MUSMNDjwnwCwvgIA2CALuBOAJarYY33d7Fv/PmRK7m4rDgAAGjgAAACAqPQqRwAA5rfc5VROKRzSes6gJhgAdho1bBxqIG2Rh6cBJggwKewOL4YRkG0CsjwBM0lgTNM/FxjNQlhuWNDqfgI/+gB+fF4/Lv5BhlGfEaI85/WgPXtnOni5WWdg83qBnEgA22FWgixrGKH92/y+KeNNq8RsjAEAAIuG9SLg5vSXDAcxAEC9Ypo+d9jcYHXSolRUDPv3rGV8czRkMJlOxRE0KvHBkzmxHVidJRzBKXQCLuwO4vJwkGDzC49hu3ox7BZa76K3uvQ1GmowIABey63n4Qms0PAXtmjcH5/1z4QXfSDpDbBGA9hWbRSJrPsfppFz++yb+pv2iuJLL1qCK81qAf0OPXOq795whAXASrmiBeymGITsof2pmTp4NbRJLmH334dCVo8BF5EFhQElZ4TcWmrv75W280BypK6BjoKRHbTGdWtmKc4ehgfbRRY+q8jUAX66vdwPP0CSEu+IQdgrxfYMT54eY4wxUo80xhipAeATBACwUQzliMyorVGpvXWc3zd8VbX9jDEq0EsAAAB4UpbiLk5hUK3g19bXd97rG0DSZxeLUwDUHu+8LevrWHv5zpzCB/C8eQAsurauHo41auvFnDfvCA74BingzWO9GGAUj7AoxUAXv0qABndYmwA=";
var tag;
// Fallback to HTML5 audio
tag = document.createElement('audio');
if (typeof tag.canPlayType === 'function') {
tag.setAttribute('preload', 'true');
if (tag.canPlayType('audio/mp3') || tag.canPlayType('audio/mpeg')) {
tag.setAttribute('src', DATA_MP3);
} else if (tag.canPlayType('audio/ogg')) {
tag.setAttribute('src', DATA_OGG);
}
this.play = function() { tag.play(); };
this.stop = function() { tag.pause(); tag.currentTime = 0; };
return;
}
// Fallback for IE<9
tag = document.createElement('bgsound');
if ('loop' in tag) {
tag.src = base + 'res/bell.wav';
tag.loop = 1;
this.play = function() { document.body.appendChild(tag); };
this.stop = function() { document.body.removeChild(tag); };
return;
}
this.play = function() { };
this.stop = function() { };
};
}