You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift Playgrounds开发:如何实现每次调用播放不同随机音调

问题解决方案

你现有代码始终播放同一音调的核心原因是:你在代码初始化阶段就通过单次随机索引创建了固定的SKAudioNode实例tone,后续循环执行序列时,调用indexNum()生成的新随机数并没有关联更新tone对应的音频资源,相当于反复播放同一个预先加载好的音频。

以下是适配Swift 5.3 + iPadOS 14 + Swift Playgrounds环境的修改后代码,可实现每次循环切换不同随机音调的需求:

//Swift5.3, iPadOS14
let tones = ["C4", "D4", "E4", "F4", "G4", "A4", "B4", "C5"]    // 1~2秒时长的aiff格式音频

func indexNum()->Int {
    let randInt = Int.random(in: 1...7)    // 按需求跳过C4
    return randInt
}

// 仅保留固定的C4音频节点初始化逻辑
let c4URL = Bundle.main.url(forResource: tones[0], withExtension: "aiff")!
let c4 = SKAudioNode(url: c4URL)
c4.autoplayLooped = false
self.addChild(c4)

let tonePlayAction = SKAction.run { [weak self] in
    guard let self = self else { return }
    // 每次执行时重新生成随机索引、创建对应音频节点
    let randomToneURL = Bundle.main.url(forResource: tones[indexNum()], withExtension: "aiff")!
    let randomTone = SKAudioNode(url: randomToneURL)
    randomTone.autoplayLooped = false
    self.addChild(randomTone)
    // 播放完成后自动移除当前随机音调节点
    randomTone.run(SKAction.sequence([
        SKAction.play(),
        SKAction.wait(forDuration: 1.5),
        SKAction.removeFromParent()
    ]))
}
let c4PlayAction = SKAction.run {
    c4.run(SKAction.play())
}
let wait = SKAction.wait(forDuration: 1.5)
let seq = SKAction.sequence([wait, tonePlayAction, wait, c4PlayAction])
let rep = SKAction.repeat(seq, count: 5)
self.run(rep)

本次修改的核心调整点:

  • 取消了提前创建固定随机音调节点的逻辑,将随机音频节点的创建逻辑移到动作执行块中,每次循环都会生成新的随机音调音频
  • 移除了无实际作用的随机数生成空动作,将随机逻辑直接和音频创建绑定
  • 保留了你原有播放时序、C4固定播放、节点自动移除的逻辑,不需要调整你的资源配置

内容的提问来源于stack exchange,提问作者kyorokarasu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:21:02