目录
中文 | English ↓

moonsic

MoonBit 音乐语义库 — 用强类型描述音乐,导出 MIDI/WAV/浏览器事件。

v2 多包架构已发布。 v1 根包 API 已弃用,请参考 MIGRATION.md 迁移。

v2 多包架构 (25 packages)

packages/
  pitch/      音高 + 快捷构造 + MIDI/频率 + 解析
  interval/   音程计算 + 转位 + 解析
  time/       节奏时间 + RhythmDuration + TimeSignature
  scale/      音阶 + 调性 + Key
  chord/      和弦品质 + 解析 + 展开
  harmony/    罗马数字 + 声部引导
  rhythm/     节奏模板 + 模式 + Phrase
  motif/      音级动机 + 变换
  score/      SimpleScore + ScoreLayout + 构造器
  validation/ 校验报告 + profile
  json/       零依赖 JSON 解析/序列化
  parse/      统一解析 facade
  midi/       MIDI 事件 + 排序 + 字节导出 + GM 乐器
  musicxml/   MusicXML 模型 + 转换 + 字符串写入
  timeline/   NoteEvent 时间线 + 浏览器事件导出
  wav/        WAV 渲染
  game/       游戏音乐 IR
  generate/   旋律/和弦/bass/伴奏生成
  adapter/    外部生成器协议
  drums/      GM 鼓组 + 基本节拍
  transform/  SimpleTrack 纯变换
  structure/  歌曲段落 + arrange
  ffi/        string-in/string-out facade
  demo/       端到端作曲流水线

快速开始 (v2)

///| 导入所需包(moon.pkg 中配置)

///| import: pitch, time, score, midi

///|
let p = @pitch.c(4) // C4

///|
let dur = @time.rhythm_duration(@time.DurQuarter, 0, None)

///|
let vel = @score.velocity_checked(100).unwrap()

///|
let n = @score.simple_note_checked(p, dur, Some(vel)).unwrap()

///|
let track = @score.simple_track_checked([n], None, None).unwrap()

///|
let tempo = @score.tempo_checked(120).unwrap()

///|
let sig = @time.time_signature(4, 4)

///|
let score = @score.simple_score_checked([track], tempo, sig).unwrap()

///|
let midi = @midi.simple_score_to_midi_bytes_checked(score, 480).unwrap()

v1 快速开始(已弃用)

点击展开 v1 API 示例
///|
let chords = progression(c(3), Major, [I, V, VI, IV], half())

///|
let lead = melody_str("C4q D4q E4q G4q")

///|
let song = score_with([chords, lead], 120, four_four())

///|
let midi = song.to_midi_bytes() // MIDI 字节流

///|
let wav = song.to_wav_bytes() // WAV 音频

核心概念

  • Pitch — 音高 = 音名 + 变音记号 + 八度,@pitch.c(4) = C4 (MIDI 60)
  • RhythmDuration — 时值:@time.rhythm_duration(unit, dots, tuplet)
  • SimpleEvent — 轨道事件:Note | Rest | Chord (在 @score 包)
  • SimpleTrack — 有序事件序列,带 channel/program/volume/pan/mute
  • SimpleScore — 速度 + 拍号 + 多轨道
  • NoteEvent — 运行时事件:start/duration/midi/velocity/channel (在 @timeline 包)

数据流 (v2):

@score.SimpleScore → @midi / @musicxml / @timeline → @wav / Browser / Bytes

API 速览

音高

函数 结果 MIDI
c(4) d(4) e(4) f(4) g(4) a(4) b(4) 自然音 60~71
cs(4) ds(4) fs(4) gs(4) 升号 61~68
db(4) eb(4) gb(4) ab(4) bb(4) 降号 61~70
pitch(C, Sharp, 4) 完整构造

时值

函数 拍数
whole() 4.0
half() 2.0
quarter() 1.0
eighth() 0.5
sixteenth() 0.25
dotted(quarter()) 1.5

事件

函数 说明
n(c(4), quarter()) 音符(力度100)
nv(c(4), quarter(), 64) 指定力度
r(half()) 休止
major(c(3), half()) 大三和弦
minor(a(3), half()) 小三和弦
dim aug dom7 maj7 min7 其他和弦
ch([c(4),e(4),g(4)], q()) 自定义和弦

轨道与乐谱

函数 说明
melody([...]) 创建轨道
score1(track) 单轨乐谱
score_with([tracks], bpm, ts) 多轨乐谱
track.transpose(n) 移调
track.stretch(f) track.concat track.reverse 变换

乐理

函数 说明
scale(root, kind, octaves) 音阶
degree(root, kind, n) 第N级
progression(root, kind, [I,IV,V], dur) 和弦进行
roman_progression(key, "I V vi IV", dur) 文本进行
voice_lead(chords) 声部引导
bass_from_progression(chords, style, oct) 低音
arpeggiate(chords, step_dur) 琶音

文本记谱

///|
let t = melody_str("C4q D4q [E4 G4]h Rq D4q:64 x2")

///|
let s = score_str("tempo 140\ntime 3/4\nC4q D4q E4q")

格式:音名[变音][八度]时值[:力度]。和弦:[音1 音2...]时值。重复:xN

导出

函数 输出
song.to_midi_bytes() MIDI 字节流 (SMF Format 1)
song.to_wav_bytes() WAV 字节流 (44100Hz 16-bit mono)
score_to_json(song) JSON 字符串
score_to_musicxml_string_checked(s, opts) MusicXML 字符串

曲谱结构(进阶)

模块 内容
score_layout.mbt Measure/Voice/Staff/Part/ScoreLayout
score_enhanced.mbt Section/Repeat/Ending/Notation/Lyric/Tie
validate.mbt ValidationProfile + 导出就绪校验

生成

模块 内容
generate.mbt 旋律/和弦/bass/伴奏/游戏循环生成
rhythm.mbt 节奏模板/动机/模式变换

协议

模块 内容
adapter.mbt 外部生成器协议 (GenerationRequest/Response)
game_music.mbt 游戏音频 IR (Cue/Loop/Stinger/Transition)

项目结构 (v2)

moon.pkg               根包(空)
moon.mod.json          模块元数据
packages/              24 个子包
  pitch/              音高 + 快捷构造 + MIDI/频率 + 解析
  interval/           音程计算 + 转位 + 解析
  time/               节奏时间 + RhythmDuration + TimeSignature
  scale/              音阶 + 调性 + Key
  chord/              和弦品质 + 解析 + 展开
  harmony/            罗马数字 + 声部引导
  rhythm/             节奏模板 + 模式 + Phrase
  motif/              音级动机 + 变换
  score/              SimpleScore + ScoreLayout + 构造器
  validation/         校验报告 + profile
  json/               零依赖 JSON 解析/序列化
  parse/              统一解析 facade
  midi/               MIDI 事件 + 排序 + 字节导出 + GM 乐器
  musicxml/           MusicXML 模型 + 转换 + 字符串写入
  timeline/           NoteEvent 时间线 + 浏览器事件导出
  wav/                WAV 渲染
  game/               游戏音乐 IR + 校验 + JSON 导出
  generate/           旋律/和弦/bass/伴奏/loop 生成
  adapter/            外部生成器请求/响应/补丁
  drums/              GM 鼓组 + 基本节拍
  transform/          SimpleTrack 纯变换
  structure/          歌曲段落 + arrange
  ffi/                string-in/string-out facade
  demo/               端到端作曲流水线
cmd/main/             CLI 入口
web/                  浏览器编辑器 + 播放器

可运行 CLI demo

默认 demo 会通过 packages/demo 的端到端管线生成乐谱、MIDI、MusicXML、WAV、浏览器事件和游戏 IR,并输出不含二进制内容的 JSON 摘要:

moon update
moon run cmd/main

预期输出包含 "has_midi":true"has_musicxml":true"has_wav":true

命令

moon check         # 静态检查
moon test          # 运行测试套件
moon run cmd/main  # 运行端到端 CLI demo
moon fmt           # 格式化
moon info          # 更新接口

API 稳定性

Stable:Pitch/Duration 构造器、事件构造器、Track/Score 构造、Music 操作(transpose/stretch/repeat/concat)、Render/export(to_midi_bytes/to_wav_bytes)、核心类型

Experimentalmelody_str/score_strroman_progression/accompany/voice_lead、Bass/Arpeggio 生成器、Style 枚举、newv1plus 模块


moonsic

MoonBit music IR and export library with MIDI, WAV, and browser event output.

v2 multi-package architecture released. See MIGRATION.md for v1 to v2 migration.

v2 Multi-Package Architecture (25 packages)

packages/
  pitch/      pitch classes, shortcuts, MIDI/frequency, parsing
  interval/   interval quality, calculation, inversion, parsing
  time/       rational time, RhytDuration, TimeSignature
  scale/      scales, keys
  chord/      chord qualities, parsing, pitch expansion
  harmony/    roman numerals, voice leading
  rhythm/     rhythm cells, patterns, phrase fitting
  motif/      degree motifs, transforms, track conversion
  score/      SimpleScore, ScoreLayout, constructors
  validation/ validation reports, profiles
  json/       zero-dependency JSON parse/stringify
  parse/      unified parse-to-JSON facade
  midi/       MIDI events, sorting, bytes export, GM instruments
  musicxml/   MusicXML model, conversion, string writer
  timeline/   NoteEvent timeline, browser event export
  wav/        WAV rendering
  game/       game music IR, validation, JSON export
  generate/   melody, chords, bass, accompaniment generation
  adapter/    external generator request/response/patch
  drums/      GM drum helpers, basic beat generation
  transform/  pure SimpleTrack transforms
  structure/  song sections, arrangement
  ffi/        string-in/string-out facade
  demo/       end-to-end composition pipeline

Quick Start (v2)

///| Import required packages in moon.pkg

///| import: pitch, time, score, midi

///|
let p = @pitch.c(4)

///|
let dur = @time.rhythm_duration(@time.DurQuarter, 0, None)

///|
let vel = @score.velocity_checked(100).unwrap()

///|
let n = @score.simple_note_checked(p, dur, Some(vel)).unwrap()

///|
let track = @score.simple_track_checked([n], None, None).unwrap()

///|
let tempo = @score.tempo_checked(120).unwrap()

///|
let sig = @time.time_signature(4, 4)

///|
let score = @score.simple_score_checked([track], tempo, sig).unwrap()

///|
let midi = @midi.simple_score_to_midi_bytes_checked(score, 480).unwrap()

v1 Quick Start (deprecated)

Click to expand v1 API examples
///|
let chords = progression(c(3), Major, [I, V, VI, IV], half())

///|
let lead = melody_str("C4q D4q E4q G4q")

///|
let song = score_with([chords, lead], 120, four_four())

///|
let midi = song.to_midi_bytes()

///|
let wav = song.to_wav_bytes()

Core Concepts

  • Pitch — class + accidental + octave, @pitch.c(4) = C4 (MIDI 60)
  • RhythmDuration@time.rhythm_duration(unit, dots, tuplet)
  • SimpleEventNote | Rest | Chord (in @score package)
  • SimpleTrack — ordered events with channel/program/volume/pan/mute
  • SimpleScore — tempo + time signature + tracks
  • NoteEvent — runtime event: start/duration/midi/velocity/channel (in @timeline package)

Pipeline (v2): @score.SimpleScore → @midi / @musicxml / @timeline → @wav / Browser / Bytes

Pitch Shortcuts

Function Result MIDI
c(4)..b(4) natural 60-71
cs(4)..gs(4) sharp 61-68
db(4)..bb(4) flat 61-70

Events

Function Description
n(p, d) Note with default velocity
nv(p, d, v) Note with velocity
r(d) Rest
major(r, d) / minor(r, d) Triads
dim aug dom7 maj7 min7 Other chords

Track & Score

Function Description
melody([...]) Create track
score1(t) Single-track score
score_with([tracks], bpm, ts) Multi-track score
track.transpose/stretch/concat/reverse Transforms

Theory

Function Description
scale(root, kind, n) Build scale
degree(root, kind, n) Nth degree
progression(root, kind, rns, dur) Chord progression
roman_progression(key, text, dur) Text-based progression
voice_lead(chords) Voice leading
bass_from_progression / arpeggiate Generators

Text Notation

///|
let t = melody_str("C4q D4q [E4 G4]h Rq D4q:64 x2")

Format: Note[Accidental]OctaveDuration[:Velocity]. Chord: [P1 P2...]Dur. Repeat: xN.

Export

Function Output
song.to_midi_bytes() MIDI bytes (SMF Format 1)
song.to_wav_bytes() WAV bytes (44100Hz 16-bit mono)
score_to_json(song) JSON string
score_to_musicxml_string_checked(s, opts) MusicXML string

Project Structure (v2)

moon.pkg               root package (empty)
moon.mod.json          module metadata
packages/              24 sub-packages (see v2 section above)
cmd/main/              CLI entrypoint
web/                   browser editor + player

Runnable CLI demo

The default demo runs the packages/demo end-to-end pipeline, producing score, MIDI, MusicXML, WAV, browser-event, and game-IR assets. It prints a JSON summary without binary payloads:

moon update
moon run cmd/main

The output includes "has_midi":true, "has_musicxml":true, and "has_wav":true.

Commands

moon check         # static check
moon test          # run the test suite
moon run cmd/main  # run the end-to-end CLI demo
moon fmt
moon info
关于
1.8 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号