由于mudcube MIDI.js的文档似乎缺乏这方面的内容,我希望有人能为我指明正确的方向。简单的说,使用midi.js,如何调整midi音符的时长和结尾?
对于一些背景知识,我创建了一个带有可拖可放注释的音乐人员小部件(jQuery-ui),可以添加或删除,以形成可以调用以播放midi的序列。到目前为止,一切都正常工作,但是,当我试图用更复杂的时间扩展这个小部件的功能时,我遇到了一些问题。
看起来我只能以设定的时长演奏音符,尽管我付出了所有的努力,但我还没有能够实现改变这个时长的变化,比如半音符,四分音符,八音符等等。另外,这可能是原因之一,MIDI.noteOff对输出没有明显的影响。人们可能会认为,给定的音符将无限期播放,直到调用MIDI.noteOff,然而,无论是否调用noteOff,音符都将播放,然后逐渐消失。
让我在这里说,我已经对SO和网络做了广泛的研究,以便弄清楚这一点。我找到了有类似问题的人,并应用了他们的修复方法,但他们的答案对我不起作用。请参阅how do I play arbitrary notes in Midi with javascript和MIDI.noteOff does not seem to work reliably
我有一个名为noteSequence的笔记序列,其中每个笔记都是一个带有noteValue的对象(即'C4')和noteDuration属性,这些属性在函数convertToMidiSequence中转换为midiSequence。一切工作与旋律序列和和弦很好,我只想有持续时间的功能添加。我还应该说,调整'delay‘变量或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();
}
}发布于 2014-01-23 20:56:02
值得指出的是,MIDI NoteOff的实际含义--通常是指先前接收到NoteOn的音符进入其ADSR envelope的释放状态,并最终逐渐消失。它直到一段时间后才释放通道。
现在,在大多数打击乐声音的情况下,没有NoteOff本身的概念-它们只是在持续阶段的初始攻击之后衰减为零(有点用词不当)。钢琴上的音符应用了阻尼器,但在这一点上声音可能已经消失得无影无踪了。
其他声音可能是没有NoteOff概念的直接样本触发器。
因此,这种行为并不一致,很大程度上取决于您所选择的声音。你有没有验证过NoteOffs确实对它有意义?
https://stackoverflow.com/questions/21296450
复制相似问题