【问题标题】:Play musical notes in Swift Playground在 Swift Playground 中弹奏音符
【发布时间】:2016-09-03 07:35:01
【问题描述】:

我正在尝试在 Swift Playground 中使用默认正弦波作为声音播放一个简短的音符序列。稍后我想用 Soundfont 替换声音,但目前我很乐意只产生一些声音。

我希望这是一个类似于 midi 的序列,可以直接控制音符,而不是纯粹基于音频的序列。 AudioToolbox 似乎提供了我正在寻找的东西,但我很难完全理解它的用法。这是我目前正在尝试的方法

import AudioToolbox

// Creating the sequence    

var sequence:MusicSequence = nil
var musicSequence = NewMusicSequence(&sequence)

// Creating a track

var track:MusicTrack = nil
var musicTrack = MusicSequenceNewTrack(sequence, &track)

// Adding notes

var time = MusicTimeStamp(1.0)
for index:UInt8 in 60...72 {
    var note = MIDINoteMessage(channel: 0,
                               note: index,
                               velocity: 64,
                               releaseVelocity: 0,
                               duration: 1.0 )
    musicTrack = MusicTrackNewMIDINoteEvent(track, time, &note)
    time += 1
}

// Creating a player    

var musicPlayer:MusicPlayer = nil
var player = NewMusicPlayer(&musicPlayer)

player = MusicPlayerSetSequence(musicPlayer, sequence)
player = MusicPlayerStart(musicPlayer)

您可以想象,没有声音播放。我很欣赏有关如何让声音序列大声播放的任何想法。

【问题讨论】:

    标签: ios swift audio swift-playground audiotoolbox


    【解决方案1】:

    您必须为 Playground 启用异步模式。

    在顶部添加这个(Xcode 7、Swift 2):

    import XCPlayground
    XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
    

    你的序列将播放。

    Xcode 8 (Swift 3) 也是如此:

    import PlaygroundSupport
    PlaygroundPage.current.needsIndefiniteExecution = true
    

    【讨论】:

      【解决方案2】:

      Swift Playground 中的工作 MIDI 示例

      import PlaygroundSupport
      import AudioToolbox
      
      var sequence : MusicSequence? = nil
      var musicSequence = NewMusicSequence(&sequence)
      
      var track : MusicTrack? = nil
      var musicTrack = MusicSequenceNewTrack(sequence!, &track)
      
      // Adding notes
      
      var time = MusicTimeStamp(1.0)
      for index:UInt8 in 60...72 { // C4 to C5
          var note = MIDINoteMessage(channel: 0,
                                     note: index,
                                     velocity: 64,
                                     releaseVelocity: 0,
                                     duration: 1.0 )
          musicTrack = MusicTrackNewMIDINoteEvent(track!, time, &note)
          time += 1
      }
      
      // Creating a player
      
      var musicPlayer : MusicPlayer? = nil
      var player = NewMusicPlayer(&musicPlayer)
      
      player = MusicPlayerSetSequence(musicPlayer!, sequence)
      player = MusicPlayerStart(musicPlayer!)
      
      PlaygroundPage.current.needsIndefiniteExecution = true
      

      很棒的MIDI reference page 有一张漂亮的图表

      【讨论】:

        猜你喜欢
        • 2010-09-15
        • 1970-01-01
        • 2014-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-22
        相关资源
        最近更新 更多