scratch-vm/src/blocks/scratch3_sound.js

143 lines
4.4 KiB
JavaScript
Raw Normal View History

var MathUtil = require('../util/math-util');
var Cast = require('../util/cast');
2016-09-15 16:51:24 -04:00
var Promise = require('promise');
2017-01-03 23:41:49 -05:00
var Scratch3SoundBlocks = function (runtime) {
2016-08-09 15:40:50 -04:00
/**
* The runtime instantiating this block package.
* @type {Runtime}
*/
this.runtime = runtime;
2017-01-03 23:41:49 -05:00
};
2016-08-09 15:40:50 -04:00
/**
* Retrieve the block primitives implemented by this package.
* @return {Object.<string, Function>} Mapping of opcode to Function.
*/
2017-01-03 23:41:49 -05:00
Scratch3SoundBlocks.prototype.getPrimitives = function () {
2016-08-09 15:40:50 -04:00
return {
2017-01-03 23:41:49 -05:00
sound_play: this.playSound,
sound_playuntildone: this.playSoundAndWait,
sound_stopallsounds: this.stopAllSounds,
sound_playnoteforbeats: this.playNoteForBeats,
sound_playdrumforbeats: this.playDrumForBeats,
sound_setinstrumentto: this.setInstrument,
sound_seteffectto: this.setEffect,
sound_changeeffectby: this.changeEffect,
sound_cleareffects: this.clearEffects,
sound_sounds_menu: this.soundsMenu,
sound_beats_menu: this.beatsMenu,
sound_effects_menu: this.effectsMenu,
sound_setvolumeto: this.setVolume,
sound_changevolumeby: this.changeVolume,
sound_sound_settempotobpm: this.setTempo,
sound_changetempoby: this.changeTempo
2016-08-09 15:40:50 -04:00
};
};
Scratch3SoundBlocks.prototype.playSound = function (args, util) {
2016-10-17 17:16:55 -04:00
var index = this._getSoundIndex(args.SOUND_MENU, util);
util.target.audioEngine.playSound(index);
2016-09-27 17:09:53 -04:00
};
2016-10-17 17:16:55 -04:00
Scratch3SoundBlocks.prototype.playSoundAndWait = function (args, util) {
var index = this._getSoundIndex(args.SOUND_MENU, util);
2016-10-27 11:31:22 -04:00
return util.target.audioEngine.playSound(index);
2016-10-17 17:16:55 -04:00
};
Scratch3SoundBlocks.prototype._getSoundIndex = function (soundName, util) {
2017-01-03 23:41:49 -05:00
if (util.target.sprite.sounds.length === 0) {
2016-10-17 17:16:55 -04:00
return 0;
}
var index;
2017-01-03 23:41:49 -05:00
if (Number(soundName)) {
soundName = Number(soundName);
}
if (typeof soundName === 'number') {
2016-10-13 11:54:00 -04:00
var len = util.target.sprite.sounds.length;
2017-01-03 23:41:49 -05:00
index = MathUtil.wrapClamp(soundName, 0, len - 1);
} else {
index = util.target.getSoundIndexByName(soundName);
2017-01-03 23:41:49 -05:00
if (index === -1) {
2016-10-17 17:16:55 -04:00
index = 0;
}
}
2016-10-17 17:16:55 -04:00
return index;
2016-08-09 15:40:50 -04:00
};
Scratch3SoundBlocks.prototype.stopAllSounds = function (args, util) {
2016-10-12 13:17:51 -04:00
util.target.audioEngine.stopAllSounds();
};
Scratch3SoundBlocks.prototype.playNoteForBeats = function (args, util) {
2016-10-12 13:17:51 -04:00
util.target.audioEngine.playNoteForBeats(args.NOTE, args.BEATS);
2017-01-03 23:41:49 -05:00
return new Promise(function (resolve) {
setTimeout(function () {
resolve();
2017-01-03 23:41:49 -05:00
}, (1000 * args.BEATS));
});
};
Scratch3SoundBlocks.prototype.playDrumForBeats = function (args, util) {
2017-01-03 23:41:49 -05:00
util.target.audioEngine.playDrumForBeats(args.DRUM, args.BEATS);
return new Promise(function (resolve) {
setTimeout(function () {
resolve();
2017-01-03 23:41:49 -05:00
}, (1000 * args.BEATS));
});
};
Scratch3SoundBlocks.prototype.setInstrument = function (args, util) {
var instNum = Cast.toNumber(args.INSTRUMENT);
return util.target.audioEngine.setInstrument(instNum);
};
Scratch3SoundBlocks.prototype.setEffect = function (args, util) {
2016-10-27 11:31:22 -04:00
var value = Cast.toNumber(args.VALUE);
util.target.audioEngine.setEffect(args.EFFECT, value);
};
Scratch3SoundBlocks.prototype.changeEffect = function (args, util) {
2016-10-27 11:31:22 -04:00
var value = Cast.toNumber(args.VALUE);
util.target.audioEngine.changeEffect(args.EFFECT, value);
};
Scratch3SoundBlocks.prototype.clearEffects = function (args, util) {
2016-10-12 13:17:51 -04:00
util.target.audioEngine.clearEffects();
};
2016-10-27 11:31:22 -04:00
Scratch3SoundBlocks.prototype.setVolume = function (args, util) {
var value = Cast.toNumber(args.VOLUME);
util.target.audioEngine.setVolume(value);
};
Scratch3SoundBlocks.prototype.changeVolume = function (args, util) {
var value = Cast.toNumber(args.VOLUME);
util.target.audioEngine.changeVolume(value);
};
Scratch3SoundBlocks.prototype.setTempo = function (args, util) {
var value = Cast.toNumber(args.TEMPO);
util.target.audioEngine.setTempo(value);
};
Scratch3SoundBlocks.prototype.changeTempo = function (args, util) {
var value = Cast.toNumber(args.TEMPO);
util.target.audioEngine.changeTempo(value);
};
2016-10-13 11:54:00 -04:00
Scratch3SoundBlocks.prototype.soundsMenu = function (args) {
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) {
return args.EFFECT;
};
2016-08-09 15:40:50 -04:00
module.exports = Scratch3SoundBlocks;