tag:crieit.net,2005:https://crieit.net/tags/AVFoundation/feed 「AVFoundation」の記事 - Crieit Crieitでタグ「AVFoundation」に投稿された最近の記事 2021-08-27T23:19:06+09:00 https://crieit.net/tags/AVFoundation/feed tag:crieit.net,2005:PublicArticle/17619 2021-08-27T23:19:06+09:00 2021-08-27T23:19:06+09:00 https://crieit.net/posts/AVAudioUnitSampler AVAudioUnitSamplerで指定したチャンネルの音をすべて止める方法 <p>AVAudioUnitSamplerにはチャンネル上でMIDIの音をならすためのstartNoteと、停止させるためのstopNoteメソッドがある。でも、例えば自動で演奏させていて、停止ボタンを押した時に全ての音を消したい、と思った時、全ての音を止めるためのメソッドがどうもないっぽい。</p> <p>ではどうするのか。</p> <p>AVAudioUnitSamplerにはsendMIDIEventという、MIDIイベントを直接送るできることのできる機能がある。それを利用することでチャンネルの音を全て停止することができた。</p> <p>具体的には下記のやり方でできた。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/17618 2021-08-27T23:13:02+09:00 2021-08-27T23:22:47+09:00 https://crieit.net/posts/AVFoundation AVFoundationでなぜか実機でだけ音がならない時 <p>AVFoundationで、プログラムは何度見返しても絶対正しいし、シミュレータだと音がなるのになぜか実機だと音がならないということがあった。</p> <p>ちなみに試していたのはAVAudioEngineとAVAudioUnitSamplerを使ったMIDIをならすための簡単な処理。サウンドフォント(sf2ファイル)を使うときも使ってないときも同様。</p> <p>ちなみに、同時に録音したボイスをならす機能もあるのだがそちらはなぜかちゃんと聞こえる。一体何なのか非常に悩んだ。</p> <p>で、結局原因はというとAVAudioSessionのsetCategoryだった。上記にも書いたとおり、MIDIの処理とボイス用の処理があり、それぞれ別クラスになっていた。まずMIDIクラスを初期化し、次にVoiceクラスを初期化していたのだが、そのVoiceクラスのコンストラクタでsetCategoryしていた。そのためMIDIクラス側が無効になってしまっていたっぽい。</p> <p>なぜ実機だけなのかはわからないが。端末全体の音をならす部分の数の問題とかかもしれない。</p> <p>なにはともあれ、各クラスを初期化する前に下記を書いたら両方ちゃんと動作するようになった。</p> <pre><code class="swift"> let session = AVAudioSession.sharedInstance() try session.setCategory( AVAudioSession.Category.playAndRecord, options: AVAudioSession.CategoryOptions.mixWithOthers ) try session.setActive(true) </code></pre> <p>とにかくあまり詳しくないため別の原因や正しい処理方法などあるかもしれないので各々適宜要調査だと思われる。</p> だら@Crieit開発者