2014-01-22 83 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