-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwebMidiCircleOfFiths.html
84 lines (70 loc) · 2.75 KB
/
webMidiCircleOfFiths.html
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
<html>
<head>
<meta charset="utf-8"/>
<link id="favicon" rel="shortcut icon" type="image/png" href="data:image/png;base64,....==" />
<title>webMidiCircleOfFiths</title>
<style type="text/css">
#canvas {
width: 300px;
height: 300px; /* unable to size canvas with css properly - wha? */
}
</style>
<!-- <script type="text/javascript" src="music.js"></script> -->
<!-- <script type="module" src="./music.js"></script> -->
</head>
<body>
<h1>webMidiCircleOfFiths</h1>
<canvas id="canvasCircleOfFiths" width="300" height="300"></canvas>
<canvas id="canvasPiano" width="200" height="100"></canvas>
<canvas id="canvasGuitarFretboard" width="100" height="500"></canvas>
<p><span id="chord"></span></p>
<script type="module">
import {
text_to_note,
identify_chord,
normalize_javascript_midi_msg,
} from './music.js'
import {drawCircleOfFifths,} from './canvasCircleOfFifths.js'
import {drawPiano,} from './canvasPiano.js'
import {drawGuitarFretboard,} from './canvasGuitarFretboard.js'
// TEMP POLYFILL
const getCanvasContext = (id) => document.getElementById(id).getContext("2d");
const _drawCircle = (notes) => drawCircleOfFifths(getCanvasContext("canvasCircleOfFiths"), notes);
const _drawPiano = (notes) => drawPiano(getCanvasContext("canvasPiano"), notes);
const _drawGuitar = (notes) => drawGuitarFretboard(getCanvasContext("canvasGuitarFretboard"), notes);
// System Midi Input ---------------------------------------------------
function onMidiNoteChange(notes) {
console.debug(notes);
document.getElementById('chord').textContent = identify_chord(notes);
_drawCircle(notes);
_drawPiano(notes);
_drawGuitar(notes);
}
const notes = new Set();
function onMidiMessage(midiDevice, msg) {
const midiMsg = normalize_javascript_midi_msg(msg);
//console.debug(midiDevice.name, midiMsg);
if (midiMsg.status.name == 'note_on') {
notes.add(midiMsg.note);
onMidiNoteChange(notes);
}
if (midiMsg.status.name == 'note_off') {
notes.delete(midiMsg.note);
onMidiNoteChange(notes);
}
};
function bindMidiDevices(midiAccess) {
for (let midiDevice of midiAccess.inputs.values()) {
midiDevice.onmidimessage = (msg) => onMidiMessage(midiDevice, msg);
}
};
function initMidi(bindMidiDevices) {
if (window.navigator.requestMIDIAccess) {
window.navigator.requestMIDIAccess({sysex: false}).then(bindMidiDevices, function() {console.warn('MIDI Access Failed');});
} else {console.warn("No browser MIDI support");}
};
initMidi(bindMidiDevices);
// Test Data -----------------------------------------------------------
onMidiNoteChange(new Set(['C', 'D#', 'G'].map(text_to_note)));
</script>
</body>