///| 导入所需包(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 音频
///| 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()
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
中文 | English ↓
moonsic
MoonBit 音乐语义库 — 用强类型描述音乐,导出 MIDI/WAV/浏览器事件。
v2 多包架构 (25 packages)
快速开始 (v2)
v1 快速开始(已弃用)
点击展开 v1 API 示例
核心概念
@pitch.c(4)= C4 (MIDI 60)@time.rhythm_duration(unit, dots, tuplet)Note|Rest|Chord(在@score包)@timeline包)数据流 (v2):
API 速览
音高
c(4)d(4)e(4)f(4)g(4)a(4)b(4)cs(4)ds(4)fs(4)gs(4)db(4)eb(4)gb(4)ab(4)bb(4)pitch(C, Sharp, 4)时值
whole()half()quarter()eighth()sixteenth()dotted(quarter())事件
n(c(4), quarter())nv(c(4), quarter(), 64)r(half())major(c(3), half())minor(a(3), half())dimaugdom7maj7min7ch([c(4),e(4),g(4)], q())轨道与乐谱
melody([...])score1(track)score_with([tracks], bpm, ts)track.transpose(n)track.stretch(f)track.concattrack.reverse乐理
scale(root, kind, octaves)degree(root, kind, 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)文本记谱
格式:
音名[变音][八度]时值[:力度]。和弦:[音1 音2...]时值。重复:xN。导出
song.to_midi_bytes()song.to_wav_bytes()score_to_json(song)score_to_musicxml_string_checked(s, opts)曲谱结构(进阶)
score_layout.mbtscore_enhanced.mbtvalidate.mbt生成
generate.mbtrhythm.mbt协议
adapter.mbtgame_music.mbt项目结构 (v2)
可运行 CLI demo
默认 demo 会通过
packages/demo的端到端管线生成乐谱、MIDI、MusicXML、WAV、浏览器事件和游戏 IR,并输出不含二进制内容的 JSON 摘要:预期输出包含
"has_midi":true、"has_musicxml":true和"has_wav":true。命令
API 稳定性
Stable:Pitch/Duration 构造器、事件构造器、Track/Score 构造、Music 操作(transpose/stretch/repeat/concat)、Render/export(to_midi_bytes/to_wav_bytes)、核心类型
Experimental:
melody_str/score_str、roman_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 (25 packages)
Quick Start (v2)
v1 Quick Start (deprecated)
Click to expand v1 API examples
Core Concepts
@pitch.c(4)= C4 (MIDI 60)@time.rhythm_duration(unit, dots, tuplet)Note|Rest|Chord(in@scorepackage)@timelinepackage)Pipeline (v2):
@score.SimpleScore → @midi / @musicxml / @timeline → @wav / Browser / BytesPitch Shortcuts
c(4)..b(4)cs(4)..gs(4)db(4)..bb(4)Events
n(p, d)nv(p, d, v)r(d)major(r, d)/minor(r, d)dimaugdom7maj7min7Track & Score
melody([...])score1(t)score_with([tracks], bpm, ts)track.transpose/stretch/concat/reverseTheory
scale(root, kind, n)degree(root, kind, n)progression(root, kind, rns, dur)roman_progression(key, text, dur)voice_lead(chords)bass_from_progression/arpeggiateText Notation
Format:
Note[Accidental]OctaveDuration[:Velocity]. Chord:[P1 P2...]Dur. Repeat:xN.Export
song.to_midi_bytes()song.to_wav_bytes()score_to_json(song)score_to_musicxml_string_checked(s, opts)Project Structure (v2)
Runnable CLI demo
The default demo runs the
packages/demoend-to-end pipeline, producing score, MIDI, MusicXML, WAV, browser-event, and game-IR assets. It prints a JSON summary without binary payloads:The output includes
"has_midi":true,"has_musicxml":true, and"has_wav":true.Commands