在Swift Playground中播放音符

问题描述 投票:19回答:2

我正在尝试用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
2个回答
14
投票

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

在顶部添加它(Xcode 7,Swift 2):

import XCPlayground
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

你的序列将会播放。

Xcode 8(Swift 3)也是如此:

import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true

0
投票

Working MIDI example in a Swift Playground

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有一个很好的图表

MIDI Notes Reference

© www.soinside.com 2019 - 2024. All rights reserved.