Warning, /education/gcompris/src/activities/piano_composition/PianoOctaveKeyboard.qml is written in an unsupported language. File is not indexed.
0001 /* GCompris - PianoOctaveKeyboard.qml 0002 * 0003 * SPDX-FileCopyrightText: 2016 Johnny Jazeix <jazeix@gmail.com> 0004 * SPDX-FileCopyrightText: 2018 Aman Kumar Gupta <gupta2140@gmail.com> 0005 * 0006 * Authors: 0007 * Beth Hadley <bethmhadley@gmail.com> (GTK+ version) 0008 * Johnny Jazeix <jazeix@gmail.com> (Qt Quick port) 0009 * Aman Kumar Gupta <gupta2140@gmail.com> (Qt Quick port) 0010 * 0011 * SPDX-License-Identifier: GPL-3.0-or-later 0012 */ 0013 import QtQuick 2.12 0014 import GCompris 1.0 0015 0016 import "../../core" 0017 0018 Item { 0019 id: piano 0020 z: 3 0021 0022 property alias keyRepeater: keyRepeater 0023 0024 property int numberOfWhite: 7 0025 property int currentOctaveNb: 0 0026 readonly property int maxNbOctaves: whiteKeyNoteLabels.length 0027 0028 property real whiteWidth: width / numberOfWhite // 23 0029 property real whiteHeight: height // 120 0030 property real blackWidth: (whiteWidth + 1) / 2 // 13 0031 property real blackHeight: 2 * height / 3 // 80 0032 0033 property bool leftOctaveVisible: false 0034 property bool playPianoActivity: false //set to true to specify the offset used for keyboard controls for this activity... 0035 0036 property var coloredKeyLabels: ['C', 'D', 'E', 'F', 'G', 'A', 'B'] 0037 // When the labelsColor is inbuilt, the default color mapping will be done, else assign any color externally in the activity. Example: Reference keys in note_names are red colored and all other are white. 0038 property string labelsColor: "inbuilt" 0039 0040 //: Translators, C, D, E, F, G, A and B are the note notations in English musical notation system. The numbers in the arguments represents the octave number of the note. For instance, C4 is a C note in the 4th octave. 0041 readonly property var whiteKeyNoteLabelsArray: [ 0042 ["F1", qsTr("F%1").arg(1)], 0043 ["G1", qsTr("G%1").arg(1)], 0044 ["A1", qsTr("A%1").arg(1)], 0045 ["B1", qsTr("B%1").arg(1)], 0046 ["C2", qsTr("C%1").arg(2)], 0047 ["D2", qsTr("D%1").arg(2)], 0048 ["E2", qsTr("E%1").arg(2)], 0049 ["F2", qsTr("F%1").arg(2)], 0050 ["G2", qsTr("G%1").arg(2)], 0051 ["A2", qsTr("A%1").arg(2)], 0052 ["B2", qsTr("B%1").arg(2)], 0053 ["C3", qsTr("C%1").arg(3)], 0054 ["D3", qsTr("D%1").arg(3)], 0055 ["E3", qsTr("E%1").arg(3)], 0056 ["F3", qsTr("F%1").arg(3)], 0057 ["G3", qsTr("G%1").arg(3)], 0058 ["A3", qsTr("A%1").arg(3)], 0059 ["B3", qsTr("B%1").arg(3)], 0060 ["C4", qsTr("C%1").arg(4)], 0061 ["D4", qsTr("D%1").arg(4)], 0062 ["E4", qsTr("E%1").arg(4)], 0063 ["F4", qsTr("F%1").arg(4)], 0064 ["G4", qsTr("G%1").arg(4)], 0065 ["A4", qsTr("A%1").arg(4)], 0066 ["B4", qsTr("B%1").arg(4)], 0067 ["C5", qsTr("C%1").arg(5)], 0068 ["D5", qsTr("D%1").arg(5)], 0069 ["E5", qsTr("E%1").arg(5)], 0070 ["F5", qsTr("F%1").arg(5)], 0071 ["G5", qsTr("G%1").arg(5)], 0072 ["A5", qsTr("A%1").arg(5)], 0073 ["B5", qsTr("B%1").arg(5)], 0074 ["C6", qsTr("C%1").arg(6)], 0075 ["D6", qsTr("D%1").arg(6)], 0076 ["E6", qsTr("E%1").arg(6)], 0077 ["F6", qsTr("F%1").arg(6)] 0078 ] 0079 0080 //: Translators, C♯, D♯, F♯, G♯, and A♯ are the note notations in English musical notation system. The numbers in the arguments represents the octave number of the note. For instance, C♯4 is a C♯ note in the 4th octave. 0081 readonly property var blackKeySharpNoteLabelsArray: [ 0082 ["C#3", qsTr("C♯%1").arg(3)], 0083 ["D#3", qsTr("D♯%1").arg(3)], 0084 ["F#3", qsTr("F♯%1").arg(3)], 0085 ["G#3", qsTr("G♯%1").arg(3)], 0086 ["A#3", qsTr("A♯%1").arg(3)], 0087 ["C#4", qsTr("C♯%1").arg(4)], 0088 ["D#4", qsTr("D♯%1").arg(4)], 0089 ["F#4", qsTr("F♯%1").arg(4)], 0090 ["G#4", qsTr("G♯%1").arg(4)], 0091 ["A#4", qsTr("A♯%1").arg(4)], 0092 ["C#5", qsTr("C♯%1").arg(5)], 0093 ["D#5", qsTr("D♯%1").arg(5)], 0094 ["F#5", qsTr("F♯%1").arg(5)], 0095 ["G#5", qsTr("G♯%1").arg(5)], 0096 ["A#5", qsTr("A♯%1").arg(5)], 0097 ["C#6", qsTr("C♯%1").arg(6)], 0098 ["D#6", qsTr("D♯%1").arg(6)] 0099 ] 0100 0101 //: Translators, D♭, E♭, G♭, A♭, B♭ are the note notations in English musical notation system. The numbers in the arguments represents the octave number of the note. For instance, D♭4 is a D♭ note in the 4th octave. 0102 readonly property var blackKeyFlatNoteLabelsArray: [ 0103 ["Db3", qsTr("D♭%1").arg(3)], 0104 ["Eb3", qsTr("E♭%1").arg(3)], 0105 ["Gb3", qsTr("G♭%1").arg(3)], 0106 ["Ab3", qsTr("A♭%1").arg(3)], 0107 ["Bb3", qsTr("B♭%1").arg(3)], 0108 ["Db4", qsTr("D♭%1").arg(4)], 0109 ["Eb4", qsTr("E♭%1").arg(4)], 0110 ["Gb4", qsTr("G♭%1").arg(4)], 0111 ["Ab4", qsTr("A♭%1").arg(4)], 0112 ["Bb4", qsTr("B♭%1").arg(4)], 0113 ["Db5", qsTr("D♭%1").arg(5)], 0114 ["Eb5", qsTr("E♭%1").arg(5)], 0115 ["Gb5", qsTr("G♭%1").arg(5)], 0116 ["Ab5", qsTr("A♭%1").arg(5)], 0117 ["Bb5", qsTr("B♭%1").arg(5)], 0118 ["Db6", qsTr("D♭%1").arg(6)], 0119 ["Eb6", qsTr("E♭%1").arg(6)] 0120 ] 0121 readonly property var blackKeyNoteLabels: useSharpNotation ? blackKeySharpNoteLabelsArray : blackKeyFlatNoteLabelsArray 0122 0123 readonly property var keyLabelColors: { "C": "#FF0000", "D": "#FF7F00", "E": "#FFFF00", "F": "#32CD32", 0124 "G": "#6495ED", "A": "#D02090", "B": "#FF1493", 0125 "C#": "#FF6347", "D#": "#FFD700", "F#": "#20B2AA", "G#": "#8A2BE2", "A#": "#FF00FF", 0126 "Db": "#FF6347", "Eb": "#FFD700", "Gb": "#20B2AA", "Ab": "#8A2BE2", "Bb": "#FF00FF"} 0127 0128 // White key notes are from C3 to G4 when the clef is bass 0129 property var whiteKeyNoteLabelsBass: [ 0130 whiteKeyNoteLabelsArray.slice(11, 18), 0131 whiteKeyNoteLabelsArray.slice(18, 22) 0132 ] 0133 // White key notes are from G3 to C6 when the clef is treble 0134 property var whiteKeyNoteLabelsTreble: [ 0135 whiteKeyNoteLabelsArray.slice(13, 18), 0136 whiteKeyNoteLabelsArray.slice(18, 25), 0137 whiteKeyNoteLabelsArray.slice(25, 32), 0138 whiteKeyNoteLabelsArray.slice(32, 36) 0139 ] 0140 readonly property var whiteKeyNoteLabels: background.clefType === "Treble" ? whiteKeyNoteLabelsTreble : whiteKeyNoteLabelsBass 0141 0142 signal noteClicked(string note) 0143 0144 property bool blackLabelsVisible: true 0145 property bool whiteLabelsVisible: true 0146 property bool blackKeysEnabled: true 0147 property bool whiteKeysEnabled: true 0148 property bool useSharpNotation: true 0149 property int labelSquareSize: whiteWidth - 5 0150 0151 Repeater { 0152 id: keyRepeater 0153 model: whiteKeyNoteLabels.length ? whiteKeyNoteLabels[currentOctaveNb % whiteKeyNoteLabels.length].length : 0 0154 0155 property int keyboardOffset: piano.numberOfWhite - whiteKeyNoteLabels[0].length 0156 0157 function playKey(keyboardKey, color) { 0158 var keyToPress; 0159 if(currentOctaveNb === 0 && !piano.playPianoActivity) 0160 keyToPress = keyboardKey - keyRepeater.keyboardOffset; 0161 else 0162 keyToPress = keyboardKey; 0163 if(itemAt(keyToPress) === null) 0164 return 0165 if(color === "white") 0166 itemAt(keyToPress).whiteKey.keyPressed(); 0167 else if(itemAt(keyToPress).blackKey.visible) 0168 itemAt(keyToPress).blackKey.keyPressed(); 0169 } 0170 0171 Item { 0172 width: whiteWidth 0173 height: whiteHeight 0174 x: ((currentOctaveNb === 0) ? (keyRepeater.keyboardOffset + index) : index) * whiteWidth 0175 0176 property alias whiteKey: whiteKey 0177 property alias blackKey: blackKey 0178 0179 PianoKey { 0180 id: whiteKey 0181 color: "white" 0182 width: whiteWidth 0183 height: whiteHeight 0184 labelSquareSize: piano.labelSquareSize 0185 noteColor: keyLabelColors[keyName[0][0]] 0186 keyName: whiteKeyNoteLabels[currentOctaveNb % whiteKeyNoteLabels.length][index] 0187 labelsVisible: whiteLabelsVisible 0188 isKeyEnabled: piano.whiteKeysEnabled 0189 onKeyPressed: noteClicked(keyName[0]) 0190 } 0191 0192 PianoKey { 0193 id: blackKey 0194 color: "black" 0195 width: blackWidth 0196 height: Math.min(blackHeight, whiteHeight - labelSquareSize - 10) 0197 x: -width / 2 0198 visible: { 0199 if(index || leftOctaveVisible) 0200 return (["D", "E", "G", "A", "B"].indexOf(whiteKeyNoteLabels[currentOctaveNb % whiteKeyNoteLabels.length][index][0][0]) != -1) 0201 return false 0202 } 0203 labelSquareSize: piano.labelSquareSize - 2 0204 noteColor: keyName ? keyLabelColors[keyName[0].substr(0, 2)] : "black" 0205 keyName: { 0206 for(var i = 0; i < blackKeyFlatNoteLabelsArray.length; i++) { 0207 if((blackKeyFlatNoteLabelsArray[i][0][0] === whiteKey.keyName[0][0]) 0208 && (blackKeyFlatNoteLabelsArray[i][0][2] === whiteKey.keyName[0][1])) 0209 return blackKeyNoteLabels[i] 0210 } 0211 return "" 0212 } 0213 labelsVisible: blackLabelsVisible 0214 isKeyEnabled: piano.blackKeysEnabled 0215 onKeyPressed: noteClicked(keyName[0]) 0216 } 0217 } 0218 } 0219 }