qambi
Version:
MIDI sequencer, loads MIDI files, can record and playback MIDI, uses WebMIDI and WebAudio
201 lines (178 loc) • 5.93 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
exports.decodeSample = decodeSample;
exports.parseSamples2 = parseSamples2;
exports.parseSamples = parseSamples;
var _isomorphicFetch = require('isomorphic-fetch');
var _isomorphicFetch2 = _interopRequireDefault(_isomorphicFetch);
var _init_audio = require('./init_audio');
var _util = require('./util');
var _eventlistener = require('./eventlistener');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function decodeSample(sample, id, every) {
return new Promise(function (resolve) {
try {
_init_audio.context.decodeAudioData(sample, function onSuccess(buffer) {
//console.log(id, buffer);
if (typeof id !== 'undefined') {
resolve({ id: id, buffer: buffer });
if (every) {
every({ id: id, buffer: buffer });
}
} else {
resolve(buffer);
if (every) {
every(buffer);
}
}
}, function onError() {
console.log('error decoding audiodata [ID: ' + id + ']');
//reject(e); // don't use reject because we use this as a nested promise and we don't want the parent promise to reject
if (typeof id !== 'undefined') {
resolve({ id: id });
} else {
resolve();
}
});
} catch (e) {
console.warn('error decoding audiodata', id, e);
if (typeof id !== 'undefined') {
resolve({ id: id });
} else {
resolve();
}
}
});
}
function loadAndParseSample(url, id, every) {
//console.log(id, url)
/*
setTimeout(() => {
dispatchEvent({
type: 'loading',
data: url
})
}, 0)
*/
(0, _eventlistener.dispatchEvent)({
type: 'loading',
data: url
});
var executor = function executor(resolve) {
// console.log(url)
(0, _isomorphicFetch2.default)(url, {
method: 'GET'
}).then(function (response) {
if (response.ok) {
response.arrayBuffer().then(function (data) {
//console.log(id, data)
decodeSample(data, id, every).then(resolve);
});
} else if (typeof id !== 'undefined') {
resolve({ id: id });
} else {
resolve();
}
});
};
return new Promise(executor);
}
function getPromises(promises, sample, key, baseUrl, every) {
var getSample = function getSample() {
if (key !== 'release' && key !== 'info' && key !== 'sustain') {
//console.log(key)
if (sample instanceof ArrayBuffer) {
promises.push(decodeSample(sample, key, baseUrl, every));
} else if (typeof sample === 'string') {
if ((0, _util.checkIfBase64)(sample)) {
promises.push(decodeSample((0, _util.base64ToBinary)(sample), key, baseUrl, every));
} else {
//console.log(baseUrl + sample)
promises.push(loadAndParseSample(baseUrl + escape(sample), key, every));
}
} else if ((typeof sample === 'undefined' ? 'undefined' : _typeof(sample)) === 'object') {
sample = sample.sample || sample.buffer || sample.base64 || sample.url;
getSample(promises, sample, key, baseUrl, every);
//console.log(key, sample)
//console.log(sample, promises.length)
}
}
};
getSample();
}
// only for internally use in qambi
function parseSamples2(mapping) {
var every = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
var type = (0, _util.typeString)(mapping),
promises = [],
baseUrl = '';
if (typeof mapping.baseUrl === 'string') {
baseUrl = mapping.baseUrl;
delete mapping.baseUrl;
}
//console.log(mapping, baseUrl)
every = typeof every === 'function' ? every : false;
//console.log(type, mapping)
if (type === 'object') {
Object.keys(mapping).forEach(function (key) {
// if(isNaN(key) === false){
// key = parseInt(key, 10)
// }
var a = mapping[key];
//console.log(key, a, typeString(a))
if ((0, _util.typeString)(a) === 'array') {
a.forEach(function (map) {
//console.log(map)
getPromises(promises, map, key, baseUrl, every);
});
} else {
getPromises(promises, a, key, baseUrl, every);
}
});
} else if (type === 'array') {
var key = void 0;
mapping.forEach(function (sample) {
// key is deliberately undefined
getPromises(promises, sample, key, baseUrl, every);
});
}
return new Promise(function (resolve) {
Promise.all(promises).then(function (values) {
//console.log(type, values)
if (type === 'object') {
mapping = {};
values.forEach(function (value) {
// support for multi layered instruments
var map = mapping[value.id];
var type = (0, _util.typeString)(map);
if (type !== 'undefined') {
if (type === 'array') {
map.push(value.buffer);
} else {
mapping[value.id] = [map, value.buffer];
}
} else {
mapping[value.id] = value.buffer;
}
});
//console.log(mapping)
resolve(mapping);
} else if (type === 'array') {
resolve(values);
}
});
});
}
function parseSamples() {
for (var _len = arguments.length, data = Array(_len), _key = 0; _key < _len; _key++) {
data[_key] = arguments[_key];
}
if (data.length === 1 && (0, _util.typeString)(data[0]) !== 'string') {
//console.log(data[0])
return parseSamples2(data[0]);
}
return parseSamples2(data);
}