abcjs
Version:
Renderer for abc music notation
145 lines (132 loc) • 4.03 kB
JavaScript
/*
* Tablature Plugins
* tablature are defined dynamically and registered inside abcjs
* by calling abcTablatures.register(plugin)
* where plugin represents a plugin instance
*
*/
var ViolinTablature = require('../tablatures/instruments/violin/tab-violin');
var GuitarTablature = require('../tablatures/instruments/guitar/tab-guitar');
/* extend the table below when adding a new instrument plugin */
// Existing tab classes
var pluginTab = {
'violin': 'ViolinTab',
'guitar': 'GuitarTab'
};
var abcTablatures = {
inited: false,
plugins: {},
/**
* to be called once per plugin for registration
* @param {*} plugin
*/
register: function (plugin) {
var name = plugin.name;
var tablature = plugin.tablature;
this.plugins[name] = tablature;
},
setError: function (tune, msg) {
if (tune.warnings) {
tune.warning.push(msg);
} else {
tune.warnings = [msg];
}
},
/**
* handle params for current processed score
* @param {*} tune current tune
* @param {*} tuneNumber number in tune list
* @param {*} params params to be processed for tablature
* @return prepared tablatures plugin instances for current tune
*/
preparePlugins: function (tune, tuneNumber, params) {
var returned = null;
var nbPlugins = 0;
if (params.tablature) {
// validate requested plugins
var tabs = params.tablature;
returned = [];
for (var ii = 0; ii < tabs.length; ii++) {
var args = tabs[ii];
var instrument = args['instrument'];
if (instrument == null) {
this.setError(tune, "tablature 'instrument' is missing");
return returned;
}
var tabName = pluginTab[instrument];
var plugin = null;
if (tabName) {
plugin = this.plugins[tabName];
}
if (plugin) {
if (params.visualTranspose != 0) {
// populate transposition request to tabs
args.visualTranspose = params.visualTranspose;
}
args.abcSrc = params.tablature.abcSrc;
var pluginInstance = {
classz: plugin,
tuneNumber: tuneNumber,
params: args,
instance: null,
};
// proceed with tab plugin init
// plugin.init(tune, tuneNumber, args, ii);
returned.push(pluginInstance);
nbPlugins++;
} else {
// unknown tab plugin
//this.emit_error('Undefined tablature plugin: ' + tabName)
this.setError(tune, 'Undefined tablature plugin: ' + instrument);
return returned;
}
}
}
return returned;
},
/**
* Call requested plugin
* @param {*} renderer
* @param {*} abcTune
*/
layoutTablatures: function (renderer, abcTune) {
var tabs = abcTune.tablatures;
// chack tabs request for each staffs
for (var ii = 0; ii < abcTune.lines.length; ii++) {
var line = abcTune.lines[ii];
var curStaff = line.staff;
if (curStaff) {
for (var jj = 0; jj < curStaff.length; jj++) {
if (tabs[jj]) {
// tablature requested for staff
var tabPlugin = tabs[jj];
if (tabPlugin.instance == null) {
tabPlugin.instance = new tabPlugin.classz();
// plugin.init(tune, tuneNumber, args, ii);
// call initer first
tabPlugin.instance.init(abcTune,
tabPlugin.tuneNumber,
tabPlugin.params,
jj
);
}
// render next
tabPlugin.instance.render(renderer, line, jj);
}
}
}
}
},
/**
* called once internally to register internal plugins
*/
init: function () {
// just register plugin hosted by abcjs
if (!this.inited) {
this.register(new ViolinTablature());
this.register(new GuitarTablature());
this.inited = true;
}
}
};
module.exports = abcTablatures ;