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

本文涉及的产品
全域智能运维平台 STAROps 免费试用,10000 积分
简介: 本文介绍基于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实践技能 课程大纲: 云原生开发和交付:云研发时代软件交付的挑战与云原生工程实践 云原生开发、运行基础设施:无差别的开发、运行环境 自动部署:构建可靠高效的应用发布体系 持续交付:建立团队协同交付的流程和流水线 质量守护:构建和维护测试和质量守护体系 安全保障:打造可信交付的安全保障体系 建立持续反馈和持续改进闭环
相关文章
|
1月前
|
缓存 druid Java
[010][数据模块]多数据源管理器在 Hibernate 多租户中的应用
本文介绍基于`DataSourceRoutingManager`的Hibernate数据库级多租户方案:通过动态路由与连接池模板复制(支持HikariCP/DBCP2/Druid),实现租户专属数据源的懒加载、缓存与无缝集成,配置简洁、扩展性强,已落地多个SaaS生产项目。(239字)
89 2
|
Kubernetes Cloud Native 数据可视化
【云原生】Rancher部署k8s集群流程—2023.03
【云原生】Rancher部署k8s集群流程—2023.03
1958 0
|
3月前
|
存储 弹性计算 人工智能
阿里云优惠券领取与使用图文教程参考:2026年购买云服务器等云产品省钱必看
阿里云2026年提供多种优惠券降低用户上云成本,包括AI焕新季礼包(个人360元、企业1728元)、学生无门槛300元优惠券及企业迁云与出海补贴券。用户可通过阿里云权益中心、高校计划云工开物页面及企业上云第一站页面等指定入口领取。使用时,需确保在有效期内,登录阿里云控制台,在费用中心选择优惠券,并在购买云产品结算时勾选使用。通过合理利用这些优惠券,用户可在购买云服务器ECS等产品时显著节省开支。
|
30天前
|
JSON 安全 API
openapi swagger skills
本技能专为生成、审查与优化OpenAPI/Swagger文档而设计,遵循API优先原则,支持OpenAPI 3.1(默认)、3.0.x及Swagger 2.0。涵盖路径设计、HTTP语义、参数/响应/安全定义、错误模型、分页、异步任务等18项规范,确保文档准确、一致、可读、工具友好,适用于设计评审、文档生成、契约对齐与测试等场景。(239字)
195 3
|
存储 Kubernetes 监控
Kubecost | Kubernetes 开支监控和管理 🤑🤑🤑
Kubecost | Kubernetes 开支监控和管理 🤑🤑🤑
|
1月前
|
人工智能 运维 安全
我对AI智能体平台架构设计经验
软件架构师罗小东,深耕AI智能体平台架构设计与工程落地。本文系统阐述AIP五层架构(应用层、平台层、支撑层、运营层、运维层),聚焦分层边界、能力抽象、运行约束与可信保障,强调“可控性、可扩展性、可维护性”的务实平衡,为AI工程化提供可复用的实践范式。(239字)
我对AI智能体平台架构设计经验
|
5月前
|
人工智能 运维 监控
2025 AI 原生编程挑战赛收官,5500+ 战队攻关 AIOps 工程化闭环
让天下没有难查的故障,决赛现场精彩回顾。
|
人工智能 JavaScript Devops
如何在云效中使用 DeepSeek 等大模型实现 AI 智能评审
除了代码智能补全外,AI 代码智能评审是 DevOps 领域受开发者广泛关注的另一场景了。本文,我们将结合云效代码管理 Codeup、流水线 Flow 和 DeepSeek,分享一种企业可快速自主接入,即可实现的 AI 智能评审解决方案,希望给大家一些启发。
739 18
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
1641 13
|
Kubernetes Serverless 云计算
OpenKruise社区Rollouts组件重磅更新:即插即用的蓝绿发布能力
Kruise Rollouts作为OpenKruise社区提供的旁路组件,其能对原始工作负载进行增强。蓝绿发布是Kruise Rollouts在0.6.0版本中新引入的能力。