介绍
之前写了一篇曲谱的一些操作,包括:音符着色和高亮区域。最近又有了一些新需求,所以继续开坑
需求一:区分左右手音符
我们的曲谱有上下两行,分别为右手和左手,前面写的方法里其实有提到过部分代码
osmd.cursor.iterator.currentVoiceEntries[0].ParentSourceStaffEntry.parentStaff.id
通过这个id
来判断当前音符是左手还是右手,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 }
}
返回的值分别对应拍号的分子分母,即一小节几拍和几分音符为一拍
以上为版本 0.9.5
的获取方式,稍微麻烦点,后续会提供直接获取的方式,代码如下:
osmd.sheet.SourceMeasures[0].RhythmPrinted.numerator
osmd.sheet.SourceMeasures[0].RhythmPrinted.denominator
现在 1.0.0
版本已经更新,可以使用上述方法了
结尾
这个 osmd
网上相关文档实在是太少了,后来在我一番寻找下找到了一个聊天室,里面有挺多人问了问题,全部看一遍还是能学到好多的
https://gitter.im/opensheetmusicdisplay/opensheetmusicdisplay
后面不知道还会不会继续开坑这个,看还有没有需求吧哈哈