Tag: 音乐技术

带有快速枚举的简单音乐音调值

我从事的乐器应用程序通常包含音乐理论部分。 这可能是一个简单的大尺度或更复杂的算法。 通常,我最终只使用MIDI音符编号来获取音高值。 结果最终看起来像: let cMajor = [48, 50, 52, 53, 55, 57, 59] 我决定做一些工作来制作一个可以在项目中重复使用的简单模式,以使代码更易于阅读。 代码很短,所以我将从此开始: enum Pitch: Int { case C = 0, Cs, D, Ds, E, F, Fs, G, Gs, A, As, B } 现在我可以写: let cMajor :[Pitch] = [.C,.D,.E,.F,.G,.A,.B] [Pitch]的显式类型允许我只键入.G而不是Pitch.G ,我认为它看起来更好。 概念 理想情况下,我将能够将音高作为偶然的音符名称来编写。 这些值看起来就像C♯或D♭ 。 这些值将是类型安全的,并且像原始类型一样起作用,如果我错误地输入了假间距,则会导致编译器抛出错误。 设计决策 当我经历一些选择时,我意识到我将不得不做出一些妥协。 没有Unicode意外情况: ♯和♭不在Swift支持的Unicode范围内。 有替代符号,但默认字体未包含这些替代符号,因此代码可移植性成为一个问题。 我为竖琴选择了一个简单s后缀。 […]

如何在Swift中计算时间和节奏

在本文中,我将描述一种在Swift中将速度作为一个单元工作的简单方法。 音乐节奏通常以bpm(每分钟的节拍)表示,对于许多任务(如同步动画,安排声音或验证音频循环的长度),将其转换为秒通常会很有帮助。 代码 struct Tempo { var bpm: Double func seconds(duration: Double = 0.25) -> Double { return 1.0 / self.bpm * 60.0 * 4.0 * duration } } 正在使用 let myTempo = Tempo(bpm: 110.0) let quarterNoteLength = myTempo.seconds() let barLength = myTempo.seconds(duration: 1) let phraseLength = myTempo.seconds(duration: 4) 背景 过去,当我需要进行这些转换时,我记了一些笔记,翻转和取消单位,并创建了一个可以解决我的特定问题的语句。 代码看起来像这样: var bpm = […]