|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var TabString = require('./instruments/tab-string'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var pluginTab = { |
|
|
'violin': { name: 'StringTab', defaultTuning: ['G,', 'D', 'A', 'e'], isTabBig: false, tabSymbolOffset: 0 }, |
|
|
'fiddle': { name: 'StringTab', defaultTuning: ['G,', 'D', 'A', 'e'], isTabBig: false, tabSymbolOffset: 0 }, |
|
|
'mandolin': { name: 'StringTab', defaultTuning: ['G,', 'D', 'A', 'e'], isTabBig: false, tabSymbolOffset: 0 }, |
|
|
'guitar': { name: 'StringTab', defaultTuning: ['E,', 'A,', 'D', 'G', 'B', 'e'], isTabBig: true, tabSymbolOffset: 0 }, |
|
|
'fiveString': { name: 'StringTab', defaultTuning: ['C,', 'G,', 'D', 'A', 'e'], isTabBig: false, tabSymbolOffset: -.95 }, |
|
|
}; |
|
|
|
|
|
var abcTablatures = { |
|
|
|
|
|
inited: false, |
|
|
plugins: {}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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]; |
|
|
} |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
preparePlugins: function (tune, tuneNumber, params) { |
|
|
|
|
|
if (!this.inited) { |
|
|
|
|
|
this.register(new TabString()); |
|
|
this.inited = true; |
|
|
} |
|
|
var returned = null; |
|
|
var nbPlugins = 0; |
|
|
if (params.tablature) { |
|
|
|
|
|
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.name]; |
|
|
} |
|
|
if (plugin) { |
|
|
if (params.visualTranspose != 0) { |
|
|
|
|
|
args.visualTranspose = params.visualTranspose; |
|
|
} |
|
|
args.abcSrc = params.tablature.abcSrc; |
|
|
var pluginInstance = { |
|
|
classz: plugin, |
|
|
tuneNumber: tuneNumber, |
|
|
params: args, |
|
|
instance: null, |
|
|
tabType: tabName, |
|
|
}; |
|
|
|
|
|
|
|
|
returned.push(pluginInstance); |
|
|
nbPlugins++; |
|
|
} else if (instrument === '') { |
|
|
|
|
|
returned.push(null) |
|
|
} else { |
|
|
|
|
|
|
|
|
this.setError(tune, 'Undefined tablature plugin: ' + instrument); |
|
|
return returned; |
|
|
} |
|
|
} |
|
|
} |
|
|
return returned; |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
layoutTablatures: function layoutTablatures(renderer, abcTune) { |
|
|
var tabs = abcTune.tablatures; |
|
|
|
|
|
|
|
|
var staffLineCount = 0; |
|
|
|
|
|
|
|
|
if (tabs && (tabs.length > 0)) { |
|
|
var nTabs = tabs.length; |
|
|
for (var kk = 0; kk < nTabs; ++kk) { |
|
|
if (tabs[kk] && tabs[kk].params.firstStaffOnly) { |
|
|
tabs[kk].params.suppress = false; |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
for (var ii = 0; ii < abcTune.lines.length; ii++) { |
|
|
var line = abcTune.lines[ii]; |
|
|
|
|
|
if (line.staff) { |
|
|
staffLineCount++; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (staffLineCount > 1) { |
|
|
if (tabs && (tabs.length > 0)) { |
|
|
var nTabs = tabs.length; |
|
|
for (var kk = 0; kk < nTabs; ++kk) { |
|
|
if (tabs[kk].params.firstStaffOnly) { |
|
|
|
|
|
tabs[kk].params.suppress = true; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
var curStaff = line.staff; |
|
|
if (curStaff) { |
|
|
var maxStaves = curStaff.length |
|
|
for (var jj = 0; jj < curStaff.length; jj++) { |
|
|
|
|
|
if (tabs[jj] && jj < maxStaves) { |
|
|
|
|
|
var tabPlugin = tabs[jj]; |
|
|
if (tabPlugin.instance == null) { |
|
|
|
|
|
tabPlugin.instance = new tabPlugin.classz(); |
|
|
|
|
|
|
|
|
tabPlugin.instance.init(abcTune, |
|
|
tabPlugin.tuneNumber, |
|
|
tabPlugin.params, |
|
|
tabPlugin.tabType |
|
|
); |
|
|
} |
|
|
|
|
|
|
|
|
tabPlugin.instance.render(renderer, line, jj); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
}, |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
module.exports = abcTablatures; |
|
|
|