2012-01-31 50 views
0

所以我正在嘗試爲我正在開發的一個新項目製作一個(超級)簡單的軟件工具。我這樣做的方式類似於Garageband的「音樂打字」,其中某些筆記綁定到鍵盤上的某些鍵。我一直試圖將超級小mp3(約100kb)綁定到按鈕和按鍵。我這樣做的方式是作爲休閒:javascript和綁定鍵的問題

var a = document.createElement('audio'); 
    var s = document.createElement('audio'); 
    var d = document.createElement('audio'); 
    var f = document.createElement('audio'); 

    a.setAttribute('src', 'Sounds/a.mp3'); 

    $('.a').click(function() { 
     a.currentTime = 0; 
     a.play(); 
    }); 

    $(document).jkey('a',function(){ 
     a.currentTime = 0; 
     a.play(); 
     return false; 
    }); 

對於鍵綁定,我使用jKey jquery插件。

工作的事情(主要是),但有幾個問題:

  1. 在Chrome中,當按下鍵或按鈕,跳音,然後似乎真正快速再次重啓。 Firefox不起作用(firebug說它與.currentTime有關),但Safari完美地工作。

  2. 當拿着keydown時,我希望它不要繼續執行該函數。目前,按住鍵不停地重播,導致一個「敦敦敦頓敦敦敦敦敦敦敦」的聲音。

有關如何解決以下問題的任何建議非常感謝。我嘗試了常規的方式來綁定JavaScript中的鍵,我得到了相同的結果,所以我知道它不是jKey。

另外 - 如果任何人有任何建議如何去做這個完全不同/更好的方式,隨時告訴我!謝謝!

我還應該提到,當前時間是這樣,只要按下按鈕它就開始重放音符。

+0

我試圖尋找到像這在幾個星期前,而事實證明,所有瀏覽器之間的HTML5音頻API真的是一團糟。我放棄了,因爲沒有一個瀏覽器一直支持所有的事情來做到這一點。也許別人有一些洞察力,但AFAIK,他們還沒有準備好。 – Eli 2012-01-31 04:24:03

回答

0

我對jKey並不熟悉,但我相信大多數瀏覽器確實會產生多個keydown事件,如果按下某個鍵,所以我想這解釋了您提到的「dun dun dun dun」聲音。從一般意義上講,如果你想在按下按鍵的時候精確地做一些事情,我想你需要某種標誌,你在鍵盤上重置。我建議這樣的事情保持整潔:

var keyNotes = { 
     addNote : function(key, audioSrc) { 
      var el = document.createElement('audio'); 
      el.setAttribute('src', audioSrc); 
      // any other element init here, presumably you 
      // append it to some container, then: 

      this[key] = { 
       audio : el, 
       canPlay : true 
      }; 
     }, 
     play : function(key) { 
      var note = this[key]; 
      // if note has been defined for this key, and can be played 
      if (note && note.canPlay) { 
       note.canPlay = false; 
       note.audio.currentTime = 0; 
       note.audio.play(); 
      } 
     }, 
     stop : function(key) { 
      var note = this[key]; 
      if (note && !note.canPlay) { 
       note.canPlay = true; 
       note.audio.pause(); // or should this be .stop()? 
      } 
     } 
    }; 

keyNotes.addNote("a", "Sounds/a.mp3"); 
keyNotes.addNote("s", "Sounds/b.mp3"); 
keyNotes.addNote("d", "Sounds/c.mp3"); 
keyNotes.addNote("f", "Sounds/d.mp3"); 

$(document).keydown(function(e){ 
    keyNotes.play(noteFromKeyCode(e.which)); 
    return false; 
}).keyup(function(e){ 
    keyNotes.stop(noteFromKeyCode(e.which)); 
}); 

function noteFromKeyCode(keyCode) { 
    return String.fromCharCode(keyCode).toLowerCase(); 
} 

(你需要檢查的語法錯誤,但我希望的總體思路是顯而易見的。)

+0

這實際上工作得很好!它不能解決鉻中的口吃問題,但我沒有想到它!謝謝! – Michael 2012-01-31 12:29:30

+0

很酷。我從來沒有使用過html5音頻,所以我不知道Chrome是怎麼回事(儘管我已經注意到在使用Chrome進行一般瀏覽時,它對視頻並不擅長 - 在迴應嘗試時往往會很慢)關於鍵入/關閉,使用一個對象來跟蹤每個鍵的狀態似乎總是最簡單的方法 - 它應該同時處理幾個按鍵,這在做遊戲或音樂時很方便。 – nnnnnn 2012-01-31 13:37:11