UNPKG

abcjs

Version:

Renderer for abc music notation

51 lines (45 loc) 1.1 kB
var accidentals = { "__": -2, "_": -1, "_/": -0.5, "=": 0, "": 0, "^/": 0.5, "^": 1, "^^": 2 } var notesInOrder = ['C', '-', 'D', '-', 'E', 'F', '-', 'G', '-', 'A', '-', 'B', 'c', '-', 'd', '-', 'e', 'f', '-', 'g', '-', 'a', '-', 'b'] function noteToMidi(note) { var reg = note.match(/([_^\/]*)([ABCDEFGabcdefg])(,*)('*)/) if (reg && reg.length === 5) { var acc = accidentals[reg[1]] var pitch = notesInOrder.indexOf(reg[2]) var octave = reg[4].length - reg[3].length return 48 + pitch + acc + octave * 12; } return 0; } function midiToNote(midi) { midi = parseInt(midi, 10) // TODO-PER: not sure how to handle quarter sharps and flats, so strip them for now. var octave = Math.floor(midi / 12) var pitch = midi % 12 var name = notesInOrder[pitch] if (name === '-') { name = '^' + notesInOrder[pitch-1] } if (octave > 4) { name = name.toLowerCase() octave -= 5 while (octave > 0) { name += "'" octave-- } } else { while (octave < 4) { name += ',' octave++ } } return name } module.exports = {noteToMidi: noteToMidi, midiToNote: midiToNote};