2013-01-13 39 views
11

Để làm rõ: Tôi không muốn tạo tệp MIDI cũng như tôi không muốn phát tệp MIDI, tôi muốn phát ghi chú khi đang di chuyển.Làm cách nào để phát các ghi chú MIDI tùy ý bằng javascript?

Tôi đã thử sử dụng https://github.com/mudcube/MIDI.js làm thư viện MIDI và hoạt động phần nào.

Tôi có thể phát ghi chú bằng cách gọi MIDI.noteOn(0,midiNumber,100);. Tuy nhiên, điều này đóng một lưu ý cho một vài giây và sau đó tapers off ngay cả khi tôi không bao giờ gọi MIDI.noteOff.

Tôi không tin đây là cách MIDI được thiết kế để hoạt động. Tôi muốn có thể gọi noteOn và có một nốt chơi và duy trì cho đến khi noteOff được gọi.

Trình duyệt dự định: firefox/chrome hiện đại.

Trả lời

9

Đó là một lỗi phiên bản của MIDI.js:

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; 
}; 

Như bạn thấy playChannel sẽ được tải một lưu ý nhất định và chơi nó. Vì không có thuộc tính autoloop nó sẽ không lặp lại, do đó, cuộc gọi của noteOff là không cần thiết. Bạn có thể tự sửa lỗi này nếu bạn đặt phần tử audio thành tự động lặp.

+2

Wow. Rất vui được phát hiện một lỗi. 1, mặc dù bạn không muốn thực hiện một yêu cầu kéo? –

+0

@ H2CO3: Hiện tại tôi không có máy tính và tôi vẫn chưa quen với giao diện github (tôi thích bitbucket). Tuy nhiên, tôi tin rằng một số ứng dụng sử dụng lỗi này và sẽ ngừng hoạt động vì chúng không sử dụng 'noteOff' (có thể có thể sau khi tất cả). Có thể trong ~ 11h (21:00 UTC + 1). – Zeta

+0

Ah, tôi nhận thấy lỗi này trong khi đọc mã nhưng không quá chắc chắn sửa lỗi là gì. Nhìn thấy như một số các triển khai thậm chí không có bất kỳ mã nào trong noteOff() lỗi này thực sự có thể là một lỗ hổng thiết kế dự định. Tôi đồng ý với các khiếu nại của bạn về việc sửa đổi mã cho các mục đích cũ. Thay vào đó, bạn nên thực hiện yêu cầu ngã ba. Bây giờ tôi sẽ chỉ khỉ vá này và xem nếu nó hoạt động. –

1

API MIDI cho web của Google. Nó chưa được thực hiện trong tất cả các trình duyệt, nhưng có một polyfill của Chris Wilson tại GitHub.

2

Các công cụ khác nhau hoạt động khác nhau. Một cây đàn piano có ghi chú "nội tại", nhưng một cơ quan thì không.

Ngoài ra, noteOnnoteOff phụ thuộc vào việc triển khai. modcu.be trong việc triển khai HTML5 phát tệp OGG cho mỗi ghi chú và không quan tâm đến bất kỳ số nào là noteOff. Khi OGG kết thúc, âm thanh sẽ dừng lại. Và autoloop sẽ không giúp ích cho piano trong trường hợp này.

Các vấn đề liên quan