InstrumentKit

CI Status Latest Release Swift Compatibility Platform Compatibility License

InstrumentKit 提供对本地化乐器及其调音的类型安全访问。

目录

开发中

⚠️这个包仍在积极开发中。以下是一些后续步骤。

安装

Swift Package Manager

Swift Package Manager 内置于 Swift 工具链中,是集成 SDK 的首选方法。

除了与 Apple 平台(iOS、macOS、tvOS、watchOS)兼容之外,该软件包还与 Linux 完全兼容,使其非常适合 服务器端 Swift 项目。

对于 Swift package 项目,只需将以下行添加到 Package.swift 文件的 dependencies 部分,并将 x.x.x 替换为最新版本

dependencies: [
  .package(url: "https://github.com/bdrelling/InstrumentKit", .from: "x.x.x"),
]

对于应用程序项目,只需按照 Apple 文档 将 package 依赖项添加到您的应用程序中。

使用

模型

struct StringInstrument {
    let localizationKey: String
    let name: String
    let numberOfStrings: Int
    let numberOfCourses: Int
    let tunings: [Tuning]
}
struct Tuning {
    let localizationKey: String
    let name: String
    let notes: [Note]
}

示例

获取特定的弦乐器。

let guitar: StringInstrument = .guitar
let ukulele: StringInstrument = .ukulele
let irishBouzouki: StringInstrument = .irishBouzouki

获取所有弦乐器。

let instruments: [StringInstrument] = StringInstrument.allCases
let instruments: [StringInstrument] = .allCases

集合提供了一个 .allCases 便利扩展,因此您不必每次都写出元素的名称。

获取乐器的特定调音。

let guitarStandard: Tuning = Tuning.Guitar.standard.rawValue

获取乐器的所有调音。

let guitarTunings: [Tuning] = StringInstrument.guitar.tunings
let guitarTunings: [Tuning] = Tuning.Guitar.allTunings

allTunings 作为 allCases.map(\.rawValue) 的便利方法提供。

本地化

默认情况下,每个 StringInstrumentTuning 都会被本地化到 Locale.current。 但是,您也可以通过使用 Locale、区域设置标识符 (String) 或使用 SupportedLanguage enum 调用 .localized(to:),动态地本地化模型。

本地化一个模型。

let guitarra: StringInstrument = .guitar.localized(to: "es")
let estandard: Tuning = Tuning.Guitar.standard.localized(to: "es")

本地化一个集合的模型。

let spanishInstruments: [StringInstrument] = .allCases.localized(to: "es")
let spanishGuitarTunings: [Tuning] = Tuning.Guitar.allTunings.localized(to: "es")

API

正在寻找本地化的乐器和调音定义,但不使用 Swift? 没问题!

此包中的所有乐器和调音可以通过向 instruments.fyi 发出 API 请求来获得。 您可以获取所有乐器、特定乐器、调音等。

有关更多信息,请参阅 instruments.fyi 或访问 instruments.fyi

性能

本地化

此模块中 String 本地化的使用与 Bundle.localizedString(forKey:value:table:)NSLocalizedString 的标准使用相匹配。 通过每次都通过本地化表初始化这些字符串,确保任何使用该模块的人都可以直接获得本地化,而无需任何额外的工作,因为他们将始终使用 Locale.current 进行本地化。

字符串初始化的调音

Tuning+Definitions.swift 中看到以下内容可能会让您感到不舒服

enum Guitar: Tuning, CaseIterable {
    case standard = "standard: E2 A2 D3 G3 B3 E4"
    case dropD = "drop_d: D2 A2 D3 G3 B3 E4"
    case openD = "open_d: D2 A2 D3 F#3 A3 D4"
}

采取这种方法并非轻率之举。 乐器有数十种常用的调音,而且有数百种乐器。 如果没有一种易于解析的方法来分析、比较和事实核查数据,那么维护一个大型数据集会变得非常困难。

StringTuning 的解析发生在 Tuning+Definitions.swift 底部的特殊 init 中。 通过使 Tuning 符合 ExpressibleByStringLiteral,它允许我们创建易于验证的 CaseIterable 枚举,并且可以开箱即用地提供 Tuning 集合和组织功能。

逻辑很简单,并且非常容易验证:循环遍历项目中的每个 Tuning,如果我们的任何受支持语言中的任何本地化键返回任何类型的错误,项目中的许多单元测试将会崩溃。

此外,这些枚举只初始化一次,这意味着如果您一直重复访问这些枚举中的一个,您可以确定它不会每次都重新解析 Tuning 定义。

如果您有其他建议,请随时提出问题或提出 pull request。 在最终确定 String 初始化的 Tuning 之前,已经考虑了几种方法,但新鲜的视角总是有帮助的。 如果您有一种性能良好的方式来定义这些数据,该方式是类型安全的,但提供相同级别的便利性和可读性(用于维护和数据准确性),我很感兴趣!

贡献

非常欢迎进行讨论、提出问题和提出 pull request,用于开发、更正和/或本地化。

如果您提供更正和/或本地化,请尽可能提供更多其他来源进行验证,以帮助确保我们可以尽快集成更正。

鸣谢

特别感谢 AudioKit 的所有专业知识和支持。

许可证

本项目根据 MIT 许可证发布。 有关详细信息,请参阅 LICENSE