2013-01-13 25 views
11

明確にする:私はMIDIファイルを生成したくないし、MIDIファイルを再生したくない。私はその場でMIDIノートを演奏したい。javascriptで任意のMIDIノートを再生するにはどうすればよいですか?

MIDIライブラリーとしてhttps://github.com/mudcube/MIDI.jsを使ってみましたが、多少動作します。

私はMIDI.noteOn(0,midiNumber,100);に電話してノートを再生することができます。しかし、これは数秒間音符を鳴らし、私がMIDI.noteOffに決して電話していなくてもテーパします。

私はこれがMIDIの動作を意図しているとは思いません。私はnoteOnを呼び出すことができ、noteOffが呼び出されるまでノートの再生と持続を望みます。

対象ブラウザ:現代のfirefox/chrome。あなたが与えられたノートをロードし、それを再生しますplayChannelを見ることができるように

var playChannel = function (id) { 
    var note = notes[id]; 
    if (!note) return; 
    var nid = (channel_nid + 1) % channels.length; 
    var time = (new Date()).getTime(); 
    var audio = channels[nid]; 
    channel_map[note.id] = audio; 
    audio.src = MIDI.Soundfont[note.id]; 
    audio.volume = volume; 
    audio.play(); 
    channel_nid = nid; 
}; 

答えて

9

それはバグMIDI.jsのバージョンです。 autoloop属性がないので、繰り返さないので、noteOffの呼び出しは必要ありません。 audio要素を自動ループに設定すると、これを修正できます。

+2

うわー。バグを発見してよかった。 +1、プルリクエストをしたいですか? –

+0

@ H2CO3:私は現在私のPCにいません。私はまだgithubインターフェイスに慣れていません(私はbitbucketが好きです)。しかし、私はいくつかのアプリケーションがこのバグを使用し、 'noteOff'を使用しなかったので、動作しなくなると考えています(結局可能かもしれません)。おそらく〜11時(21時UTC + 1)。 – Zeta

+0

ああ、私はコードを読んでいる間にこのバグに気づきましたが、その修正が何であるかあまりにもわかりませんでした。 noteOff()に実装されていないコードもありますので、このバグは意図した設計上の欠陥である可能性があります。私は、レガシー目的のためにコードを修正することに対するあなたの喜びに同意します。代わりにフォーク要求を行う必要があります。今のところ、私はこれを猿のパッチにして、それがうまくいくかどうかを見ます。 –

1

Google for Web MIDI API。 これはまだすべてのブラウザに実装されているわけではありませんが、GitHubのChris Wilsonによるpolyfillがあります。

2

異なる機器は異なる動作をします。ピアノには「固有の」音符がありますが、オルガンはありません。

また、noteOnおよびnoteOffは実装に依存します。 HTML5実装のmodcu.beは、各ノートごとにOGGファイルを再生し、noteOffはまったく気にしません。 OGGが終了すると、音が止まります。この場合、autoloopはピアノのためには役に立ちません。

関連する問題