2013-01-13 17 views
11

Aby wyjaśnić: Nie chcę generować pliku MIDI ani nie chcę odtwarzać pliku MIDI, chcę odtwarzać notatki MIDI w locie.Jak odtwarzać dowolne notatki MIDI za pomocą javascript?

Próbowałem używać https://github.com/mudcube/MIDI.js jako biblioteki MIDI i działa to nieco.

Jestem w stanie zagrać notatki dzwoniąc pod numer MIDI.noteOn(0,midiNumber,100);. Odtworzono to jednak na kilka sekund, a następnie zgasiłem, nawet jeśli nigdy nie zadzwonię pod numer MIDI.noteOff.

Nie wierzę w to, w jaki sposób MIDI ma działać. Chciałbym móc zadzwonić do noteOn i zagrać w nutę i utrzymywać, dopóki nie zostanie wywołana funkcja noteOff.

Zamierzone przeglądarki: nowoczesny firefox/chrome.

Odpowiedz

9

Jest to bug swoją wersję 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; 
}; 

Jak widać playChannel załaduje daną notatkę i odtworzyć go. Ponieważ nie ma atrybutu autoloop, nie będzie on się powtarzać, więc wywołanie noteOff nie jest konieczne. Możesz to naprawić samodzielnie, jeśli ustawisz element audio na auto-loop.

+2

Wow. Miło, że zauważyłem błąd. +1, ale czy nie chcesz wykonać żądania ściągnięcia? –

+0

@ H2CO3: Obecnie nie jestem na moim komputerze i nadal nie jestem przyzwyczajony do interfejsu github (wolę bitbucket). Wierzę jednak, że niektóre aplikacje używają tego błędu i przestaną działać, ponieważ nie używają 'noteOff' (może być jednak możliwe). Może za ~ 11h (21:00 UTC + 1). – Zeta

+0

Ach, zauważyłem ten błąd podczas odczytu kodu, ale nie byłem zbyt pewny, co to była poprawka. Ponieważ niektóre implementacje nie zawierają żadnego kodu w funkcji noteOff(), błąd ten może być w rzeczywistości zamierzoną wadą. Zgadzam się z twoimi obawami przed modyfikacją kodu do starszych celów. Zamiast tego powinieneś zrobić zapytanie o widelec. Na razie po prostu poprawię to i zobaczę, czy to działa. –

1

Google for Web MIDI API. To nie jest jeszcze zaimplementowane we wszystkich przeglądarkach, ale jest polyfill autorstwa Chrisa Wilsona na GitHub.

2

Różne instrumenty zachowują się inaczej. Fortepian ma "wewnętrzną" nutę off, ale organ nie.

Ponadto, noteOn i noteOff zależy od implementacji. modcu.be w implementacji HTML5 odtwarza plik OGG dla każdej nuty, a w ogóle nie interesuje go noteOff. Gdy OGG się kończy, dźwięk ustaje. A w tym przypadku nie pomoże fortepianowi autoloop.

Powiązane problemy