J'essaie d'utiliser l'objet AVMIDIPlayer
d'Apple pour jouer un fichier MIDI. Il semble assez facile dans Swift, en utilisant le code suivant:Comment conserver AVMIDIPlayer en cours de lecture?
let midiFile:NSURL = NSURL(fileURLWithPath:"/path/to/midifile.mid")
var midiPlayer: AVMIDIPlayer?
do {
try midiPlayer = AVMIDIPlayer(contentsOf: midiFile as URL, soundBankURL: nil)
midiPlayer?.prepareToPlay()
} catch {
print("could not create MIDI player")
}
midiPlayer?.play {
print("finished playing")
}
Et il joue pendant environ 0,05 secondes. Je suppose que j'ai besoin de l'encadrer dans une sorte de boucle. J'ai essayé une solution simple:
while stillGoing {
midiPlayer?.play {
let stillGoing = false
}
}
qui fonctionne, mais augmente massivement le CPU. Y a-t-il un meilleur moyen? Suite au premier commentaire, j'ai essayé de créer une classe, et bien qu'il ne signale aucune erreur, cela ne fonctionne pas non plus.
class midiPlayer {
var player: AVMIDIPlayer?
func play(file: String) {
let myURL = URL(string: file)
do {
try self.player = AVMIDIPlayer.init(contentsOf: myURL!, soundBankURL: nil)
self.player?.prepareToPlay()
} catch {
print("could not create MIDI player")
}
self.player?.play()
}
func stop() {
self.player?.stop()
}
}
// main
let myPlayer = midiPlayer()
let midiFile = "/path/to/midifile.mid"
myPlayer.play(file: midiFile)
Je dois donc créer une classe avec ce code en tant que fonction/méthode, puis créer une instance de la classe et appeler la méthode? Jusqu'à présent, il s'agit juste d'un script CLI, donc pas de contrôleurs d'interface utilisateur. – benwiggy
Ah ok, dans ce cas l'utilisation de la boucle est la seule façon d'y aller. Mettez un appel 'sleep (1)' dans la boucle while afin de ne pas perdre tout votre temps CPU. En outre, je suis sûr que vous devrez déplacer l'appel 'midiPlayer? .play' hors de la boucle while. –