The Swift Package Index logo.Swift Package Index

追踪 Swift 6 严格并发检查对数据竞争安全性的采用情况。有多少 Package 为 Swift 6 做好准备

当使用 Xcode 项目时

当使用 Swift Package Manager 清单时

选择一个 package 版本

最新版本


在 Swift 中实现的 MusicXML 规范




Swift 音乐可扩展语言

此软件包是原始 dn-m/MusicXML 的一个分支。

Swift Version Platforms

一个 正在进行中 的 Swift 中 musicXML 规范的实现。

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

你好,世界!

让我们从 musicXML 文档中构建“Hello, world!”乐谱示例。 这个音乐作品由一个小节组成,该小节包含以 4/4 拍为基础的中音 C 上的全音符。

图形表示

以图形方式呈现时,此乐谱示例应如下所示

SVG

XML 表示

musicXML 表示如下所示

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <!DOCTYPE score-partwise PUBLIC
        "-//Recordare//DTD MusicXML 4.0 Partwise//EN"
        "http://www.musicxml.org/dtds/partwise.dtd">
    <score-partwise version="4.0">
      <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(
        [
            Time.Signature(
                beats: ["4"],
                beatType: ["4"]
            )] 
    )],
    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 ManagerSwiftMXL 模块包含到您的项目中。

开发

要为 SwiftMXL 软件包做出贡献,请克隆 git 存储库

git clone git@github.com:Treata11/SwiftMXL.git && cd SwiftMXL

构建软件包

swift build

运行测试

swift test

如果您使用 Xcode

open package.swift 或直接 xed .

开发路线图

即将发布的预发布版本将侧重于完成不同的任务。

0.3.0

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

0.4.0

预发布版本 0.4.0 将通过改进 SwiftMXL 软件包公开的公共接口来定义。 在此之前,公共初始化器可能有些笨拙。

更多资源

有关 MusicXML 结构方式的更多信息,请参阅 MusicXML XSD 架构参考