首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MIDI.js便笺持续时间不变

MIDI.js便笺持续时间不变
EN

Stack Overflow用户
提问于 2014-01-23 07:40:01
回答 1查看 1K关注 0票数 5

由于mudcube MIDI.js的文档似乎缺乏这方面的内容,我希望有人能为我指明正确的方向。简单的说,使用midi.js,如何调整midi音符的时长和结尾?

对于一些背景知识,我创建了一个带有可拖可放注释的音乐人员小部件(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属性,这些属性在函数convertToMidiSequence中转换为midiSequence。一切工作与旋律序列和和弦很好,我只想有持续时间的功能添加。我还应该说,调整'delay‘变量或noteDuration属性只会增加播放序列之前的时间。然后,在初始延迟之后,该序列以与之前相同的定时播放。

感谢您花时间查看这篇文章,希望能对您有所帮助。我将不胜感激。

下面是运行我的MIDI的适用代码:

代码语言:javascript
复制
$(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();
  }
}
EN

回答 1

Stack Overflow用户

发布于 2014-01-23 20:56:02

值得指出的是,MIDI NoteOff的实际含义--通常是指先前接收到NoteOn的音符进入其ADSR envelope的释放状态,并最终逐渐消失。它直到一段时间后才释放通道。

现在,在大多数打击乐声音的情况下,没有NoteOff本身的概念-它们只是在持续阶段的初始攻击之后衰减为零(有点用词不当)。钢琴上的音符应用了阻尼器,但在这一点上声音可能已经消失得无影无踪了。

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

因此,这种行为并不一致,很大程度上取决于您所选择的声音。你有没有验证过NoteOffs确实对它有意义?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21296450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档