1つの音符を連続して再生する最も良い方法は何ですか?ここに私が今持っている最も機能的なコードがあります。すぐにMIDIノートを再生する
let majorScale = [60, 62, 64, 65, 67, 69, 71, 72]
for i in majorScale {
sampler.startNote(UInt8(i), withVelocity: 127, onChannel: 1)
sleep(1)
sampler.stopNote(UInt8(i), onChannel: 1)
}
この方法の問題は、sleep()はUInt8をパラメータとして受け取り、最後にこのように1秒未満のメモを作成できないことです。
私はまずミュージシャンです。私はちょうど私がカップルのJavaクラスを取ったときに、大学でのプログラミングからちょっと分かりました。つまり、私は他の選択肢が何であるか本当に分かりません。
音符の長さを処理するために使用できる内蔵MIDIプレーヤーがありますか?
1秒未満で「スリープ」する方法がありますか?自分で時間を計算しますか? 100 bpmで演奏される1/8音符は、((60/100)/ 2)= 0.3秒続く。
音符情報を取って、それから本質的に演奏できるMIDIファイルを作るべきですか?
問題を解決するにはどうすればよいですか?だから私はこれについて何かを実現
for i in majorScale {
sampler.startNote(UInt8(i), withVelocity: 127, onChannel: 1)
let pause = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), 1 * Int64(NSEC_PER_SEC))
dispatch_after(pause, dispatch_get_main_queue()) {
self.sampler.stopNote(UInt8(i), onChannel: 1)
}
sampler.stopNote(UInt8(i), onChannel: 1)
}
:ここ
EDIT
が更新されたコードです。楽器をオルガン(ピアノではなく)に変更し、1秒後、または10秒後に音符を停止しますが、その間にforループを実行しているように見えます。ノートはシーケンスではなく同時に発音します。
APIがナノ秒の単位を受け入れることは、実際の実装がこれに近いところに来ることを意味するわけではありません。 dispatch_afterのドキュメントを参照してください。これは最善の努力であり、要求よりもかなり長くなる可能性があります。正確に音楽を再生するためには、確かにAPi – BaseZen
Okを使ってより良い方法があるので、私はここで何が起こっているのか見ています...しかし、それは正確に動作していません。上記のコードをコピーすると、それは実行されますが、全体を1秒ごとに再生します。それはまったく待っているようではありません。私は1の代わりに1000を置き換え、私は同じ結果を得た。 –
BaseZenにも、あなたが正しいと確信しています...おそらくそれを扱うことができるAPIがありますが、これはちょうどこの時点までになっている悪夢でした。私はほとんど何らかの睡眠方法を使うことを好むだろう。別の渦巻き型APIを考え出すのではなく、サウンド処理に関するAppleのドキュメンテーションはあまりにも稀であり、オンラインのサンプルコードではそれほど多くはありません。 –