当前位置:首页 > 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 添加基本样式:

js实现launchpad

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

添加键盘控制

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

js实现launchpad

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

实现序列器功能

添加简单的步进序列器:

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中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…