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 }