MusicXML

Swift Version Platforms Build Status Code Coverage

一个 正在开发中 的 Swift 中 musicXML 规范的实现。

这个项目的目标是允许 Swift 用户在 Swift 支持的任何平台上,以类型丰富的方式读取、操作和写入 musicXML 文件。

Hello, world!

让我们从 musicXML 文档 中构建 "Hello, world!" 乐谱示例。 这首音乐作品由一个小节组成,其中包含一个基于 4/4 拍的中音 C 全音符。

图形表示

图形化渲染时,此乐谱示例应如下所示

Hello, world!

XML 表示

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>

MusicXML 表示

在 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)

🧬 将 musicXML 解码为 Score

您可以通过多种方式解码 Score

let fromData = try Score(data: data)
let fromString = try Score(string: string)
let fromURL = try Score(url: url)

🚧 正在开发中:将 Score 编码为 musicXML

预发布版本 0.3.0 将完成从 Score 编码为 musicXML 格式的过程。

开始使用

要求

使用 Swift Package ManagerMusicXML 模块包含到您的项目中。

用法

如果您想在自己的项目中使用 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

预发布版本 0.3.0 将通过完成 抽象音乐内容编码 实现来定义。 LilyPond 测试套件测试将转换为往返测试,以确保管道畅通。

0.4.0

预发布版本 0.4.0 将通过完善 MusicXML 包公开的公共接口来定义。 在此之前,公共初始化程序可能有些笨拙。

更多资源

有关 musicXML 如何构建的更多信息,请参阅 MusicXML XSD Schema Reference