介紹
之前寫了一篇曲譜的一些操作,包括:音符著色和高亮區(qū)域。最近又有了一些新需求,所以繼續(xù)開坑
需求一:區(qū)分左右手音符
我們的曲譜有上下兩行,分別為右手和左手,前面寫的方法里其實有提到過部分代碼
osmd.cursor.iterator.currentVoiceEntries[0].ParentSourceStaffEntry.parentStaff.id
通過這個id來判斷當(dāng)前音符是左手還是右手,id = 1 為右手,id > 1 為左手
這里要注意下 osmd.cursor.iterator.currentVoiceEntries 有可能是 undefined ,所以要加個判斷
let currentVoiceEntries = osmd.cursor.iterator.currentVoiceEntries
if (typeof currentVoiceEntries != "undefined") {
for (i = 0; i < currentVoiceEntries.length; i++) {
// 右手
if (currentVoiceEntries[i].ParentSourceStaffEntry.parentStaff.id == 1) {
let note = currentVoiceEntries[i].notes[0]
drawNoteColor(note, state)
}
// 左手
if (currentVoiceEntries[i].ParentSourceStaffEntry.parentStaff.id > 1) {
let note = currentVoiceEntries[i].notes[0]
drawNoteColor(note, state)
}
}
}
需求二:獲取曲譜拍號
這個就直接上代碼把哈哈哈
function getRhythm() {
const firstSourceMeasure = osmd.GraphicSheet.ParentMusicSheet.getFirstSourceMeasure()
const instruction = firstSourceMeasure.firstInstructionsStaffEntries[0].Instructions[2]
return { numerator: instruction.numerator, denominator: instruction.denominator }
}
返回的值分別對應(yīng)拍號的分子分母,即一小節(jié)幾拍和幾分音符為一拍
以上為版本 0.9.5 的獲取方式,稍微麻煩點(diǎn),后續(xù)會提供直接獲取的方式,代碼如下:
osmd.sheet.SourceMeasures[0].RhythmPrinted.numerator
osmd.sheet.SourceMeasures[0].RhythmPrinted.denominator
現(xiàn)在 1.0.0 版本已經(jīng)更新,可以使用上述方法了
結(jié)尾
這個 osmd 網(wǎng)上相關(guān)文檔實在是太少了,后來在我一番尋找下找到了一個聊天室,里面有挺多人問了問題,全部看一遍還是能學(xué)到好多的
https://gitter.im/opensheetmusicdisplay/opensheetmusicdisplay
后面不知道還會不會繼續(xù)開坑這個,看還有沒有需求吧哈哈