一个 正在开发中 的 Swift 中 musicXML 规范的实现。
这个项目的目标是允许 Swift 用户在 Swift 支持的任何平台上,以类型丰富的方式读取、操作和写入 musicXML 文件。
让我们从 musicXML 文档 中构建 "Hello, world!" 乐谱示例。 这首音乐作品由一个小节组成,其中包含一个基于 4/4 拍的中音 C 全音符。
图形化渲染时,此乐谱示例应如下所示
musicXML 表示如下
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE score-partwise PUBLIC
"-//Recordare//DTD MusicXML 3.1 Partwise//EN"
"http://www.musicxml.org/dtds/partwise.dtd">
<score-partwise version="3.1">
<part-list>
<score-part id="P1">
<part-name>Music</part-name>
</score-part>
</part-list>
<part id="P1">
<measure number="1">
<attributes>
<divisions>1</divisions>
<key>
<fifths>0</fifths>
</key>
<time>
<beats>4</beats>
<beat-type>4</beat-type>
</time>
<clef>
<sign>G</sign>
<line>2</line>
</clef>
</attributes>
<note>
<pitch>
<step>C</step>
<octave>4</octave>
</pitch>
<duration>4</duration>
<type>whole</type>
</note>
</measure>
</part>
</score-partwise>
在 Swift 中构建 "Hello, world!" 示例的代码如下所示
let note = Note(
pitch: Pitch(step: .c, octave: 4),
duration: 4,
type: .whole
)
let key = Key(fifths: 0)
let time = Time(4,4)
let clef = Clef(sign: .g, line: 2)
let attributes = Attributes(
divisions: 1,
keys: [key],
times: [time],
clefs: [clef]
)
let measure = Partwise.Measure(
number: "1",
musicData: [
.attributes(attributes),
.note(note)
]
)
let part = Partwise.Part(id: "P1", measures: [measure])
let header = Header(
partList: [
.part(ScorePart(id: "P1", name: "Music"))
]
)
let traversal = Partwise(header: header, parts: [part])
let score = Score.partwise(traversal)
您可以通过多种方式解码 Score
let fromData = try Score(data: data)
let fromString = try Score(string: string)
let fromURL = try Score(url: url)
预发布版本 0.3.0 将完成从 Score
编码为 musicXML 格式的过程。
使用 Swift Package Manager 将 MusicXML
模块包含到您的项目中。
如果您想在自己的项目中使用 MusicXML
模块,请将 MusicXML
包添加到您的 Package.swift
文件的 dependencies
部分
let package = Package(
name: ...,
products: [ ... ],
dependencies: [
...,
.package(url: "https://github.com/dn-m/MusicXML", from: "0.2.1")
],
targets: [ ... ]
)
要为 MusicXML
包贡献代码,请克隆 git
仓库
git clone https://github.com/dn-m/MusicXML && cd MusicXML
构建包
swift build
运行测试
swift test
如果您使用 Xcode IDE,请使用 Swift Package Manager 生成一个 .xcodeproj
文件
swift package generate-xcodeproj
即将发布的预发布版本将侧重于完成不同的任务。
预发布版本 0.3.0 将通过完成 抽象音乐内容 的 编码 实现来定义。 LilyPond 测试套件测试将转换为往返测试,以确保管道畅通。
预发布版本 0.4.0 将通过完善 MusicXML
包公开的公共接口来定义。 在此之前,公共初始化程序可能有些笨拙。
有关 musicXML 如何构建的更多信息,请参阅 MusicXML XSD Schema Reference。