Main Koha release repository
https://koha-community.org
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
5.0 KiB
108 lines
5.0 KiB
/* global PREF_OPACPlayMusicalInscripts interface verovio */
|
|
$(document).ready(function() {
|
|
if( $(".musical_inscripts").length > 0 ){
|
|
|
|
// Check support for WebAssembly
|
|
// https://stackoverflow.com/questions/47879864/how-can-i-check-if-a-browser-supports-webassembly
|
|
var webassenbly_supported = (() => {
|
|
try {
|
|
if (typeof WebAssembly === "object"
|
|
&& typeof WebAssembly.instantiate === "function") {
|
|
const module = new WebAssembly.Module(Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00));
|
|
if (module instanceof WebAssembly.Module)
|
|
return new WebAssembly.Instance(module) instanceof WebAssembly.Instance;
|
|
}
|
|
} catch (e) {
|
|
}
|
|
return false;
|
|
})();
|
|
|
|
if( webassenbly_supported ){
|
|
|
|
$.ajaxSetup({
|
|
cache: true
|
|
});
|
|
|
|
$.getScript( interface + "/lib/verovio/verovio-toolkit.js", function( data, textStatus, jqxhr ) {
|
|
$('.musical_inscripts .inscript').each(function() {
|
|
var vrvToolkit = new verovio.toolkit();
|
|
var $t = $(this);
|
|
var data = "@clef:"+$t.data('clef')+"\n@keysig:"+$t.data('keysig')+"\n@timesig:"+$t.data('timesig')+"\n@data:"+$t.data('notation')+"\n";
|
|
var svg = vrvToolkit.renderData(data, {
|
|
inputFormat: $t.data('system'),
|
|
spacingStaff: 0,
|
|
adjustPageHeight: 1,
|
|
scale: 40,
|
|
pageHeight: 300
|
|
});
|
|
$t.html(svg);
|
|
var base64midi = vrvToolkit.renderToMIDI();
|
|
var song = 'data:audio/midi;base64,' + base64midi;
|
|
var play_btn = $('.play_btn', $t.parent());
|
|
if(play_btn.length) {
|
|
play_btn.data('song', song);
|
|
play_btn.data('toolkit', vrvToolkit);
|
|
}
|
|
});
|
|
if( PREF_OPACPlayMusicalInscripts ){
|
|
$(".audio_controls").show();
|
|
var playmusic_1 = $.getScript( interface + "/lib/verovio/000_acoustic_grand_piano.js" );
|
|
var playmusic_2 = $.getScript( interface + "/lib/verovio/midiplayer.js" );
|
|
$.when( playmusic_1, playmusic_2 ).done(function () {
|
|
|
|
var ids = [];
|
|
|
|
var currentToolkit;
|
|
var player = $('.inscript_audio');
|
|
|
|
var midiUpdate = function(time) {
|
|
// time needs to - 400 for adjustment
|
|
var vrvTime = Math.max(0, time - 400);
|
|
var elementsattime = currentToolkit.getElementsAtTime(vrvTime);
|
|
if (elementsattime.page > 0) {
|
|
if ((elementsattime.notes.length > 0) && (ids != elementsattime.notes)) {
|
|
ids.forEach(function(noteid) {
|
|
if ($.inArray(noteid, elementsattime.notes) == -1) {
|
|
$("#" + noteid).attr("fill", "#000").attr("stroke", "#000");
|
|
}
|
|
});
|
|
ids = elementsattime.notes;
|
|
ids.forEach(function(noteid) {
|
|
if ($.inArray(noteid, elementsattime.notes) != -1) {
|
|
$("#" + noteid).attr("fill", "#c00").attr("stroke", "#c00");
|
|
}
|
|
});
|
|
}
|
|
}
|
|
};
|
|
|
|
var midiStop = function() {
|
|
ids.forEach(function(noteid) {
|
|
$("#" + noteid).attr("fill", "#000").attr("stroke", "#000");
|
|
});
|
|
player.hide();
|
|
};
|
|
|
|
if(player.length) {
|
|
player.midiPlayer({
|
|
locateFile: function(file) {
|
|
return interface + '/lib/verovio/'+file;
|
|
},
|
|
color: "#c00",
|
|
onUpdate: midiUpdate,
|
|
onStop: midiStop
|
|
});
|
|
}
|
|
|
|
$('.musical_inscripts .play_btn').click(function() {
|
|
var $t = $(this);
|
|
player.show();
|
|
currentToolkit = $t.data('toolkit')
|
|
player.midiPlayer.play($t.data('song'));
|
|
});
|
|
});
|
|
}
|
|
});
|
|
}
|
|
}
|
|
});
|