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 }