2014-01-22 40 views
5

由于mudcube MIDI.js的文档似乎缺乏这方面的内容,我希望有人能够指引我朝着正确的方向前进。说白了,使用midi.js,你如何调整midi音符的持续时间和结尾?MIDI.js音符持续时间不变

对于一些背景,我创建了一个可拖动和可拖动的音符(jQuery-ui)的音乐工作人员小部件,可以添加或删除,以形成可用于播放MIDI的序列。尽管如此,一切都有效,但是,由于我试图用更复杂的时机来扩展这个小部件的功能,所以我遇到了一些问题。

看来我只能在设定的时间内播放音符,并且对于我的所有努力,尚未能够实施可能会改变此持续时间的变化,例如半音,四分音符,八音符等此外,这可能是其中一个原因,MIDI.noteOff对输出没有可感知的影响。人们会认为给定的音符会无限期地播放,直到MIDI.noteOff被调用,然而,无论是否调用noteOff,音符都会播放然后逐渐消失。

让我在这里说,我已经做了广泛的研究,在SO和网络一般到底了。我发现有类似问题的人并应用了他们的修复程序,但他们的答案对我无效。见how do I play arbitrary notes in Midi with javascriptMIDI.noteOff does not seem to work reliably

我的笔记称为noteSequence其中每个音符与noteValue(即“C4”)和noteDuration属性的对象被转换成midiSequence在功能convertToMidiSequence的序列。一切都适用于旋律序列和和弦,我只想添加持续时间功能。我还应该说,调整“延迟”变量或noteDuration属性只会增加序列播放前的时间。然后在初始延迟之后,序列以与之前相同的时序播放。

非常感谢您花了一些时间来看看这些,希望能帮到您。非常感谢。

这里是运行我的MIDI应用代码:

$(document).ready(function() { 
    MIDI.loadPlugin({ 
    soundfontUrl: GLOBALS.SOUNDFONT_URL, 
    instrument: 'acoustic_grand_piano', 
    callback: function() { 
     var channel = 0, 
      instrument = 0, 
      velocity = 127, 
      delay = 1; 
     MIDI.programChange(0, instrument); 
    } 
    }); 
}); 

function playCurrentSequence() { 
    playSequence(noteSequence); 
} 

function playSequence(sequence) { 
    var midiSequence = convertToMidiSequence(sequence); 
    for (var i = 0; i < midiSequence.length; i++) { 
    if (!(midiSequence[i] instanceof Array)) { 
     playNote(midiSequence[i], i); 
    } 
    else { 
     playChord(midiSequence[i], i); 
    } 
    } 
} 

function playNote(midiNote, notePositionInMeasure) { 
    var channel = 0, 
     velocity = 127, 
     delay = 1; 
    MIDI.noteOn(channel, midiNote, velocity, delay + notePositionInMeasure + 1); 
    MIDI.noteOff(channel, midiNote, 
    delay + midiNote.noteDuration + notePositionInMeasure + 1); 
    MIDI.Player.stop(); 
} 

function playChord(midiChord, notePositionInMeasure) { 
    var channel = 0, 
     velocity = 127, 
     delay = 1; 
    for (var i = 0; i < midiChord.length; i++) { 
    MIDI.noteOn(channel, midiChord[i], velocity, delay + notePositionInMeasure + 1); 
    MIDI.noteOff(channel, midiChord[i], 
     delay + midiChord[i].noteDuration + notePositionInMeasure + 1); 
    MIDI.Player.stop(); 
    } 
} 
+0

如何测量'noteDuration'?为什么'+ 1'? –

+0

@CL。我已经将'noteDuration'设置为4来表示整个音符(我尝试了许多其他值),但是这可能会根据正确的时序实现而改变。 '+ 1'是一个来自早期修复的保留('notePositionInMeasure'是给定音符在零索引数组中的位置,这是为了确保总是至少添加1),但它目前似乎没有改变它在那里或没有。感谢您指出,我会删除它。 – catch22

+0

[执行](http:// mudcu。noteOff的be/midi-js/js/MIDI.Plugin.js)被注释掉。我还没有找到任何有关“延迟”实际意义的文档。 –

回答

1

值得指出什么是MIDI NoteOff实际上意味着 - 通常这是对之前收到NoteOn进入释放状态的笔记本其ADSR envelope,并最终尾随无事。它在一段时间后才会释放该频道。

现在在大多数打击乐声音的情况下,没有NoteOff本身的概念 - 它们在维持阶段的初始攻击(有点用词不当)后仅仅衰减到无。钢琴上的注意事项适用于阻尼器,但此时声音可能已经消失。

其他声音可能是笔直的样本触发器,没有NoteOff的概念。

因此,行为并不一致,并且取决于您选择的语音。你有没有证实NoteOffs对它有实际意义?

+0

感谢您澄清,我不知道。我正在研究'noteOff'现在是否实际适用。但是,如果我发现它没有,是否有解决方法可以将钢琴声音延长或静音预定长度? – catch22

+0

是的。阻尼器(又名延音踏板)应该尽量延长 - 尽管不是无限期的 - 音符。将通道音量设置为零可能会阻止音符死亡。 – marko

+0

但是,就我所知,这是一个很好的观点,MIDI.js似乎没有阻尼或延长音符的选项。但我可能会误解。 – catch22