UNPKG

qambi

Version:

MIDI sequencer, loads MIDI files, can record and playback MIDI, uses WebMIDI and WebAudio

201 lines (178 loc) 5.93 kB
'use strict'; 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); }