Reputation: 23
I am creating an application that receives MIDI notes and plays music in the app according to the note it received. I am using AudioKit's AKMIDIListener protocol and the function receivedMIDINoteOn. It am able to recieve these events and play the notes that I want to play from my app accordingly. However, I am also trying to change UI components within the ReceivedMIDINoteOn function, but I am unable to do so. Otherwise, the receivedMIDINoteOn is handling it's events correctly, the UI simply won't change to reflect this for some reason. The UIViewController that I am changing also has the AKMIDIListener protocol, and the receivedMIDINoteOn function is also defined in that UIViewController. I have provided a code snippet below to help ID the problem. Why might the UI components not update? In the code below, the "playButton" is not being updated when it receives the MIDINoteOn function, even though I know the function runs because it plays the background music. Also, the playButton changes it's title accordingly whenever I use change the title in some other function in my code
let midi = AudioKit.midi
class firstPageViewController: UIViewController, AKMIDIListener {
@IBOutlet var MusicButtons: [UIButton]!
@IBOutlet var playButton: UIButton!
@IBOutlet var pauseButton: UIButton!
@IBOutlet var WaveForm: AudioVisualizationView!
@IBOutlet weak var firstButton: UIButton!
@IBOutlet weak var secondButton: UIButton!
@IBOutlet weak var thirdButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
isOnFirstPage = true
isOnSecondPage = false
isOnThirdPage = false
self.secondButton.setTitleColor(UIColor.blue, for: .normal)
self.thirdButton.setTitleColor(UIColor.blue, for: .normal)
midi.openInput()
midi.addListener(self)
self.init_buttons()
self.init_soundwave()
self.init_audio()
}
func receivedMIDINoteOn(noteNumber: MIDINoteNumber, velocity: MIDIVelocity, channel: MIDIChannel) {
let currNum = mapping[Int(noteNumber)]
if currNum == 64 { //Play button
self.playBackground(0)
self.playButton.setTitle("Currently Playing", for: .normal)
}
else if currNum == 67 { //Pause button
self.pauseMusic(0)
self.playButton.setTitle("Play", for: .normal)
}
else if currNum == 68 { //Switch button - first page
self.firstPageSwitch(0)
}
else if currNum == 69 { //Switch button - second page
self.secondPageSwitch(0)
}
else if currNum == 70 { //Switch button - third page
self.thirdPageSwitch(0)
}
else if currNum == 71 {
//
}
else if currNum == 65 {
//
}
else if currNum == 66 {
//
}
else {
if isOnFirstPage! {
self.playMusic(currNum: currNum!, holder: audioPlayer)
self.MusicButtons![currNum!].backgroundColor = UIColor(red: 247/255, green: 183/255, blue: 98/255, alpha: 1.0)
}
if isOnSecondPage!{
self.playMusic(currNum: currNum!, holder: secondAudioPlayer)
self.MusicButtons![currNum!].backgroundColor = UIColor(red: 247/255, green: 183/255, blue: 98/255, alpha: 1.0)
}
}
}
}
Upvotes: 2
Views: 176
Reputation: 4573
The commenter is correct, you need wrap your UI calls in a
DispatchQueue.main.async {
// ... code here
}
And also perhaps will have to put an self.playButton.setNeedsDisplay()
at the end.
Upvotes: 2