【发布时间】:2016-08-11 01:27:42
【问题描述】:
一个接一个地演奏一个音符的最佳方式是什么?这是我现在拥有的最实用的代码。
let majorScale = [60, 62, 64, 65, 67, 69, 71, 72]
for i in majorScale {
sampler.startNote(UInt8(i), withVelocity: 127, onChannel: 1)
sleep(1)
sampler.stopNote(UInt8(i), onChannel: 1)
}
这个方法的问题是 sleep() 只接受 UInt8 作为参数,所以我不能用这种方式做一个持续少于 1 秒的笔记。
首先,我是一名音乐家。刚上大学时,我刚上几门 Java 课,对编程有了一点了解。也就是说,我真的不知道还有哪些其他选择。
是否有一些内置的 MIDI 播放器可以用来处理音符时长?
有没有办法“睡”不到一秒,然后自己计算持续时间?就像以 100 bpm 演奏的 1/8 音符一样,会持续 ((60/100)/2) = 0.3 秒。
我是否应该获取音符信息并制作一个我可以播放的 MIDI 文件?
如何最好地解决问题?
编辑
这是更新后的代码:
for i in majorScale {
sampler.startNote(UInt8(i), withVelocity: 127, onChannel: 1)
let pause = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), 1 * Int64(NSEC_PER_SEC))
dispatch_after(pause, dispatch_get_main_queue()) {
self.sampler.stopNote(UInt8(i), onChannel: 1)
}
sampler.stopNote(UInt8(i), onChannel: 1)
}
所以我意识到了这一点。我将乐器更改为风琴(而不是钢琴),它确实会在 1 秒或 10 秒后停止音符,或者我放在那里的任何东西,但它似乎同时在 for 循环中进行,所以所有的音符同时发声,而不是按顺序发声。
【问题讨论】: