Warning, file /education/gcompris/src/activities/play_rhythm/play_rhythm.js was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /* GCompris - play_rhythm.js
0002  *
0003  * SPDX-FileCopyrightText: 2018 Aman Kumar Gupta <gupta2140@gmail.com>
0004  *
0005  * Authors:
0006  *   Beth Hadley <bethmhadley@gmail.com> (GTK+ version)
0007  *   Aman Kumar Gupta <gupta2140@gmail.com> (Qt Quick port)
0008  *
0009  *   SPDX-License-Identifier: GPL-3.0-or-later
0010  */
0011 .pragma library
0012 .import QtQuick 2.12 as Quick
0013 .import "qrc:/gcompris/src/core/core.js" as Core
0014 
0015 var numberOfLevel
0016 var currentNote = 0
0017 var items
0018 var levels
0019 var isIntroductoryAudioPlaying = false
0020 
0021 function start(items_) {
0022     items = items_
0023     levels = items.parser.parseFromUrl("qrc:/gcompris/src/activities/play_rhythm/resource/dataset.json").levels
0024     numberOfLevel = levels.length
0025     items.currentLevel = Core.getInitialLevel(numberOfLevel)
0026     items.introductoryAudioTimer.start()
0027     initLevel()
0028 }
0029 
0030 function stop() {
0031     items.introductoryAudioTimer.stop()
0032     items.metronomeOscillation.stop()
0033     items.multipleStaff.stopAudios()
0034     items.score.stopWinAnimation()
0035 }
0036 
0037 function initLevel() {
0038     items.score.currentSubLevel = 0
0039     Core.shuffle(levels[items.currentLevel].melodies)
0040     items.multipleStaff.isPulseMarkerDisplayed = levels[items.currentLevel].pulseMarkerVisible
0041     items.isMetronomeVisible = levels[items.currentLevel].metronomeVisible
0042     nextSubLevel()
0043     currentNote = 0
0044 }
0045 
0046 function nextSubLevel() {
0047     if(items.score.currentSubLevel >= items.score.numberOfSubLevels)
0048         items.bonus.good("note")
0049     else
0050         initSubLevel()
0051 }
0052 
0053 function checkAnswer(pulseMarkerX) {
0054     currentNote++
0055     if(currentNote < items.multipleStaff.musicElementModel.count) {
0056         var accuracyLowerLimit = items.multipleStaff.musicElementRepeater.itemAt(currentNote).x
0057         var accuracyUpperLimit = accuracyLowerLimit + items.multipleStaff.musicElementRepeater.itemAt(currentNote).width
0058         if(pulseMarkerX >= accuracyLowerLimit && pulseMarkerX <= accuracyUpperLimit)
0059             items.multipleStaff.indicateAnsweredNote(true, currentNote)
0060         else {
0061             items.multipleStaff.indicateAnsweredNote(false, currentNote)
0062             items.isWrongRhythm = true
0063         }
0064     }
0065     if(currentNote > 0 && !items.multipleStaff.isMusicPlaying) {
0066         items.isWrongRhythm = true
0067         items.buttonsBlocked = true
0068         items.answerFeedbackTimer.restart()
0069     } else if((currentNote >= items.multipleStaff.musicElementModel.count - 1)) {
0070         items.buttonsBlocked = true
0071         items.answerFeedbackTimer.restart()
0072     }
0073 }
0074 
0075 function answerFeedback() {
0076     if(!items.isWrongRhythm) {
0077         items.score.currentSubLevel += 1
0078         items.score.playWinAnimation()
0079         items.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/completetask.wav")
0080     } else {
0081         items.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/crash.wav")
0082         items.crashPlayed = true
0083         items.answerFeedbackTimer.restart()
0084     }
0085 }
0086 
0087 function initSubLevel() {
0088     items.metronomeOscillation.stop()
0089     items.multipleStaff.stopAudios()
0090     currentNote = 0
0091     var currentSubLevelMelody = levels[items.currentLevel].melodies[items.score.currentSubLevel]
0092     items.multipleStaff.loadFromData(currentSubLevelMelody)
0093     items.background.isRhythmPlaying = true
0094     items.isWrongRhythm = false
0095 
0096     if(!isIntroductoryAudioPlaying && !items.iAmReady.visible)
0097         items.multipleStaff.play()
0098 
0099     items.buttonsBlocked = false
0100 }
0101 
0102 function nextLevel() {
0103     items.score.stopWinAnimation()
0104     items.currentLevel = Core.getNextLevel(items.currentLevel, numberOfLevel);
0105     initLevel()
0106 }
0107 
0108 function previousLevel() {
0109     items.score.stopWinAnimation()
0110     items.currentLevel = Core.getPreviousLevel(items.currentLevel, numberOfLevel);
0111     initLevel()
0112 }