在 Swift 游乐场演奏音符
Play musical notes in Swift Playground
我正在尝试在 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, ¬e)
time += 1
}
// Creating a player
var musicPlayer:MusicPlayer = nil
var player = NewMusicPlayer(&musicPlayer)
player = MusicPlayerSetSequence(musicPlayer, sequence)
player = MusicPlayerStart(musicPlayer)
如您所想,没有声音播放。我很欣赏关于如何大声播放该声音序列的任何想法。
您必须为 Playground 启用异步模式。
在顶部添加这个 (Xcode 7, Swift 2):
import XCPlayground
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
您的序列将播放。
Xcode 8 (Swift 3) 相同:
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
Swift游乐场
中的工作 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, ¬e)
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 有漂亮的图表
我正在尝试在 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, ¬e)
time += 1
}
// Creating a player
var musicPlayer:MusicPlayer = nil
var player = NewMusicPlayer(&musicPlayer)
player = MusicPlayerSetSequence(musicPlayer, sequence)
player = MusicPlayerStart(musicPlayer)
如您所想,没有声音播放。我很欣赏关于如何大声播放该声音序列的任何想法。
您必须为 Playground 启用异步模式。
在顶部添加这个 (Xcode 7, Swift 2):
import XCPlayground
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
您的序列将播放。
Xcode 8 (Swift 3) 相同:
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
Swift游乐场
中的工作 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, ¬e)
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 有漂亮的图表