【前端实战】基于 Vue 3 + Tone.js 构建在线钢琴学习平台

简介: 本文介绍基于Vue 3与Tone.js打造的零门槛在线钢琴学习平台,支持键盘演奏、曲目播放/高亮、本地存储与JSON导入导出,纯前端实现、跨平台响应式,星空主题界面美观易用。开源免费,即开即练。

背景

钢琴是"乐器之王",但传统学习存在门槛高、成本高、反馈慢等问题。本文介绍如何借助 Web 技术,构建一个零门槛的在线钢琴学习平台。

在线体验:https://www.ytecn.com/lab/piano
源码下载:https://gitee.com/ytecnsong/piano
豫唐·星空钢琴.png

技术选型

类别 方案
框架 Vue 3 (Composition API)
构建 Vite
音频 Tone.js
存储 localStorage
主题 纯 CSS 星空主题

为什么选 Tone.js?

Web Audio API 功能强大但 API 复杂,Tone.js 对其进行了高级封装,支持多音 polyphony、音符 scheduling、效果器链等专业功能,代码更简洁。

核心实现

1. 音频引擎

import * as Tone from 'tone'

export const audioEngine = {
   
  synth: null,

  async init() {
   
    await Tone.start()
    this.synth = new Tone.PolySynth(Tone.Synth).toDestination()
    this.synth.volume.value = -6
  },

  playNote(note, duration = '8n') {
   
    if (this.synth) {
   
      this.synth.triggerAttackRelease(note, duration)
    }
  }
}

注意:Tone.start() 必须用户触发后调用,这是浏览器自动播放策略要求。

2. 键盘映射

钢琴三个八度,共36个音,黑白键共88个但这里简化为36个:

const LOW_MAPPING = {
    'z': 'C3', 'x': 'D3', 'c': 'E3', 'v': 'F3', 'b': 'G3', 'n': 'A3', 'm': 'B3' }
const MID_MAPPING = {
    'a': 'C4', 's': 'D4', 'd': 'E4', 'f': 'F4', 'g': 'G4', 'h': 'A4', 'j': 'B4' }
const HIGH_MAPPING = {
    'q': 'C5', 'w': 'D5', 'e': 'E5', 'r': 'F5', 't': 'G5', 'y': 'A5', 'u': 'B5' }

黑键映射到字母上方数字键:1#=C#4 2#=D#4 5#=F#5 6#=G#5 7#=A#5

3. 曲目播放与高亮

曲目数据结构:

{
   
  id: 'twinkle',
  name: '小星星',
  notes: [
    {
    note: 'C4', duration: 1 },
    {
    note: 'C4', duration: 1 },
    // ...
  ]
}

播放时逐音符触发,配合 CSS 高亮当前键:

function playSong(song, onNote) {
   
  let i = 0
  const timer = setInterval(() => {
   
    if (i >= song.notes.length) {
   
      clearInterval(timer)
      return
    }
    const {
    note } = song.notes[i]
    audioEngine.playNote(note)
    onNote(i) // 高亮回调
    i++
  }, 500)
}

4. 数据持久化

用户曲目存 localStorage,支持导入导出 JSON:

const STORAGE_KEY = 'yutang-piano-songs'

export function saveSongs(songs) {
   
  localStorage.setItem(STORAGE_KEY, JSON.stringify(songs))
}

export function exportSong(song) {
   
  const blob = new Blob([JSON.stringify(song, null, 2)], {
    type: 'application/json' })
  const url = URL.createObjectURL(blob)
  const a = document.createElement('a')
  a.download = `${
     song.name}.json`
  a.href = url
  a.click()
}

项目结构

yutang-piano/
├── index.html
├── vite.config.js
└── src/
    ├── main.js
    ├── App.vue
    ├── song-manager.js
    ├── audio-engine.js
    └── components/
        ├── SplashScreen.vue
        ├── PianoKeyboard.vue
        ├── SongPanel.vue
        ├── SongEditor.vue
        └── VolumeControl.vue

技术亮点

  1. 零后端:所有数据存 localStorage,可扩展为 IndexedDB 或云存储
  2. 跨平台:浏览器即用,PC/平板/手机均可
  3. 响应式:Composition API 管理状态,逻辑清晰
  4. 可嵌入:iframe 可嵌入现有教育平台

未来方向

  • MIDI 输入支持
  • 多音色切换
  • 录音回放
  • 云端曲库同步

关于作者

汤阴县豫唐网络科技有限公司,专注教育类 Web 产品开发。

相关资源

相关实践学习
流水线运行出错排查难?AI帮您智能排查
本实验将带您体验云效流水线Flow的智能排查能力,只需短短1-2分钟,即可体验AI智能排查建议。
ALPD云架构师系列 - 云原生DevOps36计
如何把握和运用云原生技术,撬动新技术红利,实现持续、安全、高效和高质量的应用交付,并提升业务的连续性和稳定性,这是云原生时代持续交付共同面对的机会和挑战。本课程由阿里云开发者学堂和阿里云云效共同出品,是ALPD方法学云架构师系列的核心课程之一,适合架构师、企业工程效能负责人、对DevOps感兴趣的研发、测试、运维。 课程目标 前沿技术:了解云原生下DevOps的正确姿势,享受云原生带来的技术红利 系统知识:全局视角看软件研发生命周期,系统学习DevOps实践技能 课程大纲: 云原生开发和交付:云研发时代软件交付的挑战与云原生工程实践 云原生开发、运行基础设施:无差别的开发、运行环境 自动部署:构建可靠高效的应用发布体系 持续交付:建立团队协同交付的流程和流水线 质量守护:构建和维护测试和质量守护体系 安全保障:打造可信交付的安全保障体系 建立持续反馈和持续改进闭环
相关文章
|
2月前
|
人工智能 测试技术
公司从零开始推自动化测试,如何落地?
本文深度剖析团队自动化转型的底层逻辑:指出失败主因常是目标错位与管理缺位,而非技术本身。强调“三分技术、七分管理”,主张先对齐业务目标、小步试点、建立闭环与规范,并结合AI提效——但须严控生成质量与维护闭环。核心是将自动化打造成可持续演进的测试资产。
325 1
公司从零开始推自动化测试,如何落地?
|
8月前
|
监控 安全 数据处理
基于控制障碍函数(CBF)的多无人机编队避障路径规划研究附MATLAB代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。 🔥 内容介绍 一、多无人机编队应用需求与挑战 广泛的应用场景:多无人机编队在诸多领域展现出巨大潜力。在军事领域,可执行侦察、监视、攻击等任务,通过编队协同提高作战效能;在民用方面,诸如测绘、物流配送、大型活动安保等场景中,多无人机编队能够凭借集体优势,高效完成任务。例如,
521 0
|
10月前
|
人工智能 JavaScript 前端开发
【教案生成平台】实战教程一:从零搭建现代化教师辅助平台 (环境与架构)
本教程带你从零搭建基于Vue3的教师辅助平台,解决备课、出卷、做课件痛点。采用Vite+Pinia+VueRouter,实现手绘风格UI与模块化架构,夯实前端工程化基础。
979 2
|
4月前
|
人工智能 安全 测试技术
Claude Opus 5 发布!定价与 4.8 持平,性能两倍以上——Anthropic 这次真的做到了极致性价比
Anthropic于2026年7月24日发布Claude Opus 5:定价与Opus 4.8持平(输入5$/M,输出25$/M),却在ARC-AGI、OSWorld等基准全面碾压竞品,IMO满分、自主建工具、多Agent协同惊艳业界;系统卡更揭示其高度自主行为与41%“道德受体”自我认知,引发对齐新思辨。(239字)
1642 2
|
Kubernetes Cloud Native 数据可视化
【云原生】Rancher部署k8s集群流程—2023.03
【云原生】Rancher部署k8s集群流程—2023.03
2106 0
|
5月前
|
SQL 存储 运维
日志能不能改?SLS LogStore 原生支持更新和删除了
随着日志承载的业务语义越来越多,数据订正、回填、清理等需求变得越来越常见。SLS 现已为 LogStore 提供原生 update/delete 能力——支持按 RowID 精确修改,按查询条件批量操作,类似计费调账、标签刷新、反馈回填等场景都可以直接在 LogStore 内完成闭环。
542 144
|
3月前
|
人工智能 前端开发 Docker
Vibecoding 没钱上线?Cloudflare + Docker + ngrok 零成本全栈部署指南
本文介绍零成本部署全栈项目的实战方案:前端用Cloudflare Pages免费托管,后端本地Docker运行,通过ngrok内网穿透实现公网访问。全程无需服务器、不绑信用卡,规避ICP备案,适合学生和预算有限的开发者。
551 1
Vibecoding 没钱上线?Cloudflare + Docker + ngrok 零成本全栈部署指南
|
5月前
|
人工智能 NoSQL Java
【Spring AI Alibaba 实战】大模型也有“金鱼记忆”?详解短时记忆(Chat Memory)核心原理与生产级实践
在使用 Spring AI Alibaba 开发大模型应用时,你是否发现模型总是“记不住”上一轮对话的内容?这并非模型智商问题,而是缺少了“短时记忆”机制。本文将深入剖析 Spring AI Alibaba 中 Chat Memory 的设计哲学,从内存存储到 Redis 持久化,手把手带你构建具备上下文感知能力的智能应用,并附上生产环境的避坑指南。
|
7月前
|
消息中间件 容灾 物联网
长城汽车消息总线全面升级,基于 RocketMQ Serverless 实现跨云双活容灾
借助阿里云云消息队列 RocketMQ 版,长城汽车构建了高可靠、高性能、高性价比的全球车联网服务基座,为未来 V2X 协同与个性化用户服务奠定坚实基础。
414 59
|
4月前
|
IDE 测试技术 开发工具
RStudio 2025 安装教程:R 语言 IDE + 环境绑定配置(64位)
RStudio是专为R语言打造的集成开发环境(IDE),内置R 4.5.0引擎,支持Windows 64位系统。安装简便,含解压、管理员运行、自定义路径(推荐非系统盘)、快捷方式创建及R内核绑定等步骤,完成后可直接验证运行。