[Open Sheet Music Display] 二:左右手及拍号

介绍

之前写了一篇曲谱的一些操作,包括:音符着色和高亮区域。最近又有了一些新需求,所以继续开坑

需求一:区分左右手音符

我们的曲谱有上下两行,分别为右手和左手,前面写的方法里其实有提到过部分代码

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

后面不知道还会不会继续开坑这个,看还有没有需求吧哈哈

你可能感兴趣的:([Open Sheet Music Display] 二:左右手及拍号)