Biblioteka Magenta Music to świetne narzędzie do używania MIDI w HTML.
Odtwarzacz w HTML
Tak wygląda przykład w czystym HTML bez JS ze strony producenta:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <midi-player src="https://cdn.jsdelivr.net/gh/cifkao/html-midi-player@2b12128/twinkle_twinkle.mid" sound-font visualizer="#myPianoRollVisualizer"> </midi-player> <midi-visualizer type="piano-roll" id="myPianoRollVisualizer" src="https://cdn.jsdelivr.net/gh/cifkao/html-midi-player@2b12128/twinkle_twinkle.mid"> </midi-visualizer> <midi-player src="https://cdn.jsdelivr.net/gh/cifkao/html-midi-player@2b12128/twinkle_twinkle.mid" sound-font visualizer="#myStaffVisualizer"> </midi-player> <midi-visualizer type="staff" id="myStaffVisualizer" src="https://cdn.jsdelivr.net/gh/cifkao/html-midi-player@2b12128/twinkle_twinkle.mid"> </midi-visualizer> <script src="https://cdn.jsdelivr.net/combine/npm/tone@14.7.58,npm/@magenta/music@1.23.1/es6/core.js,npm/focus-visible@5,npm/html-midi-player@1.5.0"></script> |
Javascript
Tu już jest nasz kod, który operuje na tych plikach, mamy osobną wizualizację, zmianę długości nut, zmianę typu nut (drums):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | <body> <script src="https://cdn.jsdelivr.net/combine/npm/tone@14.7.58,npm/@magenta/music@1.23.1/es6/core.js,npm/focus-visible@5,npm/html-midi-player@1.5.0"></script> <button onclick="fx_start();">Play</button> <canvas id="myVisualizer" width="400" height="400" style="border:1px solid #000000;"></canvas> <div id="divVisualizer" style="width:200px; height:200px;"></div> <p>For more information, see <a href="https://github.com/cifkao/html-midi-player" target="_blank" rel="noopener">the <strong>html-midi-player</strong> repository</a> on GitHub.</p> </body> <script> var player; //Tak wyglada plik MIDI widziany oczami JS, można wpisać go w postaci JSON do obiektu: var DRUMS = { notes: [ { pitch: 36, quantizedStartStep: 0, quantizedEndStep: 1, isDrum: true }, { pitch: 38, quantizedStartStep: 0, quantizedEndStep: 1, isDrum: true }, { pitch: 42, quantizedStartStep: 0, quantizedEndStep: 1, isDrum: true }, { pitch: 46, quantizedStartStep: 0, quantizedEndStep: 1, isDrum: true }, { pitch: 42, quantizedStartStep: 2, quantizedEndStep: 3, isDrum: true }, { pitch: 42, quantizedStartStep: 3, quantizedEndStep: 4, isDrum: true }, { pitch: 42, quantizedStartStep: 4, quantizedEndStep: 5, isDrum: true }, { pitch: 50, quantizedStartStep: 4, quantizedEndStep: 5, isDrum: true }, { pitch: 36, quantizedStartStep: 6, quantizedEndStep: 7, isDrum: true }, { pitch: 38, quantizedStartStep: 6, quantizedEndStep: 7, isDrum: true }, { pitch: 42, quantizedStartStep: 6, quantizedEndStep: 7, isDrum: true }, { pitch: 45, quantizedStartStep: 6, quantizedEndStep: 7, isDrum: true }, { pitch: 36, quantizedStartStep: 8, quantizedEndStep: 9, isDrum: true }, { pitch: 42, quantizedStartStep: 8, quantizedEndStep: 9, isDrum: true }, { pitch: 46, quantizedStartStep: 8, quantizedEndStep: 9, isDrum: true }, { pitch: 42, quantizedStartStep: 10, quantizedEndStep: 11, isDrum: true }, { pitch: 48, quantizedStartStep: 10, quantizedEndStep: 11, isDrum: true }, { pitch: 50, quantizedStartStep: 10, quantizedEndStep: 11, isDrum: true }, ], quantizationInfo: {stepsPerQuarter: 4}, tempos: [{time: 0, qpm: 120}], totalQuantizedSteps: 11 }; var graph_midi, graph_scores; function fx_start() { player = new core.Player(false, { run: (note) => { graph_midi.redraw(note, true); //animowane nuty przy graniu graph_scores.redraw(note, true); //animowane nuty - druga grafika }, stop: () => { console.log('Koniec grania'); } }); // player.src = "https://cdn.jsdelivr.net/gh/cifkao/html-midi-player@2b12128/twinkle_twinkle.mid"; player.soundFont = ''; player.setTempo(300); // player.start(DRUMS); player.loop = true; core.urlToNoteSequence('https://cdn.jsdelivr.net/gh/cifkao/html-midi-player@2b12128/twinkle_twinkle.mid'); //PLIK MID .then( function(SEKWENCJA_MIDI) { //funkcja otrzymuje jako argument JSON ze zinterpretowanym plikiem MIDI SEKWENCJA_MIDI.notes.forEach(element => { element.isDrum = true; //wszystkie nuty -> zmiana na perkusję element.endTime = element.startTime + 0.16; }); graph_midi = new core.Visualizer(SEKWENCJA_MIDI, document.getElementById("myVisualizer")); //wyświetla prostokąty graph_scores = new core.StaffSVGVisualizer(SEKWENCJA_MIDI, document.getElementById("divVisualizer")); //wyświetla nuty // player.start(DRUMS); //na sztywno perkusja zamiast pliku MIDI z JSONa powyżej player.start(SEKWENCJA_MIDI); console.log(JSON.stringify(SEKWENCJA_MIDI)); //a tak wygląda MIDI zamieniony na JSON }); } </script> <!-- Dokumentacja: https://magenta.github.io/magenta-js/music/ --> |