当前位置:首页 > JavaScript

js实现launchpad

2026-04-05 07:59:17JavaScript

实现 Launchpad 的基本思路

Launchpad 是一种类似音乐制作软件的网格界面,允许用户触发音频样本或 MIDI 音符。以下是通过 JavaScript 实现的基本方法。

HTML 结构

创建一个简单的网格布局,使用 <div> 元素表示每个 pad:

<div id="launchpad">
  <div class="pad" data-note="C4"></div>
  <div class="pad" data-note="D4"></div>
  <!-- 更多 pad -->
</div>

CSS 样式

为 Launchpad 和每个 pad 添加基本样式:

#launchpad {
  display: grid;
  grid-template-columns: repeat(8, 1fr);
  gap: 5px;
  width: 400px;
  height: 400px;
}

.pad {
  background-color: #333;
  border-radius: 5px;
  cursor: pointer;
}

.pad.active {
  background-color: #ff0;
}

JavaScript 功能

使用 Web Audio API 处理音频:

const audioContext = new (window.AudioContext || window.webkitAudioContext)();

document.querySelectorAll('.pad').forEach(pad => {
  pad.addEventListener('mousedown', () => {
    playNote(pad.dataset.note);
    pad.classList.add('active');
  });

  pad.addEventListener('mouseup', () => {
    pad.classList.remove('active');
  });
});

function playNote(note) {
  const oscillator = audioContext.createOscillator();
  oscillator.type = 'sine';
  oscillator.frequency.value = getFrequency(note);
  oscillator.connect(audioContext.destination);
  oscillator.start();
  oscillator.stop(audioContext.currentTime + 0.5);
}

function getFrequency(note) {
  // 返回对应音符的频率
  const notes = {
    'C4': 261.63,
    'D4': 293.66,
    'E4': 329.63,
    'F4': 349.23,
    'G4': 392.00,
    'A4': 440.00,
    'B4': 493.88
  };
  return notes[note] || 440;
}

添加键盘控制

扩展功能以支持键盘控制:

document.addEventListener('keydown', (e) => {
  const keyNoteMap = {
    'a': 'C4',
    's': 'D4',
    'd': 'E4',
    'f': 'F4',
    'g': 'G4',
    'h': 'A4',
    'j': 'B4'
  };

  if (keyNoteMap[e.key]) {
    playNote(keyNoteMap[e.key]);
    const pad = document.querySelector(`[data-note="${keyNoteMap[e.key]}"]`);
    pad.classList.add('active');
  }
});

document.addEventListener('keyup', (e) => {
  const keyNoteMap = {
    'a': 'C4',
    's': 'D4',
    'd': 'E4',
    'f': 'F4',
    'g': 'G4',
    'h': 'A4',
    'j': 'B4'
  };

  if (keyNoteMap[e.key]) {
    const pad = document.querySelector(`[data-note="${keyNoteMap[e.key]}"]`);
    pad.classList.remove('active');
  }
});

使用预录样本

替换简单的振荡器为预录音频样本:

function playSample(url) {
  fetch(url)
    .then(response => response.arrayBuffer())
    .then(arrayBuffer => audioContext.decodeAudioData(arrayBuffer))
    .then(audioBuffer => {
      const source = audioContext.createBufferSource();
      source.buffer = audioBuffer;
      source.connect(audioContext.destination);
      source.start();
    });
}

// 修改 playNote 函数
function playNote(note) {
  const sampleMap = {
    'C4': 'samples/kick.wav',
    'D4': 'samples/snare.wav'
    // 其他样本
  };
  playSample(sampleMap[note]);
}

实现序列器功能

添加简单的步进序列器:

js实现launchpad

let sequence = [true, false, true, false]; // 示例序列
let currentStep = 0;

function playSequence() {
  if (sequence[currentStep]) {
    const pads = document.querySelectorAll('.pad');
    playNote(pads[currentStep % pads.length].dataset.note);
  }
  currentStep = (currentStep + 1) % sequence.length;
}

setInterval(playSequence, 500); // 每500ms前进一步

这些代码片段展示了如何实现一个基本的 JavaScript Launchpad。可以根据需要扩展功能,如添加更多音色、效果或更复杂的序列器逻辑。

标签: jslaunchpad
分享给朋友:

相关文章

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…

js实现文字滚动

js实现文字滚动

实现文字滚动的几种方法 使用CSS动画实现滚动 通过CSS的@keyframes和transform属性可以实现平滑的文字滚动效果。 <style> .scroll-text { w…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div cl…

js实现弹框

js实现弹框

使用 alert 实现简单弹框 JavaScript 的 alert 方法可以直接显示一个简单的弹框,内容为纯文本: alert("这是一个简单的弹框"); 使用 confirm 实现确认弹框…

js实现图片滚动

js实现图片滚动

图片滚动的实现方法 使用CSS动画实现 通过CSS的animation和@keyframes可以实现简单的图片滚动效果。这种方法适合静态图片的无缝循环滚动。 <style> .scr…