menu
閉じる
  1. 3Dを簡単に制御できるAfterEffects
  2. 世界一シンプルな作曲方法(第2回)
  3. DTMを始めよう(パソコン環境)
  4. 世界一シンプルな作曲方法(第1回)
閉じる

デジタル世界の路地裏で

Swift2.x対応 AVAudioPlayerクラスでの音声ファイルの再生

2015年の終わりくらいにSwift2.xになってからSwift1.x系で書かれたコードで音声ファイルが再生できなくなっていたことがありました。解決方法としては、do-catch構文でエラー処理を明示的に記述することでコンパイルが通るようになるというオチでした。下は、ボタンを押すと「へぇ〜」と発声(hee.mp3を再生)するだけの簡単なデモアプリを作ったときのViewController.swiftのコードです。

L13〜L17がdo-catch構文の箇所ですね。これでコンパイルが通ります。数カ月前まで正しいとされていた記述がバージョンアップでコンパイルすら通らなくなるなんて、Swiftってけっこう横暴なことするなぁと思った記憶があります。が、発展途上の言語なんてこんなものなのかもしれないですね。受け入れましょう。

連打による「へぇ〜」弾幕に対応してみた

で、ここから本題なんですが、ある日、知人に「へぇ〜」ボタンのデモアプリを触らせていたところ、やっぱり連打したんですね。しかし、連打すると「へ、へ、へ、へぇ〜」のように、後に押した命令で前の命令がキャンセルされてしまうため、あの番組内でよく見られた連打による「へぇ〜」弾幕ができない仕様になっていると気づいたわけです。これはマズイと思って、動的にAVAudioPlayerクラスのインスタンスを生成するような作りにできないかと考えました。最初は配列使ったらできるかなと思って、インスタンス用の変数を配列で用意したんですが配列の要素数を超えたら打ち止め(押しても発声しない状態)になってしまいました…。なのでもっとシンプルに、カウンター付けて3回条件分岐して発声部でそれぞれAVAudioPlayerクラスのインスタンスを生成、3回目はカウンターをリセットして初回の処理に戻す、という仕様にしました。これによって3回までは同時発声するようになります。つまり連打して4回目押すときには1回目の音は鳴り終わってるからキャンセルされてもいいよね、という考え方です。

L15〜L41あたりですね。よく考えたらせめてfor文使えば良かったですね。自分でも実にスマートではないプログラムだと思いますが、文系PGの自分には今のところこれくらいしか解決策が思いつきませんでした。また時間のあるときに改良したいです。もし、もっと美しく汎用的なロジックを思いつく方がいらっしゃいましたら、ぜひご指導のほどお願いしたいです!

おすすめ記事

  1. 世界一シンプルな作曲方法(第2回)
  2. 3Dを簡単に制御できるAfterEffects
  3. 世界一シンプルな作曲方法(第1回)
  4. DTMを始めよう(パソコン環境)

ピックアップ

ページ上部へ戻る