@@ -10,15 +10,15 @@ const uploadForm = document.getElementById('upload-form');
1010const uploadButton = document . getElementById ( 'upload-button' ) ;
1111
1212/**
13- * @type {string }
13+ * @type {string|null }
1414 */
1515let musicXml ;
1616let scoreId ;
1717let accessToken ;
1818
1919/**
2020 * @param scoreId {String}
21- * @returns {Promise<void > }
21+ * @returns {Promise<string > }
2222 */
2323async function loadMusicxml ( scoreId ) {
2424 let musicxml = null ;
@@ -37,11 +37,23 @@ async function loadMusicxml(scoreId) {
3737
3838 if ( musicxml == null ) {
3939 alert ( 'failed to load music xml' ) ;
40- return ;
4140 }
41+ return musicxml ;
42+ }
4243
43- await osmd . load ( musicxml )
44- . then ( ( ) => osmd . render ( ) ) ;
44+ function downloadMusicXmlFile ( ) {
45+ const blob = new Blob ( [ musicXml ] , { type : 'application/vnd.recordare.musicxml' } ) ;
46+ const url = window . URL . createObjectURL ( blob ) ;
47+
48+ const link = document . createElement ( 'a' ) ;
49+ link . href = url ;
50+ link . download = `${ scoreId } .musicxml` ;
51+ document . body . appendChild ( link ) ;
52+ link . click ( ) ;
53+
54+ // Clean up
55+ document . body . removeChild ( link ) ;
56+ window . URL . revokeObjectURL ( url ) ;
4557}
4658
4759/**
@@ -95,7 +107,7 @@ async function main() {
95107
96108 fileInput . addEventListener ( 'change' , onFileSelected ) ;
97109 uploadForm . addEventListener ( 'submit' , onSubmitScore ) ;
98- if ( user ?. isScoreEditor === true ) {
110+ if ( user ?. isScoreEditor === true ) {
99111 document . getElementById ( 'upload-form' ) . hidden = false ;
100112 } else {
101113 document . getElementById ( 'upload-form' ) . hidden = true ;
@@ -119,7 +131,14 @@ async function main() {
119131 await initializeScoreApp ( ) ;
120132 fetchScoreUpdates ( ) . then ( ( ) => loadMusicxml ( scoreId ) ) ;
121133
122- await loadMusicxml ( scoreId ) ;
134+ musicXml = await loadMusicxml ( scoreId ) ;
135+
136+ const downloadButton = document . getElementById ( 'download-button' ) ;
137+ downloadButton . hidden = false ;
138+ downloadButton . onclick = downloadMusicXmlFile ;
139+
140+ await osmd . load ( musicXml )
141+ . then ( ( ) => osmd . render ( ) ) ;
123142}
124143
125144await main ( ) ;
0 commit comments