当前位置:首页 > VUE

vue实现电子琴

2026-02-22 16:34:32VUE

使用 Vue 实现电子琴

准备工作

安装 Vue.js 和相关的依赖。可以通过 Vue CLI 或直接引入 Vue 的 CDN 来创建项目。

npm install vue

创建电子琴组件

创建一个 Vue 组件来模拟电子琴的键盘界面。键盘通常由黑白键组成,每个键对应一个音符。

<template>
  <div class="piano">
    <div 
      v-for="(key, index) in keys" 
      :key="index" 
      class="piano-key" 
      :class="{ 'black': key.isBlack }"
      @mousedown="playSound(key.note)"
      @mouseup="stopSound(key.note)"
    >
      {{ key.note }}
    </div>
  </div>
</template>

定义键盘数据

在组件的 datasetup 函数中定义键盘的布局和音符。通常钢琴键盘由白键和黑键交替组成。

vue实现电子琴

data() {
  return {
    keys: [
      { note: 'C4', isBlack: false },
      { note: 'C#4', isBlack: true },
      { note: 'D4', isBlack: false },
      { note: 'D#4', isBlack: true },
      { note: 'E4', isBlack: false },
      { note: 'F4', isBlack: false },
      { note: 'F#4', isBlack: true },
      { note: 'G4', isBlack: false },
      { note: 'G#4', isBlack: true },
      { note: 'A4', isBlack: false },
      { note: 'A#4', isBlack: true },
      { note: 'B4', isBlack: false }
    ]
  }
}

播放和停止音符

使用 Web Audio API 或第三方库(如 Tone.js)来播放音符。以下是一个简单的实现:

methods: {
  playSound(note) {
    const audioContext = new (window.AudioContext || window.webkitAudioContext)();
    const oscillator = audioContext.createOscillator();
    oscillator.type = 'sine';
    oscillator.frequency.value = this.getFrequency(note);
    oscillator.connect(audioContext.destination);
    oscillator.start();
    this.activeOscillators[note] = oscillator;
  },
  stopSound(note) {
    if (this.activeOscillators[note]) {
      this.activeOscillators[note].stop();
      delete this.activeOscillators[note];
    }
  },
  getFrequency(note) {
    const notes = {
      'C4': 261.63,
      'C#4': 277.18,
      'D4': 293.66,
      'D#4': 311.13,
      'E4': 329.63,
      'F4': 349.23,
      'F#4': 369.99,
      'G4': 392.00,
      'G#4': 415.30,
      'A4': 440.00,
      'A#4': 466.16,
      'B4': 493.88
    };
    return notes[note];
  }
}

样式设计

为电子琴键盘添加样式,区分黑白键并使其看起来像真实的钢琴键盘。

vue实现电子琴

.piano {
  display: flex;
  position: relative;
  height: 200px;
}

.piano-key {
  height: 100%;
  border: 1px solid #000;
  background: white;
  flex: 1;
  position: relative;
  cursor: pointer;
}

.piano-key.black {
  background: black;
  height: 60%;
  position: absolute;
  width: 50px;
  z-index: 1;
  margin-left: -25px;
}

响应键盘事件

为了让用户可以通过键盘按键来弹奏电子琴,可以监听键盘事件并映射到对应的音符。

mounted() {
  window.addEventListener('keydown', this.handleKeyDown);
  window.addEventListener('keyup', this.handleKeyUp);
},
beforeDestroy() {
  window.removeEventListener('keydown', this.handleKeyDown);
  window.removeEventListener('keyup', this.handleKeyUp);
},
methods: {
  handleKeyDown(event) {
    const keyMap = {
      'a': 'C4',
      'w': 'C#4',
      's': 'D4',
      'e': 'D#4',
      'd': 'E4',
      'f': 'F4',
      't': 'F#4',
      'g': 'G4',
      'y': 'G#4',
      'h': 'A4',
      'u': 'A#4',
      'j': 'B4'
    };
    if (keyMap[event.key]) {
      this.playSound(keyMap[event.key]);
    }
  },
  handleKeyUp(event) {
    const keyMap = {
      'a': 'C4',
      'w': 'C#4',
      's': 'D4',
      'e': 'D#4',
      'd': 'E4',
      'f': 'F4',
      't': 'F#4',
      'g': 'G4',
      'y': 'G#4',
      'h': 'A4',
      'u': 'A#4',
      'j': 'B4'
    };
    if (keyMap[event.key]) {
      this.stopSound(keyMap[event.key]);
    }
  }
}

使用 Tone.js 简化音频处理

Tone.js 是一个专业的 Web 音频框架,可以简化音频播放逻辑。

npm install tone
import * as Tone from 'tone';

methods: {
  playSound(note) {
    const synth = new Tone.Synth().toDestination();
    synth.triggerAttackRelease(note, '8n');
  }
}

总结

通过 Vue 组件化开发,结合 Web Audio API 或 Tone.js,可以快速实现一个交互式的电子琴应用。用户可以通过鼠标点击或键盘按键来弹奏音符。

标签: 电子琴vue
分享给朋友:

相关文章

vue实现单点

vue实现单点

Vue 实现单点登录(SSO)方案 单点登录(SSO)允许用户在多个相关但独立的系统中使用同一组凭证登录。以下是基于 Vue 的实现方案: 基于 OAuth2/OpenID Connect 的实现…

vue observer实现

vue observer实现

Vue Observer 实现原理 Vue 的响应式系统核心是通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现的 Observer 模式。以下是关键实现细…

vue实现popup

vue实现popup

Vue 实现 Popup 弹窗 使用 Vue 原生组件 创建一个基本的 Vue 组件作为弹窗,通过 v-if 或 v-show 控制显示隐藏。 <template> <div&…

vue实现评分

vue实现评分

Vue 实现评分功能 使用组件库实现 安装 element-ui 或 ant-design-vue 这类 UI 库,它们已经内置了评分组件。 以 element-ui 为例: <te…

vue删除实现

vue删除实现

Vue 删除功能的实现方法 在 Vue 中实现删除功能通常涉及以下几个步骤: 方法一:使用数组的 splice 方法 通过索引删除数组中的元素,适用于列表渲染的场景。 methods: {…

vue实现easyui缩放

vue实现easyui缩放

实现 Vue 与 EasyUI 结合的缩放功能 在 Vue 项目中集成 EasyUI 并实现缩放功能,需要结合 EasyUI 的布局组件和 Vue 的数据绑定特性。以下是一个完整的实现方案: 安装…