UNPKG

abcjs

Version:

Renderer for abc music notation

74 lines (66 loc) 2.44 kB
var tunebook = require('../api/abc_tunebook'); var midiCreate = require('../midi/abc_midi_create'); var getMidiFile = function(source, options) { var params = {}; if (options) { for (var key in options) { if (options.hasOwnProperty(key)) { params[key] = options[key]; } } } params.generateInline = false; function callback(div, tune, index) { var downloadMidi = midiCreate(tune, params); switch (params.midiOutputType) { case "encoded": return downloadMidi; case "binary": var decoded = downloadMidi.replace("data:audio/midi,", ""); decoded = decoded.replace(/MThd/g,"%4d%54%68%64"); decoded = decoded.replace(/MTrk/g,"%4d%54%72%6b"); var buffer = new ArrayBuffer(decoded.length/3); var output = new Uint8Array(buffer); for (var i = 0; i < decoded.length/3; i++) { var p = i*3+1; var d = parseInt(decoded.substring(p, p+2), 16); output[i] = d; } return output; case "link": default: return generateMidiDownloadLink(tune, params, downloadMidi, index); } } if (typeof source === "string") return tunebook.renderEngine(callback, "*", source, params); else return callback(null, source, 0); }; function isFunction(functionToCheck) { var getType = {}; return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; } var generateMidiDownloadLink = function(tune, midiParams, midi, index) { var divClasses = ['abcjs-download-midi', 'abcjs-midi-' + index] if (midiParams.downloadClass) divClasses.push(midiParams.downloadClass) var html = '<div class="' + divClasses.join(' ') + '">'; if (midiParams.preTextDownload) html += midiParams.preTextDownload; var title = tune.metaText && tune.metaText.title ? tune.metaText.title : 'Untitled'; var label; if (midiParams.downloadLabel && isFunction(midiParams.downloadLabel)) label = midiParams.downloadLabel(tune, index); else if (midiParams.downloadLabel) label = midiParams.downloadLabel.replace(/%T/, title); else label = "Download MIDI for \"" + title + "\""; title = title.toLowerCase().replace(/'/g, '').replace(/\W/g, '_').replace(/__/g, '_'); var filename = (midiParams.fileName) ? midiParams.fileName : title + '.midi'; html += '<a download="' + filename + '" href="' + midi + '">' + label + '</a>'; if (midiParams.postTextDownload) html += midiParams.postTextDownload; return html + "</div>"; }; module.exports = getMidiFile;