forked from magenta/magenta-js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvisualizer.ts
97 lines (83 loc) · 3.22 KB
/
visualizer.ts
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/**
* @license
* Copyright 2018 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import * as mm from '../src/index';
import {blobToNoteSequence, urlToNoteSequence} from '../src/index';
import {FULL_TWINKLE_UNQUANTIZED} from './common';
const MIDI_URL = './melody.mid';
let canvasVisualizer: mm.PianoRollCanvasVisualizer;
let svgVisualizer: mm.PianoRollSVGVisualizer;
let staffVisualizer: mm.StaffSVGVisualizer;
const player = new mm.Player(false, {
run: (note: mm.NoteSequence.Note) => {
canvasVisualizer.redraw(note, true);
svgVisualizer.redraw(note, true);
staffVisualizer.redraw(note, true);
},
stop: () => {}
});
// UI elements
const playBtn = document.getElementById('playBtn') as HTMLButtonElement;
const urlBtn = document.getElementById('urlBtn') as HTMLButtonElement;
const seqBtn = document.getElementById('seqBtn') as HTMLButtonElement;
const tempoInput = document.getElementById('tempoInput') as HTMLInputElement;
const tempoValue = document.getElementById('tempoValue') as HTMLDivElement;
const fileInput = document.getElementById('fileInput') as HTMLInputElement;
const canvas = document.getElementById('canvas') as HTMLCanvasElement;
const svg = document.getElementsByTagName('svg')[0] as SVGSVGElement;
const staff = document.getElementById('staff') as HTMLDivElement;
// Set up some event listeners
urlBtn.addEventListener('click', () => fetchMidi(MIDI_URL));
playBtn.addEventListener('click', () => startOrStop());
seqBtn.addEventListener('click', () => {
initPlayerAndVisualizer(FULL_TWINKLE_UNQUANTIZED);
});
fileInput.addEventListener('change', loadFile);
tempoInput.addEventListener('input', () => {
player.setTempo(parseInt(tempoInput.value, 10));
tempoValue.textContent = tempoInput.value;
});
function fetchMidi(url: string) {
urlToNoteSequence(url).then((seq) => initPlayerAndVisualizer(seq));
}
// tslint:disable-next-line:no-any
function loadFile(e: any) {
blobToNoteSequence(e.target.files[0])
.then((seq) => initPlayerAndVisualizer(seq));
}
function initPlayerAndVisualizer(seq: mm.INoteSequence) {
// Disable the UI
playBtn.disabled = false;
playBtn.textContent = 'Loading';
canvasVisualizer = new mm.PianoRollCanvasVisualizer(seq, canvas);
svgVisualizer = new mm.PianoRollSVGVisualizer(seq, svg);
staffVisualizer = new mm.StaffSVGVisualizer(seq, staff);
const tempo = seq.tempos[0].qpm;
player.setTempo(tempo);
tempoValue.textContent = tempoInput.value = '' + tempo;
// Enable the UI
playBtn.disabled = false;
playBtn.textContent = 'Play';
}
function startOrStop() {
if (player.isPlaying()) {
player.stop();
playBtn.textContent = 'Play';
} else {
player.start(canvasVisualizer.noteSequence);
playBtn.textContent = 'Stop';
}
}