私はAppleのAVMIDIPlayer
オブジェクトをMIDIファイルの再生に使用しようとしています。 Swiftでは、次のコードを使用するだけで簡単に見えます。AVMIDIPlayerの再生を維持するには?
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")
}
約0.05秒間再生されます。私は何らかのループでフレーム化する必要があると推測します。私は単純な解決策を試みました:
while stillGoing {
midiPlayer?.play {
let stillGoing = false
}
}
これは動作しますが、CPUを大幅に増加させます。より良い方法がありますか? 最初のコメントに加えて、私はクラスを作ろうとしましたが、エラーには何もフラグを立てませんが、どちらも動作しません。
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)
私は関数/メソッドとしてこのコードを持つクラスを作成し、クラスのインスタンスを作成し、メソッドを呼び出す必要がありますか? これまでのところ、これは単なるCLIスクリプトなので、UIコントローラはありません。 – benwiggy
ああ、この場合、ループを使用することは唯一の方法です。 whileループの中に 'sleep(1)'コールを入れて、CPU時間をすべて食べないようにしてください。また、whileループから 'midiPlayer?.play'コールを移動する必要があることは間違いありません。 –