2016-10-13 11:54:00 -04:00
|
|
|
// var Cast = require('../util/cast');
|
2016-09-28 16:42:25 -04:00
|
|
|
var MathUtil = require('../util/math-util');
|
2016-09-15 16:51:24 -04:00
|
|
|
var Promise = require('promise');
|
|
|
|
|
2016-08-09 15:40:50 -04:00
|
|
|
function Scratch3SoundBlocks(runtime) {
|
|
|
|
/**
|
|
|
|
* The runtime instantiating this block package.
|
|
|
|
* @type {Runtime}
|
|
|
|
*/
|
|
|
|
this.runtime = runtime;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrieve the block primitives implemented by this package.
|
|
|
|
* @return {Object.<string, Function>} Mapping of opcode to Function.
|
|
|
|
*/
|
|
|
|
Scratch3SoundBlocks.prototype.getPrimitives = function() {
|
|
|
|
return {
|
2016-09-28 16:42:25 -04:00
|
|
|
'sound_play': this.playSound,
|
2016-09-27 17:09:53 -04:00
|
|
|
'sound_playuntildone': this.playSoundAndWait,
|
2016-08-11 16:47:01 -04:00
|
|
|
'sound_stopallsounds': this.stopAllSounds,
|
|
|
|
'sound_playnoteforbeats': this.playNoteForBeats,
|
|
|
|
'sound_playdrumforbeats': this.playDrumForBeats,
|
|
|
|
'sound_seteffectto' : this.setEffect,
|
|
|
|
'sound_changeeffectby' : this.changeEffect,
|
|
|
|
'sound_cleareffects' : this.clearEffects,
|
|
|
|
'sound_sounds_menu' : this.soundsMenu,
|
2016-08-09 15:40:50 -04:00
|
|
|
'sound_beats_menu' : this.beatsMenu,
|
2016-10-13 11:54:00 -04:00
|
|
|
'sound_effects_menu' : this.effectsMenu
|
2016-08-09 15:40:50 -04:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
Scratch3SoundBlocks.prototype.playSound = function (args, util) {
|
2016-09-28 16:42:25 -04:00
|
|
|
var url = this._getSoundUrl(args.SOUND_MENU, util);
|
2016-10-12 13:17:51 -04:00
|
|
|
util.target.audioEngine.playSoundFromUrl(url);
|
2016-09-27 17:09:53 -04:00
|
|
|
};
|
|
|
|
|
2016-09-28 16:42:25 -04:00
|
|
|
Scratch3SoundBlocks.prototype._getSoundUrl = function (soundName, util) {
|
|
|
|
if (util.target.sprite.sounds.length == 0) {
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
var index;
|
|
|
|
if (typeof soundName === 'number') {
|
2016-10-13 11:54:00 -04:00
|
|
|
var len = util.target.sprite.sounds.length;
|
|
|
|
index = MathUtil.wrapClamp(soundName,0,len-1);
|
2016-09-28 16:42:25 -04:00
|
|
|
} else {
|
|
|
|
index = util.target.getSoundIndexByName(soundName);
|
|
|
|
if (index == -1) {
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
}
|
2016-10-04 14:19:04 -04:00
|
|
|
return util.target.sprite.sounds[index].fileUrl;
|
2016-09-28 16:42:25 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2016-09-27 17:09:53 -04:00
|
|
|
Scratch3SoundBlocks.prototype.playSoundAndWait = function (args, util) {
|
2016-10-12 13:17:51 -04:00
|
|
|
var url = this._getSoundUrl(args.SOUND_MENU, util);
|
|
|
|
util.target.audioEngine.playSoundFromUrl(url);
|
|
|
|
|
2016-10-13 11:54:00 -04:00
|
|
|
var duration = util.target.audioEngine.getSoundDuration(url);
|
2016-09-28 16:42:25 -04:00
|
|
|
|
2016-09-27 17:09:53 -04:00
|
|
|
return new Promise(function(resolve) {
|
2016-10-13 11:54:00 -04:00
|
|
|
setTimeout(function() {
|
|
|
|
resolve();
|
|
|
|
}, 1000*duration);
|
|
|
|
});
|
2016-08-09 15:40:50 -04:00
|
|
|
};
|
|
|
|
|
2016-08-11 16:47:01 -04:00
|
|
|
Scratch3SoundBlocks.prototype.stopAllSounds = function (args, util) {
|
2016-10-12 13:17:51 -04:00
|
|
|
util.target.audioEngine.stopAllSounds();
|
2016-08-11 16:47:01 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
Scratch3SoundBlocks.prototype.playNoteForBeats = function (args, util) {
|
2016-10-12 13:17:51 -04:00
|
|
|
util.target.audioEngine.playNoteForBeats(args.NOTE, args.BEATS);
|
2016-09-13 17:52:54 -04:00
|
|
|
return new Promise(function(resolve) {
|
2016-10-13 11:54:00 -04:00
|
|
|
setTimeout(function() {
|
|
|
|
resolve();
|
|
|
|
}, (1000 * args.BEATS) );
|
|
|
|
});
|
2016-08-17 16:45:01 -04:00
|
|
|
};
|
|
|
|
|
2016-08-11 16:47:01 -04:00
|
|
|
Scratch3SoundBlocks.prototype.playDrumForBeats = function (args, util) {
|
2016-10-12 13:17:51 -04:00
|
|
|
util.target.audioEngine.playDrumForBeats(args.DRUMTYPE, args.BEATS);
|
2016-08-11 16:47:01 -04:00
|
|
|
return new Promise(function(resolve) {
|
|
|
|
setTimeout(function() {
|
|
|
|
resolve();
|
2016-08-16 16:32:35 -04:00
|
|
|
}, (1000 * args.BEATS) );
|
2016-08-11 16:47:01 -04:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
Scratch3SoundBlocks.prototype.setEffect = function (args, util) {
|
2016-10-12 13:17:51 -04:00
|
|
|
util.target.audioEngine.setEffect(args.EFFECT, args.VALUE);
|
2016-08-11 16:47:01 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
Scratch3SoundBlocks.prototype.changeEffect = function (args, util) {
|
2016-10-12 13:17:51 -04:00
|
|
|
util.target.audioEngine.changeEffect(args.EFFECT, args.VALUE);
|
2016-08-11 16:47:01 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
Scratch3SoundBlocks.prototype.clearEffects = function (args, util) {
|
2016-10-12 13:17:51 -04:00
|
|
|
util.target.audioEngine.clearEffects();
|
2016-08-11 16:47:01 -04:00
|
|
|
};
|
|
|
|
|
2016-10-13 11:54:00 -04:00
|
|
|
Scratch3SoundBlocks.prototype.soundsMenu = function (args) {
|
2016-08-11 16:47:01 -04:00
|
|
|
return args.SOUND_MENU;
|
|
|
|
};
|
|
|
|
|
2016-10-13 11:54:00 -04:00
|
|
|
Scratch3SoundBlocks.prototype.beatsMenu = function (args) {
|
|
|
|
return args.BEATS;
|
2016-08-09 15:40:50 -04:00
|
|
|
};
|
|
|
|
|
2016-10-13 11:54:00 -04:00
|
|
|
Scratch3SoundBlocks.prototype.effectsMenu = function (args) {
|
2016-08-11 16:47:01 -04:00
|
|
|
return args.EFFECT;
|
|
|
|
};
|
|
|
|
|
2016-08-09 15:40:50 -04:00
|
|
|
module.exports = Scratch3SoundBlocks;
|