UNPKG

qambi

Version:

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

214 lines (175 loc) 4.97 kB
import fetch from 'isomorphic-fetch' const mPI = Math.PI, mPow = Math.pow, mRound = Math.round, mFloor = Math.floor, mRandom = Math.random export function getNiceTime(millis){ let h, m, s, ms, seconds, timeAsString = ''; seconds = millis / 1000; // → millis to seconds h = mFloor(seconds / (60 * 60)); m = mFloor((seconds % (60 * 60)) / 60); s = mFloor(seconds % (60)); ms = mRound((seconds - (h * 3600) - (m * 60) - s) * 1000); timeAsString += h + ':'; timeAsString += m < 10 ? '0' + m : m; timeAsString += ':'; timeAsString += s < 10 ? '0' + s : s; timeAsString += ':'; timeAsString += ms === 0 ? '000' : ms < 10 ? '00' + ms : ms < 100 ? '0' + ms : ms; //console.log(h, m, s, ms); return { hour: h, minute: m, second: s, millisecond: ms, timeAsString: timeAsString, timeAsArray: [h, m, s, ms] }; } // adapted version of https://github.com/danguer/blog-examples/blob/master/js/base64-binary.js export function base64ToBinary(input){ let keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', bytes, uarray, buffer, lkey1, lkey2, chr1, chr2, chr3, enc1, enc2, enc3, enc4, i, j = 0; bytes = Math.ceil((3 * input.length) / 4.0); buffer = new ArrayBuffer(bytes); uarray = new Uint8Array(buffer); lkey1 = keyStr.indexOf(input.charAt(input.length - 1)); lkey2 = keyStr.indexOf(input.charAt(input.length - 1)); if(lkey1 == 64) bytes--; //padding chars, so skip if(lkey2 == 64) bytes--; //padding chars, so skip input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ''); for(i = 0; i < bytes; i += 3) { //get the 3 octects in 4 ascii chars enc1 = keyStr.indexOf(input.charAt(j++)); enc2 = keyStr.indexOf(input.charAt(j++)); enc3 = keyStr.indexOf(input.charAt(j++)); enc4 = keyStr.indexOf(input.charAt(j++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; uarray[i] = chr1; if(enc3 != 64) uarray[i+1] = chr2; if(enc4 != 64) uarray[i+2] = chr3; } //console.log(buffer); return buffer; } export function typeString(o){ if(typeof o != 'object'){ return typeof o; } if(o === null){ return 'null'; } //object, array, function, date, regexp, string, number, boolean, error let internalClass = Object.prototype.toString.call(o).match(/\[object\s(\w+)\]/)[1]; return internalClass.toLowerCase(); } export function sortEvents(events){ events.sort(function(a, b){ if(a.ticks === b.ticks){ let r = a.type - b.type; if(a.type === 176 && b.type === 144){ r = -1 } return r } return a.ticks - b.ticks }) } export function checkIfBase64(data){ let passed = true; try{ atob(data); }catch(e){ passed = false; } return passed; } export function getEqualPowerCurve(numSteps, type, maxValue) { let i, value, percent, values = new Float32Array(numSteps) for(i = 0; i < numSteps; i++){ percent = i / numSteps if(type === 'fadeIn'){ value = Math.cos((1.0 - percent) * 0.5 * mPI) * maxValue }else if(type === 'fadeOut'){ value = Math.cos(percent * 0.5 * Math.PI) * maxValue } values[i] = value if(i === numSteps - 1){ values[i] = type === 'fadeIn' ? 1 : 0 } } return values } export function checkMIDINumber(value){ //console.log(value); if(isNaN(value)){ console.warn('please provide a number'); return false; } if(value < 0 || value > 127){ console.warn('please provide a number between 0 and 127'); return false; } return value; } /* //old school ajax export function ajax(config){ let request = new XMLHttpRequest(), method = typeof config.method === 'undefined' ? 'GET' : config.method, fileSize; function executor(resolve, reject){ reject = reject || function(){}; resolve = resolve || function(){}; request.onload = function(){ if(request.status !== 200){ reject(request.status); return; } if(config.responseType === 'json'){ fileSize = request.response.length; resolve(JSON.parse(request.response), fileSize); request = null; }else{ resolve(request.response); request = null; } }; request.onerror = function(e){ config.onError(e); }; request.open(method, config.url, true); if(config.overrideMimeType){ request.overrideMimeType(config.overrideMimeType); } if(config.responseType){ if(config.responseType === 'json'){ request.responseType = 'text'; }else{ request.responseType = config.responseType; } } if(method === 'POST') { request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); } if(config.data){ request.send(config.data); }else{ request.send(); } } return new Promise(executor); } */