abcjs / tests /synth /midi.test.js
KEXEL's picture
Upload 337 files
af6912c verified
describe("MIDI file creation", function() {
var abcMidi = "X:1\n" +
'%%MIDI program 4\n' +
'%%MIDI channel 4\n' +
'%%MIDI transpose -2\n' +
'T: midi options\n' +
'%score {RH LH}\n' +
'L:1/4\n' +
'Q:1/4=89\n' +
'K:A\n' +
'V:RH name="Right Hand"\n' +
'A[Bd]c2|\n' +
'V:LH clef=bass name="Left Hand"\n' +
'A,B,A,2|\n';
var expectedMidi = "data:audio/midi,MThd%00%00%00%06%00%01%00%03%01%e0" +
"MTrk%00%00%00%29%00%FF%51%03%0a%49%6d%00%FF%59%02%03%00%00%FF%58%04%04%02%18%08%00%FF%01%0c%6d%69%64%69%20%6f%70%74%69%6f%6e%73%00%FF%2F%00" +
"MTrk%00%00%00%4c%00%FF%03%0a%52%69%67%68%74%20%48%61%6e%64%00%C0%04%00%B4%79%00%00%B4%40%00%00%B4%5B%30%00%B4%0A%20%00%B4%07%64" +
"%00%94%43%69%83%60%84%43%00%00%94%45%5f%00%94%48%5f%83%60%84%45%00%00%84%48%00%00%94%47%5f%87%40%84%47%00%00%FF%2F%00" +
"MTrk%00%00%00%43%00%FF%03%09%4c%65%66%74%20%48%61%6e%64%00%C0%04%00%B4%79%00%00%B4%40%00%00%B4%5B%30%00%B4%0A%60%00%B4%07%64" +
"%00%94%37%69%83%60%84%37%00%00%94%39%5f%83%60%84%39%00%00%94%37%5f%87%40%84%37%00%00%FF%2F%00";
var abcStaccato = "X:1\n" +
'T: staccato\n' +
'L:1/4\n' +
'Q:1/4=59\n' +
'K:cm\n' +
'.A.Bcd(ef)|\n';
var expectedStaccato = "data:audio/midi,MThd%00%00%00%06%00%01%00%02%01%e0" +
"MTrk%00%00%00%25%00%FF%51%03%0f%84%75%00%FF%59%02%00%00%00%FF%58%04%04%02%18%08%00%FF%01%08%73%74%61%63%63%61%74%6f%00%FF%2F%00" +
"MTrk%00%00%00%53%00%C0%00%00%B0%79%00%00%B0%40%00%00%B0%5B%30%00%B0%0A%40%00%B0%07%64%00%90%45%55%82%26%80%45%00%81%3a%90%47%55%82%26%80%47%00%81%3a%90%48%5f%83%60%80%48%00%00%90%4a%5f%83%60%80%4a%00%00%90%4c%5f%83%60%90%4d%5f%02%80%4c%00%83%5e%80%4d%00%00%FF%2F%00"
var abcDrums = "X:1\n" +
"T:percmap\n" +
"%%MIDI drummap F 36 %bass drum 1\n" +
"%%MIDI drummap c 38 %acoustic snare\n" +
"%%MIDI drummap g 42 %closed hi hat\n" +
"Q:1/4=50\n" +
"K:C perc\n" +
"[gF] g [gc] g [gF] g [gc] g | c c c c\n"
var expectedDrums = "data:audio/midi,MThd%00%00%00%06%00%01%00%02%01%e0MTrk%00%00%00%24%00%FF%51%03%12%4f%80%00%FF%59%02%00%00%00%FF%58%04%04%02%18%08%00%FF%01%07%70%65%72%63%6d%61%70%00%FF%2F%00MTrk%00%00%00%a7%00%C0%00%00%B9%79%00%00%B9%40%00%00%B9%5B%30%00%B9%0A%40%00%B9%07%64%00%99%2a%69%00%99%24%69%81%70%89%2a%00%00%89%24%00%00%99%2a%55%81%70%89%2a%00%00%99%2a%5f%00%99%26%5f%81%70%89%2a%00%00%89%26%00%00%99%2a%55%81%70%89%2a%00%00%99%2a%5f%00%99%24%5f%81%70%89%2a%00%00%89%24%00%00%99%2a%55%81%70%89%2a%00%00%99%2a%5f%00%99%26%5f%81%70%89%2a%00%00%89%26%00%00%99%2a%55%81%70%89%2a%00%00%99%26%69%81%70%89%26%00%00%99%26%55%81%70%89%26%00%00%99%26%5f%81%70%89%26%00%00%99%26%55%81%70%89%26%00%00%FF%2F%00"
it("midi-piano", function() {
var midi = abcjs.synth.getMidiFile(abcMidi, { midiOutputType: "link", pan: [ -0.5, 0.5 ]});
var contents = setMidiLink(midi);
var msg = "\nrcv: " + JSON.stringify(contents) + "\n" +
"exp: " + JSON.stringify(expectedMidi) + "\n";
chai.assert.strictEqual(contents, expectedMidi, msg);
})
it("midi-staccato", function() {
var midi = abcjs.synth.getMidiFile(abcStaccato, { midiOutputType: "link"});
var contents = setMidiLink(midi);
// console.log(midi)
var msg = "\nrcv: " + JSON.stringify(contents) + "\n" +
"exp: " + JSON.stringify(expectedStaccato) + "\n";
chai.assert.strictEqual(contents, expectedStaccato, msg);
})
it("midi-drums", function() {
var midi = abcjs.synth.getMidiFile(abcDrums, { midiOutputType: "link"});
var contents = setMidiLink(midi);
// console.log(midi)
var msg = "\nrcv: " + JSON.stringify(contents) + "\n" +
"exp: " + JSON.stringify(expectedDrums) + "\n";
chai.assert.strictEqual(contents, expectedDrums, msg);
})
})
function setMidiLink(midi) {
var el = document.getElementById("midi");
el.innerHTML = midi;
el = el.querySelector("a");
var contents = el.href;
return contents;
}