AvnerKhan
AvnerKhan

Reputation: 23

AKMIDIListener: ReceivedNoteOn unable to change UI Components

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

Answers (1)

Aurelius Prochazka
Aurelius Prochazka

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

Related Questions