質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Swift

    8417questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4738questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

音源をカテゴリ別に分けてランダムに再生したい。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 276

flarefactory

score 2

前提・実現したいこと

選択したカテゴリによって音源をグループ別けしたいと考えています。エラーは出ないのですが、何を選択しても最後のグループしか流れません。

該当のソースコード

    //AlarmApplicationDelegateプロトコル
    func playSound(_ soundName: String) {

        //バイブ初期動作を設定する
        AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
        //バイブのコールバックを設定する
        AudioServicesAddSystemSoundCompletion(SystemSoundID(kSystemSoundID_Vibrate),nil,nil,
            { (_:SystemSoundID, _:UnsafeMutableRawPointer?) -> Void in
                AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
        },nil)
        //音源をランダムに選択
        let url1 = URL(fileURLWithPath: Bundle.main.path(forResource: "Body", ofType: "mp3")!)
        let url2 = URL(fileURLWithPath: Bundle.main.path(forResource: "Body-1", ofType: "mp3")!)
        let url3 = URL(fileURLWithPath: Bundle.main.path(forResource: "Body-2", ofType: "mp3")!)
        let url4 = URL(fileURLWithPath: Bundle.main.path(forResource: "Voice", ofType: "mp3")!)
        let url5 = URL(fileURLWithPath: Bundle.main.path(forResource: "Voice-1", ofType: "mp3")!)
        let url6 = URL(fileURLWithPath: Bundle.main.path(forResource: "Voice-2", ofType: "mp3")!)
        let url7 = URL(fileURLWithPath: Bundle.main.path(forResource: "Voice-3", ofType: "mp3")!)
        let url8 = URL(fileURLWithPath: Bundle.main.path(forResource: "Voice-4", ofType: "mp3")!)
        let url9 = URL(fileURLWithPath: Bundle.main.path(forResource: "Voice-5", ofType: "mp3")!)
        let url10 = URL(fileURLWithPath: Bundle.main.path(forResource: "Face", ofType: "mp3")!)
        let url11 = URL(fileURLWithPath: Bundle.main.path(forResource: "Face-1", ofType: "mp3")!)
        let url12 = URL(fileURLWithPath: Bundle.main.path(forResource: "Face-2", ofType: "mp3")!)
        let url13 = URL(fileURLWithPath: Bundle.main.path(forResource: "Face-3", ofType: "mp3")!)
        let url14 = URL(fileURLWithPath: Bundle.main.path(forResource: "Face-4", ofType: "mp3")!)
        let url15 = URL(fileURLWithPath: Bundle.main.path(forResource: "Face-5", ofType: "mp3")!)

        var error: NSError?
        //音源を追加するときは数値をあげる
        do {
            let rand = arc4random() % 3
            let rand1 = arc4random() % 6
            let rand2 = arc4random() % 6

            switch rand1 {
            case 1:
                audioPlayer = try AVAudioPlayer(contentsOf: url4)
            case 2:
                audioPlayer = try AVAudioPlayer(contentsOf: url5)
            case 3:
                audioPlayer = try AVAudioPlayer(contentsOf: url6)
            case 4:
                audioPlayer = try AVAudioPlayer(contentsOf: url7)
            case 5:
                audioPlayer = try AVAudioPlayer(contentsOf: url8)
            default:
                audioPlayer = try AVAudioPlayer(contentsOf: url9)
            }

            switch rand2 {
            case 1:
                audioPlayer = try AVAudioPlayer(contentsOf: url10)
            case 2:
                audioPlayer = try AVAudioPlayer(contentsOf: url11)
            case 3:
                audioPlayer = try AVAudioPlayer(contentsOf: url12)
            case 4:
                audioPlayer = try AVAudioPlayer(contentsOf: url13)
            case 5:
                audioPlayer = try AVAudioPlayer(contentsOf: url14)
            default:
                audioPlayer = try AVAudioPlayer(contentsOf: url15)
            }

            switch rand {
            case 1:
                audioPlayer = try AVAudioPlayer(contentsOf: url1)
            case 2:
                audioPlayer = try AVAudioPlayer(contentsOf: url2)
            default:
                audioPlayer = try AVAudioPlayer(contentsOf: url3)
            }

        } catch let error1 as NSError {
            error = error1
            audioPlayer = nil
        }

        if let err = error {
            print("audioPlayer error \(err.localizedDescription)")
            return
        } else {
            audioPlayer!.delegate = self
            audioPlayer!.prepareToPlay()
        }
        //負の数は無限のループ
        audioPlayer!.numberOfLoops = 0
        audioPlayer!.play()
    }
}

試したこと

どうしても記述した最後のグループしか流れません。初心者なため質問の仕方もわからず本当に申し訳ありませんが、どなたかご指南いただければとてもありがたいです。
どうかよろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

rand1による選択 → rand2による選択 → randによる選択

と、処理が流れていきますが、それぞれで選択した曲を全てaudioPlayerに保存(上書き)しているので、最後の「randによる選択」で選んだ曲が再生されることになります。

ようするに、カテゴリの選択が出来ていないということです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/07 15:00 編集

    なるほど。ありがとうございます!
    Body,Voice,Faceという三つのカテゴリ毎にrand,rand1,rand2のグループ別でランダム再生が出来るようにしたいのですが、どう調べても答えが見つからず悩んでいます。もう一度考えてみます!

    キャンセル

check解決した方法

0

playSound(soundName)をif caseで三つに分け、

if case soundName = "Body"{ playSound(soundName)}
if case soundName = "Voice"{ playSound1(soundName)}
if case soundName = "Face"{ playSound2(soundName)}

ApplicationDelegateのfuncも三種類記述することで上手くカテゴリ分けができました。

func playSound(_ soundName: String)
func playSound1(_ soundName: String)
func playSound2(_ soundName: String)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Swift

    8417questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4738questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。