在你的项目中使用 dapume-js
dapume-js 是一个零依赖的 TypeScript 库,可在 Node 与浏览器中把线性乐谱解析为乐谱对象,并渲染为 MIDI。本站正是基于它构建的示例。
安装
用你喜欢的包管理器安装:
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;
}