I am trying to play a short musical note sequence with a default sine wave as sound inside a Swift Playground. At a later point I'd like to replace the sound with a Soundfont but at the moment I'd be happy with just producing some sound.
I want this to be a midi like sequence with direct control over the notes, not something purely audio based. The AudioToolbox
seems to provide what I am looking for but I have troubles fully understanding its usage. Here's what I am currently trying
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)
As you can imagine, there's no sound playing. I appreciate any ideas on how to have that sound sequence playing aloud.
But then what? Swift Playgrounds teaches concepts and uses real Swift structure, but it's not real code. It doesn't make an app, it just guides Byte around and solves puzzles. Swift doesn't have a real command called collectGem() after all.
You have to enable the asynchronous mode for the Playground.
Add this at the top (Xcode 7, Swift 2):
import XCPlayground XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
and your sequence will play.
The same for Xcode 8 (Swift 3):
import PlaygroundSupport PlaygroundPage.current.needsIndefiniteExecution = true
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
Great MIDI reference page with a nice chart
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With