UNPKG

webdaw-modules

Version:

a set of modules for building a web-based DAW

305 lines 12.1 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spread = (this && this.__spread) || function () { for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); return ar; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.heartbeat_utils = void 0; var _1 = __importDefault(require("./")); var status = function (response) { if (response.ok) { return response; } throw new Error(response.statusText); }; // generic json loader var loadJSON = function (url) { return fetch(url) .then(status) .then(function (response) { return response.json(); }) .catch(function (e) { return console.error(e); }); }; // generic ab loader var loadArrayBuffer = function (url) { return fetch(url) .then(status) .then(function (response) { return response.arrayBuffer(); }) .catch(function (e) { return console.error(e); }); }; // const initSequencer = () => sequencer.ready(); var initSequencer = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, _1.default.ready()]; case 1: _a.sent(); console.log(_1.default); return [2 /*return*/]; } }); }); }; var getBrowser = function () { return _1.default.browser; }; var getLoadedMIDIFiles = function () { return _1.default.getMidiFiles().map(function (mf) { return mf.name; }); }; // const getLoadedInstruments = () => // sequencer // .getInstruments() // .map((i: Heartbeat.Instrument, index: number) => [index, i.name]) // .filter((t: [number, string]) => t[1] !== "metronome"); var addMIDIFile = function (url) { return new Promise(function (resolve) { _1.default.addMidiFile({ url: url }, function (json) { // console.log(url); // console.log(sequencer.getMidiFiles()) resolve(json); }); }); }; var addAssetPack = function (ap) { return new Promise(function (resolve) { _1.default.addAssetPack(ap, function () { resolve(); }); }); }; var addAssetPacks = function (aps) { return new Promise(function (resolve) { var max = aps.length; aps.forEach(function (ap) { _1.default.addAssetPack(ap, function () { max--; // console.log(max); if (max === 0) { resolve(); } }); }); }); }; // this version does not work on Android! var addAssetPack2 = function (url) { return new Promise(function (resolve) { return __awaiter(void 0, void 0, void 0, function () { var ap; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, loadJSON(url)]; case 1: ap = _a.sent(); _1.default.addAssetPack(ap, function () { resolve(ap); }); return [2 /*return*/]; } }); }); }); }; // load binary MIDI file, add it to the assets and create a song from it var createSongFromMIDIFile = function (url) { return new Promise(function (resolve) { _1.default.addMidiFile({ url: url }, function (json) { resolve(_1.default.createSong(json)); }); }); }; // load binary MIDI file and create song from it (MIDI file is not added to the assets) var createSongFromMIDIFile2 = function (url) { return loadArrayBuffer(url) .then(function (ab) { return _1.default.createMidiFile({ arraybuffer: ab }); }) .then(function (json) { return _1.default.createSong(json); }) .catch(function (e) { return console.error(e); }); }; var parseConfig = function (config) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve) { return __awaiter(void 0, void 0, void 0, function () { var aps, instrument; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!config.midiFiles) return [3 /*break*/, 2]; // console.log(config.midiFiles.map(async url => addMIDIFile(url))); return [4 /*yield*/, Promise.all(config.midiFiles.map(function (url) { return addMIDIFile(url); }))]; case 1: // console.log(config.midiFiles.map(async url => addMIDIFile(url))); _a.sent(); _a.label = 2; case 2: if (!config.assetPacks) return [3 /*break*/, 5]; return [4 /*yield*/, Promise.all(config.assetPacks.map(function (url) { return loadJSON(url); }))]; case 3: aps = _a.sent(); return [4 /*yield*/, addAssetPacks(aps)]; case 4: _a.sent(); _a.label = 5; case 5: instrument = _1.default.getInstruments()[0]; resolve({ instrumentSamplesList: Object.entries(instrument.mapping), midiInputs: _1.default.midiInputs, midiOutputs: _1.default.midiOutputs, loadedInstruments: _1.default.getInstruments(), }); return [2 /*return*/]; } }); }); })]; }); }); }; var createMIDIFileList = function () { return _1.default.getMidiFiles().map(function (mf) { var result = { name: mf.url.substring(mf.url.lastIndexOf("/") + 1), tracks: [], timeEvents: __spread(mf.timeEvents), ppq: mf.ppq, bpm: mf.bpm, nominator: mf.nominator, denominator: mf.denominator, }; mf.tracks.forEach(function (t) { var key = Object.keys(t.partsById)[0]; var events = Object.values(t.partsById[key].eventsById); result.tracks.push({ name: t.name, events: events, }); }); return result; }); }; var getNumUniqueNotes = function (part) { var uniq = {}; part.events.forEach(function (e) { uniq[e.noteName] = true; }); return Object.keys(uniq).length; }; var sortOnNoteNumberAscending = function (a, b) { if (a.noteNumber < b.noteNumber) { return -1; } else if (a.noteNumber > b.noteNumber) { return 1; } else { return 0; } }; var sortOnNoteNumberDescending = function (a, b) { if (a.noteNumber > b.noteNumber) { return -1; } else if (a.noteNumber < b.noteNumber) { return 1; } else { return 0; } }; var getLowestNote = function (events) { var sorted = events.filter(function (e) { return e.command === 144; }).sort(sortOnNoteNumberAscending); return sorted[0]; }; var getHighestNote = function (events) { var sorted = events.filter(function (e) { return e.command === 144; }).sort(sortOnNoteNumberDescending); return sorted[0]; }; var getAverageNote = function (events) { var lowest = getLowestNote(events).noteNumber; var highest = getHighestNote(events).noteNumber; var average = lowest + (highest - lowest) / 2; return Math.round(average); }; var loadMIDIFile = function (url) { return new Promise(function (resolve) { _1.default.addMidiFile({ url: url }, function () { resolve(); }); }); }; var getBarInfo = function (song, bar) { var startMillis = song.getPosition("barsandbeats", bar, 0, 0, 0).millis; var endMillis = song.getPosition("barsandbeats", bar + 1, 0, 0, 0).millis; return { durationMillis: endMillis - startMillis, startMillis: startMillis, }; }; exports.heartbeat_utils = { initSequencer: initSequencer, getBrowser: getBrowser, parseConfig: parseConfig, loadJSON: loadJSON, loadArrayBuffer: loadArrayBuffer, addAssetPack: addAssetPack, addAssetPack2: addAssetPack2, addMIDIFile: addMIDIFile, // getLoadedInstruments, createMIDIFileList: createMIDIFileList, createSongFromMIDIFile: createSongFromMIDIFile, getNumUniqueNotes: getNumUniqueNotes, getLowestNote: getLowestNote, getHighestNote: getHighestNote, getAverageNote: getAverageNote, loadMIDIFile: loadMIDIFile, getBarInfo: getBarInfo, }; //# sourceMappingURL=utils.js.map