欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript實(shí)現(xiàn)簡(jiǎn)單小鋼琴有聲彈奏效果

 更新時(shí)間:2024年02月24日 17:01:13   作者:軟件技術(shù)愛好者  
用HTML5+javascript實(shí)現(xiàn)的小鋼琴,按下鋼琴鍵上的相應(yīng)字母用或用鼠標(biāo)點(diǎn)擊鋼琴鍵發(fā)聲,javascript代碼包含了對(duì)鼠標(biāo)按下、移動(dòng)和松開,以及鍵盤按下的事件監(jiān)聽

用HTML5+javascript實(shí)現(xiàn)的小鋼琴,按下鋼琴鍵上的相應(yīng)字母用或用鼠標(biāo)點(diǎn)擊鋼琴鍵發(fā)聲。javascript代碼包含了對(duì)鼠標(biāo)按下、移動(dòng)和松開,以及鍵盤按下的事件監(jiān)聽。

小鋼琴代碼原理

代碼中使用了JavaScript中的箭頭函數(shù)(Arrow Function)語(yǔ)法。箭頭函數(shù)是ES6中的一種函數(shù)聲明方式,它的語(yǔ)法比較簡(jiǎn)潔。箭頭函數(shù)的基本格式是:(參數(shù)) => {函數(shù)體}。

keys.forEach(key => { })

箭頭函數(shù)的參數(shù)是key,表示forEach遍歷的每個(gè)元素。

key.addEventListener('click', () => { })

它是給每個(gè)琴鍵添加鼠標(biāo)點(diǎn)擊事件的代碼。addEventListener 方法用于給元素添加事件監(jiān)聽器。這里添加了一個(gè)點(diǎn)擊事件的監(jiān)聽器,當(dāng)用戶點(diǎn)擊琴鍵時(shí),箭頭函數(shù)會(huì)被執(zhí)行。

小鋼琴源碼

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>用HTML5實(shí)現(xiàn)的小鋼琴2</title>
  <style>
    .key {
      width: 50px;
      height: 150px;
      border: 1px solid black;
      display: inline-block;
      margin: 5px;
      text-align: center;
      line-height: 150px;
      cursor: pointer;
      position: relative;
      transition: transform 0.1s;
    }
    .key.active {
      transform: translateY(4px);
    }
  </style>
</head>
<body>
  <div id="A" class="key">A</div>
  <div id="S" class="key">S</div>
  <div id="D" class="key">D</div>
  <div id="F" class="key">F</div>
  <div id="G" class="key">G</div>
  <div id="H" class="key">H</div>
  <div id="J" class="key">J</div>
  <div id="K" class="key">K</div>
  <script>
    const audioContext = new (window.AudioContext || window.webkitAudioContext)();
    let isMouseDown = false; // 記錄鼠標(biāo)是否被按下
    function playSound(frequency) {
      const oscillator = audioContext.createOscillator();
      oscillator.type = 'sine';
      oscillator.frequency.setValueAtTime(frequency, audioContext.currentTime);
      oscillator.connect(audioContext.destination);
      oscillator.start();
      oscillator.stop(audioContext.currentTime + 0.3);
    }
    const keys = document.querySelectorAll('.key');
    keys.forEach(key => {
      key.addEventListener('mousedown', (event) => {
        isMouseDown = true; // 設(shè)置鼠標(biāo)按下狀態(tài)為true
        playNoteFromElement(event.target);
      });
      key.addEventListener('mouseenter', (event) => {
        if (isMouseDown) { // 如果鼠標(biāo)處于按下狀態(tài),則播放音符
          playNoteFromElement(event.target);
        }
      });
      // 鼠標(biāo)按下并移動(dòng)到其他琴鍵時(shí),無(wú)需額外mouseup事件監(jiān)聽
    });
    // 監(jiān)聽文檔的mouseup事件,以處理鼠標(biāo)在琴鍵外松開的情況
    document.addEventListener('mouseup', () => {
      isMouseDown = false;
    });
    // 監(jiān)聽鍵盤按下事件
    document.addEventListener('keydown', (event) => {
      const keyName = event.key.toUpperCase(); // 獲取按鍵名并轉(zhuǎn)為大寫
      const keyElement = document.getElementById(keyName); // 獲取對(duì)應(yīng)的琴鍵元素
      if (keyElement && !keyElement.classList.contains('active')) {
        playNoteFromElement(keyElement);
      }
    });
    function playNoteFromElement(element) {
      const note = element.textContent;
      playNote(note);
      animatePress(element);
    }
    function animatePress(keyElement) {
      keyElement.classList.add('active');
      setTimeout(() => {
        keyElement.classList.remove('active');
      }, 100);
    }
    function playNote(note) {
      let frequency;
      switch (note) {
        case 'A':
          frequency = 261.63;
          break;
        case 'S':
          frequency = 293.66;
          break;
        case 'D':
          frequency = 329.63;
          break;
        case 'F':
          frequency = 349.23;
          break;
        case 'G':
          frequency = 392.00;
          break;
        case 'H':
          frequency = 440.00;
          break;
        case 'J':
          frequency = 493.88;
          break;
        case 'K':
          frequency = 523.25;
          break;
        default:
          return;
      }
      playSound(frequency);
    }
  </script>
</body>
</html>

音高頻率對(duì)照表參考

音高(英語(yǔ):pitch)在音樂(lè)領(lǐng)域里指的是人類心理對(duì)音符基頻之感受。

聲的本質(zhì)是機(jī)械波,所以聲速一定時(shí),音的高低是由機(jī)械波的頻率和波長(zhǎng)決定的。頻率高、波長(zhǎng)短,則音"高",反之,頻率低、波長(zhǎng)長(zhǎng),則音"低"。

音高是聲音的三大特征之一,區(qū)別于音強(qiáng)和音色,音調(diào)高只能表示音的頻率高和波長(zhǎng)短,不能表示振幅大和音強(qiáng)強(qiáng),這一點(diǎn)很多初學(xué)者容易混淆出錯(cuò),進(jìn)入誤區(qū)。我們要把這兩者區(qū)分開來(lái),不能混為一談。而音色則是聲音的其他波段(如泛音)所決定,這些波段不影響音高,所以音高與音色亦無(wú)關(guān)系。

音高頻率對(duì)照表

頻率,單位為赫茲。括號(hào)內(nèi)為距離中央C(261.63赫茲)的半音距離。
八度→
音名↓
0123456789
C16.352(−48)32.703(−36)65.406(−24)130.81(−12)261.63(0)523.25(+12)1046.5(+24)2093.0(+36)4186.0(+48)8372.0(+60)
C?/D?17.324(−47)34.648(−35)69.296(−23)138.59(−11)277.18(+1)554.37(+13)1108.7(+25)2217.5(+37)4434.9(+49)8869.8(+61)
D18.354(−46)36.708(−34)73.416(−22)146.83(−10)293.66(+2)587.33(+14)1174.7(+26)2349.3(+38)4698.6(+50)9397.3(+62)
D?/E?19.445(−45)38.891(−33)77.782(−21)155.56(−9)311.13(+3)622.25(+15)1244.5(+27)2489.0(+39)4978.0(+51)9956.1(+63)
E20.602(−44)41.203(−32)82.407(−20)164.81(−8)329.63(+4)659.26(+16)1318.5(+28)2637.0(+40)5274.0(+52)10548(+64)
F21.827(−43)43.654(−31)87.307(−19)174.61(−7)349.23(+5)698.46(+17)1396.9(+29)2793.8(+41)5587.7(+53)11175(+65)
F?/G?23.125(−42)46.249(−30)92.499(−18)185.00(−6)369.99(+6)739.99(+18)1480.0(+30)2960.0(+42)5919.9(+54)11840(+66)
G24.500(−41)48.999(−29)97.999(−17)196.00(−5)392.00(+7)783.99(+19)1568.0(+31)3136.0(+43)6271.9(+55)12544(+67)
G?/A?25.957(−40)51.913(−28)103.83(−16)207.65(−4)415.30(+8)830.61(+20)1661.2(+32)3322.4(+44)6644.9(+56)13290(+68)
A27.500(−39)55.000(−27)110.00(−15)220.00(−3)440.00(+9)880.00(+21)1760.0(+33)3520.0(+45)7040.0(+57)14080(+69)
A?/B?29.135(−38)58.270(−26)116.54(−14)233.08(−2)466.16(+10)932.33(+22)1864.7(+34)3729.3(+46)7458.6(+58)14917(+70)
B30.868(−37)61.735(−25)123.47(−13)246.94(−1)493.88(+11)987.77(+23)1975.5(+35)3951.1(+47)7902.1(+59)15804(+71)

總結(jié)

到此這篇關(guān)于javascript實(shí)現(xiàn)簡(jiǎn)單小鋼琴有聲彈奏效果的文章就介紹到這了,更多相關(guān)javascript實(shí)現(xiàn)簡(jiǎn)單小鋼琴內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript事件循環(huán)同步任務(wù)與異步任務(wù)

    JavaScript事件循環(huán)同步任務(wù)與異步任務(wù)

    這篇文章主要介紹了JavaScript事件循環(huán)同步任務(wù)與異步任務(wù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • echarts動(dòng)態(tài)渲染柱狀圖背景顏色及頂部數(shù)值方法詳解

    echarts動(dòng)態(tài)渲染柱狀圖背景顏色及頂部數(shù)值方法詳解

    在使用echarts時(shí),有時(shí)需要給柱狀圖設(shè)置背景,下面這篇文章主要給大家介紹了關(guān)于echarts動(dòng)態(tài)渲染柱狀圖背景顏色及頂部數(shù)值的相關(guān)資料,文中通過(guò)圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • JavaScript中函數(shù)柯里化示例詳解

    JavaScript中函數(shù)柯里化示例詳解

    JavaScript 函數(shù)柯里化是將一個(gè)多參數(shù)的函數(shù)轉(zhuǎn)換為一系列單參數(shù)的函數(shù),每個(gè)單參數(shù)函數(shù)都可以接收一個(gè)參數(shù),并返回一個(gè)新的函數(shù),本文將通過(guò)代碼示例給大家講講JavaScript函數(shù)柯里化的優(yōu)缺點(diǎn),需要的朋友可以參考下
    2023-09-09
  • 使用原生js編寫一個(gè)簡(jiǎn)單的框選功能方法

    使用原生js編寫一個(gè)簡(jiǎn)單的框選功能方法

    這篇文章主要介紹了使用原生js編寫一個(gè)簡(jiǎn)單的框選功能方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • JS實(shí)現(xiàn)的五級(jí)聯(lián)動(dòng)菜單效果完整實(shí)例

    JS實(shí)現(xiàn)的五級(jí)聯(lián)動(dòng)菜單效果完整實(shí)例

    這篇文章主要介紹了JS實(shí)現(xiàn)的五級(jí)聯(lián)動(dòng)菜單效果,結(jié)合完整實(shí)例形式分析了js多級(jí)聯(lián)動(dòng)菜單的完整實(shí)現(xiàn)步驟,涉及JS數(shù)組遍歷、擴(kuò)展及元素節(jié)點(diǎn)操作相關(guān)技巧,需要的朋友可以參考下
    2017-02-02
  • 原生JS實(shí)現(xiàn)音樂(lè)播放器

    原生JS實(shí)現(xiàn)音樂(lè)播放器

    這篇文章主要為大家詳細(xì)介紹了原生JS音樂(lè)播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • 一文詳解Electron 電源狀態(tài)管理

    一文詳解Electron 電源狀態(tài)管理

    這篇文章主要為大家介紹了Electron 電源狀態(tài)管理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • BootStrap注意事項(xiàng)小結(jié)(五)表單

    BootStrap注意事項(xiàng)小結(jié)(五)表單

    這篇文章主要介紹了BootStrap注意事項(xiàng)小結(jié)(五)表單的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,,需要的朋友可以參考下
    2017-03-03
  • jquery在Chrome下獲取圖片的長(zhǎng)寬問(wèn)題解決

    jquery在Chrome下獲取圖片的長(zhǎng)寬問(wèn)題解決

    需要獲得圖片的長(zhǎng)寬,在IE、FireFox下均正常,就TMD在Chrome中不行,有人說(shuō)是Chrome版本的問(wèn)題,最終終于找到了解決方法,在這與大家分享下
    2013-03-03
  • JavaScript事件方法(實(shí)例講解)

    JavaScript事件方法(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇JavaScript事件方法(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06

最新評(píng)論