gpt4 book ai didi

ios - 使用 AudioKit 裁剪 MIDI 文件

转载 作者:可可西里 更新时间:2023-11-01 06:00:46 24 4
gpt4 key购买 nike

我正在尝试使用 AudioKit 裁剪和循环 MIDI 文件的特定部分。

我正在使用音序器并发现了一些接近我需要的东西,但不完全是。

我在 AKSequencer 中找到了一个名为 clearRange 的方法。通过这种方法,我可以将不需要的 MIDI 部分静音,但我还没有找到一种方法来修剪音序器,只保留我感兴趣的部分。现在只有我想要的部分有声音但我仍然能听到无声部分。

有没有办法修剪音序器或创建一个新的音序器,只包含我想从原始音序器中保留的部分?

谢谢!

最佳答案

Apple 的 MusicSequence(AKSequencer 所基于的)的一个令人沮丧的限制是,虽然您可以轻松设置循环部分的“右侧”,但左侧将始终循环回零且无法更改。因此,要从左侧裁剪,您需要隔离要循环的部分并将其移动,以便循环的起点为零。

从 AudioKit 4.2.4 开始,这是可能的。使用 AKMusicTrack 的 .getMIDINoteData() 获取一组 AKMIDINoteData 结构,其内容可以被编辑,然后用于替换原始数据。如果你有一个 16 拍的轨道并且你想循环最后四个拍,你可以这样做:

let loopStart = 12.0
let loopLength = 4.0

// keep track of the original track contents
let originalLength = 16.0
let originalContents = track.getMIDINoteData()

// isolate the segment for looping and shift it to the start of the track
let loopSegment = originalContents.filter { loopStart ..< (loopStart + loopLength) ~= $0.position.beats }
let shiftedSegment = loopSegment.map { AKMIDINoteData(noteNumber: $0.noteNumber,
velocity: $0.velocity,
channel: $0.channel,
duration: $0.duration,
position: AKDuration(beats: $0.position.beats - loopStart))
}

// replace the track contents with the loop, and assert the looping behaviour
track.replaceMIDINoteData(with: shiftedSegment)
seq.setLength(AKDuration(beats: loopLength))
seq.enableLooping()

// and to get back to the original:
track.replaceMIDINoteData(with: originalContents)
seq.setLength(AKDuration(beats: originalLength))
seq.enableLooping()

如果您想循环部分重复原始序列的长度,那么您可以使用 shiftedSegment 作为模板并从中构建 16 拍序列。

关于ios - 使用 AudioKit 裁剪 MIDI 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46960179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com