2016-08-11 20 views
1

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ループを実行しているように見えます。ノートはシーケンスではなく同時に発音します。

答えて

0

私はこれのmidiの側面を助けることはできませんが、休止や睡眠についてはdispatch_afterを使用してください。 sleep(1)とstopNote呼び出しの代わりに次のコードを入れてください。これにより、ナノ秒の精度で遅延を実行することができます。 dispatch_time_t()呼び出しの2番目のパラメータを必要な時に変更してください。

let pause = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), 1 * Int64(NSEC_PER_SEC)) 
dispatch_after(pause, dispatch_get_main_queue()) { 
     sampler.stopNote(UInt8(i), onChannel: 1) 
} 
+1

APIがナノ秒の単位を受け入れることは、実際の実装がこれに近いところに来ることを意味するわけではありません。 dispatch_afterのドキュメントを参照してください。これは最善の努力であり、要求よりもかなり長くなる可能性があります。正確に音楽を再生するためには、確かにAPi – BaseZen

+0

Okを使ってより良い方法があるので、私はここで何が起こっているのか見ています...しかし、それは正確に動作していません。上記のコードをコピーすると、それは実行されますが、全体を1秒ごとに再生します。それはまったく待っているようではありません。私は1の代わりに1000を置き換え、私は同じ結果を得た。 –

+0

BaseZenにも、あなたが正しいと確信しています...おそらくそれを扱うことができるAPIがありますが、これはちょうどこの時点までになっている悪夢でした。私はほとんど何らかの睡眠方法を使うことを好むだろう。別の渦巻き型APIを考え出すのではなく、サウンド処理に関するAppleのドキュメンテーションはあまりにも稀であり、オンラインのサンプルコードではそれほど多くはありません。 –

0

しないでください。

AudioToolboxをご覧ください。 MusicPlayerはMIDIイベントをMusicSequenceにスケジュールします。

私はblogに約1x10^gazillionの例があります。

+2

私に指摘してください私が必要とするページ、またはそれを上手く利用して、これを示すコードを作成してください。あなたが言うように、あなたのブログにはたくさんの例があり、自分のような新人にとっては、私が必要とするものを見つけるためにそれをすべて解析することは非常に難しいです。 –

関連する問題