在你的项目中使用 dapume-js

dapume-js 是一个零依赖的 TypeScript 库,可在 Node 与浏览器中把线性乐谱解析为乐谱对象,并渲染为 MIDI。本站正是基于它构建的示例。

npm versionnpm downloadslicensebundle size

安装

用你喜欢的包管理器安装:

pnpm add dapume-js
# 或:npm install dapume-js / yarn add dapume-js

核心 API

库暴露两个核心函数:parse() 把 dapume 文本解析为乐谱对象,toMidi() 把乐谱对象渲染为 MIDI 文件字节(Uint8Array)。

import { parse, toMidi } from 'dapume-js';

const score = parse(`1=C 120bpm
1234567`);

console.log(score.notes.length); // 7
const midi: Uint8Array = toMidi(score);

在 Node 中使用

解析并渲染为 MIDI,然后写入文件:

import { writeFileSync } from 'node:fs';
import { render } from 'dapume-js';

// render(text) 等价于 toMidi(parse(text))
writeFileSync('output.mid', render('1=C 120bpm\n1234567'));

在浏览器中使用

得到 MIDI 字节后,用 Blob 触发下载:

import { render } from 'dapume-js';

const bytes = render(scoreText);
const blob = new Blob([bytes], { type: 'audio/midi' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'score.mid';
a.click();
URL.revokeObjectURL(url);

更多工具函数

render() 一步完成「解析 + 渲染」;tokenize() 返回用于语法高亮的词法单元;activeNotesAt() 返回某时刻正在发声的音符(可用于播放高亮)。

import { parse, render, tokenize, activeNotesAt } from 'dapume-js';

const mid = render('1=C\n1234567');          // 解析 + 渲染
const tokens = tokenize('1=C\n[4M7]2');        // 语法高亮词法单元
const score = parse('1=C 120bpm\n1234567');
const sounding = activeNotesAt(score, 300);     // 第 300ms 正在发声的音符

类型一览

interface DapumeScore {
  tracks: DapumeNote[][]; // 按音轨分组(渲染 MIDI 用)
  notes: DapumeNote[];    // 扁平列表,按开始时刻升序
  trackCount: number;
  durationMs: number;
}

interface DapumeNote {
  trackNo: number;
  pitch: number;     // MIDI 音高,中央 C = 60
  startTime: number; // 毫秒
  duration: number;  // 毫秒
  srcStart: number;  // 源字符起始下标(用于高亮)
  srcEnd: number;
  isChord: boolean;
}