UNPKG

qambi

Version:

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

244 lines (211 loc) 7.67 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.Part = undefined; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); // @ flow var _util = require('./util'); function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var instanceIndex = 0; var Part = exports.Part = function () { function Part() { var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Part); this.id = this.constructor.name + '_' + instanceIndex++ + '_' + new Date().getTime(); var _settings$name = settings.name; this.name = _settings$name === undefined ? this.id : _settings$name; var _settings$muted = settings.muted; this.muted = _settings$muted === undefined ? false : _settings$muted; this._track = null; this._song = null; this._events = []; this._eventsById = new Map(); this._needsUpdate = false; this._createEventArray = false; this._start = { millis: 0, ticks: 0 }; this._end = { millis: 0, ticks: 0 }; var events = settings.events; if (typeof events !== 'undefined') { this.addEvents.apply(this, _toConsumableArray(events)); } } _createClass(Part, [{ key: 'copy', value: function copy() { var p = new Part(this.name + '_copy'); // implement getNameOfCopy() in util (see heartbeat) var events = []; this._events.forEach(function (event) { var copy = event.copy(); console.log(copy); events.push(copy); }); p.addEvents.apply(p, events); p.update(); return p; } }, { key: 'transpose', value: function transpose(amount) { this._events.forEach(function (event) { event.transpose(amount); }); this._needsUpdate = true; } }, { key: 'move', value: function move(ticks) { this._events.forEach(function (event) { event.move(ticks); }); if (this._song) { var _song$_movedEvents; (_song$_movedEvents = this._song._movedEvents).push.apply(_song$_movedEvents, _toConsumableArray(this._events)); } this._needsUpdate = true; } }, { key: 'moveTo', value: function moveTo(ticks) { this._events.forEach(function (event) { event.moveTo(ticks); }); if (this._song) { var _song$_movedEvents2; (_song$_movedEvents2 = this._song._movedEvents).push.apply(_song$_movedEvents2, _toConsumableArray(this._events)); } this._needsUpdate = true; } }, { key: 'addEvents', value: function addEvents() { var _this = this, _events; //console.log(events) var track = this._track; for (var _len = arguments.length, events = Array(_len), _key = 0; _key < _len; _key++) { events[_key] = arguments[_key]; } events.forEach(function (event) { event._part = _this; _this._eventsById.set(event.id, event); if (track) { event._track = track; if (track._song) { event._song = track._song; } } }); (_events = this._events).push.apply(_events, events); if (track) { var _track$_events; (_track$_events = track._events).push.apply(_track$_events, events); track._needsUpdate = true; } if (this._song) { var _song$_newEvents; (_song$_newEvents = this._song._newEvents).push.apply(_song$_newEvents, events); this._song._changedParts.push(this); } this._needsUpdate = true; } }, { key: 'removeEvents', value: function removeEvents() { var _this2 = this; var track = this._track; for (var _len2 = arguments.length, events = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { events[_key2] = arguments[_key2]; } events.forEach(function (event) { event._part = null; _this2._eventsById.delete(event.id); if (track) { event._track = null; track._eventsById.delete(event.id); if (track._song) { event._song = null; } } }); if (track) { track._needsUpdate = true; track._createEventArray = true; } if (this._song) { var _song$_removedEvents; (_song$_removedEvents = this._song._removedEvents).push.apply(_song$_removedEvents, events); this._song._changedParts.push(this); } this._createEventArray = true; this._needsUpdate = true; } }, { key: 'moveEvents', value: function moveEvents(ticks) { for (var _len3 = arguments.length, events = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { events[_key3 - 1] = arguments[_key3]; } events.forEach(function (event) { event.move(ticks); }); if (this._song) { var _song$_movedEvents3; this._song._changedParts.push(this); (_song$_movedEvents3 = this._song._movedEvents).push.apply(_song$_movedEvents3, _toConsumableArray(this._events)); } this._needsUpdate = true; } }, { key: 'moveEventsTo', value: function moveEventsTo(ticks) { for (var _len4 = arguments.length, events = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { events[_key4 - 1] = arguments[_key4]; } events.forEach(function (event) { event.moveTo(ticks); }); if (this._song) { var _song$_movedEvents4; this._song._changedParts.push(this); (_song$_movedEvents4 = this._song._movedEvents).push.apply(_song$_movedEvents4, _toConsumableArray(this._events)); } this._needsUpdate = true; } }, { key: 'getEvents', value: function getEvents() { var filter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; // can be use as findEvents if (this._needsUpdate) { this.update(); } return [].concat(_toConsumableArray(this._events)); //@TODO implement filter -> filterEvents() should be a utility function (not a class method) } }, { key: 'mute', value: function mute() { var flag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; if (flag) { this.muted = flag; } else { this.muted = !this.muted; } } }, { key: 'update', value: function update() { if (this._needsUpdate === false) { return; } if (this._createEventArray) { this._events = Array.from(this._eventsById.values()); this._createEventArray = false; } (0, _util.sortEvents)(this._events); this._needsUpdate = false; //@TODO: calculate part start and end, and highest and lowest note } }]); return Part; }();