钢琴/电子琴

在线弹奏/录制/导出 MIDI

414 次访问
VIRTUAL PIANO · WEB AUDIO SYNTHESIS

在线虚拟钢琴

完整 49 键钢琴 · 键盘 / 鼠标弹奏 · 5 种音色 · 录制 / 导出

音色 & 控制

键盘

键盘映射:白键 = Z X C V B N M, A S D F G H J K L · 黑键 = S D, G H J, 2 3, 5 6 7 · 数字 1-9 切换八度

弹奏说明

音色实现:本工具用 Web Audio API 合成音色(不依赖采样库)。钢琴音 = 多个谐波叠加 + ADSR 包络;电风琴 = 方波;弦乐 = 锯齿波 + 低通;钟 = 正弦 + 长衰减。

键盘弹奏:电脑键盘对应钢琴键,按下发声,松开停止。延音模式开后即使松开也持续到声音自然衰减。

录制:点击开始录制后所有弹奏被记录为 WebM 音频,可下载保存。

关于本工具

了解工具定位 · 使用场景 · 对比优势

使用场景

🎵

旋律灵感速记

作曲人或编曲者在通勤、散步时脑中突然冒出旋律片段,传统方法是哼唱录音或手写简谱,但转成 MIDI 很麻烦。本工具直接在浏览器里用鼠标或键盘弹奏,即时录制为 MIDI 文件,回家直接导入 DAW(数字音频工作站)继续编曲,不丢失任何一个音符的时值和力度细节。

🎓

视唱练耳训练

音乐专业学生或业余爱好者需要练习音高辨别和节奏模仿,但找陪练成本高、时间不灵活。本工具提供标准音高参考,用户弹奏后能回放对比自己的音准偏差;录制功能可反复听自己的演奏,配合节拍器功能(如工具内置)进行节奏校准,实现低成本自主训练。

🎮

游戏音效原型

独立游戏开发者需要快速验证某个场景的音效或背景音乐片段,但外包作曲周期长、沟通成本高。本工具无需安装任何软件,打开网页就能用鼠标画出简单的旋律和和弦进行,导出 MIDI 后直接挂载到游戏引擎中试听,判断氛围是否匹配,大幅缩短音效原型迭代周期。

🎤

KTV 前奏练习

非专业歌手在去 KTV 前想熟悉某首歌的前奏、间奏或转调段落,但原曲伴奏带的人声干扰大、找不到纯伴奏版。本工具允许用户手动弹奏关键乐句,反复录制并调整速度,直到完全掌握节奏和音高变化,避免在 KTV 现场出现进错拍或跑调的尴尬。

🛠️

乐器维修测试

钢琴调律师或电子琴维修师傅在完成维修后,需要快速检测所有琴键的力度响应是否一致、有无哑音或连击。本工具提供全键位弹奏录制功能,通过回放波形或 MIDI 事件列表,可以逐键检查力度值、时值是否在正常范围,比凭耳朵听更精确、可量化。

对比矩阵本工具 vs 竞品 vs 传统方法

维度本工具竞品 A: Online Sequencer传统方法
数据隐私纯浏览器处理,零上传作品默认公开,需手动设为私密完全离线,无网络传输
处理速度实时弹奏,即时响应页面加载需数秒,音符编辑有轻微延迟即时,取决于乐器响应
离线可用支持,加载后断开网络仍可弹奏不支持,必须保持在线完全离线
导出格式标准 MIDI 文件MIDI + MP3 音频(需登录)无导出功能,需外接录音设备
收费模式完全免费基础免费,导出音频等功能需付费需购买实体乐器
注册要求无需注册,打开即用需注册账号才能保存作品无需注册
音色库使用 Web MIDI API 默认音色内置多种合成器音色取决于乐器本身音色
协作功能单人弹奏录制支持多人协作编辑需多人同室合奏

使用指南

上手步骤 · 输入输出 · 避坑提示

输入输出示例7 个典型场景,覆盖常规、边界与易错

输入输出说明
在键盘上依次按下 C4、E4、G4MIDI 音符:C4 (60)、E4 (64)、G4 (67) | 时长:各 0.5 秒 | 力度:100典型场景:弹奏 C 大三和弦,验证音高对应
录制一段 10 秒的即兴旋律MIDI 文件:melody_20250327_1430.mid | 音符数:32 | 总时长:10.2 秒常见用法:录制后导出 MIDI 用于编曲
按下中央 C (C4) 持续 3 秒后松开MIDI 音符:C4 (60) | 起始:0.0s | 结束:3.0s | 力度:80边界 case:长按音符的起止时间精确记录
同时按下 10 个相邻白键(C4 到 E5)MIDI 事件:10 个 Note On (60-76) | 时间戳:0.0s | 复音数:10边界 case:测试复音数上限(常见工具支持 16-32 复音)
以极轻力度(力度值 1)按下 A4MIDI 音符:A4 (69) | 力度:1 | 音量:极弱 (ppp)边界 case:力度值 1-127 范围的最低端
在 MIDI 键盘上弹奏黑键 C#4MIDI 音符:C#4 (61) | 半音偏移:+1易错 case:黑键对应升号,音高编号为 61 而非 60
导出时选择“单轨道”格式MIDI 文件:单轨道 | 格式 0 | 所有音符合并至 Track 0易错 case:单轨道 vs 多轨道格式的导出区别

常见错误对照8 个常踩的坑 · 错误 → 修复

1. 用鼠标点击代替键盘弹奏时,误触相邻键导致杂音

错误
鼠标在钢琴键上快速滑动,同时按下多个相邻键
修复
每次只点击一个键,松开后再点击下一个键;或使用键盘映射模式(如 ZXCV 对应白键)

鼠标点击会触发 mousedown 事件,滑动时连续触发多个键的按下,产生非预期和弦或连音,影响录制音轨的纯净度

2. 录制前未重置音轨,新录音叠加在旧录音上

错误
直接点击「录制」按钮开始弹奏,未检查音轨列表是否为空
修复
录制前先点击「清空音轨」或「新建工程」按钮,确保音轨列表为空

工具默认采用叠加录制模式,新录制内容会追加到现有音轨末尾,导致导出 MIDI 包含多个重叠段落,无法分离

3. 导出 MIDI 时未选择正确的音轨范围,导致文件为空或残缺

错误
导出前未勾选任何音轨,直接点击「导出 MIDI」
修复
在音轨列表中勾选需要导出的音轨(至少勾选一个),再点击导出

导出逻辑只处理被勾选的音轨;未勾选时生成空 MIDI 文件(0 个音符),播放器无法识别

4. 使用高延迟设备(如蓝牙耳机)弹奏,感觉按键与声音不同步

错误
连接蓝牙耳机后弹奏,抱怨「按下键后声音延迟半秒」
修复
使用有线耳机或设备内置扬声器弹奏;若必须用蓝牙,在系统音频设置中关闭「低延迟模式」或使用 aptX LL 编解码器

浏览器 Web Audio API 的音频输出延迟通常在 10-50ms,蓝牙音频链路额外增加 100-300ms 延迟,导致明显的按键-声音不同步

5. 把 MIDI 导出文件直接当作 MP3/WAV 播放

错误
双击导出的 .mid 文件,系统提示「无法播放此文件」
修复
将 .mid 文件导入 DAW(如 FL Studio、GarageBand)或 MIDI 播放器(如 TiMidity++、VLC),加载音色库后播放

MIDI 文件只存储音符事件(音高、力度、时长),不包含音频波形;必须由软件合成器实时渲染成声音

6. 在移动端浏览器上使用键盘快捷键弹奏,但未切换到键盘模式

错误
在手机/平板上打开工具,点击键盘图标后尝试按物理键盘(如外接蓝牙键盘),无响应
修复
在移动端浏览器中,先点击界面上的「键盘模式」按钮(通常显示为键盘图标),确保焦点在画布上;外接键盘需确认系统已识别

移动端浏览器默认不捕获物理键盘事件,必须显式将焦点设置到可键盘输入的元素(如 canvas 或 div)才能触发 keydown 事件

7. 录制时使用延音踏板(Sustain Pedal),但导出 MIDI 后踏板事件丢失

错误
录制时踩下延音踏板,导出 MIDI 后在 DAW 中播放,音符没有延音效果
修复
录制前检查工具是否支持踏板事件(通常在设置中有「启用踏板」开关);若不支持,录制后手动在 DAW 中添加 CC64 控制器事件

该工具的 MIDI 录制默认只捕获 Note On/Off 事件,不捕获控制器事件(CC);踏板属于 CC64,需要单独启用或后期编辑

8. 导出 MIDI 后,在 DAW 中播放发现所有音符力度(Velocity)相同

错误
导出 MIDI 文件,导入 DAW 后所有音符力度均为 100(或默认值)
修复
弹奏时注意按键力度(轻按 vs 重按);若使用鼠标点击,力度固定为 100;建议使用支持力度感应的 MIDI 键盘连接电脑后弹奏

鼠标点击事件不包含力度信息,工具默认使用固定力度值(100);只有通过 Web MIDI API 连接的物理 MIDI 键盘才能传递真实力度

工作原理

公式推导 · 流程图解 · 依据出处

核心公式

f = 440 × 2^{(n - 69) / 12}

变量说明

  • f — 音符频率(Hz)
  • n — MIDI 音符编号(0-127)

示例

中央 C(MIDI 编号 60)的频率计算:f = 440 × 2^{(60 - 69) / 12} = 440 × 2^{-9/12} = 440 × 2^{-0.75} ≈ 440 × 0.5946 ≈ 261.6 Hz。这是钢琴键盘上第 40 个白键(C4)的标准音高。

适用范围

适用于标准十二平均律调音的钢琴/电子琴,MIDI 协议定义(MMA/AMEI 标准)。不适用于非平均律乐器(如纯律古钢琴)或调音偏离 A4=440Hz 的乐器。

原理图

键盘交互鼠标/触屏/键盘按下 & 释放Web Audio API实时合成音色音量/包络控制MIDI 序列化音符/力度/时长事件时间戳导出.mid文件录制控制开始/停止/回放轨道叠加本地存储IndexedDB会话缓存MIDI 合并多轨合成时间轴对齐导出.mid文件实时演奏流录制回放流
用户输入 本地处理 输出结果

开发者集成

3 种主流语言 · 复制即用

// 使用 Web MIDI API 监听键盘输入并生成 MIDI 消息
// 需要用户交互(点击页面)后激活,且浏览器支持 Web MIDI API

async function initMIDI() {
  if (!navigator.requestMIDIAccess) {
    console.error('浏览器不支持 Web MIDI API');
    return;
  }
  try {
    const midiAccess = await navigator.requestMIDIAccess();
    const output = midiAccess.outputs.values().next().value;
    if (!output) {
      console.error('未找到 MIDI 输出设备');
      return;
    }
    // 监听键盘按键
    document.addEventListener('keydown', (e) => {
      // 仅处理 A-Z 键映射到 MIDI 音符(C4 开始)
      const noteMap = { 'a': 60, 's': 62, 'd': 64, 'f': 65, 'g': 67, 'h': 69, 'j': 71 };
      const note = noteMap[e.key.toLowerCase()];
      if (note) {
        // 发送 Note On 消息(0x90 = 通道 1 的 Note On)
        const msg = [0x90, note, 100]; // 力度 100
        output.send(msg);
        console.log(`按下音符: ${note}`);
      }
    });
    document.addEventListener('keyup', (e) => {
      const noteMap = { 'a': 60, 's': 62, 'd': 64, 'f': 65, 'g': 67, 'h': 69, 'j': 71 };
      const note = noteMap[e.key.toLowerCase()];
      if (note) {
        // 发送 Note Off 消息(0x80 = 通道 1 的 Note Off)
        const msg = [0x80, note, 0];
        output.send(msg);
      }
    });
  } catch (err) {
    console.error('MIDI 初始化失败:', err);
  }
}

// 调用:initMIDI();
import mido
import time

# 创建一个 MIDI 文件并写入音符
# 需要安装 mido 库:pip install mido

def create_midi_file(filename, notes, tempo=120):
    """
    生成一个简单的 MIDI 文件
    notes: 列表,每个元素为 (note_number, duration_seconds)
    """
    mid = mido.MidiFile()
    track = mido.MidiTrack()
    mid.tracks.append(track)
    
    # 设置速度(微秒每四分音符)
    microseconds_per_beat = int(60_000_000 / tempo)
    track.append(mido.MetaMessage('set_tempo', tempo=microseconds_per_beat))
    
    for note, duration in notes:
        # Note On
        track.append(mido.Message('note_on', note=note, velocity=100, time=0))
        # 等待 duration 秒(以 tick 为单位,假设 480 ticks/beat)
        ticks = int(duration * tempo * 480 / 60)
        track.append(mido.Message('note_off', note=note, velocity=0, time=ticks))
    
    mid.save(filename)
    print(f'MIDI 文件已保存: {filename}')

# 示例:C大调音阶(C4 到 C5)
notes = [
    (60, 0.5),  # C4
    (62, 0.5),  # D4
    (64, 0.5),  # E4
    (65, 0.5),  # F4
    (67, 0.5),  # G4
    (69, 0.5),  # A4
    (71, 0.5),  # B4
    (72, 1.0),  # C5(长音)
]
create_midi_file('scale.mid', notes)
package main

import (
	"fmt"
	"os"
	"time"

	"gitlab.com/gomidi/midi/v2"
	"gitlab.com/gomidi/midi/v2/drivers/rtmididrv"
)

// 需要安装:go get gitlab.com/gomidi/midi/v2
// 示例:列出 MIDI 输出设备并发送一个音符

func main() {
	// 初始化 MIDI 驱动
	drv, err := rtmididrv.New()
	if err != nil {
		fmt.Fprintf(os.Stderr, "初始化 MIDI 驱动失败: %v\n", err)
		os.Exit(1)
	}
	defer drv.Close()

	// 获取所有输出端口
	outs := drv.Outputs()
	if len(outs) == 0 {
		fmt.Println("未找到 MIDI 输出设备")
		os.Exit(0)
	}

	// 打开第一个输出设备
	out, err := outs[0].Open()
	if err != nil {
		fmt.Fprintf(os.Stderr, "打开输出设备失败: %v\n", err)
		os.Exit(1)
	}
	defer out.Close()

	// 发送 Note On(通道 1,音符 C4=60,力度 100)
	err = out.Send([]byte{0x90, 60, 100})
	if err != nil {
		fmt.Fprintf(os.Stderr, "发送 Note On 失败: %v\n", err)
		os.Exit(1)
	}
	fmt.Println("发送 Note On: C4")

	// 保持 500ms
	time.Sleep(500 * time.Millisecond)

	// 发送 Note Off(通道 1,音符 C4=60,力度 0)
	err = out.Send([]byte{0x80, 60, 0})
	if err != nil {
		fmt.Fprintf(os.Stderr, "发送 Note Off 失败: %v\n", err)
		os.Exit(1)
	}
	fmt.Println("发送 Note Off: C4")
}

常见问题

8 个高频疑问

这个在线钢琴怎么弹?用鼠标还是键盘?
两种方式都支持。用鼠标直接点击屏幕上的琴键即可发声;键盘模式默认将电脑键盘的 A S D F G H J K L 等键映射为白键,W E T Y U 等键映射为黑键(类似 GarageBand 布局)。如果键盘映射不习惯,可以在设置区自定义键位。建议先点一下键盘上的任意键确认映射生效,再开始弹奏。
弹的时候有延迟,声音跟不上按键,怎么办?
延迟通常由浏览器音频缓冲区大小和系统音频驱动共同导致。先尝试以下步骤:1) 换用 Chrome 或 Edge 浏览器(Firefox 和 Safari 的 Web Audio 延迟略高);2) 关闭其他占用音频的应用(如视频会议、直播软件);3) 在工具设置中把音频缓冲区从默认的 256 调小到 128 或 64(会略微增加 CPU 占用,但能显著降低延迟)。如果仍然卡顿,检查电脑是否同时开着多个标签页播放视频或音频。
录好的 MIDI 文件导出后,在别的软件里打开音色不对?
MIDI 文件本身只记录音符、力度、时长和控制器信息,不包含具体的音色采样。导出后在 DAW(如 FL Studio、Cubase)或宿主软件中打开时,播放音色由你当前使用的音源决定——可能是默认的 GM 钢琴音色,也可能是其他合成器。要获得和在线弹奏时一样的音色,需要将 MIDI 导入后加载相同的钢琴音源(如 Kontakt 的钢琴库)。本工具的在线音色基于 Web Audio 内置的通用钢琴波表,仅供录制参考。
为什么按 C 键,实际播放听起来不像钢琴的 C 音?
可能原因有两个:1) 浏览器默认的音频输出设备被系统效果器处理过(如 Windows 的「音效增强」或 macOS 的「音频 MIDI 设置」中的 EQ 修改),可以尝试在系统声音设置中关闭所有音效;2) 工具默认的调音基准是 A4=440Hz,如果系统或其他软件修改了基准频率,听起来会偏高或偏低。可以在工具设置区检查「调音基准」是否为 440Hz,如果不是,手动调回即可。
最多能同时按几个键?和弦会不会丢音?
理论上支持同时按下所有 88 个键(复音数无限制),但实际受浏览器和 CPU 性能限制。在 Chrome 上测试,同时按下 10 个键(一个十指和弦)时,所有键音都能正常发声。如果同时按下超过 20 个键(比如用手掌扫过一大片白键),在低端设备上可能出现个别音被丢弃或音量骤减的现象。这与 Web Audio 的音频线程调度有关,不是工具本身的限制。如果经常弹密集和声,建议关闭其他浏览器标签页以释放 CPU。
这个在线钢琴能用来练琴考级吗?和真钢琴手感差多少?
适合认音、熟悉音阶位置和简单旋律练习,但不适合替代真钢琴用于考级训练。核心差异:1) 键盘无配重,没有真钢琴的触键力度反馈(所有键按下去手感一样);2) 力度感应只能通过鼠标点击速度或键盘按键时长来模拟,无法做到像真钢琴那样通过手指下键速度控制音量;3) 踏板只能通过鼠标点击虚拟踏板或键盘快捷键控制,无法半踏板。建议用于日常预习、复习曲目或外出时保持手感,正式练习仍用真钢琴或电钢琴。
为什么录制的 MIDI 文件在播放软件里力度全是 100?
如果使用电脑键盘弹奏,所有按键的力度值在 MIDI 文件中会被记录为固定值(通常是 100 或 127),因为键盘按键无法感知按压力度。要录制带力度变化的 MIDI,需要使用鼠标点击琴键(点击速度越快力度越大),或者连接支持力度感应的 MIDI 键盘(通过 USB-MIDI 或蓝牙 MIDI 连接)。如果已经录好了固定力度的 MIDI 文件,可以在 DAW 中手动调整每个音符的力度值来模拟表情。
手机浏览器能正常弹奏吗?触屏支持怎么样?
手机浏览器(Chrome、Safari、Edge)均支持触屏弹奏。触屏模式下,手指按到琴键即刻发声,支持多点触控(最多同时 5 指)。但有两个需要注意的地方:1) 手机屏幕较小,88 键布局会缩得很窄,容易误触相邻键,建议横屏使用并打开「放大键盘」模式(只显示 2-3 个八度,可滑动切换);2) 手机浏览器在后台运行其他音频应用时可能被系统静音,弹奏前请检查手机音量设置和媒体播放权限。
选择 打开 +新窗口 esc关闭